2013-10-21 30 views
1

我想使用hadoop流式分类文件。Hadoop流式分类错误

的文件格式是如下

<ID> <TextID> <Offset> <Text> - where ID is alpha numeric, TextID is alpha numeric and Offset is numeric 

我想去做点一些BY ID,文本ID,偏移ASC

我使用下面的Hadoop流命令:

hadoop jar /apollo/env/SEOHadoopClient/lib/hadoop-streaming-0.20.205.0.jar \       
-D mapred.output.key.comparator.class=org.apache.hadoop.mapred.lib.KeyFieldBasedComparator \ 
-D stream.num.map.output.key.fields=3 \ 
-D mapred.text.key.comparator.options="-k1 -k2 -k3n" \ 
-D mapred.text.key.partitioner.options=-k1,1 \ 
-input /user/sakul/hadoop-streaming-sort/output \ 
-output /user/sakul/hadoop-streaming-sort/sort-output \ 
-mapper org.apache.hadoop.mapred.lib.IdentityMapper \ 
-reducer org.apache.hadoop.mapred.lib.IdentityReducer \ 
-partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner 

但我在映射程序中得到以下例外:

java.io.IOException: Type mismatch in key from map: expected org.apache.hadoop.io.Text, recieved org.apache.hadoop.io.LongWritable 
     at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.collect(MapTask.java:1014) 
     at org.apache.hadoop.mapred.MapTask$OldOutputCollector.collect(MapTask.java:592) 
     at org.apache.hadoop.mapred.lib.IdentityMapper.map(IdentityMapper.java:38) 
     at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:50) 
     at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:436) 
     at org.apache.hadoop.mapred.MapTask.run(MapTask.java:372) 
     at org.apache.hadoop.mapred.Child$4.run(Child.java:255) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at javax.security.auth.Subject.doAs(Subject.java:396) 
     at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1059) 
     at org.apache.hadoop.mapred.Child.main(Child.java:249) 

我在这里做错了什么?

回答

3

我在这里希望它可以帮助你,即使经过这么长时间,但也因为我已经多次忘记了这个问题的解决方案。

正如您可能从异常中收集的一样,IdentityMapper预计<K,V>的格式为Text,Text>。默认的输入格式(org.apache.hadoop.mapred.TextInputFormat)提供<LongWriteable, Text>,因此它必须使用-inputformat参数进行更改:

hadoop jar /apollo/env/SEOHadoopClient/lib/hadoop-streaming-0.20.205.0.jar \       
-D mapred.output.key.comparator.class=org.apache.hadoop.mapred.lib.KeyFieldBasedComparator \ 
-D stream.num.map.output.key.fields=3 \ 
-D mapred.text.key.comparator.options="-k1 -k2 -k3n" \ 
-D mapred.text.key.partitioner.options=-k1,1 \ 
-input /user/sakul/hadoop-streaming-sort/output \ 
-output /user/sakul/hadoop-streaming-sort/sort-output \ 
-mapper org.apache.hadoop.mapred.lib.IdentityMapper \ 
-reducer org.apache.hadoop.mapred.lib.IdentityReducer \ 
-partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner \ 
-inputformat org.apache.hadoop.mapred.KeyValueTextInputFormat 

我使用org.apache.hadoop.mapred.KeyValueTextInputFormat,其将信息在第一个选项卡上,或者“如果不存在这样的字节,则该键将是整行,并且值将是空的。”由于这是一种排序,这听起来像你想要的行为,尽管我可能误解了你。

+0

谢谢。我通过使用-mapper =“cat”-reducer =“sort -k1”等工作。 –