私はキャリアの大部分を、2つのデータベースの境界部分で過ごしてきました。それは、誰もデモをしないスタックの部分です。上流でスキーマが変更され、同期がひっそりと遅れ、朝 のダッシュボードが間違っていて、まだ誰もそれに気づいていないため、エンジニアが午前2時に起こされるようなパイプラインです。今週、レイノル・シンがステージ上で、CDCは実際には「Continuous Data Corruption(継続的なデータ破損)」の略だと言ったとき、会場は共感の笑いに包まれました。その場にいたすべてのデータエンジニアがそれを経験していたからこそ、彼の言葉はウケたのです。
だから、DatabricksがData + AI Summitで、運用データと分析データの間の壁に関する40年前の話を持ち出したとき、私は注目しました。そして、彼らが語った最も示唆に富むことは、矛盾でした。彼らは、エージェントの時代に向けてその壁を取り払う必要があると長々と主張しながら、同時に、その壁を取り払うために構築されたカテゴリであるHTAPを失敗と断言し、LTAPという新しい名前でHTAPから撤退したのです。
私は、競合他社が新製品を発売した翌朝、自分のエンジニアリングチームに話しかけるのと同じように、この問題に取り組んでいきたいと思います。拍手喝采でもなく、都合の良い言い訳でもありません。40年来の問題が本当に解決されたのか、それとも単に名前を変えただけなのかを決定づける質問を投げかけます。

融合は現実のものであり、AIこそがそれを緊急なものにした
私たちは40年間、当時としては理にかなっていた分断体制で生きてきました。運用データベースは、一度に1行ずつビジネスを処理し、分析システムは、過去のデータに関する大きな疑問に答えていました。私たちは、パイプラインやレプリカ、そして誰もが費用を負担しながらも誰も好まなかったETLレイヤーで、両者を繋いでいました。人間が人間のスピードでソフトウェアを開発していた時代は、それは妥当なトレードだったのです。
エージェントはトレードを破壊しました。エージェントは人間のようには動作しないし、人間向けに作ったアプリのようにも動作しません。エージェントはコンテキストを読み取り、ループし、何かを試み、書き戻し、それを人間がコーヒーを飲み終える前に何百回、何千回も繰り返します。このペースでは、ライブシステムと分析システム間のあらゆるホップが、すべてを遅くする原因となります。エージェントは、現在の状態と詳細な履歴を同時に必要とし、両者が一致している必要があります。問題提起に関しては、Databricksと私は意見が一致しています。
「HTAPが失敗した」という主張について
レイノルズははっきりとこう述べました。「HTAPはほぼ失敗に終わった」。システムは独自仕様で、エコシステムもなく、単一のエンジンを目指したことで、トランザクションと分析の両方で妥協を強いられたと。彼はマイケル・ストーンブレーカーの著書『One Size Fits All: An Idea Whose Time Has Come and Gone』(万能なエンジン:時代遅れのアイデア)を引用し、単一のエンジンですべてを完璧にこなすことはできないと主張しました。これは彼らの売り込みの根幹を成す主張なので、詳しく検証する価値があります。
彼は10年前のHTAPについて述べていますが、当時のシステムに関しては彼の言う通りです。確かに妥協はありました。多くは独自のシステムで、エコシステムは脆弱でした。しかし、それはある世代の製品に対する評価であって、その理念に対する評価ではありません。そして、その評価が、その理念を葬り去るために利用されているのです。
しかし、「万能なソリューションはもはや時代遅れ」というのは、あらゆる機能を一つの汎用エンジンに詰め込んで、結局どの機能も中途半端になってしまうことへの反論でした。ポイント書き込みとビッグスキャンの両方が高速になるように、ストレージフォーマットを意図的に設計することへの反論では決してありま せんでした。その違いこそが全てであり、私たちが10年かけて構築してきたものです。SingleStoreのUniversal Storageは、分析機能を後付けした汎用エンジンではありません。最初から両方に対応できるように設計された単一のフォーマットです。「難しいから、代わりに3つのエンジンと共有バケットを使うことにしよう」というのは、正当なエンジニアリング上の選択ですが、物理法則ではありません。
そして、ここでレイノルズ氏に直接、敬意を込めて申し上げたいことがあります。HTAPを失敗作と断言しておきながら、その後20分かけて、世界がまさにHTAPが約束した機能を必要としている理由を説明するのは筋違いです。OLTPとOLAPを統合し、エージェントが1か所で読み書きできるようにするのがHTAPの目標であり、スライドに何と書いていようと変わりません。LTAPと名称変更しても、マーケティング戦略変わるだけで、根本的な原理は変わりませんし、議論の的となる問題も解決しません。
その批判の中で、私が真っ向から反論したい言葉が一つあります。それは「独自規格」です。HTAPに対する批判は、システムが独自規格でエコシステムが脆弱であるという点でした。結構です。では、新しいアーキテクチャにも同じ基準を適用すべきです。Reydenは完全に独自規格でクローズドな全く新しいエンジンであり、この市場においてエコシステムは非常に若いと言えます。つまり、まだエコシステムは存在しないのです。そして、LakebaseはPostgresのオープ ンソースというイメージを借りることはできません。マネージドLakebase製品(サーバーレス制御プレーン、レイク統合、エンタープライズレイヤー)は、Postgresに対応したDatabricks独自のソフトウェアです。「オープンなPostgres」ではありません。基盤となるオープンテーブル形式は確かに存在し、重要ですが、ディスク上のオープンファイルと、それを読み書きするオープンエンジンは同じではありません。独自規格のエンジンがHTAPに対する批判点であったとしても、その基盤となるデータがたまたまIcebergであるからといって、それが美徳になるわけではありません。
共有ストレージは統合エンジンとは違う
レイノルズ氏は、核心にある問題をまさに私と同じように捉えていました。OLTP(オンライン・トランザクション処理)では、膨大なデータの中から必要なデータを見つけ出し、迅速に更新するために、行指向のストレージが必要となります。一方、分析では、広範囲のデータを検索するために、列指向のストレージが必要となります。この二律背反は紛れもない事実であり、あらゆる処理の根幹を成すものです。問題は、この二律背反にどう対処するかです。
LTAPの解決策は、ストレージ層での統合です。トランザクション処理にはPostgres(Lakebase)、大規模分析にはSparkとPhoton、リアルタイム読み取りには新しいReydenエンジンをそれぞれ別々に用意し、それらすべてをオブジェクトストレージ内の単一のオープンコピーに向けます。同じデータのコピーを4つのシステムに分散して保持していた経験がある人にとっては、これは安心材料に聞こえるでしょうし、確かに改善と言えるでしょう。その点は認めます。
しかし、「1つのコピー」というのはストレージに関する主張であって、エンジンに関する主張ではありません。3つのエンジンが依然としてその上にあり、それぞれが独自のキャッシュ、データの鮮度に関する独自の認識、そして最悪のタイミングで障害を起こす独自の方法を持っています。また、Databricksの枠組みでは、行レイアウトと列レイアウトは異なるものです。Postgresの行表現に書き込みが行われ、アナリティクスが列表現を読み取る場合、同じデータの2つの物理的な形状が存在することになり、それらを同期させる何かが必要になります。その変換を何と呼ぶか
そして、この特定の形状がなぜ私の首筋の毛を逆立たせるのか、率直にお話ししましょう。私は長年、Hortonworks、そしてClouderaでHadoopの世界に身を置いていました。私たちはあらゆる用途に対応するエンジンを持っていました。SQLにはHive、キーバリューにはHBase、高速クエリにはImpala、ストリーミングにはStorm、検索にはSolr、そしてSparkが急速にその後ろに迫っていました。それぞれが担当分野で本当に優れていました。しかし、それらが組み合わさると悪夢のような状態になりました。それは、どのエンジンも単体で弱いからではなく、すべての問題がそれらの間の継ぎ目に存在していたからです。統合はずれを生じ、セキュリティモデルは決して完全に整合せず、データはエンジンからエンジンへとシャッフルされ、ある部分が他の部分よりバージョンが遅れると午前3時にページングされる始末でした。業界全体が最終的にその広がりから脱却し、統合へと向かいました。ですから、1つの問題を解決するために3つのエンジンが共有ストレージに取り付けられているのを見ると、 私は画期的な進歩だとは思いません。むしろ、すでに最後まで見た映画の、より小さく整ったバージョン、Hadoop v2のように見えます。私はそれに反対しているわけではありません。チャンネルを変えたのには理由があります。
私たちの現状とその理由
私たちは別の道を選びましたが、正直に言うと、構築するのはより困難でした。エンジンは1つ、ストレージレイアウトも1つ。真の統合はエンジンの問題であり、それをバンドル化して解決することはできないため、私たちはその賭けに出ました。この全体を支えているのは3つのアイデアです。
トランザクションと分析用のデータコピー1つ
Universal Storageは単一のフォーマットです。カラムストアファイルの上にインメモリの行ストア層が配置され、単一のレイアウトになっています。同じバイト数からカラムストアのスキャン速度と行ストアの書き込み速度を実現します。運用コピーと分析コピーを照合する必要はなく、睡眠中にシャドウテーブルが密かに同期を失うこともありません。トランザクションとクエリは同じデータを参照します。なぜなら、データは1つしかないからです。
データが到着してからクエリ可能になるまでの期間に差はない
これは私が最も重視している点です。なぜなら、エージェントの成否を左右するからです。SingleStoreでは、書き込みがコミットされた瞬間にクエリ可能になります。同期後でも、マテリアライゼーションジョブが追いついた後でもありません。まさにその瞬間です。リアルタイムには書き込みパスを含める必要があります。そうでなければリアルタイムではなく、少し古いデータの高速読み取りに過ぎません。注目すべき点として、Databricks自身がLakehouse//RTを「読み取り専用ワークロードから開始する」と述べています。読み取りが先です。これは正直な告白であり、まさに私が言いたいギャップです。エージェントがアカウントを更新し、同時にそのアカウントを1年分の履歴と関連付ける質問をする場合、自身の書き込みを確認する必要があります。両方のワークロードが1つのエンジンで1つのコピーで実行される場合は、それがノーコストで得られます。コミットがフォーマット境界を越えて別のエンジンに移動し、順番を待たなければならない場合は、それを実現するために努力し、多くの場合、負けてしまいます。
同一エンジンで複数モデルに対応
実際のアプリケーションは、ずっと前に純粋なリレーショナルではなくなり、エージェントがそれをクリティカルパスに組み込みました。それらは、リレーショナルテーブル、JSONドキュメント、セマンティック検索用のベクトル、全文検索、時系列データなど、場合によってはこれらすべてを単一のクエリ内で処理することを求めています。私たちはそれらを1つのエンジンでネイティブに実行するため、1つのSQLステートメントで列をフィルタリングし、ベクトル類似性検索を実行し、結果をJSONフィールドと結合しても、データベースから離れることはありません。優秀なチームが、本来1つのクエリで済むはずだった処理を実行するために、データウェアハウス、ベクトルストア、検索クラスタを寄せ集め、その後1年間かけて3つすべてを相互に整合性を保つようにしているのを見てきました。統合とは、OLTPとOLAPを組み合わせるだけではありません。それは、本来互換性を持つはずのない5つのシステムを、従業員が監視し続けることを拒否することです。
解決したと断言する前に、私が尋ねるであろう4つの質問
これらは私がその場で提起したい質問です。議論に勝つためではなく、これらの質問を飛ばしたことで痛い目に遭った経験があるからです。Databricksはステージ上でこれらの質問に答えませんでしたが、それは当然のことです。基調講演であって、デザインレビューではなかったのですから。しかし、これらの質問こそが、アーキテクチャと発表を分けるものであり、Databricksがこれらの質問に的確に答えてくれれば、私たち全員にとってプラスになるでしょう。これは本心です。
Reydenは追記専用ですか、それとも更新や削除も処理できますか?
Reyden は単純な高同時実行読み取りでは高速です。しかし、Databricks 自身が言うように Lakehouse//RT は「読み取り専用ワークロードから開始」して発売されました。追記専用で読み取り中心のワークロードは高速化の最も簡単な方法であり、優れたベンチマークとなります。実際のデータは追記専用ではありません。注文のステータスは変更され、残高は変動します。顧客は忘れられる権利を行使し、GDPR は追記の速さには関心を持ちません。データレイク上では、変更処理は本当に困難です。Iceberg は、読み取り時に読み取り側が削除ファイルを調整し、行レベルの削除を行うマージ オン リード方式、または更新のたびにファイルを書き換えるコピー オン ライト方式を採用しています。どちらの方式も、低レイテンシが求められるまさにその瞬間に、読み取り増幅または書き込み増幅というコストを追加します。したがって、疑問は単純です。Reyden が書き込みを行うとき、更新および削除されるデータに対してミリ秒単位の数値を維持できるのか、それとも Reynolds 自身が言うように、まさにその箇所で HTAP が「失敗した」のか?運用ワークロードが実際に行う処理はまさにそれなので、私たちはインプレース更新と削除を最優先事項として扱うことにしました。
