2014-09-22 65 views
0

我想用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) 
+0

你为什么在java中使用hadoop streaming?在使用不同于Java的语言编写map/reduce函数时,通常会使用Hadoop流式处理。 – SelimN 2014-09-23 00:08:52

回答

0

由于Hadoop的流只是铲通过标准输入工作提高到一个命令行可执行文件你可以在你的Test.class运行“的Java测试”像你这样的会在本地。没有必要打包成一个罐子。

我跑这个成功使用自己的代码:

hadoop jar hadoop-streaming.jar -file Test.class -mapper 'java Test' -input /input -output /output 

SelimN是正确的,这是一个非常奇怪的方式去了解它,虽然,因为你也可以同样被写入本地Java映射。

当您想要使用诸如bash或python之类的脚本语言而不是使用Java时,通常会使用流式处理。