ScalarDB Analytics をローカルにデプロイする
このページは英語版のページが機械翻訳されたものです。英語版との間に矛盾または不一致がある場合は、英語版を正としてください。
このガイドでは、Helm Chart を使用して、テスト用に特別に設計されたローカル Kubernetes クラスターに ScalarDB Analytics をデプロイする方法について説明します。
前提条件
ScalarDB Analytics をローカル環境にデプロイする前に、以下のツールがインストールされていることを確認してください。
ScalarDB Analytics を使用するには、ライセンスキー (試用ライセンスまたは商用ライセンス) が必要です。ライセンスキーをお持ちでない場合は、お問い合わせください。
アーキテクチャ例
以下は、このガイドで説明するアーキテクチャ例です。
このガイドでは、minikube 上で実行される Kubernetes クラスターを前提としています。この構成では、PostgreSQL は ScalarDB トランザクションによって管理されない外部データソースとして扱われ、MySQL は ScalarDB トランザクションによって管理されるデータソース (ScalarDB 管理データソース) として扱われます。これらのデータソースは両方ともユーザーデータを格納します。ScalarDB Analytics サーバーは Helm Chart を使用して Pod としてデプロイされます。ScalarDB Analytics サーバーは、カタログデータを格納するために専用のバックエンドデータベースを使用します。Spark コマンドを実行するためのクライアント として機能する個別の Pod も作成されます。さらに、ScalarDB Analytics サーバーを操作するために使用される CLI ツールは、コンテナイメージとして提供され、個別の Pod 上で実行されます。
ScalarDB Cluster をローカルにデプロイする方法 などのリソースを参照して、各データソースを自分で設定してください。
ステップ 1: Kubernetes 環境をセットアップする
最初に、すべてのコンポーネントがデプロイされる Kubernetes 環境をセットアップする必要があります。
ServiceAccount と RoleBinding を作成する
サービスアカウント (ServiceAccount) とロールバインディング (RoleBinding) を作成して、Spark ジョブが Kubernetes クラスター内のリソースを管理できるようにします。
NAMESPACE=default
SERVICE_ACCOUNT_NAME=spark
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ServiceAccount
metadata:
name: ${SERVICE_ACCOUNT_NAME}
namespace: ${NAMESPACE}
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: spark-role
namespace: ${NAMESPACE}
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccount
name: ${SERVICE_ACCOUNT_NAME}
namespace: ${NAMESPACE}
EOF
必要に応じて NAMESPACE および SERVICE_ACCOUNT_NAME 環境変数を変更できます。
ステップ 2: ScalarDB Analytics サーバーをデプロイする
このステップでは、Scalar が提供する Helm Chart を使用して、ScalarDB Analytics サーバーを Kubernetes 環境にデプロイします。
ScalarDB Analytics サーバーのバックエンドデータベースをデプロイする
ScalarDB Analytics サーバーは、カタログ情報を管理するために専用のバックエンドデータベースを使用します。このガイドでは、バックエンドデータベースとして専用の PostgreSQL インスタンスを使用します。
Bitnami Helm Chart を使用して、Kubernetes クラスター上に PostgreSQL をデプロイできます。以下のコマンドを実行して、Bitnami Helm Charts リポジトリを追加します。
helm repo add bitnami https://charts.bitnami.com/bitnami
以下のコマンドを実行して PostgreSQL をデプロイします。
helm install postgresql-scalardb-analytics bitnami/postgresql \
--set auth.postgresPassword=postgres \
--set primary.persistence.enabled=false
以下のコマンドを実行して PostgreSQL の Pod が動作しているかどうかを確認します。
kubectl get pod
以下のような出力が表示され、PostgreSQL の Pod が Running 状態になっている必要があります。
NAME READY STATUS RESTARTS AGE
postgresql-scalardb-analytics-0 1/1 Running 0 10s
Scalar Helm Charts リポジトリを追加する
以下のコマンドを実行して Scalar Helm Charts リポジトリを追加します。
helm repo add scalar-labs https://scalar-labs.github.io/helm-charts
ScalarDB Analytics サーバー用のカスタム値ファイルを作成する
ScalarDB Analytics サーバー Helm Chart 用のカスタム値ファイル (analytics-server-custom-values.yaml) を作成します。
以下は、シンプルな設定の例です。
cat <<EOF > analytics-server-custom-values.yaml
scalarDbAnalyticsServer:
properties: |
scalar.db.analytics.server.catalog.port=11051
scalar.db.analytics.server.metering.port=11052
scalar.db.analytics.server.db.contact_points=<CATALOG_SERVER_BACKEND_DB_URL>
scalar.db.analytics.server.db.username=<USERNAME_FOR_BACKEND_DB>
scalar.db.analytics.server.db.password=<PASSWORD_FOR_BACKEND_DB>
scalar.db.analytics.server.metering.storage.provider=filesystem
scalar.db.analytics.server.metering.storage.container_name=metering
scalar.db.analytics.server.metering.storage.path=/tmp
scalar.db.analytics.server.licensing.license_key=<YOUR_LICENSE_KEY>
scalar.db.analytics.server.licensing.license_check_cert_pem=<YOUR_LICENSE_CERT_PEM>
EOF
角括弧内の内容は以下のように変更してください:
<CATALOG_SERVER_BACKEND_DB_URL>: ScalarDB Analytics サーバーのバックエンドデータベースの JDBC 接続文字列。<USERNAME_FOR_BACKEND_DB>: バックエンドデータベースのユーザー名。<PASSWORD_FOR_BACKEND_DB>: バックエンドデータベースのパスワード。<YOUR_LICENSE_KEY>: ScalarDB Analytics サーバーのライセンスキー。<YOUR_LICENSE_CERT_PEM>: ScalarDB Analytics サーバーの PEM エンコードされたライセンス証明書。商用ライセンスと試用ライセンスの両方を含むライセンス設定方法については、ライセンスキーの設定方法を参照してください。
メータリング関連のプロパティ値 (scalar.db.analytics.server.metering.storage.*) は、例に示されているように使用できます。メータリング設定の詳細については、設定リファレンスを参照してください。
Analytics サーバーをデプロイする
以下のコマンドを実行して Analytics サーバーをデプロイします。
helm install scalardb-analytics-server scalar-labs/scalardb-analytics-server -f analytics-server-custom-values.yaml
ScalarDB Analytics サーバーのデプロイの詳細については、ScalarDB Analytics サーバ ーのデプロイを参照してください。
ステップ 3: CLI ツールを使用してカタログとデータソースを設定する
ScalarDB Analytics サーバーでカタログを作成し、データソースを登録するには、コンテナイメージとして提供される CLI ツールを使用します。この例では、CLI ツール用の Pod をセットアップし、そこからコマンドを実行する方法を示します。
CLI ツール用の Pod をセットアップする
CLI ツール Pod のマニフェストファイルを作成します。
cat <<EOF > analytics-server-cli.yaml
apiVersion: v1
kind: Pod
metadata:
name: analytics-server-cli
spec:
containers:
- name: analytics-server-cli
image: ghcr.io/scalar-labs/scalardb-analytics-cli:3.17.1
command: ['sleep']
args: ['inf']
restartPolicy: Never
EOF
metadata.name と spec.containers[*].name は、好きな値に変更できます。
次に、以下のコマンドを実行して CLI ツール用の Pod を作成します。
kubectl apply -f analytics-server-cli.yaml
Pod がデプロイされたら、以下のコマンドを実行してシェル経由でアクセスします。このセクションの以下のすべてのステップは、この Pod 内で実行する必要があります。
kubectl exec -it analytics-server-cli -- bash
以下のコマンドを実行して、コマンド実行を簡素化するために CLI ツールのエイリアスをセットアップします。
alias scalardb-analytics-cli="java -jar /scalardb-analytics-cli/scalardb-analytics-cli.jar"
ScalarDB データソース用の設定ファイルを準備する
ScalarDB トランザクション管理下のデータソースを使用する場合、ScalarDB のプロパティ値を設定する必要があります。このガイドでは、ScalarDB プロパティファイルを ScalarDB Analytics サーバーに登録する方法について説明します。
この例では MySQL のみを使用していますが、後で他のデータベースを追加しやすくするため、意図的にマルチストレージ設定として構成されています。設定では、ストレージ名 mysql が MySQL データソースに割り当てられ、名前空間 nsmy がそれにマップされています。
cat <<EOF > scalardb.properties
# Storage
scalar.db.storage=multi-storage
# Multi-storage settings
scalar.db.multi_storage.storages=mysql
# Namespace mapping
scalar.db.multi_storage.namespace_mapping=nsmy:mysql
# Default storage
scalar.db.multi_storage.default_storage=mysql
# Multi-storage: Define MySQL
scalar.db.multi_storage.storages.mysql.storage=jdbc
scalar.db.multi_storage.storages.mysql.contact_points=<MYSQL_URL>
scalar.db.multi_storage.storages.mysql.username=<MYSQL_USERNAME>
scalar.db.multi_storage.storages.mysql.password=<MYSQL_PASSWORD>
EOF
マルチストレージ設定の詳細については、マルチストレージトランザクションを参照してください。
データソース定義ファイルを準備する
ScalarDB Analytics がアクセスするデータソースを JSON 形式で定義する必要があります。以下は、ScalarDB によって管理されるデータソースを定義する例です。ScalarDB 管理データソースを使用する場合、type 項目を scalardb に設定し、${file:<PATH>} 構文を使用してプロパティファイルへのパスを指定する必要があります。<PATH> を実際の ScalarDB プロパティファイルのパスに置き換えてください(以下のように):
cat <<"EOF" > data_source_scalardb.json
{
"type": "scalardb",
"configs": "${file:./scalardb.properties}"
}
EOF
<PATH> は絶対パスまたは相対パスのいずれかを指定できます。
以下は、ScalarDB によって管理されない PostgreSQL データソースを定義する例です。PostgreSQL をデータソースとして使用する場合、type 項目の値として postgresql を指定する必要があります。次に、以下のコマンドの角括弧で囲まれたプレースホルダーの値を PostgreSQL データソースの適切な値に置き換えてコマンドを実行します。
cat <<EOF > data_source_postgres.json
{
"type": "postgresql",
"host": <POSTGRES_HOST>,
"port": "5432",
"username": <POSTGRES_USER_NAME>,
"password": <POSTGRES_PASSWORD>,
"database": <POSTGRES_DATABASE>
}
EOF
CLI ツール用の設定ファイルを作成する
ScalarDB Analytics CLI ツール用の設定ファイル (client.properties) を作成します。
CLI ツールから ScalarDB Analytics サーバーに接続するには、サーバーのホスト名ま たは IP アドレスが必要です。以下のコマンドを実行して、ScalarDB Analytics サーバー用の Service の CLUSTER-IP を確認することで IP アドレスを取得できます。
$ kubectl get svc scalardb-analytics-server
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
scalardb-analytics-server ClusterIP 10.97.81.28 <none> 11051/TCP,11052/TCP 40s
次に、以下のコマンドを実行して設定ファイルを作成し、<ANALYTICS_SERVER_HOST> を取得した CLUSTER-IP の値に置き換えます。
cat <<EOF > client.properties
scalar.db.analytics.client.server.host=<ANALYTICS_SERVER_HOST>
scalar.db.analytics.client.server.catalog.port=11051
EOF
カタログとデータソースを登録する
このセクションでは、CLI ツールを使用してカタログとデータソースを登録する方法について説明します。
カタログを作成する
まず、以下のコマンドを使用してカタログを作成します。<CATALOG_NAME> を希望するカタログ名に置き換えてください。
scalardb-analytics-cli -c client.properties catalog create --catalog <CATALOG_NAME>
データソースを登録する
次に、ScalarDB 管理と非 ScalarDB 管理の両方のデータソースを登録します。
ScalarDB 管理データソースを登録するには、以下のコマンドを使用します。<CATALOG_NAME> と <DATA_SOURCE_NAME> を希望するカタログとデータソース名に置き換えてください。
scalardb-analytics-cli -c client.properties data-source register \
--catalog=<CATALOG_NAME> --data-source=<DATA_SOURCE_NAME> --provider-file=./data_source_scalardb.json
非 ScalarDB 管理データソースを登録するには、以下のコマンドを使用します。<CATALOG_NAME> と <DATA_SOURCE_NAME> を希望するカタログとデータソース名に置き換えてください。
scalardb-analytics-cli -c client.properties data-source register \
--catalog=<CATALOG_NAME> --data-source=<DATA_SOURCE_NAME> --provider-file=./data_source_postgres.json
追加の CLI コマンド
CLI ツールは、カタログとデータソースを管理するための追加のコマンドを提供します。詳細な手順については、ScalarDB Analytics CLI ツールドキュメントを参照してください。
ステップ 4: Spark クライアント Pod をデプロイする
このステップでは、Spark クライアント Pod をデプロイし、Spark ジョブを実行するようにセットアップします。
Spark クライアント Pod を作成する
Spark クライアント Pod のマニフェストファイルを作成します。
次の例では、サービスアカウント名が spark に設定されています。以下のコマンドを実行して Spark クライアント Pod を設定します。
cat <<'EOF' > spark-client.yaml
apiVersion: v1
kind: Pod
metadata:
name: "spark-client"
spec:
serviceAccountName: spark
containers:
- name: spark-client
image: eclipse-temurin:21
command: ['sleep']
args: ['inf']
restartPolicy: Never
terminationGracePeriodSeconds: 0
EOF
以下のコマンドを実行して Spark クライアント Pod を作成します。
kubectl apply -f spark-client.yaml
Spark クライアント Pod をセットアップする
以下のコマンドを実行して、シェルセッション経由で Spark クライアント Pod にアクセスします。
kubectl exec -it spark-client -- bash
以下のコマンドを実行して、Spark バイナリファイルをインストールし、そのディレクトリに移動します。
VERSION=3.5.7
curl -O https://dlcdn.apache.org/spark/spark-${VERSION}/spark-${VERSION}-bin-hadoop3.tgz
tar xzf spark-${VERSION}-bin-hadoop3.tgz
cd spark-${VERSION}-bin-hadoop3
角括弧内のコンテンツを変更してから、以下のコマンドを実行して spark-defaults.conf ファイルを作成します。
cat <<EOF > ./conf/spark-defaults.conf
spark.jars.packages com.scalar-labs:scalardb-analytics-spark-all-<SPARK_VERSION>_<SCALA_VERSION>:<SCALARDB_ANALYTICS_VERSION>
spark.sql.catalog.<CATALOG_NAME> com.scalar.db.analytics.spark.ScalarDbAnalyticsCatalog
spark.sql.catalog.<CATALOG_NAME>.server.host <ANALYTICS_SERVER_HOST>
spark.sql.catalog.<CATALOG_NAME>.server.catalog.port 11051
spark.sql.catalog.<CATALOG_NAME>.server.metering.port 11052
spark.extraListeners com.scalar.db.analytics.spark.metering.ScalarDbAnalyticsListener
EOF
以下は、角括弧内のコンテンツを変更すべき内容について説明しています。
<SPARK_VERSION>: Spark のバージョン。<SCALA_VERSION>: Spark をビルドするために使用される Scala のバージョン。<SCALARDB_ANALYTICS_VERSION>: ScalarDB Analytics のバージョン。<CATALOG_NAME>: カタログの名前。<ANALYTICS_SERVER_HOST>: ScalarDB Analytics サーバー用の Service のCLUSTER-IP。
詳細については、ScalarDB Analytics のセットアップのための Spark 設定を参照してください。
ステップ 5: クライアント Pod から Spark ジョブを実行する
この時点で、Spark クライアント Pod がセットアップされ、Spark ジョブを実行する準備が整いました。このステップでは、以下の2つの方法を使用して分析クエリを Spark ジョブとして実行する例を示します。
- Spark SQL を使用する
spark-submitコマンドを使用してジョブを送信する
ScalarDB Analytics は現在、クエリエンジンとして Apache Spark を使用しています。Spark のネイティブ Kubernetes デプロイメントモードを活用でき、実行時に Spark ドライバーとエグゼキューター Pod の動的プロビジョニングが可能です。Kubernetes デプロイメントモードを使用するには、spark コマンドの --master オプションで Kubernetes API サーバー (k8s://...) を指定する必要があります。
- Spark SQL
- Spark ジョブを送信する
spark-sql コマンドを使用して Spark SQL を実行する
以下のようなコマンドを実行して Spark SQL を実行できます。
./bin/spark-sql \
--master k8s://https://kubernetes.default.svc \
--conf spark.kubernetes.container.image=apache/spark:3.5.7-scala2.12-java11-python3-r-ubuntu \
--conf spark.driver.host=$(hostname -i)
spark-submit コマンドを使用して Spark ジョブを実行する
このセクションでは、アプリケーション JAR の登録、一時 Pod の作成、Pod テンプレートの作成、および spark-submit の実行について説明します。
アプリケーション JAR を PVC に登録する
アプリケーションを Spark ジョブとして実行するには、以下のコマンドを実行してアプリケーションの JAR ファイルを準備し、spark-submit コマンドを実行する必要があります。JAR ファイルは、Spark ドライバーからアクセス可能なパスに配置する必要があります。これを実現するには複数の方法があり、このガイドでは永続ボリューム要求 (PVC) の使用方法を説明します。
PVC_NAME=spark-app-pvc
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: ${PVC_NAME}
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 4Gi
EOF
一時 Pod を作成してファイルをコピーする
以下のコマンドを実行して、アプリケーション JAR を PVC に保存するための一時 Pod を作成します。
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: spark-pvc-loader
spec:
containers:
- name: loader
image: busybox
command: ["sleep", "3600"]
volumeMounts:
- mountPath: /mnt
name: spark-vol
volumes:
- name: spark-vol
persistentVolumeClaim:
claimName: ${PVC_NAME}
restartPolicy: Never
EOF
以下のコマンドを実行して一時 Pod が作成されるまで待機します。
kubectl wait --for=condition=Ready pod/spark-pvc-loader --timeout=60s
以下のコマンドを実行してアプリケーション JAR を PVC にコピーします。
export JAR_PATH=/path/to/your/app.jar
kubectl cp ${JAR_PATH} spark-pvc-loader:/mnt/app.jar
以下のコマンドを実行して一時 Pod を削除します。
kubectl delete pod spark-pvc-loader
Pod テンプレートを作成する
動的に生成される Spark ドライバーおよびエグゼキューター Pod の Pod テンプレートを作成するには、Spark クライアント Pod にログインして以下のコマンドを実行します。
PVC_NAME=spark-app-pvc
cat <<EOF > spark-pod-template.yaml
apiVersion: v1
kind: Pod
metadata:
name: spark-pod-template
spec:
volumes:
- name: spark-jar-volume
persistentVolumeClaim:
claimName: ${PVC_NAME}
containers:
- name: spark-kubernetes-container
volumeMounts:
- mountPath: /opt/spark-jars
name: spark-jar-volume
EOF
spark-submit を実行する
以下のようなコマンドを使用してアプリケーションを Spark ジョブとして実行します。
./bin/spark-submit \
--master k8s://https://kubernetes.default.svc \
--deploy-mode cluster \
--name analytics-sample-job \
--class com.example.TestApp \
--conf spark.kubernetes.container.image=apache/spark:3.5.7-scala2.12-java11-python3-r-ubuntu \
--conf spark.kubernetes.namespace=default \
--conf spark.kubernetes.authenticate.driver.serviceAccountName=spark \
--conf spark.kubernetes.driver.podTemplateFile=./spark-pod-template.yaml \
--conf spark.kubernetes.executor.podTemplateFile=./spark-pod-template.yaml \
--conf spark.jars.ivy=/tmp/.ivy2 \
--conf spark.jars.repositories=https://repo1.maven.org/maven2,https://packages.confluent.io/maven/ \
--properties-file ./conf/spark-defaults.conf \
local:///opt/spark-jars/app.jar