Java 亚马逊Hadoop 2.4+;Avro 1.77:找到接口org.apache.hadoop.mapreduce.TaskAttemptContext,但应为类

Java 亚马逊Hadoop 2.4+;Avro 1.77:找到接口org.apache.hadoop.mapreduce.TaskAttemptContext,但应为类,java,hadoop,amazon-s3,avro,amazon-emr,Java,Hadoop,Amazon S3,Avro,Amazon Emr,我正在尝试在EMR上运行以下代码,并给出了前面提到的异常。有人知道会出什么问题吗?我正在使用avro-tools-1.77编译模式 经过一点研究,我开始觉得这可能是一个avro问题,可以通过使用Maven编译和编辑依赖项或将amazon hadoop版本更改为以前的版本来解决。但是,我从未使用过Maven,更改hadoop版本会弄乱我的许多其他代码 public class MapReduceIndexing extends Configured implements Tool{ static

我正在尝试在EMR上运行以下代码,并给出了前面提到的异常。有人知道会出什么问题吗?我正在使用avro-tools-1.77编译模式

经过一点研究,我开始觉得这可能是一个avro问题,可以通过使用Maven编译和编辑依赖项或将amazon hadoop版本更改为以前的版本来解决。但是,我从未使用过Maven,更改hadoop版本会弄乱我的许多其他代码

public class MapReduceIndexing extends Configured implements Tool{
static int number_of_documents;
static DynamoStorage ds = new DynamoStorage();  

public static class IndexMapper extends Mapper<AvroKey<DocumentSchema>, NullWritable, Text, IndexValue>{
    public void map(AvroKey<DocumentSchema> key, NullWritable value, Context context) throws IOException, InterruptedException {

        System.out.println("inside map start");

        //some mapper code e.g.
        for(String word : all_words.keySet()){
            context.write(new Text(word), iv);              
        }
        System.out.println("inside map end");
    }
}


public static class IndexReducer extends Reducer<Text, IndexValue, AvroKey<CharSequence>, AvroValue<Integer>> {

    @Override
    public void reduce(Text key, Iterable<IndexValue> iterable_values, Context context) throws IOException, InterruptedException {
        System.out.println("inside reduce start");
        //some reducer code
        System.out.println("inside reduce end");
    }
}


public int run(String[] args) throws Exception {        
    Configuration conf = new Configuration();       
    Job job = new Job(conf, "indexing");
    job.setJarByClass(MapReduceIndexing.class);
    job.setJobName("Making inverted index");

    FileInputFormat.setInputPaths(job, new Path(args[0]));
    FileOutputFormat.setOutputPath(job, new Path(args[1]));

    job.setInputFormatClass(AvroKeyInputFormat.class);
    job.setMapperClass(IndexMapper.class);
    AvroJob.setInputKeySchema(job, DocumentSchema.getClassSchema());
    job.setMapOutputKeyClass(Text.class);
    job.setMapOutputValueClass(IndexValue.class);

    job.setOutputFormatClass(AvroKeyValueOutputFormat.class);
    job.setReducerClass(IndexReducer.class);
    AvroJob.setOutputKeySchema(job, Schema.create(Schema.Type.STRING));
    AvroJob.setOutputValueSchema(job, Schema.create(Schema.Type.INT));

    return (job.waitForCompletion(true) ? 0 : 1);
}


public static void main(String[] args) throws Exception {
    //setting input and output directories

    AWSCredentials credentials = new BasicAWSCredentials("access key", "secret key");
    AmazonS3 s3 = new AmazonS3Client(credentials);      
    ObjectListing object_listing = s3.listObjects(new ListObjectsRequest().withBucketName(args[2]));
    number_of_documents = object_listing.getObjectSummaries().size();

    int res = ToolRunner.run(new MapReduceIndexing(), args);
    System.exit(res);
}}
公共类MapReduceIndexing扩展配置的工具{
文档的静态整数编号;
静态DynamoStorage ds=新DynamoStorage();
公共静态类IndexMapper扩展映射器{
公共void映射(AvroKey键、空可写值、上下文)引发IOException、InterruptedException{
System.out.println(“内部映射启动”);
//一些映射程序代码,例如。
for(字符串单词:所有单词.keySet()){
上下文。写(新的文本(单词),四);
}
System.out.println(“内部映射结束”);
}
}
公共静态类IndexReducer扩展了Reducer{
@凌驾
public void reduce(文本键、Iterable Iterable_值、上下文上下文)引发IOException、InterruptedException{
System.out.println(“内部还原启动”);
//一些减速机代码
System.out.println(“内缩端”);
}
}
公共int运行(字符串[]args)引发异常{
Configuration conf=新配置();
Job Job=新作业(conf,“索引”);
job.setJarByClass(MapReduceIndexing.class);
job.setJobName(“制作反向索引”);
setInputPaths(作业,新路径(args[0]);
setOutputPath(作业,新路径(args[1]);
setInputFormatClass(AvroKeyInputFormat.class);
setMapperClass(IndexMapper.class);
setInputKeySchema(作业,DocumentSchema.getClassSchema());
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IndexValue.class);
setOutputFormatClass(AvroKeyValueOutputFormat.class);
job.setReducerClass(IndexReducer.class);
setOutputKeySchema(作业,Schema.create(Schema.Type.STRING));
setOutputValueSchema(作业,Schema.create(Schema.Type.INT));
返回(job.waitForCompletion(true)?0:1;
}
公共静态void main(字符串[]args)引发异常{
//设置输入和输出目录
AWSCredentials credentials=新的基本WSCredentials(“访问密钥”、“密钥”);
AmazonS3 s3=新的AmazonS3客户端(凭据);
ObjectListing object_listing=s3.listObjects(新的ListObjectsRequest().withBucketName(args[2]);
文档数=对象列表。getObjectSummaries().size();
int res=ToolRunner.run(新的MapReduceIndexing(),args);
系统退出(res);
}}

检查avro工具是否在编译类路径上。它包括一个
org.apache.hadoop.mapreduce.TaskAttemptContext
,它可能与jar和/或集群中的版本冲突。如果出于某种原因您需要包含avro工具,那么您必须下载一个针对您的Hadoop版本编译的版本(Cloudera在他们的版本中有这个,但我不确定在哪里为EMR获得它),或者自己编译avro工具