Elasticsearch
Docker
Kibana
Embulk
docker-compose

Docker-composeを使ってEmbulk,Elasticsearch,Kibana環境を構築する

データ分析してたら、どうしても必要になるのがデータ分析基盤。

データ分析屋的には、データの加工とか、綺麗なレポートを作る時間とかに、あまり時間を割かず、なるべく分析に注力できる環境を構築したい。

ってことで、構築してみた。

※個人の忘備録用に書いた記事。3か月ぶりに書いた本人が読んでも意味不明だった時点でお察し


構築環境


  • Mac (macOS High Siera)

  • Docker for mac [Version 18.06.0-ce-mac70 (26399)]


構築するもの


  • Embulk (ver 0.9.7)

  • elasticsearch (ver 6.3.2)

  • kibana (ver 6.3.2)


Docker-compose


構成

詳細はhttps://github.com/d0d0npa/docker-compose-EEK を参照。

.

├── docker-compose.yml
├──embulk
│ └── Dockerfile-embulk
├── elasticsearch
│ └── nikkeiTemplate.json #nikkei225.csvのMapping Template設定
└── log
├── nikkei225.csv # elasticsearchに入れたいcsv
├── config.yml # embulkでnikkei225.csvを取り込むための設定
└── seed.yml # config.ymlの自動生成元ファイル


docker-compose.yml

以下のDocker-Hubに同名のイメージが存在するが、非推奨とのこと。過去のQiita記事だと以下のイメージを使っている場合もある。

- https://hub.docker.com/_/elasticsearch/

- https://hub.docker.com/_/kibana/

今回はElastic社のDockerレジストリ(https://www.docker.elastic.co) を使用している。

以下を参考にした

- Dockerコンテナ間で双方向通信させる

- Install Elasticsearch with Docker

- Running Kibana on Docker


docker-compose.yml

version: '2'

services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:6.3.2
expose:
- 9200
ports:
- "9200:9200"
- "9300:9300"
tty: true
environment:
discovery.type: single-node

kibana:
image: docker.elastic.co/kibana/kibana:6.3.2
ports:
- "5601:5601"
depends_on:
- elasticsearch
environment:
ELASTICSEARCH_URL: http://elasticsearch:9200

embulk:
volumes:
- ./log:/root/logs
build:
context : ./embulk
dockerfile: Dockerfile-embulk
tty: true



Embulk

Embulkは公式Docker imageがないので、EmbulkのDockerコンテナを作ってみる を参考に構築。参考にした記事との違いは以下の3点。

- embulk-output-elasticsearchプラグインを導入したこと

- digdagを導入しようとした(途中面倒になったので、コメントアウト)

- マウントするためのディレクトリを作成

FROM java:8

# system update
RUN apt-get -y update && apt-get -y upgrade && \
apt-get install -y --no-install-recommends jruby
# locale
RUN apt-get -y install locales && \
localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8

# timezone (Asia/Tokyo)
ENV TZ JST-9

# etc
ENV TERM xterm

# tools
RUN apt-get install -y vim git zip unzip less wget

# embulk
RUN curl -o /usr/local/bin/embulk --create-dirs -L "http://dl.embulk.org/embulk-latest.jar" && \
chmod +x /usr/local/bin/embulk

# Get Digdag and create new user "digdag"
#RUN curl -o /usr/local/bin/digdag --create-dirs -L "https://dl.digdag.io/digdag-latest" #&& \
# chmod +x /usr/local/bin/digdag && \
# apt-get clean && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* && \
# adduser --shell /sbin/nologin --disabled-password --gecos "" digdag

#Get Embulk Plugins
RUN embulk gem install embulk-output-elasticsearch

WORKDIR /root

RUN mkdir /root/logs


起動

docker-compose-EEKのディレクトリに移動してdocker-composeで起動するだけで、環境が立ち上がる。

$ docker-compose up --build


使い方

logフォルダにelasticsearchにプッシュしたいデータのcsvを置いて、Embulkのdockerコンテナから実行して使う1


サンプルデータ

d0d0npa/docker-compose-EEK/log/nikkei225.csvは以下のpythonを実行して集めたものを使った。内容は日経平均株価、ダウ平均株価と円/ドル為替の2008年1月1日からのデータ。今(2018年11月現在)はpandas_datareader.dataが使えないので、過去に自分が取ってきたものを使用2

import datetime

import pandas_datareader.data as web

start = datetime.datetime(2008, 1, 1)
nikkei225 = web.DataReader(["NIKKEI225","DJIA","DEXJPUS"], "fred", start)
nikkei225.to_csv("nikkei225.csv")


Elasticsearch MappingTemplate設定

割と地味なつまずきポイント。今回は日ごとにインデックスを分けることもないので、適当に設定。


nikkeiTemplate.json

{

"template": "nikkei225*",
"mappings": {
"nikkei_schema":{
"properties": {
"NIKKEI225": { "type": "double" },
"DATE": {"format" : "YYYY-MM-dd", "type": "date" },
"DJIA": { "type": "double" },
"DEXJPUS": { "type": "double" }
}
}
}
}

設定方法はlocalhost:5601(kibana) にアクセスして、 DEVTOOLS をクリック。Consoleで上記を入力。


Embulkを使ってelasticsearchにデータをプッシュ

Embulkのコンテナの中に入って以下のコマンドを実行すれば、nikkei225.csvのデータがelasticsearchに格納される。

$ docker exec -it docker-compose-efk_embulk_1 bash

[root@5b7d05cac814:~# cd logs/
root@5b7d05cac814:~/logs# embulk run config.yml

config.ymlの設定で、出力先ノードのホストがnodes: - {host : elasticsearch, port: 9200}なのが地味にトラップだった。


config.yml

in:

type: file
path_prefix: ./nikkei225.csv
parser:
charset: ISO-8859-2
newline: LF
type: csv
delimiter: ','
quote: '"'
escape: '"'
trim_if_not_quoted: false
skip_header_lines: 1
allow_extra_columns: false
allow_optional_columns: false
columns:
- {name: DATE, type: timestamp, format: '%Y-%m-%d'}
- {name: NIKKEI225, type: double}
- {name: DJIA, type: double}
- {name: DEXJPUS, type: double}
out:
type: elasticsearch
nodes:
- {host : elasticsearch, port: 9200}
index: nikkei225-test
index_type: nikkei_schema

config.ymlは一から作るのは大変なので、embulk guessコマンドを使って自動生成するのが楽な方法。

$ embulk guess seed.yml -o {任意のyamlファイル名}


Kibanaでイケてるダッシュボード作る

ここまで書いて疲れてきたので、適当にググってイケてるダッシュボード作ってください。


課題


  • 今の設定だと、いちいちEmbulkのコンテナに入らないとelasticsearchにデータをpushできない



  • Embulkがfluetdみたいにデータを一箇所のサーバーに集約する機能があるか調べる(多分ある)


  • k8sで構築したい


    • 現状、上の構成は1サーバーにしか使わないので、優先度は低め。




github

https://github.com/d0d0npa/docker-compose-EEK に今回のプロジェクトを公開しています。

git cloneしてdocker-compose up -dすれば環境が構築されるはず。


参考文献/サイト





  1. 実用性を考えると、あまりよくない運用。マウント位置はサーバーによってデータが集積されているディレクトリに設定するのが吉 



  2. pandas_datareader.dataのバージョンを落とせば使えるとのこと