EMR on ACK は、カスタムリソース定義 (CRD)、spark-submit コマンド、コンソールターミナルの 3 つのジョブ送信方法をサポートしています。このトピックでは、これらの方法について説明します。
前提条件
EMR on ACK コンソールで Spark クラスターを作成します。詳細については、「クラスターの作成」をご参照ください。
注意事項
このトピックの例では、JAR ファイルはイメージに直接パッケージ化されています。独自の JAR ファイルを使用する場合は、Object Storage Service (OSS) にアップロードできます。詳細については、「簡易アップロード」をご参照ください。
コマンド内の local:///opt/spark/examples/spark-examples.jar を、ご利用の JAR ファイルの OSS パスに置き換えてください。パスのフォーマットは oss://<yourBucketName>/<path>.jar です。
ジョブの送信
方法1:CRD による送信
-
kubectl を使用して Kubernetes クラスターに接続します。詳細については、「クラスターの KubeConfig ファイルを取得し、kubectl を使用してクラスターに接続する」をご参照ください。
-
次の内容で spark-pi.yaml という名前のファイルを作成します。
apiVersion: "sparkoperator.k8s.io/v1beta2" kind: SparkApplication metadata: name: spark-pi-simple spec: type: Scala sparkVersion: 3.2.1 mainClass: org.apache.spark.examples.SparkPi mainApplicationFile: "local:///opt/spark/examples/spark-examples.jar" arguments: - "1000" driver: cores: 1 coreLimit: 1000m memory: 4g executor: cores: 1 coreLimit: 1000m memory: 8g memoryOverhead: 1g instances: 1この例のパラメーターの説明については、「spark-on-k8s-operator」をご参照ください。
説明-
ファイル名は任意に指定できます。このトピックでは、例として spark-pi.yaml を使用します。
-
この例では Spark 3.2.1 (EMR-5.6.0) を使用しています。異なるバージョンを使用する場合は、sparkVersion パラメーターを変更してください。
-
-
次のコマンドを実行してジョブを送信します。
kubectl apply -f spark-pi.yaml --namespace <cluster-namespace><cluster-namespace>をご利用のクラスターの名前空間に置き換えてください。名前空間は、EMR on ACK コンソールの クラスターの詳細 ページで確認できます。次の出力が返されます:
sparkapplication.sparkoperator.k8s.io/spark-pi-simple created説明spark-pi-simpleは、この例のジョブ名です。 -
任意: 作成されたジョブを ジョブの詳細 ページで表示します。
方法2:spark-submit コマンド
-
kubectl を使用して Kubernetes クラスターに接続します。詳細については、「クラスターの KubeConfig ファイルを取得し、kubectl を使用してクラスターに接続する」をご参照ください。
-
次のコマンドを実行して、Alibaba Cloud E-MapReduce の emr-spark-ack ツールをインストールし、その権限を設定します。
wget https://ecm-repo-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/emr-on-ack/util/emr-spark-ack chmod 755 emr-spark-ack -
emr-spark-ack ツールを使用してジョブを送信します。
次の構文を使用します。
./emr-spark-ack -n <cluster-namespace> <spark-command>説明<spark-command>プレースホルダーは、spark-submit、spark-sql、spark-shell、および pyspark をサポートしています。構文はネイティブの Spark コマンドと同じです。-
例:クラスターモード
spark-submit を使用して spark-pi ジョブを送信します。
./emr-spark-ack -n <cluster-namespace> spark-submit \ --name spark-pi-submit \ --deploy-mode cluster \ --class org.apache.spark.examples.SparkPi \ local:///opt/spark/examples/spark-examples.jar \ 1000 -
例:クライアントモード
-
spark-sql コマンドの使用
# ローカル SQL ファイルを準備します。 echo "select 1+1">test.sql # ジョブを送信します。 ./emr-spark-ack -n <cluster-namespace> spark-sql -f test.sqlSpark 3 以降 (EMR-5.X) を実行するクラスターの場合、emr-spark-ack ツールはローカル依存関係を自動的にアップロードします。このツールは、
--jars、--files、-fなどのパラメーターで指定されたローカルファイルを、Kubernetes 環境でジョブを送信する前に EMR on ACK クラスターにアップロードします。次のコードは例とその出力を示しています:
[user@hostname ~]$ echo "select 1+1">test.sql [user@hostname ~]$ ./emr-spark-ack -n <cluster-namespace> spark-sql -f test.sql uploading test.sql to c-xxx/spark-submit-gateway-865bbf56f6-sfb95:/opt/spark/work-dir/test.sql cmd: kubectl exec spark-submit-gateway-865bbf56f6-sfb95 -i -n <cluster-namespace> -- /bin/bash spark-sql -f test.sql Warning: Ignoring non-Spark config property: ack.clusterid.for.rss.linked Setting default log level to "WARN". To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel). Spark master: k8s://https://kubernetes.default:443, Application Id: spark-application-1653639654376 Time taken: 4.738 seconds, Fetched 1 row(s) 2 22/05/27 16:21:04 WARN [shutdown-hook-0] ExecutorPodsWatchSnapshotSource: Kubernetes client has been closed. -
spark-shell コマンドの使用
./emr-spark-ack -n <cluster-namespace> spark-shell次のコードは例とその出力を示しています:
[user@hostname ~]$ ./emr-spark-ack -n <cluster-namespace> spark-shell cmd: kubectl exec spark-submit-gateway-865bbf56f6-sfb95 -it -n <cluster-namespace> -- /bin/bash spark-shell Warning: Ignoring non-Spark config property: ack.clusterid.for.rss.linked Setting default log level to "WARN". To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel). Spark context Web UI available at http://10.210.xxx.xxx:4041 Spark context available as 'sc' (master = k8s://https://kubernetes.default:443, app id = spark-application-16536387xxx). Spark session available as 'spark'. Welcome to ____ __ / __/__ ___ _____/ /__ _\ \/ _ \/ _ `/ __/ '_/ /___/ .__/\_,_/_/ /_/\_\ version 3.2.1 /_/ Using Scala version 2.12.15 (OpenJDK 64-Bit Server VM, Java 1.8.0_332) Type in expressions to have them evaluated. Type :help for more information. scala>
-
-
-
任意: 作成されたジョブを ジョブの詳細 ページで表示します。
-
任意: emr-spark-ack ツールを使用してジョブを終了します。
次の構文を使用します。
./emr-spark-ack -n <cluster-namespace> kill <Spark_app_id>説明emr-spark-ack ツールは、ジョブを送信するときに
<Spark_app_id>を生成します。この ID は出力ログで確認できます。
方法3:コンソールターミナル
-
[アクセスリンクとポート] ページに移動します。
-
EMR on ACK コンソールにログインします。
-
EMR on ACK ページで、対象クラスターの名前をクリックします。
-
Access Links and Ports タブをクリックします。
-
-
Access Links and Ports ページで、[SparkSubmitGateway UI] のリンクをクリックします。
これにより、シェルターミナルが開きます。
-
シェルターミナルで、次の 2 つの方法のいずれかで Spark コマンドを実行します。
-
spark-sql コマンドの使用
spark-sqlspark-sql シェルに入った後、Spark コマンドを実行してインタラクティブなクエリを実行できます。
[root@spark-submit-gateway-865bb... work-dir]# spark-sql Warning: Ignoring non-Spark config property: ack.clusterid.for.rss.linked Setting default log level to "WARN". To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel). Spark master: k8s://https://kubernetes.default:443, Application Id: spark-application-1654656192425 spark-sql> select 1+1; 2 Time taken: 5.277 seconds, Fetched 1 row(s) spark-sql> -
spark-submit コマンドの使用
spark-submit \ --name spark-pi-submit \ --deploy-mode cluster \ --class org.apache.spark.examples.SparkPi \ local:///opt/spark/examples/spark-examples.jar \ 1000
-
-
任意: 作成されたジョブを ジョブの詳細 ページで表示します。
関連トピック
-
kubectl を使用して Spark ジョブを管理するには、「kubectl を使用してジョブを管理する」をご参照ください。
-
Simple Log Service を使用して Spark ジョブのログを収集するには、「Simple Log Service を使用して Spark ジョブのログを収集する」をご参照ください。
-
EMR on ACK の Spark クラスターのメタデータを設定するには、「Spark クラスターのメタデータを設定する」をご参照ください。
-
Elastic Container Instance (ECI) を使用して Spark ジョブを弾力的にスケジュールするには、「ECI を使用して Spark ジョブを弾力的にスケジュールする」をご参照ください。