-
紹介
- HydroはRust向けの高水準分散プログラミングフレームワーク。
- Hydroはスケーラブルな分散サービスを迅速に作成できるよう支援し、Rustがメモリ安全性を保証するように、分散安全性を保証する。
- テストモードやデプロイモードで分散プログラムを簡単に実行できるよう支援する。
-
Hydroの特徴
- Hydroは高性能なシングルスレッドDFIRランタイムで動作する分散データフロー言語。
- 従来のアクターやRPCのようなアーキテクチャとは異なり、複数の場所にまたがって計算を記述できるコレオグラフィックAPIを提供する。
- Hydro Deployと統合されており、ローカルやクラウドで分散Hydroプログラムを簡単にデプロイして実行できる。
-
コンパイルとデプロイ
- Hydroは2段階のコンパイルアプローチを採用している。
- Hydroプログラムは標準的なRustプログラムであり、開発者のノートPC上でデプロイ計画を生成する。
- この計画はDFIRへコンパイルされ、分散システムの各マシン向けの個別バイナリを生成する。
- 生成された計画とクラウドリソースの仕様を使ってクラウドにデプロイされる。
-
活用事例
- Hydroは、2相コミットやPaxosのような高性能分散システムの実装に使われている。
- こうしたプロトコルを再利用可能なコンポーネントとして提供する分散システム標準ライブラリを開発中。
-
注意事項
- Hydroのドキュメントはまだ作業中であり、質問やバグがある場合はHydroのGitHubリポジトリにIssueを投稿することが推奨されている.
1件のコメント
Hacker News のコメント
Hydro プロジェクトを説明する良い YouTube 発表がある。主に DFIR に焦点を当てている
https://www.youtube.com/watch?v=YpMKUQKlak0&ab_channel=ACMSI...
実際にどこへ適用するとよいのか理解するには、現実的な適用例がもっと必要に見える
キー・バリュー・ストアのような、より複雑なアプリケーションも作っているところ
間に独自ランタイムを持つ中間言語があるなら、Rust がもたらす利点を失うのか気になる
別々の Rust バイナリを調整して、一貫して動作する分散システムにまとめる言語だと思っていたが、接着剤レベルではなく、最初から最後まで DFIR で書くように見える
DFIR の演算子(map、filter など)は Rust クロージャを受け取るため、高水準言語から最終的な Rust バイナリまでそのまま渡せる。ユーザーの立場では DFIR を直接扱うことはない
本当に興味深い。この分野に詳しい人がいれば、先行研究や似たようなフレームワークが他の言語にあったのか教えてほしい
データフロー周りは多くの人が取り組んできており、Materialize はかなり良いと思ったし、仕事で Kafka Streams も使ったことがある。これらをひとまとめにするフレームワークには意味がありそうだと思う
特に Rust ベースなので、他の言語とうまく連携できる点が強みになりそう。Spark は移植性の面では JVM が良い選択だが、多くの複雑さを持ち込むし、Dask は Python 上で動くため、すでに Python を使っている状況でなければかなり重い依存関係になる
分散 Rust 方面では Lunatic も見たことがあり悪くなさそうだったが、Hydro が目指しているものよりはもう少し低レベルに見えた
そのため https://doc.akka.io/libraries/akka-core/current/stream/index... が最も近い比較対象かもしれない
https://rise.cs.berkeley.edu/projects/
データ処理と分散システムの大部分は、この研究室が行ってきた研究とある程度つながりがある
取り組みは好感が持てるが、いつか Rust エコシステムに akka.rs のようなものが入ってくるといい
データフローの観点で timely [0] とどう比較されるのか気になる。中間表現でループのような制御フローを表現できるのかも気になる
[0] https://github.com/TimelyDataflow/timely-dataflow
関数型リアクティブプログラミング、合成、フローのフロー、代数的演算子、証明指向に近い。Timely とは非常に異なる「進行」の概念を持ち、潜在的に無限のストリーミング入力でも合成が生成的であることを保証する点に重点を置いている
実際、Flo には「適時性」の概念がほとんどなく、タイムスタンプもない。Timely のようにネストした反復をサポートするが、仕組みは非常に異なる。基本代数は極めて非循環的だが、ネストしたストリーム/グラフの形式化が反復を可能にしている
論文は DBSP とも直接比較しており、私の理解では DBSP も Timely/Naiad 系列だ。著者らは Flo が Flink、LVars、DBSP のような複数の類似システムのための統一的な意味論フレームワークになり得ると見ている
そのため Flo の著者らは Naiad/Timely をよく知っており、ネストした反復グラフから着想を得ているが、それ以外は大きく異なると見ている
[0] https://hydro.run/papers/flo.pdf
各「プロセス」が別個のバイナリとしてデプロイされるなら、おそらく別プロセスとして実行されるという意味だと思うが、そうなるとオーバーヘッドの増加という点で問題がありそうに見える
高速な通信をどう実現するのか気になる。高速な共有メモリ IPC のような仕組みを使うのだろうか?
また、async との統合についての内容も見当たらない。良くも悪くも、ネットワークを扱うコードの圧倒的多数は async に移行しており、ネットワークが必要な多くの領域では、良い非同期ではないライブラリを見つけるのは難しい
そのため、単一マシンでの並列性が欲しい場合は多少の追加オーバーヘッドがある。指摘のとおり、共有メモリによって今後ぜひ解決したい部分だ
先週の POPL 2025 で、Hydro に参加している学部生が async-await のコードブロックを Hydro のデータフローへ自動コンパイルするコンパイラを発表した。まだ作業中で文書化されていないが、ここで見られる: https://github.com/hydro-project/HydraulicLift
本当に格好よく見えるし、いくつか使い道が思い浮かぶ。特にデプロイ部分が独特に見える
ドキュメントがさらに充実するのを期待していて、特に中核に見える Streams、Singletons、Optionals の部分が気になる
プログラミングモデルは気に入った。アプリケーションを書き換えるときにネットワーク最適化も行うのか気になる
ネットワークのボトルネックや輻輳処理を扱うのか知りたい
データパイプラインに Ballista のようなものを使う場合とどう比較されるのか気になる
Ballista は Apache Arrow と Apache Datafusion の上に構築されている恩恵が大きい
目標は SQL クエリを実行することではなく、分散システムのコード(例: マイクロサービス実装)を SQL クエリのように扱うことです。Arrow と Parquet の統合もロードマップに入っています