【问题标题】:Writing Hadoop reduce output to Elasticsearch编写 Hadoop 减少对 Elasticsearch 的输出
【发布时间】:2016-12-20 16:50:31
【问题描述】:

我在理解如何将简单 Hadoop 的输出写回 Elasticsearch 时遇到了一些麻烦。

作业配置为:

job.setOutputFormatClass(EsOutputFormat.class);
job.setOutputKeyClass(NullWritable.class);
job.setOutputValueClass(MapWritable.class);

减速器做:

final DoubleWritable average = new DoubleWritable(sum / size);

final MapWritable output = new MapWritable();
output.put(key, average);
context.write(NullWritable.get(), output);

但我得到了这个(对我来说)莫名其妙的异常:

14/08/15 16:59:54 INFO mapreduce.Job: Task Id : attempt_1408106733881_0013_r_000000_2, Status : FAILED Error: 
  org.elasticsearch.hadoop.EsHadoopIllegalArgumentException: 
  [org.elasticsearch.hadoop.serialization.field.MapWritableFieldExtractor@5796fabe] cannot extract value from object [org.apache.hadoop.io.MapWritable@dcdb8e97]    
    at org.elasticsearch.hadoop.serialization.bulk.TemplatedBulk$FieldWriter.write(TemplatedBulk.java:49)   
    at org.elasticsearch.hadoop.serialization.bulk.TemplatedBulk.writeTemplate(TemplatedBulk.java:101)  
    at org.elasticsearch.hadoop.serialization.bulk.TemplatedBulk.write(TemplatedBulk.java:77)   
    at org.elasticsearch.hadoop.rest.RestRepository.writeToIndex(RestRepository.java:130)   
    at org.elasticsearch.hadoop.mr.EsOutputFormat$EsRecordWriter.write(EsOutputFormat.java:161)     
    at org.apache.hadoop.mapred.ReduceTask$NewTrackingRecordWriter.write(ReduceTask.java:558)

在 context.write() 调用中。

我有点困惑,你知道吗?

【问题讨论】:

    标签: java hadoop elasticsearch elasticsearch-hadoop


    【解决方案1】:

    原来我在作业配置中犯了一个错误。我添加了以下内容:

    configuration.set("es.mapping.id", "_id");
    

    没有在传出的 Mapwritable 中实际添加 _id 字段;这导致 ES 抛出异常。

    如果 MapWritableFleldExtractor 记录了它失败的字段,这将很有用。

    【讨论】:

      猜你喜欢
      • 2010-12-23
      • 1970-01-01
      • 2017-01-28
      • 2013-04-15
      • 2014-03-31
      • 1970-01-01
      • 2015-05-29
      • 1970-01-01
      • 2018-04-01
      相关资源
      最近更新 更多