在Spark 2.2中,Spark程序的速度是Spark 1.6的两倍

时间:2019-02-01 19:36:39

标签: scala apache-spark apache-spark-1.6 apache-spark-2.2

我们正在将Scala Spark程序从1.6.3迁移到2.2.0。所涉及的程序分为四个部分:让我们将它们称为A,B,C和D部分。A部分解析输入(拼写文件),然后缓存DF并创建一个表。然后,B,C和D部分依次对DF进行不同类型的处理。

此spark作业每小时运行约50次,输入文件的数量根据当前可用的文件而变化。执行程序,内核,执行程序内存和agg分区的数量是根据输入文件的数量及其大小计算的。这些是这样计算的:

  • n_execs = min(n_infiles,num_datanodes)
  • n_cores = ceil(n_infiles / n_execs)
  • exec_mem = 1500 * n_cores(MB)
  • shuffle_partitions = n_infiles
  • driver_mem = ceil(n_infiles / 200)(GB)
  • 最大分区字节= 5 * 1024 * 1024(恒定)

在单元测试环境中,当前有12个数据节点,平均文件输入大小为11MB / 630K记录。所以一些例子是:

  • n_infiles(24):driver_mem(1G),n_execs(12),n_cores(2),exec_mem(3000M),shuffle_partitions(24)
  • n_infiles(4):driver_mem(1G),n_execs:(4),n_cores(1),exec_mem(1500M),shuffle_partitions(4)

现在的问题是:分析1095在Spark 2.2上的运行情况,我们发现C区平均花费41.2秒,D区平均花费47.73秒。在Spark 1.6.3中,经过425次运行,C节平均耗时23秒,D节耗时64.12秒。 A和B节在两个版本之间的平均运行时间几乎相同。 D部分的改进很大,但C部分的问题很大。这在我们的生产集群(314个数据节点)上根本无法很好地扩展。

有关C节的一些详细信息:

  • 我们使用从A节创建的缓存DF
  • A节中的DF在一个较小的表(约1000行)上连接了四次,并将它们合并在一起,基本上像:

    SELECT * FROM t1 JOIN t2 WHERE t1.a = t2.x AND t2.z = 'a' UNION ALL SELECT * FROM t1 JOIN t2 WHERE t1.b = t2.x AND t2.z = 'b' UNION ALL SELECT * FROM t1 JOIN t2 WHERE t1.c = t2.x1 AND t1.d = t2.x2 AND t2.z = 'c' UNION ALL SELECT * FROM t1 JOIN t2 WHERE t1.e = t2.y1 AND t1.f = t2.y2 AND t2.z = 'd'

  • 使用稍微不同的参数再次执行此查询。

  • 每个这些查询的结果被缓存,因为它们被滤几次然后将其写入到拼花地板。

有什么办法可以解释spark 1.6和2.2之间的差异吗?

我是火花调节的新手,所以请告诉我是否能提供更多信息。

0 个答案:

没有答案