cri*_*aru 5 hadoop apache-spark parquet apache-spark-sql
我有一个 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();
Run Code Online (Sandbox Code Playgroud)
我使用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
Run Code Online (Sandbox Code Playgroud)
但是,当我获取数据帧 RDD(或使用 toJavaRDD() 创建 RDD)调用时,我只得到 4 个分区。这是否由 hdfs 块大小控制 - 每个文件 2 个块,因此有 4 个分区?
为什么这与镶木地板(父级?)操作的分区数量不匹配?
当您使用 Spark 读取文件时,执行程序的数量和核心的数量都不会以任何方式影响任务的数量。分区的数量(以及由此产生的任务)仅由输入中的块数量决定。如果您有 4 个小于 HDFS 块大小的文件 - 无论如何,这将是 4 个块,从而产生 4 个分区。公式为number_of_files * number_of_blocks_in_file。因此,请查看您的文件夹并计算它包含多少个文件以及每个文件的大小。这应该可以回答你的问题。
UPD:如果您没有手动重新分区 DataFrame 并且您的 DataFrame 不是由于连接或任何其他随机操作而创建的,则上述所有内容都是正确的。
UPD:固定答案细节。
| 归档时间: |
|
| 查看次数: |
5867 次 |
| 最近记录: |