一、环境:JAVA8,Elasticsearch-5.6.2,Hadoop-2.8.1
二、实现功能:mapreduce读elasticsearch数据、输出parquet文件、多输出路径
三、主要依赖
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version></version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-to-slf4j</artifactId>
<version></version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version></version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version></version>
</dependency>
<dependency>
<groupId>org.apache.parquet</groupId>
<artifactId>parquet-avro</artifactId>
<version></version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch-hadoop-mr</artifactId>
<version></version>
</dependency>
<dependency>
<groupId>org.apache.avro</groupId>
<artifactId>avro-mapred</artifactId>
<version></version>
</dependency>
四、主要代码
1.public class Job extends Configured implements Tool
 Configuration conf = getConf();
conf.set(ConfigurationOptions.ES_NODES,"127.0.0.1");
conf.set(ConfigurationOptions.ES_PORT,"9200");
conf.set(ConfigurationOptions.ES_RESOURCE, "index/type");
conf.set(ConfigurationOptions.ES_QUERY, "?q=*");
Job job = Job.getInstance(conf);
// ...(其他不重要的设置)
// set input
job.setInputFormatClass(EsInputFormat.class);
// set output
job.setOutputFormatClass(AvroParquetOutputFormat.class);
AvroParquetOutputFormat.setOutputPath(job, ${outputDir});
AvroParquetOutputFormat.setSchema(job, ${schema});
AvroParquetOutputFormat.setCompression(job, CompressionCodecName.SNAPPY);
AvroParquetOutputFormat.setCompressOutput(job, true);
AvroParquetOutputFormat.setBlockSize(job, ${size});
for(String name: ${list}){
  MultipleOutputs.addNamedOutput(job, name, AvroParquetOutputFormat.class, Void.class, GenericRecord.class);
}

2.public class Mapper extends Mapper<Text, MapWritable, ${KeyType}, ${ValueType}>

// 代码一般,略

3.public class Reducer extends Reducer<${KeyType}, ${ValueType}, Void, GenericRecord>

 private MultipleOutputs<Void, GenericRecord> multipleOutputs;

 @Override
protected void setup(Context context) throws IOException, InterruptedException {
multipleOutputs = new MultipleOutputs<>(context);
} @Override
public void reduce(${KeyType} key, Iterable<${ValueType}> values, Context context) throws IOException, InterruptedException {
for(${ValueType} value:values){
  GenericData.Record avroRecord = new GenericData.Record(ReflectData.get().getSchema(${实体类}.class));// value转实体类
avroRecord.put(${字段名}, ${字段值});
  // ... n多字段         
multipleOutputs.write(${Job中的name}, null, avroRecord, ${输出hdfs的绝对路径});
}
} @Override
protected void cleanup(Context context) throws IOException, InterruptedException {
multipleOutputs.close();
}
五、遇到的问题
1.查询字符串scroll失败
ConfigurationOptions.ES_QUERY,不需要urlEncode,否则反而会解析失败
例如查询带时间范围:?q=event_time:>=1509465600 AND event_time:<1512057600 2.多输出路径重复跑job,根路径冲突
Job中的输出路径不能存在否则会抛异常“org.apache.hadoop.mapred.FileAlreadyExistsException”,所以在创建Job时需要判断输出路径是否存在,存在则删除。
当时用MultipleOutputs时,Job中的${outputDir}和Reducer中的${输出hdfs的绝对路径}可以是完全不同的目录,Job中的输出路径会保存_matadata等不是很重要的数据(parquet本身包含这些信息),Reducer中的输出路径为想要的输出路径,路径下只保存parquet文件。
重复执行相同的Job时删除Job中的输出路径,主要数据没有影响,另外如果Reducer的输出路径有冲突可以在Job中循环删除。

【原创】MapReduce备份Elasticsearch数据到HDFS(JAVA)的更多相关文章

  1. 使用MapReduce将mysql数据导入HDFS

    package com.zhen.mysqlToHDFS; import java.io.DataInput; import java.io.DataOutput; import java.io.IO ...

  2. kafka消费者实时消费数据存入hdfs java scalca 代码

    hadoop-client依赖很乱 调试很多次cdh版本好多jar没有 用hadoop2.7.3可以 自定义输出流的池子进行流管理 public void writeLog2HDFS(String p ...

  3. Hbase使用MapReduce编程导出数据到HDFS

    废话少说,直接上代码! package cn.com.oozie.demo;  import java.io.IOException;  import org.apache.hadoop.conf.C ...

  4. elasticsearch数据备份还原

    elasticsearch数据备份还原 1.在浏览器中运行http://XXX.XXX.XXX.XXX:9200/_flush,确保索引数据能保存到硬盘中. 2.原数据的备份.主要是elasticse ...

  5. 实际使用Elasticdump工具对Elasticsearch集群进行数据备份和数据还原

    文/朱季谦 目录 一.Elasticdump工具介绍 二.Elasticdump工具安装 三.Elasticdump工具使用 最近在开发当中做了一些涉及到Elasticsearch映射结构及数据导出导 ...

  6. 【原创】大叔经验分享(26)hive通过外部表读写elasticsearch数据

    hive通过外部表读写elasticsearch数据,和读写hbase数据差不多,差别是需要下载elasticsearch-hadoop-hive-6.6.2.jar,然后使用其中的EsStorage ...

  7. Hadoop 中利用 mapreduce 读写 mysql 数据

    Hadoop 中利用 mapreduce 读写 mysql 数据   有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...

  8. HDFS Java API的使用举例

    HDFS是Hadoop应用程序使用的主要分布式存储.HDFS集群主要由管理文件系统元数据的NameNode和存储实际数据的DataNodes组成,HDFS架构图描述了NameNode,DataNode ...

  9. hadoop2的mapreduce操作hbase数据

    1.从hbase中取数据,再把计算结果插入hbase中 package com.yeliang; import java.io.IOException; import org.apache.hadoo ...

随机推荐

  1. vs2010 静态使用 opencv 2.46 库

    下载opencv2.46的库,假设解压到OpenCV246,设置如下: 在工程的c++的include目录下添加:OpenCV246\opencv\build\include 在工程的c++的lib目 ...

  2. 3469 [POI2008]BLO-Blockade

    洛谷—— P3469 [POI2008]BLO-Blockade 题目描述 There are exactly  towns in Byteotia. Some towns are connected ...

  3. 一个Tomcat最多支持多少用户的并发?

    ,也就是说同时支持 另外,在 Java 中每开启一个线程需要耗用 1MB 的 JVM 内存空间用于作为线程栈之用.Tomcat的最大并发数是可以配置的,实际运用中,最大并发数与硬件性能和CPU数量都有 ...

  4. java IO与NIO

    场景:IO适用于大而少,NIO适用于小而多 转载:https://www.cnblogs.com/kzfy/p/5063467.html 传统的socket IO中,需要为每个连接创建一个线程,当并发 ...

  5. Simics 破解 转

    http://www.eetop.cn/blog/html/28/1066428-type-bbs-view-myfav.html http://blog.sina.com.cn/s/blog_538 ...

  6. 【Todo】STAR面试法

    今天在面试培训的时候,接触到了STAR面试法. 觉得挺好的,用来准备非技术面试,还蛮全面的.所以可以多了解一下. 可以参考:http://www.hrloo.com/rz/73652.html

  7. atomic原子操作

    C++中对共享数据的存取在并发条件下可能会引起data race的未定义行为,需要限制并发程序以某种特定的顺序执行,有两种方式:1.使用mutex保护共享数据: 2.原子操作 原子操作:针对原子类型操 ...

  8. CSDN-markdown基本的语法说明

    文件夹 概述 简介Markdown CSDN Markdown的功能支持 标题 Setext形式 atx形式 区块引用 分隔线 强调 列表 无序列表 有序列表 注意事项 链接 自己主动链接 普通文本链 ...

  9. ZOJ 3316 Game 一般图最大匹配带花树

    一般图最大匹配带花树: 建图后,计算最大匹配数. 假设有一个联通块不是完美匹配,先手就能够走那个没被匹配到的点.后手不论怎么走,都必定走到一个被匹配的点上.先手就能够顺着这个交错路走下去,最后一定是后 ...

  10. oracle随机数

    1.从表中随机取记录 select * from (select * from staff order by dbms_random.random) where rownum < 4 表示从ST ...