2015-12-15 128 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' –

相关问题