1

以下のようなカスタムパーティショナーがあります。

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 \

その後、次のエラーが表示されます: クラスが見つかりません。

何が問題か知っていますか?

よろしくお願いします、

4

2 に答える 2

1

私は同じ問題に直面しましたが、多くの調査の結果、解決することができました。

根本的な原因は、streaming-2.6.0.jar が mapreduce api ではなく mapred 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
于 2015-04-07T05:52:30.300 に答える
0

-file SignaturePartitioner.java -partitioner SignaturePartitioner

-file オプションは、Hadoop フレームワークによって必要なすべてのノードでファイルを使用できるようにします。Java ファイル名ではなく、クラス名を指す必要があります。

于 2012-11-02T08:35:54.880 に答える