使用-libjars的MapReduce流作业,自定义分区失败:“找不到类”

时间:2013-11-18 12:15:41

标签: java hadoop mapreduce streaming hadoop-partitioning

我正在尝试将自定义(java)分区程序附加到MapReduce流式传输作业。我正在使用这个命令:

../bin/hadoop jar ../contrib/streaming/hadoop-streaming-1.2.1.jar \
-libjars ./NumericPartitioner.jar -D mapred.map.tasks=12 -D mapred.reduce.tasks=36 \
-input /input -output /output/keys -mapper "map_threeJoin.py" -reducer "keycount.py" \
-partitioner newjoin.NumericPartitioner -file "map_threeJoin.py" \
-cmdenv b_size=6 -cmdenv c_size=6

重要的是文件NumericPartitioner.jar,它位于运行命令的同一文件夹中(从Hadoop根目录安装开始的级别)。这是它的代码:

package newjoin;
import java.util.*;
import java.lang.*;
import org.apache.hadoop.mapreduce.*;
import org.apache.hadoop.io.*;

public class NumericPartitioner extends Partitioner<Text,Text>
{
    @Override
    public int getPartition(Text key,Text value,int numReduceTasks)
    {
        return Integer.parseInt(key.toString().split("\\s")[0]) % numReduceTasks;
    }  
}

然而,当我尝试运行上述命令时,我得到:

-partitioner : class not found : newjoin.NumericPartitioner
Streaming Command Failed!

这里发生了什么,我怎样才能让mapReduce找到我的分区器?

1 个答案:

答案 0 :(得分:2)

-libjars选项是使您的第三方JAR可用于远程地图并减少任务JVM。 但是为了使这些相同的第三方JAR可用于客户端JVM(运行hadoop jar命令时创建的JVM),您需要在HADOOP_CLASSPATH变量中指定

$ export HADOOP_CLASSPATH = $ HADOOP_CLASSPATH:./ NumericPartitioner.jar

../ bin / hadoop jar ../contrib/streaming/hadoop-streaming-1.2.1.jar \ -libjars ${HADOOP_CLASSPATH} -D mapred.map.tasks = 12 -D mapred.reduce.tasks = 36 \ -input / input -output / output / keys -mapper“map_threeJoin.py”-reducer“keycount.py”\ -partitioner newjoin.NumericPartitioner -file“map_threeJoin.py”\ -cmdenv b_size = 6 -cmdenv c_size = 6