2013-10-02 2 views
4

내 모든 프로그램은 hadoop의 새로운 MR1 인터페이스 (org.apache.hadoop.mapreduce)로 작성하므로 avro의 새로운 org.apache.avro.mapreduce도 사용하고 싶습니다. 그러나 그것은 나를 위해 작동하지 않습니다.AVRO org.apache.avro.mapreduce 인터페이스로 프로그래밍하는 방법은 무엇입니까?

프로그램은 avro 데이터를 입력 받아 출력합니다. 내 프로그램의 주된 아이디어는 avro wrapped key/value에 대한 hadoop의 Mapper와 Reducer를 하위 클래스 화하는 것입니다.

AvroJob.setInputKeySchema(job, NetflowRecord.getClassSchema()); 
    AvroJob.setOutputKeySchema(job, NetflowRecord.getClassSchema()); 

    job.setMapperClass(MyAvroMap.class); 
    job.setReducerClass(MyAvroReduce.class); 

    job.setInputFormatClass(AvroKeyInputFormat.class); 
    job.setOutputFormatClass(AvroKeyOutputFormat.class); 

    job.setMapOutputKeyClass(AvroKey.class); 
    job.setMapOutputValueClass(AvroValue.class); 

    job.setOutputKeyClass(AvroKey.class); 
    job.setOutputValueClass(NullWritable.class); 

MyAvroMap 및 MyAvroReduce 서브 클래스의 respectivly의 정의가 methioned NetflowRecord 내 아 브로 기록 클래스입니다

public static class MyAvroMap extends Mapper<AvroKey<NetflowRecord>, NullWritable, 
      AvroKey<CharSequence>, AvroValue<NetflowRecord>>{ ... } 

public static class MyAvroReduce extends Reducer<AvroKey<CharSequence>, AvroValue<NetflowRecord>, 
       AvroKey<NetflowRecord>, NullWritable>{ ... } 

같습니다 여기 내 직업 드라이버의 블록이다. 내가 하둡의와 브로의 소스 코드, 를 읽어 예외

java.lang.ClassCastException: class org.apache.avro.hadoop.io.AvroKey 

을 실행있어 내가 예외가 지도 키 WritableComparable의 서브 클래스 확인 JobConf에 의해 발생 된 것을 발견,이 (hadoop1.2.1 같은, line759)

WritableComparator.get(getMapOutputKeyClass().asSubclass(WritableComparable.class)); 

그러나 브로는 AvroKey 및 AvroValue가 하둡 * 쓰기 가능한 인터페이스를 하위없이 단순한 래퍼 것을 보여준다.

테스트를 거치지 않고도 오래된 매핑 된 인터페이스를 사용할 수 있다고 생각합니다.하지만 원하는 것은 아닙니다. 순수 org.apache.avro.mapreduce 인터페이스를 사용하여 프로그래밍에 대한 예제 또는 설명을 제공 할 수 있습니까? 감사합니다

,

야민

하드 검색 후

답변

4

, 내가 각 AvroKey 및 AvroValue 래퍼 작업 구성의 스키마 정의가 있어야합니다 알아낼이 패치 https://issues.apache.org/jira/browse/AVRO-593, 의 도움으로. 그게 내가 놓친거야. 여기

I 두 가지 옵션이

  1. , I는

    AvroJob 같이 CharSequence를위한 스키마를 정의하고, 맵퍼 출력 AvroJob이 스키마 선언해야 잔류 MyAvroMap 및 MyAvroReduce 변하지 않으면 .setMapOutputKeySchema (job, < "정의 된 스키마를위한 charsequence">); AvroJob.setMapOutputValueSchema (job, NetflowRecord.getClassSchema()); 텍스트/AvroValue, 나는

    job.setMapOutputKeyClass (Text.class) 같은 매퍼 출력 값에 대한 스키마 선언을 추가하기 만하면 같은 매퍼 출력 키/값을 변경하여

  2. ; AvroJob.setMapOutputValueSchema (job, NetflowRecord.getClassSchema());

mapreduce API를 사용하면 더 이상 AvroMapper와 AvroReducer를 하위 클래스로 만들 필요가 없습니다. 여기 코드에서 addtional 스키마 정의없이 option2를 구현합니다.

jamin

관련 문제