我在AWS集群(1个拥有4个工作节点的主服务器)上运行基于Scala(2.11.8)的spark(2.0.0)程序,每个节点有15GB的内存。
使用以下配置运行:
spark-submit --master "spark://ip-xyz:xyz" --deploy-mode cluster
--driver-memory 2g --executor-memory 10g --queue default myProject.jar
数据帧(df)由“16098400000”行组成。
| a_id| i_id| category| name| u| p| score|
+--------+-------+-----------+--------------------+--------+-------+---------+
|12000035|8119221| ARTIST|ASHBY, LINDEN: CA...| 0.01251|0.93166|0.0116613|
|12000081|8119221| ARTIST|ASHBY, LINDEN: CA...| 0.2672|0.93166| 0.248998|
|12000009|8111111| ARTIST|ASHBY, LINDEN: CA...| 0.0236|0.93160| 0.022008|
|12000091|8111111| ARTIST|ASHBY, LINDEN: CA...| 0.5|0.93126| 0.46583|
|13200000|8100000| ARTIST|ASHBY, LINDEN: CA...| 0.0944|0.93166| 0.088034|
+--------+-------+-----------+--------------------+--------+-------+---------+
运行以下代码:
val df1 = df.groupBy("a_id", "i_id").sum("score")
检查点的容量为50GB。 在监控检查点时,使用的空间在2小时内从500mb增加到45-50 gb。
之后,应用程序失败并显示错误:
线程“main”中的异常java.lang.reflect.InvocationTargetException
引起:java.io.IOException:设备上没有剩余空间
我知道这是一个庞大的数据集,我可以使用相同的资源高效地完成吗?
注意:尝试groupBy只有1列,操作在5分钟内成功完成。