为流作业指定自己的inputformat

时间:2012-02-09 05:41:49

标签: hadoop mapreduce

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

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。我将此类复制到启动作业的客户端。我使用以下命令启动作业并将上面的类作为inputformat传递。

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

这失败说: -inputformatt:找不到类:NSTextInputFormat 流媒体工作失败!

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

2 个答案:

答案 0 :(得分:4)

如果您不熟悉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%)

答案 1 :(得分:3)

将输入格式和映射器类捆绑到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