【问题标题】:Hive MapReduce job splitting up filesHive MapReduce 作业拆分文件
【发布时间】: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:由于它适用于较小的文件,我认为它可能不是应有的分隔符。

标签: hadoop hive


【解决方案1】:

好的..实际上,您提到https://issues.apache.org/jira/browse/HIVE-8630 敲响了警钟。不久前,我们处理了一个非常相似的问题。 该错误提到了 CombineHiveInputFormat 仍将如何拆分不可拆分的格式。 CombineHiveInputFormat 是默认的 HiveInputFormat,其目的是合并多个小文件以减少开销。 你可以禁用它,设置

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

在查询之前,或者如果你希望它作为默认值,可以在 hive-site.xml 中将其设置为 xml:

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

请注意,您将牺牲合并部分的功能,因此如果您有许多小文件,则在处理时它们每个都会使用一个映射器....但这应该可行,它确实对我们有用。

【讨论】:

  • 谢谢@Roberto。那行得通!我试图创建一个自定义组合配置单元格式并使用它。像 set hive.input.format='com.hiveio.io.CustomCoustomHiveInputFormat'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多