Livy シリーズ - 基于 Spark 的 REST サービス Livy 简介#
内容整理自:
Livy 简介#
Apache Livy は、Spark に基づくオープンソースの REST サービスであり、REST の方法でコードスニペットやシリアライズされたバイナリコードを Spark クラスターに送信して実行することができます。以下の基本機能を提供します:
- Scala、Python、または R のコードスニペットをリモートの Spark クラスターで実行するために送信します。
- Java、Scala、Python で書かれた Spark ジョブをリモートの Spark クラスターで実行するために送信します。
- バッチ処理アプリケーションをクラスターで実行するために送信します。
Livy REST API の使用については、公式文書を参照してください。
Livy 基本架構#
Livy は典型的な REST サービスアーキテクチャであり、一方でユーザーの REST リクエストを受け取り解析し、対応する操作に変換します。もう一方では、ユーザーが起動したすべての Spark クラスターを管理します。
ユーザーは REST リクエストを通じて Livy を介して新しい Spark クラスターを起動できます。Livy は起動された各 Spark クラスターをセッション (session) と呼び、セッションは完全な Spark クラスターで構成され、RPC プロトコルを介して Spark クラスターと Livy サーバー間で通信します。インタラクションの処理方法に応じて、Livy はセッションを 2 つのタイプに分けています:
インタラクティブセッション(interactive session)
。これは Spark のインタラクティブ処理と同じで、インタラクティブセッションは起動後にユーザーが送信したコードスニペットを受け取り、リモートの Spark クラスターでコンパイルして実行します。バッチセッション(batch session)
。ユーザーは Livy を介してバッチ処理の方法で Spark アプリケーションを起動できます。この方法は Livy ではバッチセッションと呼ばれ、Spark のバッチ処理と同じです。
Livy の企業級特性#
多ユーザーサポート#
ユーザー tom が Livy サーバーに REST リクエストを送信して新しいセッションを起動したと仮定しますが、Livy サーバーはユーザー livy によって起動されています。この場合、作成された Spark クラスターのユーザーは誰でしょうか?ユーザー tom でしょうか、それとも livy でしょうか?デフォルトでは、この Spark クラスターのユーザーは livy です。これによりアクセス権の問題が発生します:ユーザー tom は自分が持つ権限のあるリソースにアクセスできず、逆にユーザー livy が持つリソースにはアクセスできることになります。
この問題を解決するために、Livy はHadoop のプロキシユーザーモード (proxy user) を導入しました。プロキシユーザーモードは、HiveServer2 などの多ユーザー環境で広く使用されています。このモードでは、スーパーユーザーが通常のユーザーとしてリソースにアクセスし、通常のユーザーに相応しい権限を持つことができます。プロキシユーザーモードを有効にすると、ユーザー tom が作成したセッションで起動された Spark クラスターのユーザーは tom になります。
エンドツーエンドのセキュリティ#
- Kerberos に基づく Spnego 認証によりクライアント認証の安全性を実現
- 標準の SSL を使用して Http プロトコルを暗号化し、クライアントと Livy サーバー間の Http 伝送の安全性を確保
- SASL 認証に基づく RPC 通信メカニズムにより、Livy サーバーと Spark クラスター間のネットワーク通信の安全性を確保
障害回復メカニズム#
Livy は障害回復メカニズムを提供しており、ユーザーがセッションを起動すると同時に、Livy は信頼できるストレージにセッション関連のメタ情報を記録します。Livy が障害から回復すると、関連するメタ情報を読み取り、Spark クラスターに再接続しようとします。
この機能を使用するには、以下の Livy 設定を行う必要があります:
// 障害回復機能を有効にする
livy.server.recovery.mode: recovery
// メタ情報をどの信頼できるストレージに保存するかを設定します。現在はfilesystemとzookeeperがサポートされています
livy.server.recovery.state-store
// 具体的なストレージパスを設定します。filesystemの場合はファイルパスに変更し、zookeeperの場合はzookeeperクラスターのURLを指定します
livy.server.recovery.state-store.url
Livy と spark-jobserver の比較#
Livy の利点:
- Livy はコードを変更する必要がなく、SJS ジョブは特定のクラスを拡張する必要があります。
- Livy はコードスニペット(Python を含む)や事前コンパイルされた jar を送信することを許可し、SJS は jar のみを受け入れます。
- REST の他に、Livy には Java と Scala の API があります。Python API は開発中で、SJS には「python バインディング」があります。
SJS の利点:
- SJS は jars を管理でき、Jars をアップロードおよび保存することを許可し、ジョブをデプロイする際には別の REST を介して呼び出すだけで済みます。一方、Livy はジョブを再デプロイするたびにこれらの jar を再アップロードする必要があります。
- HOCON 形式で SJS ジョブを構成でき、この形式は REST 呼び出しとして送信できます。
公式リンク
Livy: https://livy.incubator.apache.org/
spark-jobserver: https://github.com/spark-jobserver/spark-jobserver