10
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

EmbulkでMySQLのデータをElasticsearch5に転送する

Last updated at Posted at 2017-10-18

概要

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 or 7にMySQL5.6 or 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をインストールしてください。
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

pluginの管理

Embulkのpluginを管理するために、mkbundleというものをインストールします。
railsのbundlerみたいなものです。
以下のコマンドを実行してください。

$ cd sample-app
$ embulk mkbundle sample-plugins

Gemfileにpluginを追加

今回はMySQLからinputして、elasticsearch5にoutputするため、以下のプラグインを入れます。

sample-app/sample-plugins/Gemfile
gem 'embulk-input-mysql'
gem 'embulk-output-elasticsearch_ruby'

pluginをインストール

railsでいうbundle install。
Gemfileのある階層で実行します。

$ cd sample-plugins
$ embulk bundle --path=vendor/bundle

pluginがインストールされたことを確認

$ 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の接続情報を、環境変数としてセットします。

sample-app/.env
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 }}のような形式で使います。
ファイル名は以下の通りでなく、任意のもので構いません。

sample-app/mysql-elasticsearch.yml.liquid
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 }}

実行

実行する前に、dry-runをします。

$ 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"
        }
      }
    ]
  }
}

以上

関連記事

参考

10
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?