データプラットフォームの構築：なぜ我々はSnowflakeではなくDatabricksを選んだのか

[Building our Data Platform: Why we have chosen Databricks over Snowflake](https://blog.denexus.io/databricks)の翻訳です。

DeNexusにおいて、我々は重要なインフラストラクチャに悪影響を及ぼすサイバーリスクの課題を解決しており、世界中の保険を引き受けている保険事業者でもあります。

# 課題：信頼できるデータ

重要なインフラストラクチャは空港、電力ライン、分電センター以上のものとなります。これには、複雑なオペレーショナルテクノロジー(OT)、ITネットワーク、ICS、エンタープライズソフトウェアおよび人材が含まれます。

さらに、重要なインフラストラクチャはこれまで以上のサイバーセキュリティリスクにさらされています。過去5年において、エネルギー、再生可能品、製造、交通、サプライチェーンエコシステムなど全てが、増加するランサムウェア、マルウェアの攻撃の犠牲者となっています。[過去2年のみで、ICS、OTをターゲットとしたランサムウェアの攻撃は500%以上に増加しました。](https://purplesec.us/resources/cyber-security-statistics/ransomware/)サイバーリスクの課題は高くつくものであり、おそらく、この現象を表現する膨大なデータを用いることでしか、必要となる費用を削減することはできないでしょう。

DeNexusでは、プロプライエタリなリスク検知アルゴリズムを開発、トレーニングするのに必要なデータを収集、格納し、高度にスケーラブルな**リスク検知SaaSプラットフォームDeRISK**からクライアントがセキュア、効率的、柔軟に利用することで本格利用でききるように、プロプライエタリなデータレイクである***DeNexusナレッジセンター***を構築しました。
![](https://blog.denexus.io/hs-fs/hubfs/Knowledge%20Center.png?width=1958&name=Knowledge%20Center.png)
**図1:DeNexusナレッジセンター**

# DeNexusの要件

1. **様々なタイプのユーザーにデータアクセスを許可**：上級ユーザー(複雑な変換処理を活用)および基本ユーザー(SQLのみを使える)
1. **強力なデータバージョン管理**：先進的なモデリングにおいて、特定のファイル、テーブルのバージョンが変更されていないことを確実にする機能。以前のバージョンのデータへのアクセス、利用が容易になるように、データレイクにおける過去のすべてのトランザクションは記録される必要がある。
1. **様々なデータのサポート**：構造化、非構造化、準構造化データおよび、DeRISKでやりとりしているビジネスインテリジェンスのデータソースでサポートされている**様々なデータフォーマット**のサポート。
1. **高いスケーラビリティ**：データ量が急激に増加しており、ペタバイト規模のデータに対応できる必要がある。「[無限に対するデザイン：十分大きいことは常に十分良いとは限らない](https://www.youtube.com/watch?v=jfyS_gc8WGA)」
1. **インフラストラクチャの権限移譲**：内製の人的資産の活用を最適化するために、ソリューションは(可能な限り)SaaSあるいはPaaSである必要がある。
1. **ML-OPS**：データレイクの主な用途の一つはモデルのアプリケーションを通じたデータの活用である。プロダクションのデプロイメントを加速し、開発を円滑にするために、ベストプラクティスの基準として[ML-OPSパラダイム](https://en.wikipedia.org/wiki/MLOps)に従う必要がある。
1. **強力なセキュリティ、コンプライアンス機能**：データストレージは柔軟かつ動的である必要がある。

マーケットにある既存のソリューションを評価したのち、よく知られている[データウェアハウスコンセプト](https://en.wikipedia.org/wiki/Data_warehouse)に基づくソリューションは除外されました。ParquetやAvroのようなフォーマットやSpark、Presto/Trinoのようなツールによって提供される高速データアクセスが実現されている中、データレイクとデータウェアハウスを区別することにいまだ意味はあるのでしょうか？これはユースケースに依存しますが、我々の場合そうではありませんでした。なぜでしょうか？我々のメインのデータソースはSQL Server、PostgreSQL、MySQLなどの[RDBMS](https://searchdatamanagement.techtarget.com/definition/RDBMS-relational-database-management-system)システム由来のものではありませんでした。実際のところ、データプラットフォームを移行せずにスクラッチで開発したので、我々のデータは元々はあちらこちらから集められたものとなっています。

Bill Inmonは最近同じような見解を述べています。

> まず初めに、我々は「データレイク」と呼ばれる穴に全てのデータを投げ込みました。しかし、穴にデータを投げ込むことは意味のないことだとすぐに気づきました。データを有効活用、分析されるようにするためには、データはそれぞれ関連づけられ、分析インフラストラクチャが注意深く準備され、エンドユーザーが利用できるようになる必要があります。これら2の条件が満たされない場合、データレイクはスワンプ(沼)となり、しばらくするとスワンプは臭いを放ち始めるでしょう。分析におけるこれらの評価指標を満たさないデータレイクは、時間とお金の無駄となります - [Building the Data Lakehouse By Bill Inmon](https://databricks.com/wp-content/uploads/2021/10/The-Data-Lakehouse.pdf)

# ソリューション：データレイクハウス

我々はデータウェアハス(ACID互換性、データのバージョン管理、最適化技術)とデータレイク(低コストのストレージ、様々なデータフォーマットのサポート)のキーとなる利点を組み合わせたデータ管理システムを必要としていましたので、データレイクハウスのネイティブの実装と、以下のセクションで説明するような理由から、[データレイクハウスプラットフォーム](https://databricks.com/discoverlakehouse)とDatabricksを選択しました。
![](https://blog.denexus.io/hs-fs/hubfs/aaadata-lakehouse-new-1024x538.png?width=2048&name=aaadata-lakehouse-new-1024x538.png)
**図2:データウェアハウス：データレイク - データレイクハウスの比較**

データウェアハウス(DWH)では機械学習(ML)アルゴリズムはうまく動作しません。通常小規模のデータを抽出するBIクエリーとは異なり、これらのMLアルゴリズムはSQLを使うことなしに大規模なデータセットを処理します(*XGBoost、Pytorch、TensorFlow...*)。定常的なデータ型の変換によってデータの読み込みは非効率的なものであり、データウェアハウスで使用されているプロプライエタリな内部データフォーマットとの直接的な互換性がないケースがないケースが多くあります。これらのユースケースにおいては、データはオープンなデータフォーマットのフォイルとしてエクスポートされますが、これにより追加のETLステップが発生し、複雑性を増加させ、データの鮮度を低下させます。

*Snowflake*のようにデータレイクフォーマット(オープンデータフォーマット)の外部テーブルの読み込みをサポートしている「クラウドネイティブ」のデータウェアハウスもデータレイクハウスアプローチを実装しているという議論があるかもしれませんが、

- 彼らのメインのデータソースは彼らの内部データであり、いくつかのケースにおいては依然としてETLパイプラインが必要となります(管理すべきプロセスと、失敗が起こりうるポイントを追加することになります)。
- 彼らが内部データに対して提供しているのと同じ管理機能(例：トランザクション、インデックス...)を、データレイクのデータに対して提供することはできません。
- 彼らのSQLエンジンは、彼らの内部フォーマットに対するクエリーに対してほとんどが最適化されています。

さらに、データレイクストレージのデータに直接クエリーを行うために単一のツールを利用した場合、通常のデータウェアハウスが持っているデータ機能の欠如(例：ACIDトランザクション、インデックス...)から、全体的なデータ問題を解決しません。
![](https://blog.denexus.io/hs-fs/hubfs/Screen%20Shot%202021-11-08%20at%207.42.31%20AM.png?width=1378&name=Screen%20Shot%202021-11-08%20at%207.42.31%20AM.png)
**図3:DeNexusデータプラットフォーム**

# なぜ我々の要件に合致したのか？

**様々なタイプのユーザーにデータアクセスを許可**: データにアクセするためにSQLを用いるには、誰かが生データに対して構造を付与するプロセスを実行する必要があります。シンプルなSQLでこのような変換処理が可能でしょうか？答えはYESですが、色々と大変です...

SQLは特定のことに対しては威力を発揮しますが、汎用プログラミング言語ではないため、それ以外では効果が出せません。我々はDeRISKの製品ロードマップの実装において必要となる変換処理の完全なスコープがわからなかったので、**汎用性**を優先する決断をしました：*Databricks*はSpark、Python、Scala、Java、R、そしてSQL！の実行を可能とします。このため、**様々なタイプのユーザーによって活用することができます**。やったね！

**強力なデータバージョン管理 -> Delta** *Databricks*はネイティブで[DELTAフォーマット](https://docs.delta.io/latest/delta-intro.html)を実装しています。これによって、Sparkに[ACIDとの互換性がない](http://blog.knoldus.com/spark-acid-compliant-or-not/)という主要な課題の一つを解決します([DeltaはACIDと完全互換です](http://blog.knoldus.com/spark-acid-transaction-with-delta-lake/))。さらに、これによってパイプラインでエラーが起きた際のシステムリカバリーを可能とし、モデル開発の際に常に同じデータが使用されていることを保証するシンプルな方法([データのバージョン管理](https://docs.delta.io/latest/quick-start.html#read-older-versions-of-data-using-time-travel))を提供します。さらに、[Deltaは完全にオープンソースです](https://github.com/delta-io/delta)。

**(Sparkなど)Databricksによって様々なタイプのデータ(構造化、準構造化、非構造化データ)、データフォーマットを取り扱えるようになります：**

さらに、Sparkが特定のフォーマットをサポートしていない場合、マニュアルでコネクターを開発([Sparkは完全にオープンソースです](https://github.com/apache/spark))するか、ネイティブのPython、Scala、R、Javaライブラリを使用することができます(*Databricks*はマネージドSpark以上のものです)。

> [素晴らしいテクノロジーだ。Google、Netflix、Uber、Facebookのようなテクノロジーリーダーががオープンソースからプロプライエタリなシステムに移行するまでは、技術視点で優れているDatabricksのようなオープンソースに基づくシステムを安心して使用できる。彼らは非常に汎用的だ。](https://www.datagrom.com/data-science-machine-learning-ai-blog/snowflake-vs-databricks)

![](https://blog.denexus.io/hs-fs/hubfs/image-png-2.png?width=422&name=image-png-2.png)

**DatabricksのPaaSの特性はスケーラビリティと密接な関係**にあり、我々のデータプラットフォームの全てのクラウドリソースを活用できます。増加するストレージの要求にはS3が応え、新規環境が必要なった際(新たなデータサイエンティストがチームにジョインした場合、ローカルマシンで環境を構築する必要はありません)やより多くの処理パワーが必要になった際には、Databricksによって直接対応することができ、非常に価値のあるリソースであるソフトウェアエンジニアの多くの時間を解放することができます。何台のマシンが動作しているのか、どのような機能を使っているのかに関して、常に詳細なコントロールを行うことができます(そして、請求に驚くことがなくなります！)。

さらに、SparkのDBR(Sparkの*Databricks*実装)は通常のSparkよりはるかに高速であり、これは[*Databricks*ランタイム](https://docs.databricks.com/runtime/dbr.html)に追加の料金を支払う価値があるものです。
[![](https://blog.denexus.io/hs-fs/hubfs/111aa.jpg?width=842&name=111aa.jpg)](https://www.youtube.com/watch?v=RvrM81VJRmg&t=920s)
**図4:オープンソースSpark vs Spark DBR(画像をクリックするとYouTubeに移動します)**

**完全なML-OpsソリューションとしてのDatabricks + マネージドMLflow**がモデル開発環境と機械学習ライフサイクル全体のためのプラットフォームを提供します。

[もともと*Databricks*がMLflowを開発し、Linuxファウンデーションに寄贈しました。](https://www.theregister.com/2020/06/25/databricks_analytics/)

[GitHub - mlflow/mlflow: 機械学習ライフサイクルのためのオープンソースプラットフォーム](https://github.com/mlflow/mlflow/#mlflow-a-machine-learning-lifecycle-platform)
これにより、データサイエンティストは実験に用いたテーブルのバージョンを容易にトラッキングでき、後ほどそのバージョンのデータを使って再現させることができます。さらに、同僚とモデルやコードを容易に共有できるコラボレーティブな環境を提供します。

[Azure-MLやAWS SageMakerのような他のMLプラットフォームと組み合わせて活用することもできます](https://github.com/mlflow/mlflow/#mlflow-a-machine-learning-lifecycle-platform)：*Databricks*のマネージドMLflowに登録されたモデルを、Azure-MLやAWS SageMakerで簡単に使用することができます。

さらに、*Databricks*マネージドMLflowを活用することで、データサイエンティストはSpark MLやKoalas(SparkにおけるPandas実装)を用いることで簡単にアルゴリズムを並列化することができます。

**データストレージと計算レイヤーは完全に分離されます。**データはどのような場所にあっても構わなく、それらを処理するためにDatabricksを活用することができます(計算とストレージの分離)。プロプライエタリなフォーマットやツールを使う必要がないので、データを移行する際に高い柔軟性を保つことができます。

# まとめ

本書の最初の図(図3)では、データの3つのステージとそれぞれで用いるツールを示しています。

- **Data Processing(データ処理)**: *Databricks*、Python+AWS Lambda、EC2
- **Data Discoverability(データの検索)**: *Databricks*、AWS Athena
- **ML-Ops**: *Databricks*、AWS SageMaker

**1つだけ共通しているものがあります：*Databricks*の活用です。**

さらに、ここにはベンダーロックインは存在せず、従量課金モデルによって、現時点では明らかになっていなくても将来的には直面するであろう特定のシナリオに対する代替策を持つことが可能となります。
![](https://blog.denexus.io/hs-fs/hubfs/image-png-3.png?width=852&name=image-png-3.png)
**図5:全てを統治するデータプラットフォーム**

> [優れたアーキテクチャとデータモデルを用いることで、データの一貫性、ガバナンス、スキーマ強制の多くの課題を解決できることを理解していて、データに対してさらなるパワーや柔軟性を欲するのであれば、Databricksを選ぶべきです...SparkとDeltaLakeにできないことはほとんどありません。](https://www.confessionsofadataguy.com/databricks-vs-snowflake-the-datalake-warehouse-battle/)

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)