如何将数据分发到工作节点

时间:2014-12-18 12:02:23

标签: scala apache-spark

我有一个关于Apache Spark以及如何将数据从驱动程序分发到执行程序的一般性问题。 我用&sca.io.Source'加载了一个文件。进入收藏。然后我将该集合与' SparkContext.parallelize'并行化。这里开始讨论这个问题 - 当我没有指定分区数量时,那么工作者数量被用作分区值,任务被发送到节点,我收到警告,建议任务大小为100kB,我的任务大小例如15MB(60MB文件/ 4个节点)。然后计算结束于' OutOfMemory'节点上的异常。当我并行化到更多分区时(例如600个分区 - 每个任务获得100kB)。计算是在工人上成功完成的,但是“OutOfMemory”' OutOfMemory'在驱动程序中经过一段时间后会引发异常。这种情况下,我可以打开spark UI并观察在计算过程中如何慢慢消耗驱动程序的内存。看起来驱动程序将所有内容保存在内存中,并且不会将中间结果存储在磁盘上。

我的问题是:

  • 分成多少个分区RDD?
  • 如何以正确的方式分发数据'?
  • 如何防止内存异常?
  • 有没有办法告诉司机/工人交换?它是配置选项还是必须手动完成?在程序代码?

由于

1 个答案:

答案 0 :(得分:3)

  • 如何以正确的方式分发数据'

    您需要一个分布式文件系统(如HDFS)来托管您的文件。这样,每个工作人员可以并行读取一段文件。这将提供比序列化和数据更好的性能。

  • 如何防止内存异常?

    很难说不看代码。大多数操作都会溢出到磁盘。如果我不得不猜测,我说你正在使用groupByKey

  • 分成RDD的分区数量

    我认为拇指规则(最佳并行度)是可用于工作的核心数量的2-4倍。正如您所做的那样,您可以节省内存使用时间。

  • 有没有办法告诉司机/工人交换?它是配置选项还是必须手动完成?在程序代码中?

    随机播放行为由属性spark.shuffle.spill控制。它是真的(=溢出到磁盘)默认情况下。