Hadoop Spark:使用textFile';什么是分区选项?
我正在通过类似于Hadoop Spark:使用textFile';什么是分区选项?,hadoop,apache-spark,Hadoop,Apache Spark,我正在通过类似于sc.textFile(“/data/*/*/*/*”)的方式将数以万计的文件读入rdd。一个问题是,这些文件中的大多数都很小,而其他文件则很大。这会导致任务不平衡,导致各种众所周知的问题 我是否可以通过sc.textFile(“/data/*/*/*”,minPartitions=n_files*5)读取数据来分解最大的分区,其中n_files是输入文件的数量 与stackoverflow上的转换一样,minPartitions通过hadoop rabit漏洞传递,并用于org
sc.textFile(“/data/*/*/*/*”)
的方式将数以万计的文件读入rdd。一个问题是,这些文件中的大多数都很小,而其他文件则很大。这会导致任务不平衡,导致各种众所周知的问题
我是否可以通过sc.textFile(“/data/*/*/*”,minPartitions=n_files*5)
读取数据来分解最大的分区,其中n_files
是输入文件的数量
与stackoverflow上的转换一样,minPartitions
通过hadoop rabit漏洞传递,并用于org.apache.hadoop.mapred.TextInputFormat.getSplits
。我的问题是,这是否实现为首先拆分最大的文件。换句话说,拆分策略是一种试图导致分区大小均匀的策略吗
我更喜欢一个答案,指出在spark/hadoop的最新版本中,分裂策略实际在哪里实施。没有人给出答案,所以我自己深入研究了这个问题,并将发布我自己问题的答案: 似乎,如果您的输入文件是可拆分的,
textFile
确实会尝试平衡分区大小,如果您使用minPartitions选项
分区策略是在org.apache.hadoop.mapred.TextInputFormat
的getSplits
方法中实现的。此分区策略很复杂,首先设置goalSize
,这是输入的总大小除以numSplits
(minPartitions
向下传递以设置numSplits
的值)。然后,它以这样一种方式拆分文件,即尝试确保每个分区的大小(就其输入的字节大小而言)尽可能接近目标大小/
如果输入文件不可拆分,则不会进行此拆分:请参阅源代码