sparkParquetDataframe分区数

xmq68pz9  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(317)

我有一个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?)操作中的分区数不匹配?

hpcdzsge

hpcdzsge1#

当您使用spark读取文件时,执行器的数量和内核的数量都不会以任何方式影响任务的数量。分区数(以及相应的任务数)仅由输入中的块数决定。如果有4个文件小于hdfs块大小,那么结果就是4个块和4个分区。公式是\文件的\个数*文件中\块的\个数。所以看看你的文件夹,数一数它包含多少个文件,每个文件的大小是多少。这应该能回答你的问题。
upd:如果您没有手动重新划分Dataframe,并且您的Dataframe不是由于join或任何其他shuffle操作而创建的,那么上面的所有内容都是正确的。
upd:固定答案细节。

相关问题