使用Embulk将MySQL数据转移到Elasticsearch5中
总结
使用Embulk将MySQL数据传输到Elasticsearch5。
环境
-
- CentOS 7.2
-
- embulk 0.8.35
-
- openjdk version “1.8.0_144”
-
- MySQL 5.7
- elasticsearch 5.6.3-1
事前准备
MySQL的安装。
请参考以下内容,安装MySQL至CentOS6或7上,并选择MySQL5.6或5.7版本进行安装。
请在安装MySQL后,使用以下SQL语句创建表并插入数据。
GRANT ALL ON sample_db.* TO sample_user@'%' IDENTIFIED BY 'Sample_password123';
CREATE DATABASE sample_db;
USE sample_db;
CREATE TABLE items(
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20),
price INT(10),
created_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
INSERT INTO items (name, price) VALUES('olive oil', 600);
INSERT INTO items (name, price) VALUES('garlic', 300);
INSERT INTO items (name, price) VALUES('red peppar', 200);
安装Elasticsearch
请参考以下步骤安装Elasticsearch,并简单了解其使用方法。
安装Java
请按照以下步骤在CentOS7上安装Java OpenJDK8。
Embulk 的安装
请使用以下命令来安装 Embulk。
$ curl --create-dirs -o ~/.embulk/bin/embulk -L "https://dl.embulk.org/embulk-latest.jar"
$ chmod +x ~/.embulk/bin/embulk
$ echo 'export PATH="$HOME/.embulk/bin:$PATH"' >> ~/.bashrc
$ source ~/.bashrc
确认安装
$ embulk -version
embulk 0.8.35
目录结构
创建一个名为sample-app的目录,并在其中进行以下所有操作。
$ mkdir sample-app
插件管理
请执行以下命令来安装mkbundle,用于管理Embulk的插件。它类似于rails的bundler工具。
$ cd sample-app
$ embulk mkbundle sample-plugins
在Gemfile文件中添加插件。
本次我们将从MySQL输入数据,并将其输出到elasticsearch5,因此需要安装以下插件。
gem 'embulk-input-mysql'
gem 'embulk-output-elasticsearch_ruby'
安装插件
在rails中,与bundle install相对应的是执行bundle install命令。它需要在Gemfile所在的目录层级下运行。
$ cd sample-plugins
$ embulk bundle --path=vendor/bundle
确认插件已安装。
$ embulk bundle list
2017-10-18 07:10:53.791 +0000: Embulk v0.8.35
Gems included by the bundle:
* bundler (1.10.6)
* elasticsearch (5.0.4)
* elasticsearch-api (5.0.4)
* elasticsearch-transport (5.0.4)
* embulk (0.8.35)
* embulk-input-mysql (0.8.5)
* embulk-output-elasticsearch_ruby (0.1.6)
* excon (0.59.0)
* faraday (0.13.1)
* liquid (4.0.0)
* msgpack (1.1.0)
* multi_json (1.12.2)
* multipart-post (2.0.0)
* rjack-icu (4.54.1.1)
环境变量
请在sample-app的根目录下创建以下内容。
将MySQL和Elasticsearch的连接信息设置为环境变量。
MYSQL_HOST=localhost
MYSQL_USER=sample_user
MYSQL_PASSWORD=Sample_password123
ELS_HOST=localhost
$ export $(cat .env | xargs)
可以将以下内容写入 ~/.bash_profile 或者 /etc/environment 文件中。
export MYSQL_HOST=localhost
export MYSQL_USER=sample_user
export MYSQL_PASSWORD=Sample_password123
export ELS_HOST=localhost
$ source ~/.bash_profile
创建一个yaml文件
通过将扩展名设置为liquid,您可以在yaml文件内使用include语句和变量。顺便提一下,环境变量可以使用{{ env.MYSQL_USER }}这样的格式。文件名不必按以下方式命名,可以是任意的。
in:
type: mysql
host: {{ env.MYSQL_HOST }}
user: {{ env.MYSQL_USER }}
password: {{ env.MYSQL_PASSWORD }}
database: sample_db
query: SELECT * FROM items
out:
type: elasticsearch_ruby
# 省略可能
cluster_name: sample-application
index: sample_index
index_type: sample_type
nodes:
- host: {{ env.ELS_HOST }}
执行
在执行之前,进行试运行。
$ embulk preview mysql-elasticsearch.yml.liquid -b sample-plugins
+---------+-------------+------------+-------------------------+-------------------------+
| id:long | name:string | price:long | created_date:timestamp | updated_date:timestamp |
+---------+-------------+------------+-------------------------+-------------------------+
| 1 | olive oil | 600 | 2017-10-18 07:07:36 UTC | 2017-10-18 07:07:36 UTC |
| 2 | garlic | 300 | 2017-10-18 07:07:36 UTC | 2017-10-18 07:07:36 UTC |
| 3 | red peppar | 200 | 2017-10-18 07:07:36 UTC | 2017-10-18 07:07:36 UTC |
+---------+-------------+------------+-------------------------+-------------------------+
如果没有问题的话,我会执行。
$ embulk run mysql-elasticsearch.yml.liquid -b sample-plugins/
确认数据是否已输入Elasticsearch。
使用以下命令向Elasticsearch发起查询请求。
$ curl http://localhost:9200/embulk_sample/embulk/_search?pretty
如果收到以下结果,就算成功了。
{
"took" : 154,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 3,
"max_score" : 1.0,
"hits" : [
{
"_index" : "embulk_sample",
"_type" : "embulk",
"_id" : "AV8t1p0iQ_tnL6hHKk6O",
"_score" : 1.0,
"_source" : {
"id" : 2,
"name" : "garlic",
"price" : 300,
"created_date" : "2017-10-18 11:27:42 UTC",
"updated_date" : "2017-10-18 11:27:42 UTC"
}
},
{
"_index" : "embulk_sample",
"_type" : "embulk",
"_id" : "AV8t1p0iQ_tnL6hHKk6N",
"_score" : 1.0,
"_source" : {
"id" : 1,
"name" : "olive oil",
"price" : 600,
"created_date" : "2017-10-18 11:26:43 UTC",
"updated_date" : "2017-10-18 11:26:43 UTC"
}
},
{
"_index" : "embulk_sample",
"_type" : "embulk",
"_id" : "AV8t1p0iQ_tnL6hHKk6P",
"_score" : 1.0,
"_source" : {
"id" : 3,
"name" : "red peppar",
"price" : 200,
"created_date" : "2017-10-18 11:28:08 UTC",
"updated_date" : "2017-10-18 11:28:08 UTC"
}
}
]
}
}
以上
相关文章
- Elasticsearch5系 クラスタ構成構築手順
请参阅
-
- Github: embulk
-
- 大量データの転送にEmbulkを使ってみたら本当に楽だった
-
- Embulkではてなブログの記事をparseしてElasticsearchに入れてみる
-
- embulk mkbundle の使い方
-
- embulk チュートリアルを兼ねて RDS のスロークエリをログを Elasticsearch と Kibana で可視化する
- ApacheのアクセスログをEmbulk+Elasticsearch+Kibanaで見る