Hadoop 为流作业指定自己的inputformat

Hadoop 为流作业指定自己的inputformat,hadoop,mapreduce,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) { retur

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

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将其编译成一个类nstputformat.class。我将这个类复制到一个客户机,从那里启动作业。我使用以下命令来启动作业并将上面的类作为inputformat传递

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

这并不是说: -inputformat:找不到类:NStInputFormat 流作业失败


我将PATH和CLASSPATH变量设置为包含NSTEMPUTFORMAT.class的目录,但这仍然不起作用。任何指向这一点的指针都会很有帮助。

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

如果您不熟悉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打包101,但是如果您使用的是Hadoop流媒体,那么您首先可能对Java不太熟悉。将
-d
选项传递到
javac
将告诉它将输入文件编译到与包名匹配的目录中的.class文件中

javac -classpath `hadoop classpath` -d ./output NSTextInputFormat.java
编译后的.class文件将被写入
/output/org/example/hadoop/nstemputformat.class
。您需要创建
输出
目录,但会为您创建其他子目录。然后可以这样创建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%)