2016-08-31 12 views
2

外部プロパティファイルからディメンションを取るダイナミックマップリダクションアプリケーションを作成しようとしています。Hadoop MapReduceのキーとしてArrayWritable

public void map(AvroKey<flumeLogs> key, NullWritable value, Context context) throws IOException, InterruptedException{ 
    Configuration conf = context.getConfiguration(); 
    int dimensionCount = Integer.parseInt(conf.get("dimensionCount")); 
    String[] dimensions = conf.get("dimensions").split(","); //this gets the dimensions from the run method in main 

    Text[] values = new Text[dimensionCount]; //This is supposed to be my composite key 

    for (int i=0; i<dimensionCount; i++){ 
     switch(dimensions[i]){ 

     case "region": values[i] = new Text("-"); 
      break; 

     case "event": values[i] = new Text("-"); 
      break; 

     case "eventCode": values[i] = new Text("-"); 
      break; 

     case "mobile": values[i] = new Text("-"); 
     } 
    } 
    context.write(new StringArrayWritable(values), new IntWritable(1)); 

} 

:主な問題は、例えばなど3つのキー、4つのキーのペア、

マイマッパーのペア、変数はキーが複合になり、どんな数字であってもよい、すなわち、という事実にあります値は後で良い論理を持つでしょう。

マイStringArrayWritable:

public class StringArrayWritable extends ArrayWritable { 
public StringArrayWritable() { 
    super(Text.class); 
} 

public StringArrayWritable(Text[] values){ 
    super(Text.class, values); 
    Text[] texts = new Text[values.length]; 
    for (int i = 0; i < values.length; i++) { 
     texts[i] = new Text(values[i]); 
    } 
    set(texts); 
} 

@Override 
public String toString(){ 
    StringBuilder sb = new StringBuilder(); 

    for(String s : super.toStrings()){ 
     sb.append(s).append("\t"); 
    } 

    return sb.toString(); 
} 
} 

私は取得していますエラー:

Error: java.io.IOException: Initialization of all the collectors failed. Error in last collector was :class StringArrayWritable 
    at org.apache.hadoop.mapred.MapTask.createSortingCollector(MapTask.java:414) 
    at org.apache.hadoop.mapred.MapTask.access$100(MapTask.java:81) 
    at org.apache.hadoop.mapred.MapTask$NewOutputCollector.<init>(MapTask.java:698) 
    at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:770) 
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341) 
    at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:163) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at javax.security.auth.Subject.doAs(Subject.java:415) 
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1671) 
    at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158) 
Caused by: java.lang.ClassCastException: class StringArrayWritable 
    at java.lang.Class.asSubclass(Class.java:3165) 
    at org.apache.hadoop.mapred.JobConf.getOutputKeyComparator(JobConf.java:892) 
    at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.init(MapTask.java:1005) 
    at org.apache.hadoop.mapred.MapTask.createSortingCollector(MapTask.java:402) 
    ... 9 more 

任意の助けいただければ幸いです。

ありがとうございます。

答えて

1

書き込み可能オブジェクトをキーとして使用しようとしています。地図の縮小では、キーはWritableComparableインターフェイスを実装する必要があります。 ArrayWritableは、Writableインターフェイスのみを実装しています。

2つの違いは、comaprableインターフェイスでは、compareToメソッドを実装する必要があるため、mapreduceがキーを正しく並べ替えてグループ化できることです。

+0

実際にはcompareTo()関数の機能について説明してください。 Btwはnoobを助けてくれてありがとう... :) –

+0

よくmapreduceはどのようにキーを注文し、グループ化したいのかを知る必要があります。 Javadocの説明は、https://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.htmlで詳細に比較されています。ハープープのソースコードを含む、ネット上にはたくさんのリソースがあります:https://github.com/apache/hadoop/tree/trunk/hadoop-common-project/hadoop-common/src/main/java/ org/apache/hadoop/io。だから、どのようにあなたのキーをソートするかについて考える必要があります。 –

関連する問題