专栏首页腾讯云存储大厂程序员为了更好的满足历史数据的保存和检索往往选择这种神操作!
原创

大厂程序员为了更好的满足历史数据的保存和检索往往选择这种神操作!

原文发布于微信公众号:腾讯云存储(关注有惊喜)

使用场景

ElasticSearch是一款开源的非常火爆的文档索引引擎, 大小公司都比较青睐的一款做日志检索、分析、查询的工具。

但是ElasticSearch的数据依靠本地磁盘来做存储,虽然有三副本机制来保障数据的可靠性,但是磁盘的容量毕竟有限,如果希望保留更长时间的历史数据,如30天至半年的数据,ElasticSearch的本地存储就显得捉襟见肘了。

为了更好的满足历史数据的保存和检索,推荐一种非常靠谱的存储解决方案:ES + CHDFS。

云 HDFS(Cloud HDFS,CHDFS)是腾讯云存储团队新推出的一款完全兼容HDFS协议,主要解决大数据场景下海量数据存储和数据分析,能够为大数据用户在无需更改现有代码的基础上,将本地自建的 HDFS 文件系统无缝迁移至CHDFS 上。可以将ES中的历史索引数据移动到CHDFS保存。

接下来,我们将一步一步地教您如何打通ES到CHDFS的数据流。

准备工作

在开始前,需要做以下几件事情:

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元礼包

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 使用 SCF 自动刷新被 CDN 缓存的 COS 资源

    本实践将引导您在使用腾讯云对象存储 COS 上传对象时,借助云函数 SCF 实现自动刷新在 CDN 上指定的缓存文件,让其自动获取到更新后的资源。

    云存储
  • 使用腾讯云函数SCF快速解压对象存储COS中的ZIP文件

    在本实践中,我们用到了云函数 SCF 和对象存储 COS。假定用户上传到 COS 的 zip 文件需要进行解压缩,并以 zip 包名作为文件夹名,回传到 COS...

    云存储
  • 对象存储 COS 和云函数 SCF 结合的轻应用及其技术原理

    ? 扫描海报二维码 即可预约直播,开播前我们将会为您发送直播提醒。 7 月 17 日(本周五)19:00——Tencent Serverless Hours ...

    云存储
  • MongoDB导入Shapefile数据

    两种解决方案: 一、将整个shapefile转为GeoJSON然后直接导入mongoDB数据库中 首先,将shapefile数据转为WGS84地理坐标,...

    卡尔曼和玻尔兹曼谁曼
  • wxml、wxss、js 引入外部文件的方法

    import可以在文件中使用目标文件定义的template,import 有作用域的概念,即只会 import 目标文件中定义的 template,而不会 im...

    honey缘木鱼
  • Java测试框架推荐

    java有很多测试类框架, 开发中有很多比如Mokito, powermock, wiremock, cucumber ,但是powermock测试,sonar...

    CoffeeLand
  • elasticsearch2.2之javaApi

    前言:elasticsearch虽然自带rest接口,但是在真正使用过程中可能更多的是通过不同编程语言的客户端进行交互。

    王念博客
  • SpringBoot入门建站全系列(十五)内置定时任务及Quartz定时任务使用

    2.ScheduledExecutorService,线程池版的TimerTask。

    品茗IT
  • SpringBoot入门建站全系列(十五)内置定时任务及Quartz定时任务使用

    2.ScheduledExecutorService,线程池版的TimerTask。

    品茗IT
  • 写个yarn的监控

    在星球里和微信群里很多朋友都有疑惑,如何监控 yarn 上 spark 或者 mr 应用的存活状态,浪尖今天在这里分享一下实现方法,实际上只需要简单的几行代码即...

    Spark学习技巧

扫码关注云+社区

领取腾讯云代金券