kakakakakku blog

Weekly Tech Blog: Keep on Learning!

Fluentd / Embulk / Elasticsearch / Digdag を学ぶのに最高な「データ分析基盤構築入門」を読んだ

出版されてから少し時間がたってしまったけど,「データ分析基盤入門」を読み終えた.ページ数が多く,持ち運ぶようなサイズではないので,家でちょこちょこ読み進める感じになってしまって,想定以上に時間がかかってしまった.

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

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

  • 作者: 鈴木健太,吉田健太郎,大谷純,道井俊介
  • 出版社/メーカー: 技術評論社
  • 発売日: 2017/09/21
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログを見る

はじめに

目次にも書いてある通り,「データ分析基盤」というテーマで Fluentd / Elasticsearch / Kibana の解説が詳細にまとまっている.さらに付録には Embulk と Digdag の解説もあり,このあたりの技術スタックに興味がある人にとって最高な一冊なのではないかなと思う.また,Elasticsearch / Kibana に関しては Elastic Stack 5.x を前提に書かれているので,昔のバージョンで知識が止まっている人にも良いと思う.

僕自身は Fluentd も Elasticsearch も仕事で運用していて,そこそこ理解できていると思っていたけど,それでも知らないことがあって,たくさん学ぶことができた.特に Elasticsearch 5.x は使ったことがなく,試すことができたし,普段使う機会がない X-Pack を試せたのも良かった.

  • 第1部 データ分析基盤入門
  • 第2部 Fluentd入門
  • 第3部 Elasticsearch入門
  • 第4部 Kibana入門
  • 付録
    • A Fluentdプラグイン事典
    • B Embulk & Digdag入門
    • C Embulkプラグイン事典
    • D Kibanaの便利機能とその他のElastic Stackの紹介

実は Go も学べる

第1部では,Go で実装されたブログアプリケーションを題材に解説が進み,このアプリケーションのバックエンドとして Fluentd / Elasticsearch / Kibana も動いている.Docker Compose で起動をするだけなので,Go のアプリケーションをデバッグしながら学べるし,Go から fluent-logger-golang を使って直接ログを Fluentd に投げている部分も試せるし,いろいろと学べる点がある.デバッグ用途だとしても,比較的環境構築が面倒な Fluentd / Elasticsearch / Kibana をすぐに試せるので,最高すぎる.ちなみに GitHub で公開されている.

github.com

ブログアプリケーションを起動してみる

Makefile が用意されているので,最初は make run だけで良いのかなと思ったけど,僕の環境だとこれだけじゃ動かず,自分なりに手順を用意したので,参考までに載せておこうと思う.

まず Dockerfile-fluentd ファイルを以下のように修正する.

-RUN apt-get -qq update && apt-get install --no-install-recommends -y curl ca-certificates sudo
+RUN apt-get -qq update && apt-get install --no-install-recommends -y curl ca-certificates sudo build-essential libcurl4-gnutls-dev

理由は以下のエラーが出るからで,修正方法が適切かどうかは不安があるけど,ネイティブのライブラリが不足しているってことで,こういう対応をしてみた.

ERROR:  Error installing fluent-plugin-elasticsearch:
    ERROR: Failed to build gem native extension.

    current directory: /opt/td-agent/embedded/lib/ruby/gems/2.1.0/gems/strptime-0.1.9/ext/strptime
/opt/td-agent/embedded/bin/ruby -r ./siteconf20171117-8-1ft7l5r.rb extconf.rb
checking for rb_timespec_now()... *** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

この状態で,以下のコマンドを実行する.

$ make run

起動は成功するものの,ブラウザで http://localhost にアクセスすると 502 Bad Gateway で動かなかった.なので,Docker Compose を再起動してみると,動くようになった.

$ docker-compose restart

ただし,画面に以下のエラーが出てしまった.

no such table: articles

次にマイグレーションを実行したら,ちゃんと動くようになった.

$ make migrate/up

今度は http://localhost/search にアクセスすると,Elasticsearch のインデックスがなく,エラーになった.ブログ記事を1件でも登録すれば動くので,注意する(本当はインデックスがなくてもエラーにならない方が良いんだけど).

elastic: Error 404 (Not Found): no such index [type=index_not_found_exception]

ということで,あとは好きなように使える!

Fluentd 関連

process_name

実は system ディレクティブで process_name の設定ができることを知らなかった.

<system>
  process_name fluentd
</system>

今まで process_name の設定をしていなかったので,Mackerel でプロセス監視をするときは,以下のように設定していた.

[plugin.checks.check_td-agent]
command = "/usr/bin/check-procs --pattern /usr/sbin/td-agent --user td-agent -C 2"

実際に td-agent.confprocess_name の設定を追加すると,以下のように ps 結果がシンプルになり,supervisor と worker を簡単に区別できるようになった.

$ ps -ef | grep td-agent
td-agent  4396     1  0 07:44 ?        00:00:00 supervisor:fluentd
td-agent  4399  4396  4 07:44 ?        00:00:00 worker:fluentd

よって Mackerel のプロセス監視設定も,以下のように修正することができた.

[plugin.checks.check_td-agent]
command = "/usr/bin/check-procs --pattern fluentd --user td-agent -C 2"

便利!

require_ack_response

Fluentd v0.12 系を運用しているのに require_ack_response を知らなかった.簡単に言えば,TCP レイヤでパケットロストがあったり,受信側を再起動したりするときに,タイミングによってはログを失う可能性があるため,それを解決してくれる.ログ転送の挙動で言えば at-least-once となる.多少のパフォーマンス劣化はあるかもしれないけど,Fluentd Aggregator を再起動することもあるし,入れておくべき設定だと思った.

docs.fluentd.org

Elasticsearch 関連

action.destructive_requires_name

Elasticsearch に /* の DELETE リクエストを投げると全てのインデックスが消える件は知っていて,今まで「絶対打たないように」意識をして運用をしていたけど,それを抑止するための設定があったとは...!もしかしたら最近の Elasticsearch で追加された設定なのかなと思ったら,前に運用をしていた Elasticsearch 1.4 でも使える設定だった.僕が情弱すぎるだけだった.

action.destructive_requires_name: true

text & keyword

僕が運用をしている Elasticsearch のバージョンは 1.4 / 1.7 / 2.3 で,5.x と 6.x は使ったことがなく,リリース内容などを全然把握できていなかった.

今回知ったのは,Elasticsearch 5.x から string 型が廃止され,text 型と keyword 型に切り替わったということだった.今までだと,ログを Kibana で可視化することも考えて,完全一致と部分一致をサポートするために Multi Field などを使っていた.今後は完全一致なら text で,部分一致なら keyword を使えば良いということになる.テンプレートを考える手間が少し減るのは嬉しい.公式ブログにもちゃんと記事が出ていた.

www.elastic.co

Kibana 関連

Kibana は普段よく使っているけど,Elasticsearch 5.x の Kibana は使ったことがなく,デザインが全然違うのに驚いた.さらに,コンテナには30日間なら無料で使える X-Pack が入っているため,今まで使う機会がなかった機能を試せたのも個人的には良かった.Monitoring はあると絶対に便利だし,Elasticsearch 2.x の Kibana だとアラートの機能がなくて困る場面もあるので,Alerting も嬉しい機能だと思う.すぐにバージョンアップをしたくなった.他にも Machine Learning など,楽しそうな機能も使えるようになるので X-Pack はやはり良いなぁー.

  • Monitoring
  • Alerting (Watcher)
  • Graph
  • Machine Learning
  • などなど

Embulk & Digdag 関連

Embulk と Digdag の解説も少し入っていて,今後試そうと思っている人には良さそうだった.Embulk は多少試したことがあるけど,「Embulk プラグイン辞典」を見て,もうこんなにプラグインが出揃ってるのかぁーと驚いた.Fluentd と Embulk を用途によって適切に使い分けたり,cron を Digdag に置き換えたり,まだまだデータ分析基盤を改善できそう.

まとめ

  • Fluentd / Elasticsearch / Kibana / Embulk / Digdag を学べる本ってほぼなくて,興味がある人にとっては最高な一冊だと思う
  • Fluentd は今後だと v0.14 が主流になると思うけど,現時点だと一番メジャーな v0.12 を学べるのも良かった
  • Elasticsearch 2.x はよく使っているけど,Elasticsearch 5.x や Kibana X-Pack を試したことがなかったので,勉強になった
  • 付録も非常に価値ある情報ばかりで,非常に良かった
  • ただちょっと,全体的に誤植が多いような気がしたので,第2版などで直ると良いなぁ...
    • もしまだ出版社側にフィードバックが来てなければ,まとめて送ることもできるっす!

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

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

  • 作者: 鈴木健太,吉田健太郎,大谷純,道井俊介
  • 出版社/メーカー: 技術評論社
  • 発売日: 2017/09/21
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログを見る

関連記事

suzuken.hatenablog.jp