我正在努力解决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
但不幸的是,我又遇到了同样的错误。
如果你可以帮助我,那将是很棒的,因为我无法继续前进 没有克服这一点。
在期待中感谢你。
答案 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/