【原创】MapReduce备份Elasticsearch数据到HDFS(JAVA)
一、环境: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)的更多相关文章
- 使用MapReduce将mysql数据导入HDFS
package com.zhen.mysqlToHDFS; import java.io.DataInput; import java.io.DataOutput; import java.io.IO ...
- kafka消费者实时消费数据存入hdfs java scalca 代码
hadoop-client依赖很乱 调试很多次cdh版本好多jar没有 用hadoop2.7.3可以 自定义输出流的池子进行流管理 public void writeLog2HDFS(String p ...
- Hbase使用MapReduce编程导出数据到HDFS
废话少说,直接上代码! package cn.com.oozie.demo; import java.io.IOException; import org.apache.hadoop.conf.C ...
- elasticsearch数据备份还原
elasticsearch数据备份还原 1.在浏览器中运行http://XXX.XXX.XXX.XXX:9200/_flush,确保索引数据能保存到硬盘中. 2.原数据的备份.主要是elasticse ...
- 实际使用Elasticdump工具对Elasticsearch集群进行数据备份和数据还原
文/朱季谦 目录 一.Elasticdump工具介绍 二.Elasticdump工具安装 三.Elasticdump工具使用 最近在开发当中做了一些涉及到Elasticsearch映射结构及数据导出导 ...
- 【原创】大叔经验分享(26)hive通过外部表读写elasticsearch数据
hive通过外部表读写elasticsearch数据,和读写hbase数据差不多,差别是需要下载elasticsearch-hadoop-hive-6.6.2.jar,然后使用其中的EsStorage ...
- Hadoop 中利用 mapreduce 读写 mysql 数据
Hadoop 中利用 mapreduce 读写 mysql 数据 有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...
- HDFS Java API的使用举例
HDFS是Hadoop应用程序使用的主要分布式存储.HDFS集群主要由管理文件系统元数据的NameNode和存储实际数据的DataNodes组成,HDFS架构图描述了NameNode,DataNode ...
- hadoop2的mapreduce操作hbase数据
1.从hbase中取数据,再把计算结果插入hbase中 package com.yeliang; import java.io.IOException; import org.apache.hadoo ...
随机推荐
- msp430项目编程07
msp430中项目---简单计算器 1.扫描键盘工作原理 2.电路原理说明 3.代码(显示部分) 4.代码(功能实现) 5.项目总结 msp430项目编程 msp430入门学习
- HDU 5667 Sequence
指数有递推式,可以通过矩阵快速幂来求解.再用下面这公式快速幂取模即可. (C是素数) #include<cstdio> #include<cstring> #include&l ...
- 使用fastjson将list、map转换成json,出现$ref
这是转换时出现的问题情况( map >> json ) 引用是通过"$ref"来表示的 引用 描述 "$ref":".." 上一 ...
- LUA协程复用
-----协程复用根函数 local function routine(fun, args) while (fun) do fun, args = coroutine.yield(fun(table. ...
- cocos2d-x进化为2.5D的一些想法
首先我得说Unity3D已经做的非常好了,搞这些东西意义真心不大.详细Unity3D有什么优势我之前也写过两篇文章来阐述自己的想法. 假设我的下一份工作是U3D的话,预计我就不会 ...
- vue 自定义 移动端筛选条件
1.创建组件 components/FilterBar/FilterBar.vue <template> <div class="filterbar" :styl ...
- Native进程之Trace原理(转)——可直接输出某进程的栈帧——debuggerd
一. 概述 当发生ANR(Application Not Response,对于Java进程可通过kill -3向目标进程发送信号SIGNAL_QUIT, 输出相应的traces信息保存到目录/dat ...
- SpringBoot项目报错Cannot determine embedded database driver class for database type NONE
原因: Cannot determine embedded database driver class for database type NONE 这是因为spring boot默认会加载org.s ...
- 用bis和bic实现位级操作
20世纪70年代末至80年代末,DigitalEquipment的VAX计算机是一种非常流行的机型.它没有布尔运算AND和OR指令,仅仅有bis(位设置)和bic(位清除)这两种指令.两种指令的输入都 ...
- 深入分析JavaWeb Item13 -- jsp指令具体解释
一.JSP指令简单介绍 JSP指令(directive)是为JSP引擎而设计的.它们并不直接产生不论什么可见输出,而仅仅是告诉引擎怎样处理JSP页面中的其余部分. 在JSP 2.0规范中共定义了三个指 ...