あのときのログ

思ったこと、経験したことを忘れないようにするためのメモ。

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

  • スケジュール実行はどのように?
  • センサーからのイベントドリブンなので定期実行するのは可能
  • 定期実行の際に重複実行を避けたい、どうする?
  • 複数ノードに分散しているが、同じノードで同時に複数リクエスト来た場合のことは考慮されてない

参考資料

https://stackstorm.com/

http://qiita.com/unchemist/items/0e6425396ba1a1e6b43c


『JenkinsからDigdagへ日次バッチを移行して幸せになるお話』

株式会社DMM.comラボ 鈴木 翔太氏

発表資料

なぜDigdagなのか

  • 多数の日次バッチ
  • 所謂ETL
  • これまではJenkinsで運用
  • 問題
  • Jenkins依存
  • コードで管理できない
  • 失敗時のリトライが大変
  • 処理が時間依存

  • 課題解決のためにワークフローエンジン導入を検討

選定ポイント

  • ◎可用性
  • ◎スケーラビリティ
  • コード管理
  • 失敗したタスクからリトライ可能
  • 進捗確認ができるIF

構成

  • Digdag2台、サーバ兼クライアント
  • PostgreSQLサーバ2台(PgPool-II使って Active&Standby構成)

Workflow設計

  • 設定はYAML
  • 進捗状況が視覚的に分かるIFサイコー
  • タスクはRuby&Shを利用する事が多い

プラグイン自作

  • Slack通知を実現するdigdag-slackを作った
  • SLAの通知に利用

チーム間連携(=システム間連携)

  • あっちのシステムでファイルができたらこれを実行、みたいなの
  • 時間に依存しない形で実行させたい
  • mog(go製CLIツール)を作成し提供
  • タスク名ベースでステータス確認可能に
  • ワークフローのスタート&リトライも対応
  • Github公開していない(が、渋ってるわけじゃないので公開します)

まとめ

  • Jenkinsからの脱却
  • 全てコード管理可能に
  • コードで依存関係も表現
  • バッチ失敗時のリトライも楽ちん
  • mog CLIにより時間依存の処理を排除

『Treasure DataにおけるDigdagによる大規模データ処理の自動化とエラー処理』

トレジャーデータ株式会社 古橋 貞之

あまりメモ取らなかったけど詳しいレポートができてた

そもそもなぜDigdagを作ったか

  • あらゆる手作業を自動化するため
  • マルチクラウド、多数のミドルウェア、どんどん新しく出て来るのにエラーコードやハンドリング方法を全部覚えないといけないのか
  • シェルで複数ジョブを順次実行するには上から並べることになるが、エラーハンドリングやモジュール化での再利用などに問題がある

デモ

  • Treasuredata Workflowの画面で説明(ロゴが違う以外は一緒)
  • Timelineにタスクの進捗状況、経過時間がビジュアルに見える(すごい)
  • タスクを動的に増やせる
  • ループタスクも書ける

使用事例紹介


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をインストールする。

このあたりを見てやってみる。

理系じゃないけどMacに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のダイアログまで載せてあって、同じ画面を見てとても安心。

coderoid.hatenablog.com

$ 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(範囲,範囲))

なんでこれで出来るの?とパッと見では全然わからなかったのですが、こちらのサイトの説明ですっきり分かりました。

software.ssri.co.jp

めっちゃ便利!多分同じような場面で何度も使うと思います。 忘れないように、いや忘れるのでメモとして残しておきます。

CentOS6.5でlocaleを追加する

VagrantでCentOS6.5を使っているが、python環境を構築中、pipでdateutilをインストールしようとしてlocale.Error: unsupported locale settingが発生。普通にja_JP.utf8を使っていて特殊なものは使っていないつもりだったのだが、なぜロケールエラーが。。。

解決法を探していたらこの記事を見つけた。

blog.tokoyax.com

まるっとこのまま参考にさせて頂きました。

※まだdateutilパッケージはインストールできていません。。

Elasticsearchの過去データパージ

主にログ可視化環境で使うことが多いElasticsearchだが、取り込むログの量が多いとあっという間にDISK容量を圧迫してしまう。

Elasticsearchの古いデータの削除はcuratorを使って行える。

以下を参考にインストールし使ってみる。

利用にはpython & pip が必要。

qiita.com

●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。