9
14

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 3 years have passed since last update.

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

Last updated at Posted at 2018-11-21

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

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

※個人の忘備録用に書いた記事。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/k-ken-t4g/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記事だと以下のイメージを使っている場合もある。

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

以下を参考にした

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

※追記(2019/07/17)

最適な Java の Docker イメージを選びたいによると、

前は Docker Hub の java のリポジトリで提供されていましたが、このリポジトリは deprecated になっています。現在のリポジトリは openjdk です。

またOpenJDKのDockerfileを読むと、apt-getを実行するにはset -euxを枕詞にする必要があるみたいです(理由はよく分かっていない)

なので、こういう感じになります。

FROM openjdk:8

## 省略

RUN set -eux; \
     apt-get -y update && apt-get -y upgrade ;\
     apt-get install -y --no-install-recommends jruby

起動

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

$ docker-compose up --build

使い方

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

サンプルデータ

k-ken-t4g/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/k-ken-t4g/docker-compose-EEK に今回のプロジェクトを公開しています。
git cloneしてdocker-compose up -dすれば環境が構築されるはず。

参考文献/サイト

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

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

9
14
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
9
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?