我正在尝试在我的Hadoop Streaming脚本中使用Elephant Bird的输入格式。特别是,我想使用LzoInputFormat并最终使用LzoJsonInputFormat(在这里使用Twitter数据)。但是当我尝试这样做时,我不断收到一个错误,表明Elephant Bird格式不是InputFormat类的有效实例。
这就是我正在运行Streaming命令的方式:
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)
答案 0 :(得分:4)
在hadoop 2.4中,我设法让它运行:
-D org.apache.hadoop.mapreduce.lib.input.FileInputFormat=your.package.path.FileInputFormat
而不是标准-inputformat
答案 1 :(得分:2)
为了兼容性,Hadoop支持两种在Java中编写map / reduce任务的方法:通过org.apache.hadoop.mapred
包中的接口创建“old”,使用{{1中的抽象类创建“new”包裹。
即使您使用的是流式api,也需要知道这一点,因为流本身是使用旧方法编写的,因此当您想要使用外部库更改流机制的某些内部时,您应该确定这个图书馆也是用旧学校的方式写的。
这正是你身上发生的事。在一般情况下,您会编写一个包装器,但幸运的是Elephant Bird提供了一个旧式的org.apache.hadoop.mapreduce
,所以您只需要用InputFormat
替换com.twitter.elephantbird.mapreduce.input.LzoTextInputFormat
。