在hadoop流中使用 elephant-bird 输入格式时出错

qvtsj1bj  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(373)

我试图在hadoop流脚本中使用 elephant-bird 的输入格式。特别是,我想使用lzoinputformat,最终使用lzojsoninputformat(在这里处理twitter数据)。但是当我尝试这样做时,我不断得到一个错误,它表明 elephant-bird 格式不是inputformat类的有效示例。
以下是我运行流式处理命令的方式:

hadoop jar /usr/lib/hadoop/contrib/streaming/hadoop-streaming-0.20.2-cdh3u5.jar \                                                                                                          
    -libjars /project/hanna/src/elephant-bird/build/elephant-bird-2.2.0.jar \                                                                                                              
    -D stream.map.output.field.separator=\t \                                                                                                                                              
    -D stream.num.map.output.key.fields=2 \                                                                                                                                                
    -D map.output.key.field.separator=\t \                                                                                                                                                 
    -D mapred.text.key.partitioner.options=-k1,2 \                                                                                                                                         
    -file /home/a/ahanna/sandbox/hadoop-textual-analysis/streaming/filter/filterMap.py \                                                                                                   
    -file /home/a/ahanna/sandbox/hadoop-textual-analysis/streaming/filter/filterReduce.py \                                                                                                
    -file /home/a/ahanna/sandbox/hadoop-textual-analysis/streaming/data/latinKeywords.txt \                                                                                                
    -inputformat com.twitter.elephantbird.mapreduce.input.LzoTextInputFormat \                                                                                                             
    -input /user/ahanna/lzotest \                                                                                                                                                          
    -output /user/ahanna/output \                                                                                                                                                          
    -mapper filterMap.py \                                                                                                                                                                 
    -reducer filterReduce.py \                                                                                                                                                             
    -partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner

我得到的错误是:

Exception in thread "main" java.lang.RuntimeException: class com.hadoop.mapreduce.LzoTextInputFormat not org.apache.hadoop.mapred.InputFormat
    at org.apache.hadoop.conf.Configuration.setClass(Configuration.java:1078)
at org.apache.hadoop.mapred.JobConf.setInputFormat(JobConf.java:633)
at org.apache.hadoop.streaming.StreamJob.setJobConf(StreamJob.java:707)
at org.apache.hadoop.streaming.StreamJob.run(StreamJob.java:122)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:79)
at org.apache.hadoop.streaming.HadoopStreaming.main(HadoopStreaming.java:50)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
at org.apache.hadoop.util.RunJar.main(RunJar.java:197)
qcbq4gxm

qcbq4gxm1#

为了兼容性,hadoop支持两种在java中编写map/reduce任务的方法:通过 org.apache.hadoop.mapred 通过来自 org.apache.hadoop.mapreduce 包裹。
即使您使用的是流api,您也需要知道这一点,因为流本身是使用旧方法编写的,因此当您希望使用外部库更改流机制的某些内部结构时,您应该确保该库也是使用旧方法编写的。
你就是这样。在一般情况下,您会编写一个 Package 器,但幸运的是 elephant-bird 提供了一个老式的 InputFormat ,所以你只需要替换 com.twitter.elephantbird.mapreduce.input.LzoTextInputFormatcom.twitter.elephantbird.mapred.input.DeprecatedLzoTextInputFormat .

7eumitmz

7eumitmz2#

在hadoop 2.4中,我成功地使用以下工具运行它:

-D org.apache.hadoop.mapreduce.lib.input.FileInputFormat=your.package.path.FileInputFormat

而不是标准 -inputformat

相关问题