🐡🐡🐡Benthos触ってみた🐡🐡🐡
気にはなってるけど触ってないビッグデータ系のツール・サービスを触る Advent Calendar 2022の#14です。
Benthosとは
公式サイト曰く、
Benthos is a declarative data streaming service that solves a wide range of data engineering problems with simple, chained, stateless processing steps.
です。 Ashley Jeffs さんが主に開発を行っているGoで書かれたデータ処理エンジンです。YAML(+DSL)で処理を定義します。
(Benthos公式サイトから)
VectorやApache Nifi、Logstashやfluentdに近いプロダクトだと思います。Vectorについては特に比較の説明があり、
- Vectorはデータの転送を重視
- それに比べてBenthosはデータの処理に重きを置いている
とのことです(どちらに重きを置くかの話で、Vectorでデータ処理もBenthosでデータ転送も可能)。
Webサイトでは事例は(多分)公開されていませんが、いくつかスポンサー企業がついており、その中では使われているのかなーと思っています。
機能
入出力
- ファイル(オブジェクトストレージやローカルファイル)
- データベース
- キュー
- ネットワーク(HTTP等)
等をサポートしています。紹介に「Streaming」とありますが、ファイルとかBatch的な入力も処理できるのですね。
サポートされていない入出力の場合は、Go言語でプラグインを書けます。
Processing
多分Benthosのメイン機能で、受け取ったデータを出力するまでの間に、何らかの処理を行うことができます。例えば、
- テキスト処理(jqやawk、後述のbloblangの呼び出し)
- 入力データを使って、外部リソースを呼び出しデータの拡充(いわゆるenrichment)
- ファイルの形式に応じたパース・解凍
- 分岐やループといった制御
などを行ことができます。
Bloblang
Bloblang, or blobl for short, is a language designed for mapping data of a wide variety of forms. It's a safe, fast, and powerful way to perform document mapping within Benthos.
です。Benthosの中での処理を記載するDSLで、awkやjqが近いかもしれません。
Bloblangを使うことで、入力(典型的にはJSON?)に対し
- 要素の追加、要素を抽出し別の要素に(ネストを外す)、要素の削除
- 条件分岐
- filterやmap
- 関数を呼び出しデータを拡充
といった処理を行うことができます。
その他の機能
- キャッシュ
- Rate Limit
- バッファ
- トレーサビリティ(メトリクスやTracer)
といった、大規模に使う上で便利そうな機能もあります。
触ってみる
Getting Started
- インストール
- ひな形の設定ファイルの作成
- 標準入力から受け取ったデータを、Bloblangで処理(大文字小文字やハッシュ化)し、標準出力に出力
する例が紹介されています。
Bloblang Walkthrough
Bloblang WalkthroughはBloblangに特化したチュートリアルです。
Bloblangを試すWebUI(benthos blob server)を開き、Bloblangの機能を試していきます。WebUI(benthos blob server)では、左上に入力、下にBloblangを入力すると、右上に出力が表示されます。
このチュートリアルでは、具体的には
- JSONの要素を増やす
- 大文字にする
- 置換
- 削除
- 変数
- 条件分岐
- エラーハンドル
- catchでエラー時の戻り値を記載
- バリデーション
- チェックしてダメだったら例外を発生させる
- filter
- map
- unit test
といったBloblangの機能を試していきます。
なお、ドキュメントではDockerコンテナでWebUI(benthos blob server)を起動していますが、Getting Startedでインストールしたbenthosコマンド経由( benthos blobl server --host 0.0.0.0
)でも動作可能です。
感想
面白そうだと思った点
- 外部依存が少なく(JVMやRubyが不要)静的なバイナリだけで動くので、動かしやすい・試しやすい
- Processingの機能が豊富
気になった点
- 同じカテゴリーの製品(fluentdやLogstash)との使いわけ・比較
- ドキュメントでは「exactly-once」を謳っている箇所がありますが、その方法や制約
- 分散処理
- データが多い時はどうするか。単一マシンで処理できるデータがスコープなのか、Nifiの用にクラスタを組んだりできるのか
ロゴ
あまりにも可愛いので、ステッカーが販売されています。
Discussion