根据我阅读的材料和一些在线帖子,我认为Spark将通过以下方式从外部文件广播所有RDD变量:sc.textFile
,例如:
val rdd = sc.textFile(file_path)
然而,当我的同事阅读我的代码并请求代码sc.parallelize
时,我对此感到困惑,因为我认为sc.parallelize
是多余的,我再次问我的同事他给了我一个回答:
根据我迄今为止的经验,spark并不擅长处理多个节点和工作人员的外部文件的分歧,因此您需要设置分区,迫使工作人员应用多个工作人员来完成工作。
基于我的同事的建议,如果sc.textFile
无法做到这一点,那么在我阅读大量文件时,我可以设置分区的最简单方法是什么。一种可能的方法是首先collect
然后sc.parallelize
,但我认为它浪费了太多时间而且是多余的。
答案 0 :(得分:0)
您可以拨打rdd.repartion(..)。收集和并行不是实现你所描述的正确方法。
您的同事观察到此行为的原因可能是由于文件较小,因为分区是由HDFS块在读取时驱动的。因此,如果文件小于块大小,则所有数据都将在同一个执行程序中结束。