使用spark scala比较两个大型数据集时出现内存不足问题

时间:2016-08-09 19:01:04

标签: apache-spark apache-spark-sql spark-streaming hadoop2

我每天使用Spark scala程序从Mysql向Hive导入1000万条记录,并比较昨天和今天数据集的数据集。

val yesterdayDf=sqlContext.sql("select * from t_yesterdayProducts");
val todayDf=sqlContext.sql("select * from t_todayProducts");
val diffDf=todayDf.except(yesterdayDf);

我正在使用3节点集群和程序正常工作400万条记录。 由于RAM内存不足,我们面临超出400万的内存问题。

我想知道比较两个大数据集的最佳方法。

3 个答案:

答案 0 :(得分:2)

您是否尝试了解有多少分区: yesterdayDf.rdd.partitions.size将为您提供todayDf数据帧的信息,您也可以对其他数据帧执行相同的操作。

您也可以使用 yesterdayDf.repartition(1000) // (a large number)看看OOM问题是否消失。

答案 1 :(得分:0)

这个问题的原因很难说。但问题可能是由于某些原因,工人们收集了太多数据。尝试清除数据框以执行除外。根据我在评论中的问题,你说你有关键列,所以只需要这样:

val yesterdayDfKey = yesterdayDf.select("key-column")
val todayDfKey = todayDf.select("key-column")
val diffDf=todayDfKey.except(yesterdayDfKey);

然后,您将使用键获取数据框。你可以使用像post这样的连接来制作过滤器。

答案 2 :(得分:0)

你还需要确保你的yarn.nodemanager.resource.memory-mb比你的--executor-memory大。