hadoop - 如何为 hadoop 流指定分区程序

标签 hadoop mapreduce hadoop-streaming hadoop-partitioning

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

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 \

然后我得到一个错误:找不到类。

你知道问题出在哪里吗?

最好的问候,

最佳答案

我遇到了同样的问题,但经过大量研究后设法解决了。

根本原因是 streaming-2.6.0.jar 使用 mapred api 而不是 mapreduce api。另外,实现 Partitioner 接口(interface),而不是扩展 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

关于hadoop - 如何为 hadoop 流指定分区程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13191468/

相关文章:

python - 管道命令有效,但Mapreduce无效

hadoop - 托管的 BigQuery 实例

performance - 在Where条件中使用变量时,Hive查询运行非常缓慢

hadoop - Hadoop reduce 函数的键输入是否完整?

hadoop - 不支持的操作异常 : Not implemented by the KosmosFileSystem FileSystem implementation

python-2.7 - 无法在 python 中使用 mapreduce

file - Hadoop 重命名文件

hadoop - 使用正则表达式的配置单元查询

hadoop - 如何在分布式缓存中使用 MapReduce 输出

hadoop - 在 hive 和 hadoop streaming-api 输出之间共享数据