【问题标题】:Command line for hadoop streaminghadoop 流的命令行
【发布时间】:2014-09-22 17:37:21
【问题描述】:

我正在尝试使用 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] -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 /user/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 流? Hadoop 流式处理通常用于用 Java 以外的语言编写 map/reduce 函数。

标签: hadoop hadoop-streaming


【解决方案1】:

由于 hadoop 流只是通过标准输入将工作推向命令行可执行文件,因此您可以像在本地一样在 Test.class 上运行“java Test”。无需打包到 jar 中。

我自己使用你的代码成功地运行了这个:

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

SelimN 说得对,这是一种非常奇怪的方法,因为您也可以编写本机 java 映射器。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-17
    • 2017-04-17
    相关资源
    最近更新 更多