Utilisez Elastic Container Instance (ECI) pour planifier des tâches Spark sans être limité par la capacité de calcul des nœuds de votre cluster ACK. ECI crée dynamiquement des pods à la demande, ce qui permet de réduire les coûts de calcul. Cette rubrique décrit comment utiliser ECI pour planifier élastiquement des tâches Spark.
Contexte
Pour exploiter des fonctionnalités ECI plus avancées, définissez des annotations supplémentaires afin de configurer les paramètres ECI selon vos besoins. Pour plus d'informations, consultez la section Annotation de pod ECI.
Prérequis
Un cluster Spark a été créé dans la console EMR on ACK. Pour plus d'informations, consultez la section Prise en main d'EMR on ACK.
Le service Elastic Container Instance est activé. Pour plus d'informations, consultez la section Flux de travail.
Procédure
Installez les nœuds virtuels requis par ECI dans votre cluster ACK. Pour plus d'informations, consultez la section Étape 1 : Déployer le composant ack-virtual-node dans un cluster ACK.
-
Lors de la soumission d'une tâche Spark sur EMR on ACK, activez la planification ECI en configurant un libellé, une annotation ou Spark Conf.
Pour plus d'informations sur la soumission d'une tâche Spark, consultez la section Soumettre une tâche Spark.
RemarqueLes exemples de cette rubrique utilisent Spark 3.1.1 (EMR-5.2.1-ack). Si vous utilisez une version différente, modifiez les configurations sparkVersion et mainApplicationFile. Pour une description des paramètres utilisés dans les exemples, consultez la documentation spark-on-k8s-operator.
-
Méthode 1 : Configurer un libellé de pod
Définissez le libellé alibabacloud.com/eci sur
truepour planifier l'exécution des pods spécifiés sur ECI. L'exemple suivant illustre cette configuration.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 # By configuring this label, all executors use ECI. labels: alibabacloud.com/eci: "true" # (Optional) Enable the ECI image cache to improve performance. annotations: k8s.aliyun.com/eci-image-cache: "true" -
Méthode 2 : Configurer une annotation de pod
Définissez l'annotation alibabacloud.com/burst-resource sur
ecipour planifier l'exécution des pods spécifiés sur ECI. Cette annotation accepte deux valeurs valides :eci: Utiliser ECI lorsque les ressources des nœuds classiques du cluster sont insuffisantes.eci_only: Utiliser uniquement ECI.
L'exemple suivant illustre cette configuration.
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 # By configuring this annotation, executors use ECI when regular node resources are insufficient. annotations: alibabacloud.com/burst-resource: "eci" # (Optional) Enable the ECI image cache to improve performance. k8s.aliyun.com/eci-image-cache: "true" -
Méthode 3 : Configurer Spark Conf
Vous pouvez également activer la planification ECI en configurant des annotations de pod dans Spark Conf. Les valeurs des annotations sont identiques à celles de la Méthode 2 : Configurer une annotation de pod.
-
Accédez à l'onglet spark-defaults.conf.
Connectez-vous à la console EMR on ACK.
Sur la page EMR on ACK, localisez le cluster cible et cliquez sur Configure dans la colonne Actions.
Sur la page Configure, cliquez sur l'onglet spark-defaults.conf.
-
Configurez le cluster Spark pour activer ECI.
Cliquez sur Add Configuration Item.
-
Dans la boîte de dialogue Add Configuration Item, ajoutez les éléments de configuration suivants.
Parameter
Description
spark.kubernetes.driver.annotation.alibabacloud.com/burst-resource
Indique si le pilote Spark utilise ECI. Valeurs valides :
ecieteci_only.spark.kubernetes.driver.annotation.k8s.aliyun.com/eci-image-cache
Indique si le pilote Spark utilise le cache d'images ECI. Définissez ce paramètre sur
truepour améliorer les performances.spark.kubernetes.executor.annotation.alibabacloud.com/burst-resource
Indique si les exécuteurs Spark utilisent ECI. Valeurs valides :
ecieteci_only.spark.kubernetes.executor.annotation.k8s.aliyun.com/eci-image-cache
Indique si les exécuteurs Spark utilisent le cache d'images ECI. Définissez ce paramètre sur
truepour améliorer les performances.spark.kubernetes.driver.annotation.k8s.aliyun.com/eci-ram-role-name
Spécifie le nom du rôle RAM à lier lors de la création du pod pilote Spark. Définissez cette valeur sur AliyunECSInstanceForEMRRole.
Cliquez sur OK.
Dans la boîte de dialogue qui s'affiche, saisissez un motif dans le champ Execution Reason et cliquez sur Save.
-
Appliquez la configuration.
Cliquez sur Deploy Client Configuration.
Dans la boîte de dialogue qui s'affiche, saisissez un motif dans le champ Execution Reason et cliquez sur OK.
Dans la boîte de dialogue Confirm, cliquez sur OK.
-
-
-
Facultatif : Si votre tâche doit lire ou écrire des données dans OSS, ou utiliser les métadonnées DLF, accordez à ECI les autorisations nécessaires pour accéder à ces services cloud. Vous pouvez procéder de l'une des manières suivantes :
-
Méthode 1 : Attribuer un rôle RAM à ECI pour un accès sans mot de passe.
-
Dans la console RAM, créez un rôle RAM dont l'entité de confiance est un service Alibaba Cloud. Pour plus d'informations, consultez la section Créer un rôle de service standard.
RemarqueSélectionnez ECS comme service de confiance.
-
Attachez les stratégies AliyunOSSFullAccess et AliyunDLFFullAccess au rôle RAM.
Pour plus d'informations, consultez la section Gérer les autorisations d'un rôle RAM.
-
Dans votre tâche Spark, ajoutez l'annotation suivante pour spécifier le rôle RAM.
annotations: k8s.aliyun.com/eci-ram-role-name: <your-ram-role-name>
-
-
Méthode 2 : Configurer une AccessKey OSS ou une AccessKey DLF
-
Si votre tâche doit lire ou écrire des données dans OSS, ajoutez la configuration AccessKey à hadoopConf comme indiqué ci-dessous.
hadoopConf: fs.jfs.cache.oss.accessKeyId: <yourAccessKeyId> fs.jfs.cache.oss.accessKeySecret: <yourAccessKeySecret> -
Si votre tâche utilise DLF, ajoutez la configuration AccessKey à hadoopConf comme indiqué ci-dessous.
hadoopConf: dlf.catalog.accessKeyId: <yourAccessKeyId> dlf.catalog.accessKeySecret: <yourAccessKeySecret> dlf.catalog.akMode: "MANUAL"
-
-