spark sql 集群小檔案太多解決方式

2021-10-06 11:53:48 字數 1900 閱讀 4323

某張表有三個分割槽字段(partition_brand, partition_date, partition_rssc)

則生成小檔案個數:2 * 26 * 8 * 200 = 83,200

這個表還算一般,如果按照年月日進行分割槽的話,小檔案就太多了

先檢視集群動態資源配置:

再檢視執行spark程式配置資源:

--driver-memory 30g \

--executor-memory 12g \

--num-executors 12 \

--executor-cores 3 \

12executor3個core =36 cores

12executor12 + 30 =174g

然而是實際執行過程

看來是集群動態分配資源,然而分配資源對生成檔案數並沒影響。。

最終發現預設檔案生成數和表檔案儲存的個數有關,但是上游表儲存個數不是我們下游能控制的,只能自己想辦法處理小檔案了

方法一:新增配置資訊:

執行結果ok,但是執行時間增加了10min.

方法二:repartition函式

//合併成乙個檔案

df.repartition(10).createorreplacetempview("table1")

hivecontext.sql("insert overwrite table wd_part_test partition(partition_brand, partition_date, partition_rssc) select * from table1")

執行結果ok,同樣執行時間增加了10min。

最後深入分析之後,採用distribute by方式:

insert overwrite table asmp.wd_part_test partition(partition_brand, partition_date)

select

c.rssc_code,

c.rssc_name,

b.sst_code,

b.sst_name,

b.sst_code p1,

regexp_replace(substr(te.fkdat,1,7), '-', '') p2

from tt_part_test

distribute by p1,p2

執行結果ok,同樣執行時間幾乎沒有增加。

注:(1)測試採用一年的資料量大約50g(1億條)

(2)distribute by 控制map輸出結果的分發,相同欄位的map輸出會發到乙個reduce節點去處理;sort by為每乙個reducer產生乙個排序檔案。cluster by = distribute by + sort by,預設只能是公升序。

Spark Sql 小檔案問題

參考 使用spark sql apis 處理資料容易產生生成大量小檔案,小檔案問題也是在分布式計算中常見的問題。一般有三種方法來處理這類問題 spark.sql.shuffle.partitions 引數通過在處理joins 或 aggregations 等shuffle操作來控制輸出的分割槽數。可...

SparkSQL將小檔案合併

1 設定配置 spark.sql set hive.exec.dynamic.partition true spark.sql set hive.exec.dynamic.partition.mode nonstrict spark.sql set spark.sql.shuffle.partiti...

sparksql壓縮小檔案

set spark.sql.shuffle.partitions 2 set spark.sql.adaptive.enabled true set spark.sql.adaptive.shuffle.targetpostshuffleinputsize 268435456 insert over...