私は、いくつか家内サービスを運用しています。SQLを使った「家計簿」を家族全員が使っていますし、自宅に「監視カメラ」をおいてLineBotで適宜確認できるようになっています。無料枠を使い回しているのでデータ移行が定期的にありますが、そのときによくEmbulkを使っています。非常に短い備忘録ですが、以下にまとめています。www.1915keke.comこの記事は短すぎて適当に見えるのですが、それくらいシステムは簡単だったことが印象でした。今回はEmbulkと同じくTeasureDataで開発が進められているDigdagを使ってみて、どのような開発のしやすさなのかなど知識を増やしたいと思います。Digdagについて一体何をするもの?Digdagとは、トレジャーデータが公開したオープンソースなワークフローマネージャーです設定ファイルは一般的なYAMLではなくて.digであり、どうやらMapのキーの順番が維持される必要があるかららしいです。目的としてはcronITオペレーションの自動化バッチジョブによるデータ分析などを置き換えるために作られています。手作業で行っていた作業を自動化することによって、様々な恩恵が受けられると思います。簡単に開発できるバイナリーをダウンロードすればすぐに開発できます。周知の如くですが、やはり開発しやすさと開発スピードには相関があり、それはビジネスを進める上でも非常に重要です。簡単な設定YAMLによって書かれているため非常に分かりやすいです。YAMLは広く使われていてCircleCIやKubernetesをはじめとするありとあらゆるものに使われています。依存関係がある読み書きできるワークフローになっています。CrobJobのように時刻で動作するようなものから解放されます。Storageやオンプレミスなデータベースからデータを扱えます。多言語サポート現在はPythonとRubyをネイティブサポートしています。データサイエンティストとWeb開発者が協力することができます。エラーハンドリングワークフローが失敗してしまったとき、Digdagはロバストなエラーハンドリングを提供します。モジュール性それぞれのワークフローが再利用可能なものになるようにDigdagはデザインされています。拡張可能Pluginによって拡張できるようになっています。自分のオペレータやコントロールフローを定義できる。管理者UIGUIによって管理ができるようになっているので、すべてをコマンドラインからする必要がないです。Secretsを管理DigdagはSecretを安全に管理できるようにできる。DockerをサポートDigdagはDockerコンテナに定義されてあるDockerコンテナをサポートしているので、環境に依存せずにタスクをこなすことができます。バージョン管理Digdagはワークフローをコードとして宣言的に書くことができます。アーキテクチャワークフローによってありとあらゆるタスクを自動化できます。タスクはオペレータープラグインを使って定義されます。使えるオペレーター一覧は以下の通りです。documentationこれからアーキテクチャについて説明していきます。グループによるタスク管理[http://docs.digdag.io/images/grouping-tasks.png:image=http://docs.digdag.io/images/grouping-tasks.png]Digdagでは複雑なワークフローを自動化できる一方で、管理をしなければなりません。グループという概念でタスクをまとめることができ、直感的にワークフローを理解することが容易になります。親子の関係であり、グループが実行されるとそのグループに含まれる子であるタスクがすべて実行されます。タスクが成功するとグループが成功したとされます。パラメータグループにタスクをまとめることは、タスク間でパラメータを渡すために使われています。親のタスクはexportすることによって変数をこのタスクに渡すことができます。Code「宣言的に書ける」よとうことです。Github上にあるワークフローは実際のデプロイされているワークフローをそのまま表していることになります。実際のワークフローはGithub上のコードを記述しているはずです。Docker上でタスクを実行できるDockerの上でタスクを実行するので実行環境の差分によるエラーなどを防ぐことができます。Dockerを使う場合は以下のように書きます。tasks.MyWorkflow.step1用語Taskあまり説明が必要ではないかもしれませんが、アトミックな実行単位です。名前は一意になるようにしなければなりません。実際に何をするかは定義次第です。...このようにすると特定のタスクは親のタスクがプレフィックスについた名前で指定されます。+my_workflow+load+from_mysql+tables,+my_workflow+load+from_postgresのようになるということです。ワークフローを作ってみようDigdagをInstallするまず、以下のコマンドを使用してインストールします。--versionと実行してみてください。私の場合はFishシェルで実行しているためエラーが出ました。system.これはIssueにもあがっています。github.com以下のaliasを登録します。~/bin/digdag"すると使えるようになると思います。--version0.9.31これで始めることができます。簡単なワークフローを作ってみるまず、これまでのディレクトリは以下の通りになっています。initコマンドで初期化します。hello-world-workflowすると以下のようなディレクトリ構成になっています。hello-world-workflow.digまた、実際の中身の.digファイルは以下のようになっています。runコマンドを実行せればよいです。hello-world-workflow.digすると以下のようになります。Workflowの定義Workflowは.digのように指定されます。ファイル名があなたのワークフロー名になります。トップレベルにtimezoneでどの時間帯かを指定します。デフォルトではUTCですが、Asia/Tokyoなどを指定することができます。initで初期化した時にできたワークフローの一行目です。タスクの定義タスクは+を使って定義し、上から下に実行されます。オペレータを使うタスクはオペレーターのタイプ名>のように書かれています。シェルスクリプトを実行したり、Pythonスクリプトを実行したり、メールを送ったり、いろんなことができます。変数を使うすでにEmbedしている変数があります。以下のようなものです。timezonesession_idtask_nameなどです。詳しくは以下のリンクをご覧ください。計算をする${}の中で基本的なJavascriptの計算はできます。時間の計算にはMoment.jsが使われています。一つのタスク内で以下のような計算ができます。変数を定義する自分で変数を定義したいときがあるとしましょう。三つの方法で変数を定義できます。_exportで定義するAPIを使って定義するSessionを開始するときに定義するExportで定義するときは以下のようにします。tasks.MyWorkflow.prepareAPIを使う場合は以下の通りです。2})このようにdigdag.env.store(dict)で引数に辞書型を渡してあげます。他のdigファイルをimportする以下のように他のファイルを!includeすることによってimportすることができます。並列に処理をすることができます。trueとすることによってグループのタスクを並列処理できます。以下のように定義します。tasks/analyze_prepared_data_sets.sh特定のタスクのみを並列処理したければ、_backgroud:trueと追記することによって定義することができます。自動的に失敗したタスクのリトライ_retry:Nというリトライパラメータが設定できます。失敗してリトライできる回数を設定できます。tasks/analyze_prepared_data_sets.sh公式ドキュメントにもあるように、失敗するとそのグループの最初のタスクから実行されます。Nを定義することもできます。失敗すると以下のように_errorで定義したタスクを走られすことができます。文法ワークフローを定期的に行うには以下のようにschedule:で定義する必要があります。tasks/shell_sample.shどのように定義すうかは公式ドキュメントを参考にしてください。cronのフォーマットでも指定をすることができます。schedulerでコマンドを実行できます。ファイルが変更していても、自動的にロードされます。実行にかかった時間をアラートするあるワークフローに、普段なら2分くらいしかかからないのに1時間などかかっていたら何かがおかしいことが想定できます。そのようなために、timeとうものが指定できます。セッションのスキップ例えば30分毎に実行されているワークフローがあり、普段は20分かかって終了するが、データ数が以上に多い祝日などは20分以上かかってしまうかもしれません。falseを設定することによって、複数のWorkflowが同時に実行されるのかを指定できます。DigdagのGUIを使ってみるDigdagには開発時につかうローカルモードと、運用時に使うサーバーモードがあります。ローカルモードでは単一の.digで定義されたワークフローを実行できます。#11]またサーバーモードでは以下のようなアーキテクチャになっています。#11]まずは、実際にGUIを提供するサーバーを立ててみます。--memoryそして、以下のようにワークフローをAPIを通して保存します。hello-world-workflow他のディレクトリにいるなら---projectで指定してください。http://localhost:65432にアクセスをします。すると以下のようにワークフローがpushされています。選択してみると以下のようになっています。実際に実行しています。するとセッションができます。StatusのSuccessボタンを指定すると、結果をみることができます。foreachなどが並列処理されていることがわかります。ログレベルはPushのときに指定できます。--log-level=infoといったような感じです。必要に応じて行ってください。メモを整理していたときに、もっと簡潔に明文化したいと思...2018-12-23Concourseで継続的デリバリー。Calendarの23日目の記事にな...2018-12-14CircleCIでSpinnakerのデプロイメントパイプラインをデプロイするどうも、もうすぐ大学卒業の@timtimtim1026です。Kubernetesのいろは。»プロフィール学生エンジニア。忘れてしまうので備忘録です。flaskでServerlessにホストするTelepresence概論スターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。