使用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で見る
广告
将在 10 秒后关闭
bannerAds