Java类文件的Hadoop Streaming -file选项问题

时间:2011-07-22 12:36:08

标签: hadoop mapreduce

我正在努力解决hadoop中的一个非常基本的问题 在“-file”选项中流式传输。

首先,我尝试了流式传输中的基本示例:

hadoop @ ubuntu:/ usr / local / hadoop $ bin / hadoop jar contrib / streaming / hadoop-streaming-0.20.203.0.jar -mapper org.apache.hadoop.mapred.lib.IdentityMapper \ -reducer / bin / wc -inputformat KeyValueTextInputFormat -input gutenberg / * -output 古滕贝格-outputtstchk22

完全没问题。

然后我复制了IdentityMapper.java源代码并对其进行了编译。 然后我将这个类文件放在/ home / hadoop文件夹中并执行了 跟随终端。

hadoop @ ubuntu:/ usr / local / hadoop $ bin / hadoop jar contrib / streaming / hadoop-streaming-0.20.203.0.jar -file 〜/ IdentityMapper.class -mapper IdentityMapper.class \ -reducer / bin / wc -inputformat KeyValueTextInputFormat -input gutenberg / * -output 古滕贝格-outputtstch6

执行失败,并在stderr文件中出现以下错误:

java.io.IOException:无法运行程序“IdentityMapper.class”: java.io.IOException:error = 2,没有这样的文件或目录

然后我再次通过复制IdentityMapper.class文件来尝试它 hadoop安装并执行以下操作:

hadoop @ ubuntu:/ usr / local / hadoop $ bin / hadoop jar contrib / streaming / hadoop-streaming-0.20.203.0.jar -file IdentityMapper.class -mapper IdentityMapper.class \ -reducer / bin / wc -inputformat KeyValueTextInputFormat -input gutenberg / * -output 古滕贝格-outputtstch5

但不幸的是,我又遇到了同样的错误。

如果你可以帮助我,那将是很棒的,因为我无法继续前进 没有克服这一点。

在期待中感谢你。

3 个答案:

答案 0 :(得分:1)

为什么要编译课程?它已经在hadoop jar中编译。您只是传递类名(org.apache.hadoop.mapred.lib.IdentityMapper),因为Hadoop使用反射来实例化此映射类的新实例。

你必须确保它位于类路径中,例如在一个罐子里,你正在通过工作。

答案 1 :(得分:1)

与你的other question相同的答案,你不能真正使用-file来发送jar,因为hadoop不支持多个jar(已经不在CLASSPATH中),请检查{{3} }:

  

至少到版本0.14,Hadoop不支持多个jar文件。因此,在指定自己的自定义类时,您必须将它们与流式传输jar一起打包并使用自定义jar而不是默认的hadoop流式传输。

答案 2 :(得分:1)

我遇到了类似的问题。并将jar文件添加到HADOOP_CLASSPATH修复了该问题。 更多信息请参考:http://blog.cloudera.com/blog/2011/01/how-to-include-third-party-libraries-in-your-map-reduce-job/