Workflow Engines Night 参加メモ
開催日:2017/6/7
場所:DMM.comラボ 六本木オフィス
『StackStorm ワークフローエンジンによる運用コスト・リスク低減の取り組み』
株式会社DMM.comラボ 大山 裕泰氏
- StackStorm Contributor
- StackStorm AWS maintainer
digdagじゃなく別のWorkflowエンジンの話
運用者を悩ませる問題
- ユーザ(社内)との折衝コスト(口頭、チケット、メールで依頼)
- オペレーションコスト(多種多様なシステム環境、機器)
- オペミスのリスク、熟練オペレータしか触れない、教育コスト高い
- (確かに新人にLBは触らせないとかある…)
理想的な運用形態
- 定型運用のAPI化
- システムの適切な抽象化
- ×個別機器を操作する ◯操作して得たい結果を機械に教える
StackStormとは
- IFTTT x Workflow
- センサーが反応するイベントを受けて、一定のルールでActionを実行
- 例えばイベントに併せてリソースを増やす
- VMを作るだけの単体タスクじゃなく、VM作る→Provisioning→DNS登録→ELBにぶら下げるなど一連のタスク
Stackstormのある環境
- オペレーション用APIの提供
- 知っている人誰かに聞いたり、ドキュメントを漁ったり(用意したり)しなくてもStackStormを見れば分かる
- システムの抽象化(欲しい結果だけを指定する)
- 運用の自動化(個別のシステム状況に応じた対応を機械的に実施)
StackStormが実現するであろう未来
- 折衝業務を行うエンジニアの開放
- オペレータの運用・学習コストの逓減
- サービス運用リスクの削減
Q&A
- スケジュール実行はどのように?
- センサーからのイベントドリブンなので定期実行するのは可能
- 定期実行の際に重複実行を避けたい、どうする?
- 複数ノードに分散しているが、同じノードで同時に複数リクエスト来た場合のことは考慮されてない
参考資料
http://qiita.com/unchemist/items/0e6425396ba1a1e6b43c
『JenkinsからDigdagへ日次バッチを移行して幸せになるお話』
株式会社DMM.comラボ 鈴木 翔太氏
なぜDigdagなのか
- 多数の日次バッチ
- 所謂ETL
- これまではJenkinsで運用
- 問題
- Jenkins依存
- コードで管理できない
- 失敗時のリトライが大変
処理が時間依存
課題解決のためにワークフローエンジン導入を検討
選定ポイント
- ◎可用性
- ◎スケーラビリティ
- コード管理
- 失敗したタスクからリトライ可能
- 進捗確認ができるIF
構成
- Digdag2台、サーバ兼クライアント
- PostgreSQLサーバ2台(PgPool-II使って Active&Standby構成)
Workflow設計
プラグイン自作
- Slack通知を実現するdigdag-slackを作った
- SLAの通知に利用
チーム間連携(=システム間連携)
- あっちのシステムでファイルができたらこれを実行、みたいなの
- 時間に依存しない形で実行させたい
- mog(go製CLIツール)を作成し提供
- タスク名ベースでステータス確認可能に
- ワークフローのスタート&リトライも対応
- Github公開していない(が、渋ってるわけじゃないので公開します)
まとめ
- Jenkinsからの脱却
- 全てコード管理可能に
- コードで依存関係も表現
- バッチ失敗時のリトライも楽ちん
- mog CLIにより時間依存の処理を排除
『Treasure DataにおけるDigdagによる大規模データ処理の自動化とエラー処理』
トレジャーデータ株式会社 古橋 貞之
あまりメモ取らなかったけど詳しいレポートができてた
そもそもなぜDigdagを作ったか
- あらゆる手作業を自動化するため
- マルチクラウド、多数のミドルウェア、どんどん新しく出て来るのにエラーコードやハンドリング方法を全部覚えないといけないのか
- シェルで複数ジョブを順次実行するには上から並べることになるが、エラーハンドリングやモジュール化での再利用などに問題がある
デモ
- Treasuredata Workflowの画面で説明(ロゴが違う以外は一緒)
- Timelineにタスクの進捗状況、経過時間がビジュアルに見える(すごい)
- タスクを動的に増やせる
- ループタスクも書ける
使用事例紹介
- TD内で利用しているworkflowのユースケース紹介
LT『Digdagを使ってみて便利だったとこ、はまったとこ』
株式会社VASILY 塩崎 健弘
IQONを提供してる(若い女性ターゲットのファッショなプリ)
- クローラを開発してcronでジョブ管理
- 複数クローラのジョブを並列にcron定義
- 30分毎に実行
- でも30分で終わらなかったら?重複実行は?
- ハンドリングつらい
- Digdagは設定ファイルがシンプル
- AirflowやLuigiとくらべて自由度低い(高い自由度は不要、複雑なジョブができちゃうから)
- dockerサポート嬉しい
一時ディレクトリを切って実行してくれるので他のタスクからの影響を最小化できる
pythonのバージョンでハマった
- py>:オペレータはpythonコマンドを呼び出すが、OSによってバージョンが2で呼ばれる
- python3のdockerイメージを使用することで解決
ruby(rb)でも同じ問題が
一時ファイルの受け渡し
- 一時ディレクトを毎回ジョブ毎に切ってくれるのでまとめて読めない
- 一時ファイルはS3に書いて読み出し
Macにpython3開発環境を構築する (pyenv導入)
手元のMacbook airにpython3環境を構築したいが、標準で入っている2.x系を変えてしまうのは他にどんな影響が起きるか分からないのでイヤ。 であれば、node.jsのnvmや、rubyのrbenvなどのように、複数バージョンをインストールして切替可能な方法でインストールしたい。
pythonにはそのようなツールとして、pyenvが提供されている。
最初、virtualenvがそういうものなのかと思ったが、virtualenvは文字通り仮想環境を用意するためのもので、 パッケージなどを含めた開発環境を別々に作るためのものなので、ちょっと違うらしい。
(どちらかと言えば両方を合わせて使いたい。)
virtualenvについては別途書くことにする。
とりあえず、まずはpyenvを導入してpython3をインストールする。
このあたりを見てやってみる。
ここで紹介している手順に従うと、以下のようになる。
1. Homebrewをインストール
2. pyenvをインストール
3. pyenvでPython3をインストール
1.Homebrewをインストール
入っていないわけはないので、スキップ・・・と言いたいところだが、この手順で行う前に
$ brew install python3
とやって以下のエラーが発生していたことを思い出し、
Error: Homebrew doesn't know what compiler versions ship with your version of Xcode (8.0). Please `brew update` and if that doesn't help, file an issue with the output of `brew --config`: https://github.com/Homebrew/homebrew/issues
brew update
をしてみろというので、やってみる。
※思えばこれが道を踏み外した瞬間。
$ brew update ==> Migrating Homebrew to v0.9.9 ・ ・ ・
うまく入ったっぽい。バージョン確認もしてみる。
$ brew config HOMEBREW_VERSION: 1.0.7 (略)
2. pyenvインストール
$ brew install pyenv
無事に入ったように見えるので、pyenvコマンドを叩いてみる。
$ pyenv versions dyld: Library not loaded: /usr/local/opt/readline/lib/libreadline.6.dylib Referenced from: /usr/local/bin/bash Reason: image not found Trace/BPT trap: 5
あれ?なんだこれ。
どうも、readline 6 が見つからないと言っているようだ。
※今入っているバージョン
$ brew info readline readline: stable 7.0 (bottled) [keg-only] Library for command-line editing https://tiswww.case.edu/php/chet/readline/rltop.html Not installed From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/readline.rb ==> Caveats This formula is keg-only, which means it was not symlinked into /usr/local. OS X provides the BSD libedit library, which shadows libreadline. In order to prevent conflicts when programs look for libreadline we are defaulting this GNU Readline installation to keg-only.
そしてpyenvの問題かと思っていたのだが、実はもっと影響は大きく、bashですら起動時に同じメッセージで怒られる始末。
面倒なことになってきた・・・。
readlineの修復(readline6.3のインストール)
解決策を探して、似たケースっぽい以下を参考にした。
psqlしたらreadlineのエラーが出るようになって – はらいそ
コレに従って、readline6.3をダウンロード。( http://core.ring.gr.jp/pub/GNU/readline/ )
このダウンロードしたソースを解凍、configure、makeで インストールして brew switch readline 6.3
で切り替えしてみると、
ようやくbash でも pyenv でも起動時エラーが出なくなった。
.bash_profile に以下を追加。
#-- pyenv¬ export PATH="$HOME/.pyenv/shims:$PATH"
3.pyenvでPython3をインストール
ようやく動くようになったpyenvでpython3(この時点の最新:3.5.2)をインストールしてみる。
$ pyenv install 3.5.2 Downloading Python-3.5.2.tar.xz... -> https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tar.xz Installing Python-3.5.2... BUILD FAILED (OS X 10.11.6 using python-build 20160602) Inspect or clean up the working tree at /var/folders/xw/t3s4g06x3sx4nd1xkdck0r6r0000gn/T/python-build.20161012060445.36527 Results logged to /var/folders/xw/t3s4g06x3sx4nd1xkdck0r6r0000gn/T/python-build.20161012060445.36527.log Last 10 log lines: dyld: Symbol not found: _getentropy Referenced from: /private/var/folders/xw/t3s4g06x3sx4nd1xkdck0r6r0000gn/T/python-build.20161012060445.36527/Python-3.5.2/./Programs/_freeze_importlib Expected in: /usr/lib/libSystem.B.dylib /bin/sh: line 1: 47690 Trace/BPT trap: 5 ./Programs/_freeze_importlib ./Lib/importlib/_bootstrap.py Python/importlib.h make: *** [Python/importlib.h] Error 133 make: *** Waiting for unfinished jobs.... /bin/sh: line 1: 47691 Trace/BPT trap: 5 ./Programs/_freeze_importlib ./Lib/importlib/_bootstrap_external.py Python/importlib_external.h make: *** [Python/importlib_external.h] Error 133
BUILD FAILDだと・・・
再び解決策を探して以下にたどり着く。
osx - Building Python 3 on OS X: [Python/importlib.h] Error 133 - Stack Overflow
最後のコメントに書いてある通り、 xcode-select --install
をすればこのビルドエラーは解消するはず。
こちらにも書いてあった。 しかもGUIのダイアログまで載せてあって、同じ画面を見てとても安心。
$ xcode-select --install xcode-select: note: install requested for command line developer tools
「残り約10秒」になってから10分以上待たされて、もう少しでキャンセルするところだったが、何とか完了。
再度 python3.5.2のインストールを試みる。
$ pyenv install 3.5.2 Downloading Python-3.5.2.tar.xz... -> https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tar.xz Installing Python-3.5.2... Installed Python-3.5.2 to /Users/username/.pyenv/versions/3.5.2
成功!長かった。。
インストールされたことを確認。
$ pyenv versions * system (set by /Users/username/.pyenv/version) 3.5.2
最後に標準で使うバージョンをsystem → 3.5.2に切り替え。
$ pyenv global 3.5.2 $ pyenv rehash $ pyenv versions system * 3.5.2 (set by /Users/username/.pyenv/version)
これでようやく、pyenvで切替可能な状態で、python3を使えるようになった。
Excel関数で重複を除いた件数を数える
Excelに集計された3階層構造くらいのデータを、2階層目くらいのIDで count distinct
的なことができないかなぁ・・・と思っていたら、やっぱりあるんですね。関数として用意されていなくても計算する方法が。
=SUMPRODUCT(1/COUNTIF(範囲,範囲))
なんでこれで出来るの?とパッと見では全然わからなかったのですが、こちらのサイトの説明ですっきり分かりました。
めっちゃ便利!多分同じような場面で何度も使うと思います。 忘れないように、いや忘れるのでメモとして残しておきます。
CentOS6.5でlocaleを追加する
Elasticsearchの過去データパージ
主にログ可視化環境で使うことが多いElasticsearchだが、取り込むログの量が多いとあっという間にDISK容量を圧迫してしまう。
Elasticsearchの古いデータの削除はcuratorを使って行える。
以下を参考にインストールし使ってみる。
利用にはpython & pip が必要。
●1ヶ月経った httpd_log のindexを削除
$ curator --host localhost delete indices --older-than 30 --time-unit days --timestring %Y-%m-%d --prefix httpd
●2週間経った nginx_* のindexを削除(COneのnginxログは1日の出力量が数GBに達するため、どのindexも2週間
$ curator --host localhost delete indices --older-than 14 --time-unit days --timestring %Y-%m-%d --prefix nginx
上記をcronに1日1回入れておけばOK。