使用Docker-compose构建Embulk、Elasticsearch和Kibana环境

在进行数据分析时,不可避免需要的是数据分析基础设施。
对于数据分析员来说,希望能够构建一个能够尽量专注于分析工作而不用花费太多时间在数据处理和制作精美报告上的环境。

所以,我试着建立了起来。

※此文章是我为个人备忘录而写的。当本人三个月后再次读到时,发现它毫无意义,可以想象。。。

建立环境

    • 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 : Docker组合

组成

请参考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文章中,也可能使用了以下的镜像。
– https://hub.docker.com/_/elasticsearch/
– https://hub.docker.com/_/kibana/

这次我们正在使用Elastic社的Docker注册表(https://www.docker.elastic.co)。

以下是参考:
– 在Docker容器之间实现双向通信
– 使用Docker安装Elasticsearch
– 在Docker上运行Kibana

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镜像,我们参考了”EmbulkのDockerコンテナを作ってみる”一文进行构建。与参考文章的不同之处有以下三点:
– 引入了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 的存储库,但是该存储库已经被废弃。现在的存储库是 openjdk。

当阅读OpenJDK的Dockerfile时,似乎需要使用set -eux作为前言来执行apt-get(尽管原因不太清楚)。

所以,情况会变成这样的感觉。

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

用法.

将要推送到elasticsearch的数据的CSV文件放置在log文件夹中,并从Embulk的docker容器中执行和使用。

样本数据

k-ken-t4g/docker-compose-EEK/log/nikkei225.csv是使用下面的python脚本收集的数据。该数据包括了从2008年1月1日开始的日经平均股价、道琼斯平均股价和人民币/美元汇率。由于现在(截至2018年11月)pandas_datareader.data无法使用,因此我使用以前自己收集的数据作为替代。

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映射模板配置。

相对来说比较不起眼的问题点。这次没有按日分开索引,所以随意设置。

    • Elasticsearch Reference [6.x] » Mapping

 

    • Elasticsearch Reference [6.3] » Indices APIs » Index Templates

 

    データ分析基盤構築入門[Fluentd,Elasticsearch,Kibanaによるログ収集と可視化]
{
  "template": "nikkei225*",
  "mappings": {
    "nikkei_schema":{
      "properties": {
          "NIKKEI225": { "type": "double" },
          "DATE": {"format" : "YYYY-MM-dd", "type": "date" },
          "DJIA": { "type": "double" },
          "DEXJPUS": { "type": "double" }
      }
    }
  }
}

在本地主机的5601端口(kibana)上访问,点击DEVTOOLS。在控制台中输入以上内容。

使用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},这真的是个潜在的陷阱。

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できない

digdagとかで、データが更新されると勝手にpushする構成にしたい。

docker-composeを使ってmysqlからbigqueryにデータを送るが参考になりそう。

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

k8sで構築したい

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

GitHub 即为中国的哲学。

我在 https://github.com/k-ken-t4g/docker-compose-EEK 上共享了本次项目。只需使用 git clone 命令,并执行 docker-compose up -d,即可构建环境。

参考资料/网站

    • データ分析基盤構築入門[Fluentd,Elasticsearch,Kibanaによるログ収集と可視化]

 

    • 【Docker】FluentdとElasticsearchとKibanaの環境構築

 

    • 【Embulk】使い方あれこれ

 

    Embulk + Elasticsearch + kibana + OpenStreetMapでお手軽に地理情報を可視化
从实用性的角度考虑,运用并不是很好。最好将安装位置设置在服务器集中存储数据的目录上。如果降低pandas_datareader.data的版本,则可以使用。
bannerAds