【发布时间】:2014-12-18 23:36:02
【问题描述】:
我有一个关于 Apache Spark 以及如何将数据从驱动程序分发到执行程序的一般性问题。 我将带有“scala.io.Source”的文件加载到集合中。然后我将集合与“SparkContext.parallelize”并行化。问题从这里开始 - 当我没有指定分区的数量时,工作人员的数量被用作分区值,任务被发送到节点,我收到建议的任务大小为 100kB 的警告,我的任务大小是例如15MB(60MB 文件/4 个节点)。然后计算以节点上的“OutOfMemory”异常结束。当我并行化到更多分区时(例如 600 个分区 - 每个任务获得 100kB)。计算在工作人员上成功执行,但在驱动程序中经过一段时间后会引发“OutOfMemory”异常。在这种情况下,我可以打开 spark UI 并观察驱动程序的内存在计算过程中是如何缓慢消耗的。看起来驱动程序将所有内容都保存在内存中,并且没有将中间结果存储在磁盘上。
我的问题是:
- RDD分成多少个分区?
- 如何“以正确的方式”分发数据?
- 如何防止内存异常?
- 有没有办法告诉司机/工人交换?它是一个配置选项还是必须在程序代码中“手动”完成?
谢谢
【问题讨论】:
-
你能发布代码吗?我听起来好像代码级别有问题。
标签: scala apache-spark