我想用hadoop流式传输,其中有一个用作映射器的java类。为了使问题简单,让我们假设的Java代码如下所示:hadoop流式传输的命令行
[[email protected] java]$ cat a.dat
abc
[[email protected] java]$ cat a.dat | java Test
abc
[[email protected] 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”从命令行运行我们假设我在HDFS文件:a.dat
[[email protected] java]$ hadoop fs -cat /user/abhattac/a.dat
Abc
[[email protected] java]$ jar cvf Test.jar Test.class
added manifest
adding: Test.class(in = 769) (out= 485)(deflated 36%)
[[email protected] java]$
现在我尝试使用(Test.java)在Hadoop的数据流映射。我该如何提供 [1] -mapper命令行选项。它应该像以下一样吗? [2] - 文件命令行选项。我需要从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 - 输出/用户/ abhattac /输出
上述命令不起作用。在任务日志的错误消息是:
标准错误日志
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)
你为什么在java中使用hadoop streaming?在使用不同于Java的语言编写map/reduce函数时,通常会使用Hadoop流式处理。 – SelimN 2014-09-23 00:08:52