1

MapReduce ストリーミング ジョブにカスタム (Java) パーティショナーを接続しようとしています。私はこのコマンドを使用しています:

../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 でパーティショナーを見つけるにはどうすればよいですか?

4

1 に答える 1

2

-libjars オプションは、サードパーティの JAR をリモート マップで使用できるようにし、JVM のタスクを削減します。ただし、これらと同じサードパーティ JAR をクライアント JVM (hadoop jar コマンドを実行したときに作成される JVM) で使用できるようにするには、HADOOP_CLASSPATH 変数で指定する必要があります。

$ export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:./NumericPartitioner.jar

../bin/hadoop jar ../contrib/streaming/hadoop-streaming-1.2.1.jar \ -libjars ${HADOOP_CLASSPATH}-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

于 2013-11-23T19:02:32.030 に答える