Spark寫parquet檔案時,經過shuffle和不shuffle資料量 不同,shuffle后parquet檔案壓縮比降低
最近在做測驗時遇到一個奇怪的問題,不能理解,問題描述如下:
對相同的一份資料進行讀取并寫出為parquet檔案時,對資料集進行shuffle和不進行shuffle后生成的parquet檔案大小不同,且相差較多。具體操作如下:
原始資料集為snappy壓縮的46G parquet檔案,檔案大小從11M~1.5G不等,共100個檔案,對檔案讀取后寫出為不壓縮的parquet檔案:
val productDF = spark.read.parquet("/ingest/product/20180202/22-43/")
//讀取結果集后直接寫出,不進行shuffle
productDF
.write.mode(org.apache.spark.sql.SaveMode.Overwrite)
.option("compression", "none")
.parquet("/processed/product/20180215/04-37/read_repartition_write/nonewithoutshuffle")
//讀取結果集后,repartition為500個檔案,shuffle后寫出
productDF..repartition(500).write.mode(org.apache.spark.sql.SaveMode.Overwrite)
.option("compression", "none")
.parquet("/processed/product/20180215/04-37/read_repartition_write/nonewithshuffle")
兩次程式執行寫出的結果檔案,大小不同。其中第一次不經過shuffle直接寫出,生成parquent檔案為80G,而第二次經過shuffle后生成檔案總大小為283G。
同時我對80G的檔案再次進行讀取并repartition(500),生成283G檔案。有兩個問題不太明白:
第一個是為什么spark在repartitioning/shuffle寫出parquet檔案后檔案總大小會增大
第二個問題是如何有效地shuffle spark中的資料,才能有效地對parquent檔案進行編碼/壓縮?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/51986.html
標籤:Spark
