当前位置: 首页 > 知识库问答 >
问题:

hadoop流的命令行

姜楷
2023-03-14

我正在尝试使用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命令行选项。我需要制作一个jar文件Test.class?如果是这种情况,我需要包含MANIFEST.MF文件来指示主类吗?

我试了所有这些选项,但似乎都不起作用。任何帮助都将不胜感激。

hadoop jar /导出/应用程序/hadoop/最新/贡献/流/hadoop-流-1.2.1.45.jar -文件测试.jar映射器“java测试” -输入/用户/abhattac/a.dat -输出 /用户/abhattac/output

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

stderr日志

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)

共有1个答案

宇文曦
2023-03-14

由于hadoop streaming只是通过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流作业。例如,我运行了一个命令hadoop jarhadoop-streaming.jar-mappermap1.pyreducer.py-inputxx输出 /output1 但是我想使用第一步的输出作为第二步mapduce作业的输入,而不存储在hdfs中,也许输出为标准输出。有没有像linux管道一样的东西?比如hadoop jarhadoop-streamin

  • 目的 这篇文档的目的是帮助你快速完成单机上的Hadoop安装与使用以便你对Hadoop分布式文件系统(HDFS)和Map-Reduce框架有所体会,比如在HDFS上运行示例程序或简单作业等。 先决条件 支持平台 GNU/Linux是产品开发和运行的平台。 Hadoop已在有2000个节点的GNU/Linux主机组成的集群系统上得到验证。 Win32平台是作为开发平台支持的。由于分布式操作尚未在Wi

  • 目的 这篇文档的目的是帮助你快速完成单机上的Hadoop安装与使用以便你对Hadoop分布式文件系统(HDFS)和Map-Reduce框架有所体会,比如在HDFS上运行示例程序或简单作业等。 先决条件 支持平台 GNU/Linux是产品开发和运行的平台。 Hadoop已在有2000个节点的GNU/Linux主机组成的集群系统上得到验证。 Win32平台是作为开发平台支持的。由于分布式操作尚未在Wi

  • 我已经在单节点集群上安装了Hadoop-2.4.0。在启动dfs和yarn并执行jps之后,我将运行以下服务。 当我尝试执行以下命令时,我得到了一个错误

  • 如何从java文件运行hadoop命令下面: hadoop jar'/home/ashish/desktop/hadoop_basics/wordcount_program/WordCount.jar'WordCount/wordcounttutorial/input/wordcounttutorial/output 提前谢了。