この記事では、あらゆるノートブックIDEやカスタムアプリケーションからネイティブのApache Spark APIを利用できる新たなライブラリであるDatabricks Connectをご紹介します。
概要
過去数年にわたって、Apache Spark向けに多くのカスタムアプリケーションコネクターが開発されました。これには、spark-submitやRESTジョブサーバー、ノートブックゲートウェイなどのツールが含まれます。これらには以下のような制限がありました。
- これらは様々なケースに対応できるものではありませんでした:多くは特定のIDEやノートブック向けのものでした。
- お使いのアプリケーションをSparkクラスターで実行する必要がありました。
- Sparkの上に別のプログラミングインタフェースを統合する必要がありました。
- クラスターを再起動することなしに、ライブラリの依存関係を変更することができませんでした。
これを、単純にライブラリウィインポートしてサーバーにアクセスする、SQLデータベースサービスへの接続方法を比較してみましょう。
import pymysql
conn = pymysql.connect(<connection_conf>)
conn.execute("SELECT date, product FROM sales")
Sparkの構造化データAPIで同様のことを行う場合には、以下のようになります。
from pyspark.sql import SparkSession
spark = SparkSession.builder.config(<connection_conf>).getOrCreate()
spark.table("sales").selectExpr("date", "product").show()
しかし、Databricks Connect以前では、上記のスニペットはシングルノードのSparkクラスターでのみ動作し、複数ノードへの容易なスケーリングや、spark-submitのような追加のツールなしにはクラウドにスケーリングすることができませんでした。
Databricks Connectクライアント
Databricks Connectは普遍的なSparkライブラリを提供することで、このSparkコネクターのストーリーを完結させます。これによって、ノートブックのアプリケーション (例:Jupyter、Zeppelin、CoLab)、IDE(例:Eclipse、PyCharm、Intellij、RStudio)、カスタムのPython / JavaアプリケーションからSparkジョブを実行できます。
このことは、あなたはどこからでも"import pyspark"や"import org.apache.spark"を実行でき、Databricksクラスターに対してシームレスに大規模ジョブを実行できることを意味します。例として、Databricks Connectを用いてCoLabノートブックからSparkジョブをリモートで実行する様子をお見せします。ここでは、アプリケーション固有のインテグレーションが不要であることに注意してください。単にdatabricks-connectライブラリをインストールしてインポートするだけです。また、ここではGCPからS3のデータセットを読み込んでいますが、SparkクラスターがAWSにホストされているので実現可能となっています。
Databricks Connectから起動されたジョブは、分散処理を活用し、Databricks Spark UIでモニタリングできるように、リモートでDatabricksクラスター上で実行されます。
カスタマーユースケース
現時点(2019/6)で数百以上のお客様がアクティブにDatabricks Connectを利用しています。特筆すべきユースケースには以下のようなものがあります。
開発およびCI/CD
- Databricksクラスターを利用しつつも、ローカルのIDEでコードをデバッグ。
- 運用環境におけるCI/CDパイプラインにおいて、Sparkアプリケーションをテスト。
インタラクティブな分析
- 慣れ親しんでいるシェル(Jupyter、bash)やスタジオ環境(RStudio)を使いつつも、Databricksクラスターで処理を行えるように、多くのユーザーがDatabricks Connectを活用。
アプリケーション開発
- ヘルスケア業界の大手のお客様は、インタラクティブなユーザークエリーを提供するPythonベースのマイクロサービスをデプロイするためにDatabricks Connectを使用。クエリーサービスは、1日あたり数千のクエリーに対応するために、リモートで複数のDatabricksクラスター上でSparkジョブを実行、このためにDatabricks Connectライブラリを使用。
Databricks Connectの動作原理
普遍的なクライアントライブラリを作るためには、以下の要件を満たす必要がありました。
- アプリケーション観点では、クライアントライブラリは完全なSparkとして動作(例:SQL、データフレームなどを利用できること)する必要があります。
- 物理計画や実行などのヘビーウェイトなオペレーションはクラウド上のサーバーで実行されるべきです。さもないと、クライアントがクラスターに近い場所になく、広域ネットワーク越しにデータを読み込む際に多大なるオーバーヘッドを引き起こすことになります。
これらの要件に適合するために、アプリケーションがSpark APIを利用する際には、Databricks Connectライブラリは、Sparkと全く同じように分析フェーズに至るジョブの計画を実行します(要件1)。ジョブの実行準備が整った際には、Databricks Connectは論理的クエリープランを、実際の物理的処理実行とIOが発生するサーバーに送信します(要件2)。
図1. Databricks ConnectはSparkジョブのライフタイムを、論理的分析までを含むクライアントフェーズ、リモートクラスターにおける処理実行を含むサーバーフェーズに分割します。
Databricks Connectクライアントは、様々なユースケースに対応できるように設計されています。プラットフォームのAPIトークンを通じて分かりやすい認証、承認ができるように、REST経由でサーバーと通信を行います。セキュアかつ同時実行性の高い共有クラスターにおいても、複数ユーザーのセッションは分離されます。高いパフォーマンスを実現するために結果は効率的なバイナリーフォーマットで返却されます。使用されるプロトコルはステートレスなので、対障害性のあるアプリケーションを容易に構築でき、クラスターが再起動されたとしても作業状態を失うことはありません。
利用方法
Databricks ConnectはDBR 5.4のリリースからGAとなっており、Python、Scala、Java、Rをサポートしています。"pip install databricks-connect"を実行することで、すべての言語に対するライブラリをPyPIから取得できます。Databricks Connectのドキュメントにはこちらからアクセスできます。