使用hadoop MR处理数据导入Elasticsearch

我的hadoop版本hadoop-2.6.5。我的Es版本elasticsearch-6.4.3。首先保证你的hadoop集群可以跑wordcount例子。

以下为pom文件,注意这里要加上<scope>provided</scope>,否则会出现以下错误

org.apache.hadoop.mapred.YarnChild: Error running child : java.lang.Error: Multiple ES-Hadoop versions detected in the classpath; please use only one
jar:file:/usr/local/hadoop/hadoop-2.6.5/share/hadoop/yarn/lib/elasticsearch-hadoop-6.4.3.jar
jar:file:/home/bigdata/tmp/nm-local-dir/usercache/root/appcache/application_1551077535613_0047/filecache/10/job.jar/job.jar

<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch-hadoop</artifactId>
    <version>6.4.3</version>
    <scope>provided</scope>
</dependency>

接下来需要把elasticsearch-hadoop-6.4.3.jar,这个jar包放入到hadoop目录下的yarn的lib下

我的lib位置为/usr/local/hadoop/hadoop-2.6.5/share/hadoop/yarn/lib

必须放入,必须放入,必须放入!!!否则会出现以下错误

org.apache.hadoop.yarn.exceptions.YarnRuntimeException: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class org.elasticsearch.hadoop.mr.EsOutputFormat not found

 

接下来上代码

public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
    Configuration conf = new Configuration();
    conf.setBoolean("mapred.map.tasks.speculative.execution", false);
    conf.setBoolean("mapred.reduce.tasks.speculative.execution", false);
    conf.set("es.nodes", "localhost:9200");
    conf.set("es.resource", "my_index/my_type");
    conf.set("es.mapping.id", "id");
    conf.set("es.input.json", "yes");

    Job job = Job.getInstance(conf, "hadoop es write test");
    job.setJarByClass(HdfsToES.class);
    job.setMapperClass(HdfsToES.MyMapper.class);

    job.setInputFormatClass(TextInputFormat.class);
    job.setOutputFormatClass(EsOutputFormat.class);

    job.setMapOutputKeyClass(NullWritable.class);
    job.setMapOutputValueClass(Text.class);

    // 设置输入路径
    FileInputFormat.setInputPaths(job, new Path
            ("hdfs://node01:8020/xxxx/xxxx.json"));
    job.waitForCompletion(true);
}

 

 public static class MyMapper extends Mapper<Object, Text, NullWritable, Text> {
        public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
                JSONObject jsonObject2 = new JSONObject();
                
                jsonObject2.put("id","9527");
                jsonObject2.put("name","盖伦");
                jsonObject2.put("age,"18");


                Text valueout = new Text();
                valueout.set(jsonObject2.toJSONString().trim());
                context.write(NullWritable.get(), valueout);
            }
        }
    }

以下为错误展示:

org.apache.hadoop.mapred.YarnChild: Exception running child : org.elasticsearch.hadoop.serialization.EsHadoopSerializationException: org.codehaus.jackson.JsonParseException: Unexpected character ('c' (code 99)): was expecting double-quote to start field name

出现以上错误请使用job.setMapOutputValueClass(Text.class);

不要使用job.setMapOutputValueClass(BytesWritable.class);

或者job.setMapOutputValueClass(LinkedMapWritable.class);

 

 

 

org.apache.hadoop.mapred.YarnChild: Exception running child : java.lang.RuntimeException: java.lang.NoSuchMethodException: org.apache.hadoop.io.ArrayWritable.<init>()

或者

org.elasticsearch.hadoop.serialization.EsHadoopSerializationException: org.codehaus.jackson.JsonParseException: Unexpected character ('b' (code 98)): expected a valid value (number, String, array, object, 'true', 'false' or 'null')
 at [Source: [B@69c79f09; line: 1, column: 3]

出现以上错误请使用job.setMapOutputValueClass(Text.class);不要使用LinkedMapWritable

使用json存放数据(我是用的alibaba的fastjson),

然后Text valueout = new Text();
                valueout.set(jsonObject2.toJSONString().trim());
                context.write(NullWritable.get(), valueout);

 

出现错误不要着急,更不要盲目的反复,反复,反复。试验csdn博主给的解决方式,往往版本不同,环境不同,解决方法就不一样。别人适用的解决方法并不适合你的情况。多查资料,多动脑

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值