Alibaba Cloud E-MapReduce(EMR)では、Elastic Container Instance を使用して Spark ジョブを柔軟にスケジュールできます。この方法では、Container Service for Kubernetes(ACK)クラスタのコンピューティング機能に制限されることなく、ビジネス要件に基づいてポッドを作成できます。これにより、コンピューティングコストを効果的に削減できます。このトピックでは、Elastic Container Instance を使用して Spark ジョブを柔軟にスケジュールする方法について説明します。
背景情報
Elastic Container Instance のより高度な機能を使用するには、ビジネス要件に基づいてパラメーターを設定するために、さらにポッドアノテーションを追加できます。詳細については、「ポッドアノテーション」をご参照ください。
前提条件
新しい EMR コンソールの EMR on ACK ページで、Spark クラスタが作成されています。詳細については、「EMR on ACK を使い始める」をご参照ください。
Elastic Container Instance がアクティブ化されています。詳細については、「Elastic Container Instance を使用する一般的なワークフロー」をご参照ください。
手順
ACK クラスタに Elastic Container Instance に必要な仮想ノードをインストールします。詳細については、「手順 1:ACK クラスタに ack-virtual-node をデプロイする」をご参照ください。
EMR on ACK ページで作成された Spark クラスタに Spark ジョブを送信する際に、ポッドラベルまたはポッドアノテーションを設定するか、Spark 設定項目を追加して、Elastic Container Instance を使用して Spark ジョブをスケジュールします。
Spark ジョブの送信方法の詳細については、「Spark ジョブを送信する」をご参照ください。
説明このトピックでは、EMR V5.2.1 用の Spark 3.1.1 を使用しています。別のバージョンの Spark を使用する場合は、sparkVersion パラメーターと mainApplicationFile パラメーターを変更してください。このトピックのパラメーターの詳細については、GitHub の spark-on-k8s-operator をご参照ください。
方法 1:ポッドラベルを設定する
alibabacloud.com/eci パラメーターを true に設定して、特定のポッドを Elastic Container Instance にスケジュールします。サンプルコード:
apiVersion: "sparkoperator.k8s.io/v1beta2" kind: SparkApplication metadata: name: spark-pi-eci spec: type: Scala sparkVersion: 3.1.1 mainClass: org.apache.spark.examples.SparkPi mainApplicationFile: "local:///opt/spark/examples/jars/spark-examples_2.12-3.1.1.jar" arguments: - "1000000" driver: cores: 2 coreLimit: 2000m memory: 4g executor: cores: 4 coreLimit: 4000m memory: 8g instances: 10 # すべてのエグゼキュータが Elastic Container Instance を使用できるようにポッドラベルを設定します。 labels: alibabacloud.com/eci: "true" # オプション。パフォーマンスを向上させるために、Elastic Container Instance のイメージキャッシュ機能を有効にします。 annotations: k8s.aliyun.com/eci-image-cache: "true"
方法 2:ポッドアノテーションを設定する
alibabacloud.com/burst-resource パラメーターを eci に設定して、特定のポッドを Elastic Container Instance にスケジュールします。alibabacloud.com/burst-resource パラメーターの有効な値:
eci:クラスタの通常ノードのリソースが不足している場合に、Elastic Container Instance が使用されます。
eci_only:Elastic Container Instance のみが使用されます。
サンプルコード:
apiVersion: "sparkoperator.k8s.io/v1beta2" kind: SparkApplication metadata: name: spark-pi-eci spec: type: Scala sparkVersion: 3.1.1 mainClass: org.apache.spark.examples.SparkPi mainApplicationFile: "local:///opt/spark/examples/jars/spark-examples_2.12-3.1.1.jar" arguments: - "1000000" driver: cores: 2 coreLimit: 2000m memory: 4g executor: cores: 4 coreLimit: 4000m memory: 8g instances: 10 # クラスタの通常ノードのリソースが不足している場合に、エグゼキュータが Elastic Container Instance を使用できるようにポッドアノテーションを設定します。 annotations: alibabacloud.com/burst-resource: "eci" # オプション。パフォーマンスを向上させるために、Elastic Container Instance のイメージキャッシュ機能を有効にします。 k8s.aliyun.com/eci-image-cache: "true"
方法 3:Spark 設定項目を追加する
Spark 設定項目を追加してポッドアノテーションを設定し、Elastic Container Instance を使用して Spark ジョブをスケジュールできます。アノテーションの有効な値は、方法 2 の値と同じです。
spark-defaults.conf タブに移動します。
EMR コンソール にログインします。左側のナビゲーションウィンドウで、[ EMR on ACK ] をクリックします。
EMR on ACK ページで、目的のクラスタを見つけ、[ 操作 ] 列の [設定] をクリックします。
[設定] タブで、[ Spark-defaults.conf ] タブをクリックします。
Spark クラスタに対して Elastic Container Instance を有効にします。
spark-defaults.conf タブで、[設定項目の追加] をクリックします。
[設定項目の追加] ダイアログボックスで、次の表に示す設定項目を追加します。
設定項目
説明
spark.kubernetes.driver.annotation.alibabacloud.com/burst-resource
Spark ドライバが Elastic Container Instance を使用するかどかを指定します。有効な値:eci および eci_only。
spark.kubernetes.driver.annotation.k8s.aliyun.com/eci-image-cache
Spark ドライバが Elastic Container Instance のイメージキャッシュ機能を使用するかどかを指定します。設定項目を true に設定することをお勧めします。
spark.kubernetes.executor.annotation.alibabacloud.com/burst-resource
Spark エグゼキュータが Elastic Container Instance を使用するかどかを指定します。有効な値:eci および eci_only。
spark.kubernetes.executor.annotation.k8s.aliyun.com/eci-image-cache
Spark エグゼキュータが Elastic Container Instance のイメージキャッシュ機能を使用するかどかを指定します。設定項目を true に設定することをお勧めします。
spark.kubernetes.driver.annotation.k8s.aliyun.com/eci-ram-role-name
Spark ドライバポッドを作成するときに、Spark ドライバポッドに割り当てられる RAM ロールの名前。設定項目を AliyunECSInstanceForEMRRole に設定します。
[OK] をクリックします。
表示されるダイアログボックスで、[実行理由] パラメーターを設定し、[保存] をクリックします。
設定を有効にします。
[ 設定 ] タブの下部にある [クライアント設定のデプロイ] をクリックします。
表示されるダイアログボックスで、[実行理由] パラメーターを設定し、[OK] をクリックします。
[確認] メッセージで、[OK] をクリックします。
オプション。Object Storage Service(OSS)バケットからデータを読み取ったり、データに書き込んだりするジョブを実行する場合、または Data Lake Formation(DLF)のメタデータを使用する場合は、Elastic Container Instance に関連する権限を付与する必要があります。次のいずれかの方法で権限を付与できます。
方法 1:パスワードなしのアクセスを実装するために、RAM ロールを Elastic Container Instance に割り当てる
RAM コンソール にログインします。信頼できるエンティティが Alibaba Cloud サービスである RAM ロールを作成します。詳細については、「標準サービスロールを作成する」をご参照ください。
説明信頼できるサービスとして Elastic Cloud Service を選択します。
AliyunOSSFullAccess ポリシーと AliyunDLFFullAccess ポリシーを RAM ロールにアタッチします。
詳細については、「RAM ロールに権限を付与する」をご参照ください。
RAM ロールを使用するために、Spark ジョブのポッドアノテーションを追加します。
annotations: k8s.aliyun.com/eci-ram-role-name: <RAM ロールの名前>
方法 2:OSS または DLF にアクセスするための AccessKey ペアを設定する
OSS バケットからデータを読み取ったり、データに書き込んだりするジョブを実行する場合は、hadoopConf で AccessKey ペアを設定します。サンプルコード:
hadoopConf: fs.jfs.cache.oss.accessKeyId: <yourAccessKeyId> fs.jfs.cache.oss.accessKeySecret: <yourAccessKeySecret>
ジョブで DLF を使用する場合は、hadoopConf で AccessKey ペアを設定します。サンプルコード:
hadoopConf: dlf.catalog.accessKeyId: <yourAccessKeyId> dlf.catalog.accessKeySecret: <yourAccessKeySecret> dlf.catalog.akMode: "MANUAL"