2016-08-31 2 views
2

Ich versuche, eine Anwendung zur dynamischen Kartenreduzierung zu erstellen, die Dimensionen aus einer externen Eigenschaftendatei übernimmt. Das Hauptproblem liegt in der Tatsache, dass die Variablen, dh der Schlüssel zusammengesetzt sein wird und kann wie auch immer Zahlen, zB Paar 3 Schlüssel, Paar 4 Tasten, etc. seinArrayWritable als Schlüssel in Hadoop MapReduce

Mein Mapper:

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

} 

Die Werte werden später eine gute Logik haben.

Mein 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(); 
} 
} 

Der Fehler Ich erhalte:

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 

Jede Hilfe wäre sehr geschätzt.

Vielen Dank.

Antwort

1

Sie versuchen, ein Writable-Objekt als Schlüssel zu verwenden. In mapreduce muss der Schlüssel die WritableComparable Schnittstelle implementieren. ArrayWritable implementiert nur die Schnittstelle Writable.

Der Unterschied zwischen den beiden ist, dass die kompatible Schnittstelle erfordert, dass Sie eine compareTo Methode implementieren, damit Mapreduce die Schlüssel richtig sortieren und gruppieren kann.

+0

können Sie bitte erklären, was die Funktion einer compareTo() -Funktion eigentlich ist. Vielen Dank für die Hilfe eines Noob ... :) –

+0

Nun mapreduce muss wissen, wie Sie die Tasten bestellen und gruppieren möchten. Die Javadocs erklären im Detail zu vergleichen: https://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html. Es gibt viele Ressourcen im Internet, die Ihnen helfen können, einschließlich des Hadoop-Quellcodes: https://github.com/apache/hadoop/tree/trunk/hadoop-common-project/hadoop-common/src/main/java/ org/apache/hadoop/io. Sie müssen also darüber nachdenken, wie Ihr Schlüssel sortiert werden soll. –