本节作者:李宏旭
大多数公司在使用 Elasticsearch 之前,都已经维护有一套 Hadoop 系统。因此,在实时数据慢慢变得冷却,不再被经常使用的时候,一个需求自然而然的就出现了:怎么把 Elasticsearch 索引数据快速转移到 HDFS 上,以解决 Elasticsearch 上的磁盘空间;而在我们需要的时候,又可以较快的从 HDFS 上把索引恢复回来继续使用呢?
Elasticsearch 为此提供了 snapshot 接口。通过这个接口,我们可以快速导入导出索引镜像到本地磁盘,网络磁盘,当然也包括 HDFS。
HDFS 插件安装配置
下载repository-hdfs插件 ,通过标准的 elasticsearch plugin 安装命令安装:
Copy bin/plugin install elasticsearch/elasticsearch-repository-hdfs/2.2.0
然后在 elasticsearch.yml 中增加以下配置:
Copy # repository 配置
hdfs:
uri:"hdfs://<host>:<port>"(默认port为8020)
#Hadoop file-system URI
path:"some/path"
#path with the file-system where data is stored/loaded
conf.hdfs_config:"/hadoop/hadoop-2.5.2/etc/hadoop/hdfs-site.xml"
conf.hadoop_config:"/hadoop/hadoop-2.5.2/etc/hadoop/core-site.xml"
load_defaults:"true"
#whether to load the default Hadoop configuration (default) or not
compress:"false"
# optional - whether to compress the metadata or not (default)
chunk_size:"10mb"
# optional - chunk size (disabled by default)
# 禁用 jsm
security.manager.enabled: false
默认情况下,Elasticsearch 为了安全考虑会在运行 JVM 的时候执行 JSM。出于 Hadoop 和 HDFS 客户端权限问题,所以需要禁用 JSM。将 elasticsearch.yml
中的 security.manager.enabled
设置为 false
。
将插件安装好,配置修改完毕后,需要重启 Elasticsearch 服务。没有重启节点插件可能会执行失败。
注意:Elasticsearch 集群的每个节点都要执行以上步骤!
Hadoop 配置
本节内容基于Hadoop版本:2.5.2,假定其配置文件目录:hadoop-2.5.2/etc/Hadoop。注意,安装hadoop集群需要建立主机互信,互信方法请自行查询,很简单。
相关配置文件如下:
mapred-site.xml.template
默认没有 mapred-site.xml 文件,复制 mapred-site.xml.template 一份,并把名字改为 mapred-site.xml,需要修改 3 处的 IP 为本机地址:
Copy <configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobtracker.http.address</name>
<value>XX.XX.XX.XX:50030</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value> XX.XX.XX.XX:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value> XX.XX.XX.XX:19888</value>
</property>
</configuration>
yarn-site.xml
需要修改5处的IP为本机地址:
Copy <configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value> XX.XX.XX.XX:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value> XX.XX.XX.XX:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value> XX.XX.XX.XX:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value> XX.XX.XX.XX:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value> XX.XX.XX.XX:8088</value>
</property>
</configuration>
hadoop-env.sh
修改 jdk 路径和 jvm 内存配置,内存使用根据情况配置。
Copy export JAVA_HOME=/usr/java/jdk1.7.0_79
export HADOOP_PORTMAP_OPTS="-Xmx512m $HADOOP_PORTMAP_OPTS"
export HADOOP_CLIENT_OPTS="-Xmx512m $HADOOP_CLIENT_OPTS"
core-site.xml
临时目录及 hdfs 机器 IP 端口指定:
hadoop.tmp.dir/soft/hadoop-2.5.2/tmpAbase for other temporary directories.fs.defaultFShdfs:// XX.XX.XX.XX:9000io.file.buffer.size4096
slaves
配置集群 IP 地址,集群有几个 IP 都要配置进去:
Copy 192.168.0.2
192.168.0.3
192.168.0.4
hdfs-site.xml
namenode 和 datenode 数据存放路径及别名:
Copy <configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>/data01/hadoop/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/data01/hadoop/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
启动 Hadoop
格式化完成后也可使用 sbin/start-all.sh
启动,但有可能出现异常,建议按照顺序分开启动。
首先需要格式化存储:
bin/Hadoop namenode –format
启动start-dfs.sh
sbin/start-dfs.sh
启动start-yarn.sh
sbin/start-yarn.sh
备份导出
创建快照仓库
Copy curl -XPUT 'localhost:9200/_snapshot/backup' -d
'{
"type":"hdfs",
"settings":{
"path":"/test/repo",
"uri":"hdfs://<uri>:<port>"
}
}'
在这步可能会报错。通常是因为 hadoop 配置问题,更改好配置需要重新格式化文件系统:
在 hadoop 目录下执行 bin/hadoop namenode -format
索引快照
执行索引快照命令,可写入crontab,定时执行
Copy curl -XPUT 'http://localhost:9200/_snapshot/backup/snapshot_1' -d
'{"indices":"indices_01,indices_02"}'
备份恢复
curl -XPOST "localhost:9200/_snapshot/backup/snapshot_1/_restore"
备份删除
curl -XDELETE "localhost:9200/_snapshot/backup/snapshot_1"
查看仓库信息
curl -XGET 'http://localhost:9200/_snapshot/backup?pretty'