如何为hadoop流指定分区器

g0czyy6m  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(339)

我有一个自定义分区器,如下所示:

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 \

然后我得到一个错误:找不到类。
你知道有什么问题吗?
致以最诚挚的问候,

yquaqz18

yquaqz181#

我也面临着同样的问题,但经过大量的研究终于解决了。
根本原因是streaming-2.6.0.jar使用mapredapi而不是mapreduceapi。另外,实现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
8nuwlpux

8nuwlpux2#

-文件signaturepartitioner.java-partitioner signaturepartitioner
-file选项将使该文件在hadoop框架所需的所有节点上都可用。它需要指向类名而不是java文件名。

相关问题