我有一个hdfs文件夹和两个250mb的Parquet文件。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的集群上运行它。我可以看到Parquet文件的读取在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
然而,当我得到dataframerdd(或者用tojavardd()创建rdd)调用时,我只得到4个分区。这是由hdfs块大小控制的吗?每个文件有2个块,因此有4个分区?
为什么这与parquet(parent?)操作中的分区数不匹配?
1条答案
按热度按时间hpcdzsge1#
当您使用spark读取文件时,执行器的数量和内核的数量都不会以任何方式影响任务的数量。分区数(以及相应的任务数)仅由输入中的块数决定。如果有4个文件小于hdfs块大小,那么结果就是4个块和4个分区。公式是\文件的\个数*文件中\块的\个数。所以看看你的文件夹,数一数它包含多少个文件,每个文件的大小是多少。这应该能回答你的问题。
upd:如果您没有手动重新划分Dataframe,并且您的Dataframe不是由于join或任何其他shuffle操作而创建的,那么上面的所有内容都是正确的。
upd:固定答案细节。