我有一个自定义分区程序,如下所示:
import java.util.*;
import org.apache.hadoop.mapreduce.*;
public static class SignaturePartitioner extends Partitioner<Text,Text>
{
@Override
public int getPartition(Text key,Text value,int numReduceTasks)
{
return (key.toString().Split(' ')[0].hashCode() & Integer.MAX_VALUE) % numReduceTasks;
}
}
我设置了如下所示的hadoop流参数
-file SignaturePartitioner.java \
-partitioner SignaturePartitioner \
然后我收到一个错误:找不到类。
你知道这是什么问题吗?
最诚挚的问候,
答案 0 :(得分:1)
我遇到了同样的问题,但经过大量研究后成功解决了问题。
根本原因是流 - 2.6.0.jar使用mapred api而不是mapreduce api。另外,实现Partitioner接口,而不是扩展Partitioner类。以下对我有用:
import java.io.IOException;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.Partitioner;
import org.apache.hadoop.mapred.JobConf;`
public class Mypartitioner implements Partitioner<Text, Text> {`
public void configure(JobConf job) {}
public int getPartition(Text pkey, Text pvalue, int pnumparts)
{
if (pkey.toString().startsWith("a"))
return 0;
else return 1 ;
}
}
编译Mypartitioner,创建jar,然后
bin/hadoop jar share/hadoop/tools/lib/hadoop-streaming-2.6.0.jar
-libjars /home/sanjiv/hadoop-2.6.0/Mypartitioner.jar
-D mapreduce.job.reduces=2
-files /home/sanjiv/mymapper.sh,/home/sanjiv/myreducer.sh
-input indir -output outdir -mapper mymapper.sh
-reducer myreducer.sh -partitioner Mypartitioner
答案 1 :(得分:0)
-file SignaturePartitioner.java -partitioner SignaturePartitioner
-file选项将使Hadoop框架在所有必需节点上提供该文件。它需要指向类名而不是Java文件名。