我们正在将Scala Spark程序从1.6.3迁移到2.2.0。所涉及的程序分为四个部分:让我们将它们称为A,B,C和D部分。A部分解析输入(拼写文件),然后缓存DF并创建一个表。然后,B,C和D部分依次对DF进行不同类型的处理。
此spark作业每小时运行约50次,输入文件的数量根据当前可用的文件而变化。执行程序,内核,执行程序内存和agg分区的数量是根据输入文件的数量及其大小计算的。这些是这样计算的:
在单元测试环境中,当前有12个数据节点,平均文件输入大小为11MB / 630K记录。所以一些例子是:
现在的问题是:分析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在一个较小的表(约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之间的差异吗?
我是火花调节的新手,所以请告诉我是否能提供更多信息。