2017-10-28 1300 views
0

我的輸入包含大量的小ORC文件,我希望在一天的每一天結束,我想將數據拆分爲100MB的塊。Hive合併小ORC文件

我的輸入和輸出都是S3和環境中使用的電子病歷,

蜂巢參數,正在設置,

set hive.msck.path.validation=ignore; 
set hive.exec.reducers.bytes.per.reducer=256000000; 
SET hive.exec.dynamic.partition = true; 
SET hive.exec.dynamic.partition.mode = nonstrict; 
SET hive.mapred.mode = nonstrict; 

set hive.merge.mapredfiles=true; 
set hive.merge.mapfile=true ; 

set hive.exec.parallel = true; 
set hive.exec.parallel.thread.number = 8; 

SET hive.exec.stagingdir=/tmp/hive/  ; 
SET hive.exec.scratchdir=/tmp/hive/ ; 

set mapred.max.split.size=68157440; 
set mapred.min.split.size=68157440; 
set hive.merge.smallfiles.avgsize=104857600; 
set hive.merge.size.per.task=104857600; 
set mapred.reduce.tasks=10; 

我的插入語句:

insert into table dev.orc_convert_zzz_18 partition(event_type) select * from dev.events_part_input_18 where event_type = 'ScreenLoad' distribute by event_type; 

現在的問題是,我有大約80個總共500MB大小的輸入文件,並且在這個插入語句之後,我期待S3中有4個文件,但所有這些文件都合併成一個文件,這個文件是n所需的輸出。

有人可以請讓我知道,什麼錯,

+0

'mapred'性能都已過時 –

+0

@ cricket_007哦確定,由於將檢查。我剛纔想出了答案,我們可以使用集羣來進一步將分區拆分爲多個部分。我在這裏探索配置單元是因爲我的火花輸出有太多小文件,如果我通過Presto將最小的文件暴露給最終用戶,那麼查詢這些較小的文件將會變得更慢https://community.hortonworks.com/content/supportkb/49637 /hive-bucketing-and-partitioning.html –

+0

您應該在Spark中使用'coalesce'或'repartition'來修復您的小文件問題 –

回答

1
您正在使用2個不同的概念來控制輸出文件

  • 分區:它設置的目錄
  • 通過分發:集每個目錄中的文件

如果你只是想在每個目錄中有4個文件,你可以通過一個隨機數分配,例如:

insert into table dev.orc_convert_zzz_18 partition(event_type) 
select * from dev.events_part_input_18 
where event_type = 'ScreenLoad' distribute by Cast((FLOOR(RAND()*4.0)) as INT); 

但我會建議通過您可能查詢的數據中的某個列進行分發。它可以改善您的查詢時間。

可以閱讀更多關於它here

+0

嗨@lev我試過這個,但得到30個分區,任何想法如何控制,我試着設置減速器10認爲它會導致10個文件,但我仍然得到30 –

+0

你是對的,'蘭德'返回0和1之間的雙。我修復了答案 – lev

+0

我也試過這個,但它沒有奏效,請在這裏找到屏幕截圖,不知道我在這裏做了什麼錯誤https://ibb.co/eFqorR –