【发布时间】:2015-12-15 18:15:18
【问题描述】:
我创建了一个读取自定义文件输入格式的配置单元外部表。当文件很小时,这工作得很好。但是当文件很大时,工作正在拆分文件,我的工作失败了。
我在 IsSplittable 方法的自定义输入格式类中返回 false。我还尝试将 mapreduce.input.fileinputformat.split.minsize 和 mapred.min.split.size 设置为较大的值。我创建了一个自定义 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 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/';
【问题讨论】:
-
您能否详细说明“我的工作失败”——是因为您的记录分隔符不是通常的 LF 吗?顺便说一句,您是否尝试对文件进行 GZip 压缩以使其不可拆分?
-
作业失败,因为我的输入文件不可拆分,并且 map reduce 作业失败,因为我的输入格式开始读取错误的文件并获取配置单元表值的无效数据。压缩文件工作,因为文件被压缩到~20mb。较小的文件也可以解压缩。当文件很大时,作业会失败。我还没有尝试过大于 128 mb 的 gzip 文件。
-
map/reduce 作业是否在 hive 查询中运行?如果是这样,表还必须声明输入格式,否则 hive 将使用其默认值。我们需要更多详细信息来回答您的问题,特别是您正在开展的工作以及如何开展工作。
-
可能您的问题与针对 MAPREDUCE-2254 报告的错误类似,请参阅最终 cmets - issues.apache.org/jira/browse/MAPREDUCE-2254
-
@RobertoCongiu:我已经添加了我的 create table 语句。我的工作是从蜂巢计数查询生成的。 “从测试中选择计数(1)”。我不认为这是由于错误的输入格式而发生的,因为它适用于小文件。 SamsonScharfrichter:由于它适用于较小的文件,我认为它可能不是应有的分隔符。