原文发布于微信公众号:腾讯云存储(关注有惊喜)java
使用场景node
ElasticSearch是一款开源的很是火爆的文档索引引擎, 大小公司都比较青睐的一款作日志检索、分析、查询的工具。apache
可是ElasticSearch的数据依靠本地磁盘来作存储,虽然有三副本机制来保障数据的可靠性,可是磁盘的容量毕竟有限,若是但愿保留更长时间的历史数据,如30天至半年的数据,ElasticSearch的本地存储就显得捉襟见肘了。服务器
为了更好的知足历史数据的保存和检索,推荐一种很是靠谱的存储解决方案:ES + CHDFS。微信
云 HDFS(Cloud HDFS,CHDFS)是腾讯云存储团队新推出的一款彻底兼容HDFS协议,主要解决大数据场景下海量数据存储和数据分析,可以为大数据用户在无需更改现有代码的基础上,将本地自建的 HDFS 文件系统无缝迁移至CHDFS 上。能够将ES中的历史索引数据移动到CHDFS保存。app
接下来,咱们将一步一步地教您如何打通ES到CHDFS的数据流。elasticsearch
准备工做ide
在开始前,须要作如下几件事情:函数
1. 搭建hadoop环境,2.x和3.x都可。也可使用腾讯云EMR套件,省时省力;工具
2. 安装ES-hadoop插件,做者下载的是elasticsearch-hadoop-7.4.2.jar(点击下载),下载后将插件安装到hadoop组件的每台服务器上的classpath中(可使用java classpath命令查看);
3. 下载CHDFS插件,而且配置好CHDFS的插件(查看详情);
4. 建立CHDFS文件系统并配置好权限组和挂载点(查看详情);
当上面4个步骤均准备成功,恭喜你,离成功愈来愈近了。
编写备份代码
编写MapReduce程序,编写本身的Mapper,示例:
package org.chdfs.es_chdfs;import org.apache.hadoop.io.Text;import org.apache.hadoop.mapreduce.Mapper;import org.elasticsearch.hadoop.mr.LinkedMapWritable;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.io.IOException;class TestMapper extends Mapper<Text, LinkedMapWritable, Text, LinkedMapWritable> { private static final Logger LOG = LoggerFactory.getLogger(TestMapper.class); @Override protected void setup(Context context) throws IOException, InterruptedException { super.setup(context); } @Override protected void map(Text key, LinkedMapWritable value, Context context) throws IOException, InterruptedException { context.write(key, value); } @Override protected void cleanup(Context context) throws IOException, InterruptedException { super.cleanup(context); }}
编写Main函数,指定ES的实例及索引,示例代码:
package org.chdfs.es_chdfs;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.Path;import org.apache.hadoop.io.Text;import org.apache.hadoop.mapreduce.Job;import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;import org.elasticsearch.hadoop.mr.EsInputFormat;import org.elasticsearch.hadoop.mr.LinkedMapWritable;import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class EsToCHDFS { private static Logger LOG = LoggerFactory.getLogger(EsToCHDFS.class); public static void main(String[] args) { try { Configuration conf = new Configuration(); conf.setBoolean("mapred.map.tasks.speculative.execution", false); conf.setBoolean("mapred.reduce.tasks.speculative.execution", false); //ElasticSearch节点 conf.set("es.nodes", "10.0.1.11:9200"); //ElaticSearch 索引 conf.set("es.resource", "logstash-2019.11.29-000001"); if (args.length != 1) { LOG.error("error : " + args.length); System.exit(1); } Job job = Job.getInstance(conf, " EsToCHDFS "); job.setJarByClass(EsToCHDFS.class); job.setInputFormatClass(EsInputFormat.class); job.setMapperClass(TestMapper.class); job.setMapOutputKeyClass(Text.class); job.setMapOutputValueClass(LinkedMapWritable.class); FileOutputFormat.setOutputPath(job, new Path(args[0])); System.out.println(job.waitForCompletion(true)); } catch (Exception e) { LOG.error(e.getMessage(), e); } }}
编译代码生成jar包,例如es-chdfs-0.0.1-SNAPSHOT.jar
备份数据
当生成好jar包以后,在hadoop环境执行启动job命令, 例如:
hadoop jar es-chdfs-0.0.1-SNAPSHOT.jar org.chdfs.es_chdfs.E2HJob01 ofs://f4mnighxmwd-tiW9.chdfs.ap-beijing.myqcloud.com/e2h
其中,指定CHDFS的存储路径,
ofs://f4mnighxmwd-tiW9.chdfs.ap-beijing.myqcloud.com/e2h
注意:因为mapreduce的限制,须要确保e2h目录是不存在的。
查看效果
提交MapReduce后,能够查看hadoop监控页面观察做业是否正常结束。
若是正常结束后,能够查看CHDFS上的文件是否有生成。若是有看到相似以下的显示,恭喜你,成功完成ES到CHDFS的数据转储。
数据分析
备份成功后,能够释放ElasticSearch上历史数据,极大节省了ElasticSearch上的存储成本。
CHDFS能够无缝对接各类主流的大数据套件,如Spark、hive、tez、presto、MapReduce、腾讯云EMR等。数据落地到CHDFS后,能够轻松高效的使用常见大数据组件来进行数据的进一步分析,为客户创造更多的价值。
关注腾讯云 掌握更多云技术
点击领取:COS限时1元礼包!