Spark-SQL處理小文件問題

一、小文件產生的原因
1、在使用spark sql處理數據的過程中,如果有shuffle產生,依賴於spark.sql.shuffle.partitions配置信息,默認爲200,當處理的數據量比較大時,通常會把該值調大,以避免單個分區處理的數據太大出現異常或者拖慢整個任務的執行時間。
2、如果沒有shuffle產生,文件的數量依賴於數據源的文件數量以及文件是否可切分等特性決定任務的併發度即task數量,如果在進行數據清洗轉換或者的過程中通常不會涉及shuffle,此時會產生很多小文件,造成資源的浪費,給NameNode增加壓力。
二、如何解決小文件問題
1)、降低spark.sql.shuffle.partitions配置的值,但會影響處理的併發度
2)、使用repartition和coalesce 根據經驗調整分區數的大小,但是太不靈活,如果使用spark-sql cli方式,就很不方便
3)、在數據入庫的時候使用distribute by 字段或者rand(),但是此時對字段的選擇就需要慎重
4)、spark sql adaptive 自適應框架
三、spark-sql adaptive框架解決小文件問題
1、打開自適應框架的開關

spark.sql.adaptive.enabled true

2、設置partition的上下限

spark.sql.adaptive.minNumPostShufflePartitions 10
spark.sql.adaptive.maxNumPostShufflePartitions 2000

3、設置單reduce task處理的數據大小

spark.sql.adaptive.shuffle.targetPostShuffleInputSize 134217728
spark.sql.adaptive.shuffle.targetPostShuffleRowCount 10000000

4、必須要出發shuffle,如果任務中只有map task,需要通過group by 或者distribute 觸發shuffle的執行,只有觸發shuffle,才能使用adaptive解決小文件問題

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章