2016-08-31 5 views
2

외부 속성 파일에서 차원을 가져 오는 동적 맵 축소 응용 프로그램을 만들려고합니다. 가장 큰 문제는 변수 등, 키가 복합되며 4 키의 어떤 숫자 3 키의 예를 들어 쌍, 쌍의 수 있습니다, 즉 사실에있다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)); 

} 

값은 나중에 좋은 논리를 갖습니다.

내 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

쓰기 가능한 개체를 키로 사용하려고합니다. mapreduce에서 키는 WritableComparable 인터페이스를 구현해야합니다. ArrayWritableWritable 인터페이스 만 구현합니다.

두 가지의 차이점은 comaprable 인터페이스는 mapreduce가 키를 올바르게 정렬하고 그룹화 할 수 있도록 compareTo 메소드를 구현해야한다는 것입니다.

+0

compareTo() 함수의 기능이 실제로 무엇인지 설명해 주실 수 있습니까? Btw 덕분에 멍청한 놈을 도와 주셔서 감사합니다 ... :) –

+0

글쎄 mapreduce는 키를 정렬하고 그룹화하는 방법을 알아야합니다. Javadocs의 설명은 https://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html에서 자세히 설명합니다. hadoop 소스 코드를 포함하여 인터넷에 도움이되는 많은 리소스가 있습니다. https://github.com/apache/hadoop/tree/trunk/hadoop-common-project/hadoop-common/src/main/java/ org/apache/hadoop/io. 따라서 키를 정렬하는 방법을 생각해야합니다. –