【问题标题】:specifying own inputformat for streaming job为流式作业指定自己的输入格式
【发布时间】:2012-02-09 05:41:49
【问题描述】:

我定义了自己的输入格式如下,以防止文件拆分:

import org.apache.hadoop.fs.*;
import org.apache.hadoop.mapred.TextInputFormat;

public class NSTextInputFormat extends TextInputFormat {
    @Override
    protected boolean isSplitable(FileSystem fs, Path file) {
        return false;
    }
}

我使用 Eclipse 将它编译成一个类 NSTextInputFormat.class。我将此类复制到启动作业的客户端。我使用以下命令启动作业并将上面的类作为输入格式传递。

hadoop jar $HADOOP_HOME/hadoop-streaming.jar -Dmapred.job.queue.name=unfunded -input 24222910/framefile -input 24225109/framefile -output Output -inputformat NSTextInputFormat -mapper ExtractHSV -file ExtractHSV -file NSTextInputFormat.class -numReduceTasks 0

这失败了: -inputformat:找不到类:NSTextInputFormat 流式传输作业失败!

我将 PATH 和 CLASSPATH 变量设置为包含 NSTextInputFormat.class 的目录,但这仍然不起作用。对此的任何指示都会有所帮助。

【问题讨论】:

    标签: hadoop mapreduce


    【解决方案1】:

    如果您不熟悉 Java,这里有一些陷阱可以帮助您。

    -inputformat(以及其他需要类名的命令行选项)需要一个完全限定的类名,否则它需要在某个 org.apache.hadoop... 命名空间中找到该类。所以你必须在你的 .java 文件中包含一个包名

    package org.example.hadoop;
    
    import org.apache.hadoop.fs.*;
    import org.apache.hadoop.mapred.TextInputFormat;
    
    public class NSTextInputFormat extends TextInputFormat {
        @Override
        protected boolean isSplitable(FileSystem fs, Path file) {
            return false;
        }
    }
    

    并在命令行中指定全名:

    -inputformat org.example.hadoop.NSTextInputFormat
    

    当您构建 jar 文件时,.class 文件还必须位于与包名称对应的目录结构中。我确定这是 Java Packaging 101,但如果您使用的是 Hadoop Streaming,那么您可能一开始就不太熟悉 Java。将-d 选项传递给javac 将告诉它将输入文件编译为与包名匹配的目录中的.class 文件。

    javac -classpath `hadoop classpath` -d ./output NSTextInputFormat.java
    

    编译后的 .class 文件将写入./output/org/example/hadoop/NSTextInputFormat.class。您将需要创建output 目录,但将为您创建其他子目录。然后可以像这样创建 jar 文件:

    jar cvf myjar.jar -C ./output/ .
    

    你应该会看到一些类似这样的输出:

    added manifest
    adding: org/(in = 0) (out= 0)(stored 0%)
    adding: org/example/(in = 0) (out= 0)(stored 0%)
    adding: org/example/hadoop/(in = 0) (out= 0)(stored 0%)
    adding: org/example/hadoop/NSTextInputFormat.class(in = 372) (out= 252)(deflated 32%)
    

    【讨论】:

      【解决方案2】:

      将输入格式和映射器类捆绑到一个jar(myjar.jar)中,并在命令行中添加-libjars myjar.jar选项:

      hadoop jar $HADOOP_HOME/hadoop-streaming.jar \
         -libjars myjar.jar \
         -Dmapred.job.queue.name=unfunded \\
         -input 24222910/framefile \
         -input 24225109/framefile \
         -output Output \
         -inputformat NSTextInputFormat \
         -mapper ExtractHSV \
         -numReduceTasks 0
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-27
        • 2015-05-03
        • 2019-05-30
        • 2020-04-27
        • 2021-06-09
        相关资源
        最近更新 更多