2015-12-15 75 views
1

我創建了一個讀取自定義文件輸入格式的配置單元外部表。當文件很小時,這工作得很好。但是,當文件很大時,作業會分裂文件,而我的作業會失敗。Hive MapReduce作業拆分文件

我在IsSplittable方法的自定義輸入格式類中返回false。我也嘗試將mapreduce.input.fileinputformat.split.minsize和mapred.min.split.size設置爲較大的值。我創建了一個Custom InputFormat,OutputFormat和一個SerDe類,並在創建此表時使用它們。

在我的工作日誌中,我仍然看到分裂發生。

Processing split: Paths:/user/test/testfile1:0+134217728,/user/test/testfile1:134217728+95198924,/user/test/testfile2:0+134217728,/user/test/testfile2:134217728+96092244... 

134217728是128 MB,它必須是我的HDFS塊大小。有沒有辦法阻止這種分裂發生?它與這個問題有關嗎https://issues.apache.org/jira/browse/HIVE-8630

我的CREATE TABLE語句是:

CREATE EXTERNAL TABLE test_data(
    key STRING, 
    body map<string, string> 
) 
PARTITIONED BY (year int, month int, day int) 
ROW FORMAT SERDE 'com.hiveio.io.CustomHiveSerde' 
STORED AS INPUTFORMAT 'com.hiveio.io.CustomHiveInputFormat' 
OUTPUTFORMAT 'com.hiveio.io.CustomHiveOutputFormat' 
LOCATION '/user/test/'; 
+0

你能否詳細說明「我的工作失敗」 - 是否因爲你的記錄分隔符不是通常的LF?順便說一句,你是否嘗試GZIP文件,使他們不可拆分? –

+0

作業失敗,因爲我的輸入文件不可拆分,地圖縮小作業失敗,因爲我的輸入格式開始讀取文件錯誤,並獲取無效的數據爲蜂巢表值。Gzipping文件工作,因爲文件被壓縮到〜20MB。較小的文件也可以解壓縮。當文件大小大時,作業失敗。我還沒有嘗試使用> 128 MB的gzip文件。 –

+0

是運行蜂巢查詢的地圖/減少作業嗎?如果是這樣,表格還必須聲明輸入格式,否則配置單元將使用其默認值。 我們需要更多的細節來回答你的問題,特別是你正在運行什麼工作以及如何工作。 –

回答

0

Ok..actually,你提https://issues.apache.org/jira/browse/HIVE-8630響了門鈴。前一段時間,我們處理了一個非常類似的問題。 這個錯誤提到了CombineHiveInputFormat如何仍然將不可分割的格式分開。 CombineHiveInputFormat是默認的HiveInputFormat,其目的是組合多個小文件以減少開銷。 您可以禁用它,在查詢之前設置

set hive.input.format=org.apache.hadoop.hive.ql.io.HiveInputFormat 

,或者如果你想它作爲默認設置爲在蜂房site.xml的XML:

<property> 
    <name>hive.input.format</name> 
    <value>org.apache.hadoop.hive.ql.io.HiveInputFormat</value> 
</property> 

注意,你會被犧牲Combine部分的特性,所以如果你有很多小文件,他們會在處理時每個都拿一個映射器......但是這應該起作用,它確實對我們有用。

+0

謝謝@Roberto。這有效!我試圖創建一個自定義的組合hive格式並使用它。像set hive.input.format ='com.hiveio.io.CustomCoustomHiveInputFormat' –

相關問題