我正在尝试将自定义(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 找到我的分区器?