2012-11-02 1 views
1

J'ai un partitionneur personnalisé comme ci-dessous:Comment spécifier le partitionneur pour Hadoop le streaming

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; 
    } 
} 

Je mets le paramètre de streaming Hadoop comme ci-dessous

-file SignaturePartitioner.java \ 
-partitioner SignaturePartitioner \ 

Je reçois une erreur: Classe introuvable .

Savez-vous quel est le problème?

Cordialement,

+0

écrire le nom complet de la classe, et non classname simple (com.company.SignaturePartitioner) – octo

Répondre

0

-file SignaturePartitioner.java -partitioner SignaturePartitioner

L'option -file va rendre le fichier disponible sur tous les nœuds requis par le cadre Hadoop. Il doit pointer sur le nom de la classe et non sur le nom du fichier Java.

+0

ce que je ai fait. mais j'ai une erreur: Class Not Found. –

1

J'ai fait face au même problème, mais j'ai réussi à résoudre après beaucoup de recherches.

La cause première est streaming-2.6.0.jar utilise l'API mapred et non l'API mapreduce. En outre, implémenter l'interface Partitioner et ne pas étendre la classe Partitioner. Ce qui suit a fonctionné pour moi:

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 ; 
    } 
    } 

compilez Mypartitioner, créez pot, puis,

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