2015-10-16 84 views
1

我正在运行一个非常简单的火花作业,它逐个读取许多s3文件,并在RDD上调用地图/过滤器作业,并将结果写入另一个s3。换句话说,首先有一个for循环,每个循环内有一个sc调用来读取,处理,然后写入步骤。GC减慢火花作业至停止

即使每个文件的大小都比节点的大小和数量小(在每个10 GB的执行程序内存的8个节点内部运行500 MB),速度异常缓慢。

在工作节点标准输出日志

,我看到连续的线像这样 [GC2015-10-16T22:31:39.567 + 0000:[ParNew:272655K-> 19K(306688K),0.0292600秒] 467995K-> 195361K( 10451712K),0.0293570秒] [时间:用户= 0.11 sys = 0.00,实际= 0.03秒]

似乎工人们正在被GC'ed死亡。为什么会这样呢?

+0

每10秒间隔有多少个gc线?在大约1/10秒时,这将是正确的(占总CPU的1%)。 – javadba

回答

1

不确定每秒究竟有多少,但我找到了一个合理的解决方案。

在这种情况下,每个文件都会生成一个新的RDD,这会触发prev RDD的收集。我重写了代码,以便RDD是一个var,并在循环的每个循环中重复使用相同的变量。现在,我仍然可以看到GC生产线,但吞吐量很容易快10倍。