我正在尝试使用hadoop流,其中我有一个用作mapper的java类。为了简化问题,我们假设java代码如下:
import java.io.* ;
class Test {
public static void main(String args[]) {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input ;
while ((input = br.readLine()) != null) {
System.out.println(input) ;
}
} catch (IOException io) {
io.printStackTrace() ;
}
}
}
我可以将其编译为“javac Test.java”,从命令行运行它,如下所示:
[abhattac@eat1-hcl4014 java]$ cat a.dat
abc
[abhattac@eat1-hcl4014 java]$ cat a.dat | java Test
abc
[abhattac@eat1-hcl4014 java]
我们假设我有一个HDFS文件:a.dat
[abhattac@eat1-hcl4014 java]$ hadoop fs -cat /user/abhattac/a.dat
Abc
[abhattac@eat1-hcl4014 java]$ jar cvf Test.jar Test.class
added manifest
adding: Test.class(in = 769) (out= 485)(deflated 36%)
[abhattac@eat1-hcl4014 java]$
现在我尝试在hadoop流中使用(Test.java)作为映射器。我提供什么 [1] -mapper命令行选项。它应该如下吗? [2] -file命令行选项。我需要用Test.class制作一个jar文件吗?如果是这种情况,我是否需要包含MANIFEST.MF文件来指示主类?
我尝试了所有这些选项,但它们似乎都没有效果。任何帮助将不胜感激。
hadoop jar /export/apps/hadoop/latest/contrib/streaming/hadoop-streaming-1.2.1.45.jar -file Test.jar -mapper'java Test'-input /user/abhattac/a.dat-output /用户/ abhattac /输出
上面的命令不起作用。任务日志中的错误消息是:
stderr logs
Exception in thread "main" java.lang.NoClassDefFoundError: Test
Caused by: java.lang.ClassNotFoundException: Test
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
答案 0 :(得分:0)
由于hadoop流式传输只是将stdin工作转移到命令行可执行文件,你可以运行" java Test"在你的Test.class上就像在本地一样。没有必要打包到罐子里。
我使用您的代码成功运行了这个:
hadoop jar hadoop-streaming.jar -file Test.class -mapper 'java Test' -input /input -output /output
SelimN说得对,这是一个非常古怪的方式,因为你也可以编写一个原生的java映射器。
当您想使用bash或python等脚本语言而不是使用Java时,通常会使用Streaming。