Zephyrnet Logosu

Spark Operator ve Spark-Submit ile EKS iş gönderiminde Amazon EMR ile tanışın | Amazon Web Hizmetleri

Tarih:

EKS'de Amazon EMR kuruluşların Amazon Elastic Kubernetes Service (Amazon EKS) üzerinde açık kaynaklı büyük veri çerçeveleri çalıştırmasına olanak tanıyan bir Amazon EMR dağıtım seçeneği sunar. EKS'de EMR ile Spark uygulamaları, Apache Spark için Amazon EMR çalışma zamanında çalışır. Amazon EMR tarafından sunulan, performansı optimize edilmiş bu çalıştırma süresi, Kıvılcım işlerinizin hızlı ve uygun maliyetli bir şekilde yürütülmesini sağlar. EMR çalışma zamanı şunları sağlar: 5.37 kata kadar daha iyi performans ve %76.8 maliyet tasarrufu, Amazon EKS'de açık kaynaklı Apache Spark kullanmaya kıyasla.

Amazon EMR'nin EKS üzerindeki başarısını temel alan müşteriler, emr kapları API, oluşturma EMR sanal kümelerive işleri AWS Komut Satırı Arayüzü (AWS CLI) aracılığıyla EKS kümesine gönderme veya Apache Hava Akışı zamanlayıcı. Ancak Spark uygulamalarını çalıştıran diğer müşteriler, Kıvılcım Operatörü veya yerli kıvılcım gönder Amazon EKS'de Apache Spark işleri tanımlamak ve çalıştırmak için, ancak Spark'ı optimize edilmiş EMR çalışma zamanında çalıştırmanın sağladığı performans kazanımlarından yararlanmadan. Bu ihtiyaca yanıt olarak, EMR 6.10'dan başlayarak, Spark işlerini Spark Operator veya üzerinden gönderirken ve yönetirken optimize edilmiş EMR çalışma zamanını kullanmanıza izin veren yeni bir özelliği kullanıma sunduk. spark-submit. Bu, EKS üzerinde Spark iş yükleri çalıştıran herkesin EMR'nin optimize edilmiş çalışma zamanından yararlanabileceği anlamına gelir.

Bu gönderide, Spark işlerini hem Spark Operator kullanarak hem de spark-submit, EMR çalışma zamanı özelliği ile entegre edilmiştir. Altyapıyı kurmanıza ve her iki yöntemle de iş göndermenize yardımcı olacak adım adım talimatlar sunuyoruz. Ek olarak, EKS şemasındaki veriler Terraform şablonlarını kullanarak tüm altyapıyı dağıtmak için.

Altyapıya genel bakış

Bu gönderide, kullanarak kapsamlı bir çözüm dağıtma sürecini adım adım ele alıyoruz. eksctl, Helm ve AWS CLI. Dağıtımımız aşağıdaki kaynakları içerir:

  • ile kurulan bir VPC, EKS kümesi ve yönetilen düğüm grubu eksctl araç
  • ile kurulan VPC CNI, CoreDNS ve KubeProxy gibi temel Amazon EKS tarafından yönetilen eklentiler eksctl araç
  • Küme Otomatik Ölçekleyici ve Spark Operator eklentileri, Helm kullanılarak kurulur
  • Spark iş yürütme AWS Kimlik ve Erişim Yönetimi (IAM) rolü, için IAM politikası Amazon Basit Depolama Hizmeti (Amazon S3) klasör erişimi, hizmet hesabı ve rol tabanlı erişim kontrolü, AWS CLI kullanılarak kurulur ve eksctl

Önkoşullar

Aşağıdaki ön koşulların makinenizde yüklü olduğunu doğrulayın:

AWS kimlik bilgilerini ayarlayın

Bir sonraki adıma geçmeden ve eksctl komutunu çalıştırmadan önce, yerel AWS kimlik bilgileri profilinizi oluşturmanız gerekir. Talimatlar için bkz. Yapılandırma ve kimlik bilgisi dosyası ayarları.

VPC, EKS kümesi ve yönetilen eklentileri dağıtın

Aşağıdaki yapılandırma kullanır us-west-1 varsayılan Bölge olarak. Farklı bir Bölgede çalıştırmak için region ve availabilityZones buna göre alanlar. Ayrıca, gönderi boyunca sonraki adımlarda aynı Bölgenin kullanıldığını doğrulayın.

AWS kimlik bilgilerinizin ayarlandığı terminale aşağıdaki kod parçacığını girin. güncellediğinizden emin olun. publicAccessCIDRs Aşağıdaki komutu çalıştırmadan önce IP'nizle alan. Bu, adlı bir dosya oluşturacaktır. eks-cluster.yaml:

cat <<EOF >eks-cluster.yaml
---
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata: name: emr-spark-operator region: us-west-1 # replace with your region version: "1.25"
vpc: clusterEndpoints: publicAccess: true privateAccess: true publicAccessCIDRs: ["YOUR-IP/32"]
availabilityZones: ["us-west-1a","us-west-1b"] # replace with your region
iam: withOIDC: true serviceAccounts: - metadata: name: cluster-autoscaler namespace: kube-system wellKnownPolicies: autoScaler: true roleName: eksctl-cluster-autoscaler-role
managedNodeGroups: - name: m5x instanceType: m5.xlarge availabilityZones: ["us-west-1a"] volumeSize: 100 volumeType: gp3 minSize: 2 desiredCapacity: 2 maxSize: 10 tags: k8s.io/cluster-autoscaler/enabled: "true" k8s.io/cluster-autoscaler/eks-nvme: "owned" addons: - name: vpc-cni version: latest - name: coredns version: latest - name: kube-proxy version: latest
cloudWatch: clusterLogging: enableTypes: ["*"]
EOF

EKS kümesini oluşturmak için aşağıdaki komutu kullanın: eksctl create cluster -f eks-cluster.yaml

Küme Otomatik Ölçekleyicisini Dağıtın

Küme Otomatik Ölçekleyici, Kubernetes kümenizin boyutunu mevcut kaynak taleplerine göre otomatik olarak ayarlamak, kaynak kullanımını ve maliyeti optimize etmek için çok önemlidir. Oluşturduğunuz bir autoscaler-helm-values.yaml Helm'i kullanarak Küme Otomatik Ölçekleyicisini dosyalayın ve kurun:

cat <<EOF >autoscaler-helm-values.yaml
---
autoDiscovery: clusterName: emr-spark-operator tags: - k8s.io/cluster-autoscaler/enabled - k8s.io/cluster-autoscaler/{{ .Values.autoDiscovery.clusterName }}
awsRegion: us-west-1 # Make sure the region same as the EKS Cluster
rbac: serviceAccount: create: false name: cluster-autoscaler
EOF

helm repo add autoscaler https://kubernetes.github.io/autoscaler
helm install nodescaler autoscaler/cluster-autoscaler --namespace kube-system --values autoscaler-helm-values.yaml --debug

Ayrıca kurabilirsiniz marangoz EKS kümenizin uygulamalarını işlemek üzere doğru bilgi işlem kaynaklarını otomatik olarak başlatmak için bir küme otomatik ölçekleyicisi olarak. bunu takip edebilirsiniz blog Karpenter'ın nasıl kurulacağı ve yapılandırılacağı hakkında.

Spark Operatörünü Dağıtın

Kıvılcım Operatörü Kubernetes üzerinde çalışan Spark uygulamalarını yönetmek ve izlemek için özel olarak tasarlanmış açık kaynaklı bir Kubernetes operatörüdür. Spark uygulamalarını tanımlamak, yapılandırmak ve çalıştırmak ve Kubernetes API aracılığıyla iş yaşam döngüsünü yönetmek için bir Kubernetes özel kaynağı sağlayarak Spark işlerini dağıtma ve yönetme sürecini kolaylaştırır. Bazı müşteriler, Spark uygulamalarını tıpkı diğer Kubernetes kaynakları gibi yönetmelerini sağladığı için Spark işlerini yönetmek için Spark Operator kullanmayı tercih ediyor.

Şu anda müşteriler açık kaynaklı Spark görüntülerini oluşturuyor ve S3a işlemcileri Spark Operator ile yapılan iş başvurularının bir parçası olarak veya spark-submit. Ancak, yeni iş gönderme seçeneğiyle artık EMR çalışma zamanından EMRFS ile birlikte yararlanabilirsiniz. Amazon EMR 6.10'dan başlayarak ve EMR çalışma zamanının gelecek her sürümü için, EMR çalışma zamanını kullanmak üzere Kıvılcım Operatörü'nü ve Helm grafiğini kullanıma sunacağız.

Bu bölümde, bir Spark Operator Helm grafiğini bir bilgisayardan nasıl konuşlandıracağınızı gösteriyoruz. Amazon Elastik Konteyner Kayıt Defteri (Amazon ECR) deposu ve EMR çalışma zamanı görüntülerini kullanarak işleri gönderin, EMR çalışma zamanı tarafından sağlanan performans iyileştirmelerinden yararlanın.

Amazon ECR'den Helm ile Spark Operator'ı kurun

Spark Operator Helm tablosu bir ECR deposunda saklanır. Spark Operator'ü kurmak için önce Helm istemcinizin kimliğini ECR deposuyla doğrulamanız gerekir. Grafikler aşağıdaki yol altında saklanır: ECR_URI/spark-operator.

Helm istemcinizin kimliğini doğrulayın ve Spark Operatörünü kurun:

aws ecr get-login-password --region us-west-1 | helm registry login --username AWS --password-stdin 608033475327.dkr.ecr.us-west-1.amazonaws.com

İlgili Bölge için AWS hesap kimliğini alarak EKS tarafından desteklenen Bölgelerdeki diğer EMR'lerde kimlik doğrulaması yapabilirsiniz. Daha fazla bilgi için bkz. temel görüntü URI'si nasıl seçilir.

Spark Operatörünü Kurun

Artık Spark Operator'ı aşağıdaki komutu kullanarak kurabilirsiniz:

helm install spark-operator-demo oci://608033475327.dkr.ecr.us-west-1.amazonaws.com/spark-operator --set emrContainers.awsRegion=us-west-1 --version 1.1.26-amzn-0 --set serviceAccounts.spark.create=false --namespace spark-operator --create-namespace

Operatörün doğru kurulduğunu doğrulamak için aşağıdaki komutu çalıştırın:

helm list --namespace spark-operator -o yaml

Spark iş yürütme rolünü ve hizmet hesabını ayarlayın

Bu adımda, Spark Operator'da kullanılacak bir Spark iş yürütme IAM rolü ve bir hizmet hesabı oluşturuyoruz ve spark-submit iş gönderme örnekleri.

İlk olarak, tarafından kullanılacak bir IAM politikası oluşturuyoruz. Hizmet Hesapları için IAM Rolleri (IRSA). Bu politika, sürücü ve yürütücü bölmelerinin politikada belirtilen AWS hizmetlerine erişmesini sağlar. Aşağıdaki adımları tamamlayın:

  1. Önkoşul olarak, bir S3 klasörü oluşturun (aws s3api create-bucket --bucket <ENTER-S3-BUCKET> --create-bucket-configuration LocationConstraint=us-west-1 --region us-west-1) veya mevcut bir S3 klasörünü kullanın. Yer değiştirmek kova adıyla aşağıdaki kodda.
  2. Bir S3 grubuna okuma ve yazma erişimi sağlayan bir ilke dosyası oluşturun:
    cat >job-execution-policy.json <<EOL
    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:ListBucket", "s3:PutObject", "s3:DeleteObject", "s3:AbortMultipartUpload", "s3:ListMultipartUploadParts" ], "Resource": [ "arn:aws:s3:::<ENTER-S3-BUCKET>", "arn:aws:s3:::<ENTER-S3-BUCKET>/*", "arn:aws:s3:::aws-data-lake-workshop/*", "arn:aws:s3:::nyc-tlc", "arn:aws:s3:::nyc-tlc/*" ] } ]
    }
    EOL

  3. Aşağıdaki komutla IAM politikasını oluşturun:
    aws iam create-policy --policy-name emr-job-execution-policy --policy-document file://job-execution-policy.json

  4. Ardından, adlı hizmet hesabını oluşturun. emr-job-execution-sa-role yanı sıra IAM rolleri. Aşağıdaki eksctl komutu, yürütücü ve sürücü tarafından kullanılmak üzere tanımlanan hizmet hesabı ve ad alanına kapsamlı bir hizmet hesabı oluşturur. değiştirdiğinizden emin olun komutu çalıştırmadan önce hesap kimliğiniz ile:
    eksctl create iamserviceaccount --cluster=emr-spark-operator --region us-west-1 --name=emr-job-execution-sa --attach-policy-arn=arn:aws:iam::<ENTER_YOUR_ACCOUNT_ID>:policy/emr-job-execution-policy --role-name=emr-job-execution-irsa --namespace=data-team-a --approve

  5. Yalnızca 3. adımda oluşturma yürütme rolünün 4. adımda S3 klasör oluşturma'dan yazma ve okuma yapmasına izin vermek için bir S1 klasör politikası oluşturun. Değiştirdiğinizden emin olun komutu çalıştırmadan önce hesap kimliğiniz ile:
    cat > bucketpolicy.json<<EOL
    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:ListBucket", "s3:PutObject", "s3:DeleteObject", "s3:AbortMultipartUpload", "s3:ListMultipartUploadParts" ], "Principal": { "AWS": "arn:aws:iam::<ENTER_YOUR_ACCOUNT_ID>:role/emr-job-execution-irsa" }, "Resource": [ "arn:aws:s3:::<ENTER-S3-BUCKET>", "arn:aws:s3:::<ENTER-S3-BUCKET>/*" ] } ]
    }
    EOL aws s3api put-bucket-policy --bucket ENTER-S3-BUCKET-NAME --policy file://bucketpolicy.json

  6. Spark iş çalıştırmasında kullanılan hizmet hesabı için gerekli olan bir Kubernetes rolü ve rol bağlama oluşturun:
    cat <<EOF >emr-job-execution-rbac.yaml
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata: name: emr-job-execution-sa-role namespace: data-team-a
    rules: - apiGroups: ["", "batch","extensions"] resources: ["configmaps","serviceaccounts","events","pods","pods/exec","pods/log","pods/portforward","secrets","services","persistentvolumeclaims"] verbs: ["create","delete","get","list","patch","update","watch"]
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata: name: emr-job-execution-sa-rb namespace: data-team-a
    roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: emr-job-execution-sa-role
    subjects: - kind: ServiceAccount name: emr-job-execution-sa namespace: data-team-a
    EOF

  7. Aşağıdaki komutla Kubernetes rolünü ve rol bağlama tanımını uygulayın:
kubectl apply -f emr-job-execution-rbac.yaml

Şimdiye kadar, Spark iş yürütme rolleri de dahil olmak üzere altyapı kurulumunu tamamladık. Aşağıdaki adımlarda, hem Spark Operator'ü kullanarak hem de Spark Operator kullanarak örnek Spark işleri çalıştırıyoruz. spark-submit EMR çalışma zamanı ile.

Spark Operator işini EMR çalışma zamanı ile yapılandırın

Bu bölümde, S3 klasörlerinde depolanan genel veri kümelerinden verileri okuyan, bunları işleyen ve sonuçları kendi S3 klasörünüze yazan örnek bir Spark işi sunuyoruz. Değiştirerek aşağıdaki yapılandırmada S3 klasörünü güncellediğinizden emin olun. belirtilen kendi S3 kovanızın URI'si ile 2 adım Spark iş yürütme rolünü ve hizmet hesabını ayarlayınbaşlıklı bir kılavuz yayınladı Bölüm. Ayrıca, kullandığımıza dikkat edin data-team-a bir ad alanı olarak ve emr-job-execution-sa önceki adımda oluşturduğumuz bir hizmet hesabı olarak. Bunlar, ayrılmış ad alanında Spark iş bölmelerini çalıştırmak için gereklidir ve hizmet hesabına bağlı IAM rolü, verileri okumak ve yazmak için S3 klasörüne erişmek için kullanılır.

En önemlisi, dikkat image şu anda ayarlanan EMR için optimize edilmiş çalışma zamanı Docker görüntüsünün bulunduğu alan emr-6.10.0. Amazon EMR ekibi tarafından piyasaya sürüldüğünde bunu daha yeni bir sürümle değiştirebilirsiniz. Ayrıca, işlerinizi yapılandırırken şunları eklediğinizden emin olun: sparkConf ve hadoopConf ayarlar aşağıdaki bildirimde tanımlandığı gibidir. Bu yapılandırmalar, EMR çalışma zamanı performansından yararlanmanızı sağlar, AWS Tutkal Veri Kataloğu entegrasyonu ve EMRFS için optimize edilmiş bağlayıcı.

  1. Dosyayı oluştur (emr-spark-operator-example.yaml) yerel olarak seçin ve işi bir sonraki adımın parçası olarak gönderebilmeniz için S3 grup konumunu güncelleyin:
    cat <<EOF >emr-spark-operator-example.yaml
    ---
    apiVersion: "sparkoperator.k8s.io/v1beta2"
    kind: SparkApplication
    metadata: name: taxi-example namespace: data-team-a
    spec: type: Scala mode: cluster # EMR optimized runtime image image: "483788554619.dkr.ecr.eu-west-1.amazonaws.com/spark/emr-6.10.0:latest" imagePullPolicy: Always mainClass: ValueZones mainApplicationFile: s3://aws-data-lake-workshop/spark-eks/spark-eks-assembly-3.3.0.jar arguments: - s3://nyc-tlc/csv_backup - "2017" - s3://nyc-tlc/misc/taxi _zone_lookup.csv - s3://<ENTER_S3_BUCKET>/emr-eks-results - emr_eks_demo hadoopConf: # EMRFS filesystem config fs.s3.customAWSCredentialsProvider: com.amazonaws.auth.WebIdentityTokenCredentialsProvider fs.s3.impl: com.amazon.ws.emr.hadoop.fs.EmrFileSystem fs.AbstractFileSystem.s3.impl: org.apache.hadoop.fs.s3.EMRFSDelegate fs.s3.buffer.dir: /mnt/s3 fs.s3.getObject.initialSocketTimeoutMilliseconds: "2000" mapreduce.fileoutputcommitter.algorithm.version.emr_internal_use_only.EmrFileSystem: "2" mapreduce.fileoutputcommitter.cleanup-failures.ignored.emr_internal_use_only.EmrFileSystem: "true" sparkConf: spark.eventLog.enabled: "true" spark.eventLog.dir: "s3://<ENTER_S3_BUCKET>/" spark.kubernetes.driver.pod.name: driver-nyc-taxi-etl # Required for EMR Runtime and Glue Catalogue spark.driver.extraClassPath: /usr/lib/hadoop-lzo/lib/*:/usr/lib/hadoop/hadoop-aws.jar:/usr/share/aws/aws-java-sdk/*:/usr/share/aws/emr/emrfs/conf:/usr/share/aws/emr/emrfs/lib/*:/usr/share/aws/emr/emrfs/auxlib/*:/usr/share/aws/emr/security/conf:/usr/share/aws/emr/security/lib/*:/usr/share/aws/hmclient/lib/aws-glue-datacatalog-spark-client.jar:/usr/share/java/Hive-JSON-Serde/hive-openx-serde.jar:/usr/share/aws/sagemaker-spark-sdk/lib/sagemaker-spark-sdk.jar:/home/hadoop/extrajars/* spark.driver.extraLibraryPath: /usr/lib/hadoop/lib/native:/usr/lib/hadoop-lzo/lib/native:/docker/usr/lib/hadoop/lib/native:/docker/usr/lib/hadoop-lzo/lib/native spark.executor.extraClassPath: /usr/lib/hadoop-lzo/lib/*:/usr/lib/hadoop/hadoop-aws.jar:/usr/share/aws/aws-java-sdk/*:/usr/share/aws/emr/emrfs/conf:/usr/share/aws/emr/emrfs/lib/*:/usr/share/aws/emr/emrfs/auxlib/*:/usr/share/aws/emr/security/conf:/usr/share/aws/emr/security/lib/*:/usr/share/aws/hmclient/lib/aws-glue-datacatalog-spark-client.jar:/usr/share/java/Hive-JSON-Serde/hive-openx-serde.jar:/usr/share/aws/sagemaker-spark-sdk/lib/sagemaker-spark-sdk.jar:/home/hadoop/extrajars/* spark.executor.extraLibraryPath: /usr/lib/hadoop/lib/native:/usr/lib/hadoop-lzo/lib/native:/docker/usr/lib/hadoop/lib/native:/docker/usr/lib/hadoop-lzo/lib/native # EMRFS commiter spark.sql.parquet.output.committer.class: com.amazon.emr.committer.EmrOptimizedSparkSqlParquetOutputCommitter spark.sql.parquet.fs.optimized.committer.optimization-enabled: "true" spark.sql.emr.internal.extensions: com.amazonaws.emr.spark.EmrSparkSessionExtensions spark.executor.defaultJavaOptions: -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseParallelGC -XX:InitiatingHeapOccupancyPercent=70 -XX:OnOutOfMemoryError='kill -9 %p' spark.driver.defaultJavaOptions: -XX:OnOutOfMemoryError='kill -9 %p' -XX:+UseParallelGC -XX:InitiatingHeapOccupancyPercent=70 sparkVersion: "3.3.1" restartPolicy: type: Never driver: cores: 1 memory: "4g" serviceAccount: emr-job-execution-sa executor: cores: 1 instances: 4 memory: "4g" serviceAccount: emr-job-execution-sa
    EOF

  2. İşi EKS kümesine göndermek için aşağıdaki komutu çalıştırın:
    kubectl apply -f emr-spark-operator-example.yaml

    İşin tamamlanması 4-5 dakika sürebilir ve başarılı mesajı sürücü bölmesi günlüklerinde doğrulayabilirsiniz.

  3. Aşağıdaki komutu çalıştırarak işi doğrulayın:
kubectl get pods -n data-team-a

Spark kullanıcı arayüzüne erişimi etkinleştirin

Spark UI, veri mühendisleri için önemli bir araçtır çünkü görevlerin ilerlemesini izlemenize, ayrıntılı iş ve aşama bilgilerini görüntülemenize ve darboğazları belirlemek ve kodunuzu optimize etmek için kaynak kullanımını analiz etmenize olanak tanır. Kubernetes üzerinde çalışan Spark işleri için Spark UI, sürücü bölmesinde barındırılır ve erişimi Kubernetes'in dahili ağıyla sınırlıdır. Erişmek için, trafiği bölmeye iletmemiz gerekir. kubectl. Aşağıdaki adımlar, nasıl ayarlayacağınız konusunda size yol gösterir.

Trafiği sürücü bölmesine iletmek için aşağıdaki komutu çalıştırın:

kubectl port-forward <driver-pod-name> 4040:4040

Aşağıdakine benzer bir metin görmelisiniz:

Forwarding from 127.0.0.1:4040 -> 4040
Forwarding from [::1]:4040 → 4040

Gönderim sırasında sürücü bölmesi adını belirtmediyseniz SparkApplication, aşağıdaki komutla alabilirsiniz:

kubectl get pods -l spark-role=driver,spark-app-name=<your-spark-app-name> -o jsonpath='{.items[0].metadata.name}'

Bir tarayıcı açın ve girin http://localhost:4040 adres çubuğunda. Spark kullanıcı arayüzüne bağlanabilmeniz gerekir.

kıvılcım-ui-ekran görüntüsü

Spark Geçmiş Sunucusu

İşinizi çalıştırdıktan sonra keşfetmek isterseniz, onu Spark Geçmiş Sunucusu aracılığıyla görüntüleyebilirsiniz. Önceki SparkApplication tanım, olay günlüğünü etkinleştirir ve olayları aşağıdaki yolla bir S3 klasöründe depolar: s3://YOUR-S3-BUCKET/. Spark Geçmiş Sunucusunu kurma ve günlükleri keşfetme hakkındaki talimatlar için bkz. Docker kullanarak Spark geçmiş sunucusunu başlatma ve Spark kullanıcı arayüzünü görüntüleme.

kıvılcım gönder

kıvılcım gönder Apache Spark uygulamalarını bir kümede veya yerel olarak çalıştırmak için bir komut satırı arabirimidir. Uygulamaları Spark kümelerine göndermenizi sağlar. Araç, uygulama özelliklerinin, kaynak tahsisinin ve özel kitaplıkların basit bir şekilde yapılandırılmasını sağlayarak Spark işlerinin dağıtımını ve yönetimini kolaylaştırır.

Amazon EMR 6.10'dan başlayarak, spark-submit bir iş gönderme yöntemi olarak desteklenmektedir. Bu yöntem şu anda gönderim mekanizması olarak yalnızca küme modunu desteklemektedir. kullanarak işleri göndermek için spark-submit yöntemiyle, daha önce kurduğumuz hizmet hesabı için IAM rolünü yeniden kullanırız. Spark Operator yöntemi için kullanılan S3 kovasını da kullanıyoruz. Bu bölümdeki adımlar, işleri nasıl yapılandıracağınızı ve göndereceğinizi gösterir. spark-submit ve EMR çalışma zamanı iyileştirmelerinden yararlanın.

  1. Bir iş göndermek için Amazon EMR'de bulunanla eşleşen Spark sürümünü kullanmanız gerekir. Amazon EMR 6.10 için yapmanız gerekenler kıvılcım 3.3 sürümünü indirin.
  2. sahip olduğunuzdan da emin olmanız gerekir. Java ortamınıza kurulur.
  3. Dosyayı açın ve Spark dizininin kök dizinine gidin.
  4. Aşağıdaki kodda, değiştirin EKS bitiş noktası yanısıra S3 kepçe sonra betiği çalıştırın:
./bin/spark-submit --class ValueZones --master k8s://EKS-ENDPOINT --conf spark.kubernetes.namespace=data-team-a --conf spark.kubernetes.container.image=608033475327.dkr.ecr.us-west-1.amazonaws.com/spark/emr-6.10.0:latest --conf spark.kubernetes.authenticate.driver.serviceAccountName=emr-job-execution-sa --conf spark.kubernetes.authenticate.executor.serviceAccountName=emr-job-execution-sa --conf spark.driver.extraClassPath="/usr/lib/hadoop-lzo/lib/*:/usr/lib/hadoop/hadoop-aws.jar:/usr/share/aws/aws-java-sdk/*:/usr/share/aws/emr/emrfs/conf:/usr/share/aws/emr/emrfs/lib/*:/usr/share/aws/emr/emrfs/auxlib/*:/usr/share/aws/emr/security/conf:/usr/share/aws/emr/security/lib/*:/usr/share/aws/hmclient/lib/aws-glue-datacatalog-spark-client.jar:/usr/share/java/Hive-JSON-Serde/hive-openx-serde.jar:/usr/share/aws/sagemaker-spark-sdk/lib/sagemaker-spark-sdk.jar:/home/hadoop/extrajars/*" --conf spark.driver.extraLibraryPath="/usr/lib/hadoop/lib/native:/usr/lib/hadoop-lzo/lib/native:/docker/usr/lib/hadoop/lib/native:/docker/usr/lib/hadoop-lzo/lib/native" --conf spark.executor.extraClassPath="/usr/lib/hadoop-lzo/lib/*:/usr/lib/hadoop/hadoop-aws.jar:/usr/share/aws/aws-java-sdk/*:/usr/share/aws/emr/emrfs/conf:/usr/share/aws/emr/emrfs/lib/*:/usr/share/aws/emr/emrfs/auxlib/*:/usr/share/aws/emr/security/conf:/usr/share/aws/emr/security/lib/*:/usr/share/aws/hmclient/lib/aws-glue-datacatalog-spark-client.jar:/usr/share/java/Hive-JSON-Serde/hive-openx-serde.jar:/usr/share/aws/sagemaker-spark-sdk/lib/sagemaker-spark-sdk.jar:/home/hadoop/extrajars/*" --conf spark.executor.extraLibraryPath="/usr/lib/hadoop/lib/native:/usr/lib/hadoop-lzo/lib/native:/docker/usr/lib/hadoop/lib/native:/docker/usr/lib/hadoop-lzo/lib/native" --conf spark.hadoop.fs.s3.customAWSCredentialsProvider=com.amazonaws.auth.WebIdentityTokenCredentialsProvider --conf spark.hadoop.fs.s3.impl=com.amazon.ws.emr.hadoop.fs.EmrFileSystem --conf spark.hadoop.fs.AbstractFileSystem.s3.impl=org.apache.hadoop.fs.s3.EMRFSDelegate --conf spark.hadoop.fs.s3.buffer.dir=/mnt/s3 --conf spark.hadoop.fs.s3n.impl=com.amazon.ws.emr.hadoop.fs.EmrFileSystem --deploy-mode cluster s3://aws-data-lake-workshop/spark-eks/spark-eks-assembly-3.3.0.jar s3://nyc-tlc/csv_backup 2017 s3://nyc-tlc/misc/taxi_zone_lookup.csv s3://S3_BUCKET/emr-eks-results emr_eks_demo

Bir çekirdek ve 7 G bellekten oluşan iki yürütücü ile işin tamamlanması yaklaşık 1 dakika sürer.

Özel kubernetes planlayıcıları kullanma

Eşzamanlı olarak büyük hacimli işler yürüten müşteriler, Kubernetes'in sunduğu standart zamanlama ve kaynak kullanım yönetimi ile çözemedikleri, bilgi işlem kapasitesine adil erişim sağlamayla ilgili zorluklarla karşılaşabilir. Ayrıca, Amazon EMR'den Amazon Elastic Compute Cloud'a (Amazon EC2) geçiş yapan ve planlamalarını YARN kuyruklarıyla yöneten müşteriler, bunları Kubernetes planlama özelliklerine aktaramaz.

Bu sorunun üstesinden gelmek için, gibi özel zamanlayıcıları kullanabilirsiniz. Apaçi Yunikorn or Volkan.Spark Operator bu programlayıcıları yerel olarak destekler ve bunlarla birlikte Spark uygulamalarını öncelik, kaynak gereksinimleri ve adillik politikaları gibi faktörlere göre planlayabilirsiniz, Spark Operator ise uygulama dağıtımını ve yönetimini basitleştirir. Yunikorn'u grup programlama ile kurmak ve Spark Operator aracılığıyla gönderilen Spark uygulamalarında kullanmak için bkz. YuniKorn ile Kıvılcım Operatörü.

Temizlemek

AWS hesabınızdan istenmeyen ücretler alınmasını önlemek için bu dağıtım sırasında oluşturulan tüm AWS kaynaklarını silin:

eksctl delete cluster -f eks-cluster.yaml

Sonuç

Bu yazıda, Spark Operator için EMR çalışma zamanı özelliğini tanıttık ve spark-submitve bu özelliği bir EKS kümesinde kullanmanın avantajlarını araştırdı. Optimize edilmiş EMR çalıştırma süresiyle, maliyetleri optimize ederken Spark uygulamalarınızın performansını önemli ölçüde artırabilirsiniz. Kullanarak küme dağıtımını gösterdik. eksctl aracını da kullanabilirsiniz. EKS planları ile ilgili veriler EKS üzerinde EMR için kullanabileceğiniz ve EKS üzerinde EMR iş gönderme yöntemine ek olarak bu yeni dağıtım yöntemlerinden yararlanabileceğiniz üretime hazır bir EKS dağıtmak için. Uygulamalarınızı optimize edilmiş EMR çalıştırma zamanında çalıştırarak, Spark uygulama iş akışlarınızı daha da geliştirebilir ve veri işleme boru hatlarınızda yeniliği destekleyebilirsiniz.


Yazarlar Hakkında

Lotfi Muhib Amazon Web Services ile Kamu Sektörü ekibi için çalışan bir Kıdemli Çözüm Mimarıdır. EMEA'daki kamu sektörü müşterilerinin fikirlerini gerçekleştirmelerine, yeni hizmetler oluşturmalarına ve vatandaşlar için inovasyon yapmalarına yardımcı oluyor. Lütfi boş zamanlarında bisiklete binmeyi ve koşmayı sever.

vara bonthu stratejik hesaplardan çeşitli kuruluşlara kadar çeşitli AWS müşterilerine yardımcı olma konusunda uzmanlaşmış, özel bir teknoloji uzmanı ve EKS'de Veriler için Dünya Çapında Teknoloji Lideridir. Açık kaynak teknolojileri, veri analitiği, AI/ML ve Kubernetes konusunda tutkulu ve geliştirme, DevOps ve mimaride kapsamlı bir geçmişe sahip. Vara'nın birincil odak noktası, Kubernetes platformlarında üst düzeyde ölçeklenebilir veri ve AI/ML çözümleri oluşturmak ve müşterilerin veri odaklı arayışları için en son teknolojinin tüm potansiyelinden yararlanmalarına yardımcı olmaktır.

spot_img

En Son İstihbarat

spot_img

Bizimle sohbet

Merhaba! Size nasıl yardım edebilirim?