原文發佈於微信公衆號:騰訊雲存儲(關注有驚喜)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元禮包!