1

私はJavaとHadoopの両方が初めてです。頻繁なペアを取得するための非常に単純なプログラムを試しています。

例えば

Input: My name is Foo. Foo is student. 
Intermediate Output:
    Map:
        (my, name): 1
        (name ,is): 1
        (is, Foo): 2 // (is, Foo) = (Foo, is) 
        (is, student)

したがって、最終的に頻繁なペアは になり(is ,Foo)ます。

擬似コードは次のようになります。

Map(Key: line_num, value: line)
words = split_words(line)
for each w in words:
     for each neighbor x:
          emit((w, x)), 1)

ここで私の鍵は 1 つではなく、ペアです。ドキュメントを読みながら、新しいキーごとにWritableComparableを実装する必要があることを読みました。

だから私はそれについて混乱しています。誰かがこのクラスについて説明できれば、それは素晴らしいことです. それが本当かどうかはわかりません。そうすれば、私は自分でそれを行う方法を見つけ出すことができます!

マッパーも何もコードも必要ありません...この WritableComparable が何をするのかを理解したいだけですか? 実際にキーを比較する WritableComparable のメソッドはどれですか? equals と compareTo はわかりますが、それについての説明が見つかりません。ノーコードでお願いします!ありがとう

EDIT 1:compareToでは、ペア(a、b)=(b、a)に対して0を返しますが、それでも同じリデューサーにはなりません。compareToメソッドにキー(b、a)を(a、b)にリセットする方法はありますか)またはまったく新しいキーを生成しますか?

編集 2: 新しいキーの生成についてはわかりませんが、compareTo の変更ロジックでは、正常に機能しました ..! みんな、ありがとう!

4

2 に答える 2

2

WritableComparableは、それを実装するクラスを2つのものにするインターフェイスです。つまり、Writableシリアル化などを介してネットワークに書き込みおよびネットワークから読み取ることができます。これは、キーまたは値として使用する場合に必要です。 Hadoopノード間で送信できます。またComparable、これは、特定のクラスの1つのオブジェクトを別のオブジェクトと比較する方法を示すメソッドを提供する必要があることを意味します。これは、Reducerがキーで整理するときに使用されます。

このインターフェースは、キーとなる独自のオブジェクトを作成する場合に必要です。InputFormatまた、Hadoopに付属しているものの1つを使用するのではなく、独自に作成する必要があります。これは(私の経験から)かなり難しい場合があります。特に、JavaとHadoopの両方を初めて使用する場合はそうです。

ですから、私があなたなら、もっと簡単な方法があるので、私はそれを気にしません。私はこれを使用しますTextInputFormat。これは、デフォルトInputFormatであるだけでなく、非常に使いやすく、理解しやすいものです。Text文字列に非常によく似たオブジェクトとして各キーを単純に発行できます。ただし、注意点があります。あなたが言ったよう"is Foo""Foo is"、同じキーであると評価される必要があります。String.compareToしたがって、単語のペアごとに、メソッドでキーとして渡す前に、アルファベット順に並べ替えます。そうすれば、繰り返しがないことが保証されます。

于 2012-09-27T19:13:40.443 に答える
0

これが問題のマッパークラスです。頻繁に使用される単語のペアのロジックは実装されていません。あなたはそれを探していなかったと思います。

public class MR {

public static class Mapper extends org.apache.hadoop.mapreduce.Mapper<LongWritable, Text, Text, LongWritable>
{
    public static int check (String keyCheck)
    {
        // logig to check key is frequent or not ?
        return 0;
    }
    @Override
    protected void map(LongWritable key, Text value, Context context)
            throws IOException, InterruptedException {
        Map< String, Integer> keyMap=new HashMap<String, Integer>();
        String line=value.toString();
        String[] words=line.split(" ");
        for(int i=0;i<(words.length-1);i++)
        {
            String mapkeyString=words[i]+","+words[i+1];
            // Logic to check is mapKeyString is frequent or not .
            int count =check(mapkeyString);
            keyMap.put(mapkeyString, count);

        }
        Set<Entry<String,Integer>> entries=keyMap.entrySet();
        for(Entry<String, Integer> entry:entries)
        {
            context.write(new Text(entry.getKey()), new LongWritable(entry.getValue()));
        }

    }

}
public static class Reduce extends Reducer<Text, LongWritable, Text, Text>
{

    protected void reduce(Text key, Iterable<LongWritable> Values,
            Context context)
            throws IOException, InterruptedException {

    }

}
public static void main(String[] args) {
    Configuration configuration=new Configuration();
    try {
        Job job=new Job(configuration, "Word Job");
        job.setMapperClass(Mapper.class);
        job.setReducerClass(Reduce.class);
        job.setInputFormatClass(TextInputFormat.class);
        FileInputFormat.setInputPaths(job, new Path(args[0]));
        FileOutputFormat.setOutputPath(job, new Path(args[1]));
        job.waitForCompletion(true);


    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

}
于 2012-09-28T07:54:28.790 に答える