我有一个带有两个250MB镶木地板文件的HDFS文件夹。 hadoop df块大小设置为128MB。 拥有以下代码:
JavaSparkContext sparkContext = new JavaSparkContext();
SQLContext sqlContext = new SQLContext(sparkContext);
DataFrame dataFrame = sqlContext.read().parquet("hdfs:////user/test/parquet-folder");
LOGGER.info("Nr. of rdd partitions: {}", dataFrame.rdd().getNumPartitions());
sparkContext.close();
我在spark.executor.instances = 3和spark.executor.cores = 4的集群上运行它。我可以看到镶木地板文件的读取分为3个执行器X 4个核心= 12个任务:
spark.SparkContext: Starting job: parquet at VerySimpleJob.java:25
scheduler.DAGScheduler: Got job 0 (parquet at VerySimpleJob.java:25) with 12 output partitions
但是,当我获得数据帧RDD(或使用toJavaRDD()创建RDD)调用时,我只得到4个分区。这是由hdfs块大小控制的 - 每个文件有2个块,因此有4个分区吗?
为什么这与实木拼盘(父?)操作中的分区数完全匹配?
答案 0 :(得分:2)
当您使用Spark读取文件时,执行程序的数量和核心数都不会以任何方式影响任务的数量。分区数(以及作为结果的任务)仅由输入中的块数决定。如果你有4个小于HDFS块大小的文件 - 那么无论如何都是4个块,结果是4个分区。公式为 number_of_files * number_of_blocks_in_file 。因此,请查看您的文件夹并计算它包含的文件数以及每个文件的大小。这应该回答你的问题。
UPD:如果你没有手动重新分区你的DataFrame,并且你的DataFrame不是由于加入或任何其他shuffle操作而创建的,那么上面的所有内容都是真的。
UPD:修复了答案详情。