2017-06-28 574 views
0

我有一個HDFS文件夾和兩個250MB地板文件。 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(或創建RDD與toJavaRDD())調用,我只獲得4個分區。這是由hdfs塊大小控制 - 每個文件2個塊,因此4個分區?

爲什麼這不匹配parquet(parent?)操作的分區數?

+0

回答如下,但總的來說你是對的 - 這都是關於HDFS塊的大小。 – Zyoma

+0

基於@Zyoma的建議,我已經更新了代碼,試圖強制更小的分割,從而爲數據框提供更多的輸入分區。以下配置已更改:** parquet.block.size,mapred.max.split.size,mapred.min.split.size全部設置爲Long.toString(8 * 1024 * 1024L)**。這*仍然*給我回4個分區 –

回答

1

當您使用Spark讀取文件時,執行程序的數量和內核數量都不會以任何方式影響任務數量。分區數量(以及作爲結果的任務)僅由輸入中的塊數決定。如果你有4個文件小於HDFS塊大小 - 無論如何是4塊,結果是4個分區。公式爲number_of_files * number_of_blocks_in_file。因此,查看您的文件夾並計算它包含的文件數量以及每個文件的大小。這應該回答你的問題。

UPD:如果您沒有手動重新分區數據幀以上的一切是真實的,如果你的數據幀不作爲加入的結果,或者任何其他整理操作創建。

UPD:修復答案的詳細信息。

+0

我的文件夾包含2個文件,每個文件有250MB。所以基本上你是說沒有辦法有更多的分區比塊的數量(在這種情況下,4塊128 MB)?爲什麼我會在最初閱讀文件時看到創建的12個任務?或者我對這12個taska是什麼的解釋是錯誤的?在這裏:https://stackoverflow.com/questions/27194333/how-to-split-parquet-files-into-many-partitions-in-spark有人建議用較小的parquet.block.size編寫鑲木地板文件可能會訣竅 - 但我試過設置,但沒有運氣。 –

+0

正確。您可以使用**重新分配**方法強制分配數量。 – Zyoma

+0

我知道重新分配是一種選擇,但會觸發混洗,這不是最佳選擇。我在集羣中有更多的核心*執行程序,我希望通過從初始讀取操作中獲取更多分區來理想地使用它。 –