hadoop流的命令行

hadoop流的命令行,hadoop,hadoop-streaming,Hadoop,Hadoop Streaming,我正在尝试使用hadoop流媒体,我有一个java类用作映射器。为了简化问题,让我们假设java代码如下所示: import java.io.* ; class Test { public static void main(String args[]) { try { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); Str

我正在尝试使用hadoop流媒体,我有一个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] -文件命令行选项。我需要用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/user/abhattac/output

上面的命令不起作用。任务日志中的错误消息为:

标准测井曲线

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)

由于hadoop流只是通过stdin将工作转移到命令行可执行文件中,所以您可以像在本地一样在Test.class上运行“java Test”。不需要打包到罐子里

我自己使用您的代码成功运行了此操作:

hadoop jar hadoop-streaming.jar -file Test.class -mapper 'java Test' -input /input -output /output
SelimN是对的,这是一种非常奇怪的方式,因为您也可以编写一个本机java映射器


当您想使用脚本语言(如bash或python)而不是使用Java时,通常会使用流式处理。

为什么要将hadoop流式处理与Java结合使用?Hadoop流式处理通常在使用不同于Java的语言编写map/reduce函数时使用。