某張表有三個分割槽字段(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...