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