執行 insert overwrite 陳述句,產生了200個小檔案。 試過配置引數:spark.sql.shuffle.partitions=1, 但這個導致所有reduce階段均只有一個并行度,影響了執行效率。
大家,有沒有什么辦法能解決這個問題呢?
uj5u.com熱心網友回復:
repartition(1)uj5u.com熱心網友回復:
200是Spark sql的默認并行度。別人都嫌棄他太慢了要調高并行度,你居然要降低它的并行度,你如果真的嫌棄他太多了,你可以適當降低它的并行度,調節引數spark.sql.shuffle.partitions
uj5u.com熱心網友回復:
你不妨在進行寫入之前進行coalesce(num)這樣試試,我試了一下,至少小資料量還是可以的,像這樣:specialDaysInMall.toDF("name", "age", "address").coalesce(3)
.registerTempTable("inMall")
hqx.sql("insert overwrite table t1 select name,age,address from inMall")
這樣之后,在使用sql進行insert或者overwrite形式進行寫入hive表,這樣結果應該就只會生成3個parquet檔案,不妨一試
uj5u.com熱心網友回復:
如果每個檔案都小于HDFS BlockSize,那還是有調整的必要,否則沒必要在寫入前reparation。因為一個是會增加一次shuffle,二個如果資料集已經排序,shuffle會把順序打亂。
所以如果真有調整的必要,建議是在寫入前一個步驟插入reparation(n)。
例如
rdd.map(xxx).filter(xxx).sortBy(xxx).write(xxx) 在sortBy前進行reparation
uj5u.com熱心網友回復:
對計算完成之后的rdd,再coalesce一下uj5u.com熱心網友回復:
coalesce(1) 望采納uj5u.com熱心網友回復:
并行度決定了產生多少個檔案, 要么在檔案數量和并行度之間找個平衡, 要么嘗試一下adaptive轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/32402.html
標籤:Spark
上一篇:k8s提交pyspark任務失敗
下一篇:小白日記(1)
