شعار زيفيرنت

تقديم Amazon EMR على EKS لتقديم الوظائف باستخدام Spark Operator و spark-submit | خدمات أمازون ويب

التاريخ:

Amazon EMR على EKS يوفر خيار نشر Amazon EMR الذي يسمح للمؤسسات بتشغيل أطر عمل البيانات الضخمة مفتوحة المصدر على Amazon Elastic Kubernetes Service (Amazon EKS). باستخدام EMR على EKS ، تعمل تطبيقات Spark في وقت تشغيل Amazon EMR لـ Apache Spark. وقت التشغيل المُحسَّن للأداء الذي توفره Amazon EMR يجعل وظائف Spark الخاصة بك تعمل بسرعة وفعالية من حيث التكلفة. يوفر وقت تشغيل EMR ملفات أداء أفضل يصل إلى 5.37 مرة وتوفير في التكاليف بنسبة 76.8٪، عند مقارنتها باستخدام Apache Spark مفتوح المصدر على Amazon EKS.

بناءً على نجاح Amazon EMR على EKS ، كان العملاء يديرون الوظائف ويديرونها باستخدام حاويات emr API ، وخلق مجموعات EMR الافتراضية، وإرسال المهام إلى مجموعة EKS ، إما من خلال واجهة سطر أوامر AWS (AWS CLI) أو أباتشي تدفق الهواء المجدول. ومع ذلك ، اختار العملاء الآخرون الذين يقومون بتشغيل تطبيقات Spark عامل شرارة أو مواطن شرارة تقديم لتحديد وظائف Apache Spark وتشغيلها على Amazon EKS ، ولكن دون الاستفادة من مكاسب الأداء من تشغيل Spark في وقت تشغيل EMR المحسّن. استجابة لهذه الحاجة ، بدءًا من EMR 6.10 ، قدمنا ​​ميزة جديدة تتيح لك استخدام وقت تشغيل EMR المحسّن أثناء إرسال مهام Spark وإدارتها من خلال Spark Operator أو spark-submit. هذا يعني أن أي شخص يقوم بتشغيل أحمال عمل Spark على EKS يمكنه الاستفادة من وقت تشغيل EMR المحسّن.

في هذا المنشور ، نسير خلال عملية إعداد وظائف Spark وتشغيلها باستخدام كل من Spark Operator و spark-submit، متكامل مع ميزة وقت تشغيل EMR. نحن نقدم إرشادات خطوة بخطوة لمساعدتك في إعداد البنية التحتية وتقديم وظيفة بكلتا الطريقتين. بالإضافة إلى ذلك ، يمكنك استخدام ملف بيانات عن مخطط EKS لنشر البنية التحتية بالكامل باستخدام نماذج Terraform.

نظرة عامة على البنية التحتية

في هذا المنشور ، نسير خلال عملية نشر حل شامل باستخدام eksctlو Helm و AWS CLI. يشمل نشرنا الموارد التالية:

  • تم إعداد مجموعة VPC و EKS ومجموعة العقدة المدارة بملحق eksctl أداة
  • تم إعداد الوظائف الإضافية الأساسية المُدارة من Amazon EKS ، مثل VPC CNI و CoreDNS و KubeProxy باستخدام eksctl أداة
  • إضافات Cluster Autoscaler و Spark Operator الإضافية ، تم إعدادهما باستخدام Helm
  • تنفيذ وظيفة سبارك إدارة الهوية والوصول AWS دور (IAM) ، سياسة IAM لـ خدمة تخزين أمازون البسيطة (Amazon S3) الوصول إلى الحاوية ، وحساب الخدمة ، والتحكم في الوصول المستند إلى الدور ، والذي تم إعداده باستخدام AWS CLI و eksctl

المتطلبات الأساسية المسبقة

تحقق من تثبيت المتطلبات الأساسية التالية على جهازك:

قم بإعداد بيانات اعتماد AWS

قبل المتابعة إلى الخطوة التالية وتشغيل الأمر eksctl ، تحتاج إلى إعداد ملف تعريف بيانات اعتماد AWS المحلي الخاص بك. للحصول على تعليمات ، راجع التكوين وإعدادات ملف الاعتماد.

انشر VPC ومجموعة EKS والوظائف الإضافية المُدارة

يستخدم التكوين التالي us-west-1 كمنطقة افتراضية. للتشغيل في منطقة مختلفة ، قم بتحديث ملف region و availabilityZones وفقًا لذلك. تحقق أيضًا من استخدام نفس المنطقة في الخطوات اللاحقة في جميع أنحاء المنشور.

أدخل مقتطف الشفرة التالي في الجهاز حيث تم إعداد بيانات اعتماد AWS الخاصة بك. تأكد من تحديث ملف publicAccessCIDRs المجال مع IP الخاص بك قبل تشغيل الأمر أدناه. سيؤدي هذا إلى إنشاء ملف باسم 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: eksctl create cluster -f eks-cluster.yaml

نشر مقياس الكتلة التلقائي

يعد Cluster Autoscaler ضروريًا لضبط حجم مجموعة Kubernetes تلقائيًا بناءً على متطلبات الموارد الحالية ، وتحسين استخدام الموارد والتكلفة. يخترع autoscaler-helm-values.yaml ملف وتثبيت Cluster Autoscaler باستخدام Helm:

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

يمكنك أيضًا الإعداد كاربنتر كمقياس تلقائي للكتلة لإطلاق موارد الحوسبة الصحيحة تلقائيًا للتعامل مع تطبيقات مجموعة EKS. يمكنك متابعة هذا مدونة حول كيفية إعداد وتكوين كاربنتر.

نشر Spark Operator

عامل شرارة هو مشغل Kubernetes مفتوح المصدر مصمم خصيصًا لإدارة ومراقبة تطبيقات Spark التي تعمل على Kubernetes. إنه يبسط عملية نشر وظائف Spark وإدارتها ، من خلال توفير مورد مخصص لـ Kubernetes لتحديد تطبيقات Spark وتكوينها وتشغيلها ، بالإضافة إلى إدارة دورة حياة العمل من خلال Kubernetes API. يفضل بعض العملاء استخدام Spark Operator لإدارة وظائف Spark لأنه يمكّنهم من إدارة تطبيقات Spark تمامًا مثل موارد Kubernetes الأخرى.

حاليًا ، يقوم العملاء ببناء صور Spark مفتوحة المصدر الخاصة بهم واستخدامها مرتكبو S3a كجزء من عمليات تقديم الوظائف مع Spark Operator أو spark-submit. ومع ذلك ، مع خيار تقديم الوظيفة الجديد ، يمكنك الآن الاستفادة من وقت تشغيل EMR بالتزامن مع EMRFS. بدءًا من Amazon EMR 6.10 ولكل إصدار قادم من وقت تشغيل EMR ، سنصدر Spark Operator ومخطط Helm الخاص به لاستخدام وقت تشغيل EMR.

في هذا القسم ، نوضح لك كيفية نشر مخطط Helm Operator Spark من ملف سجل الأمازون المرنة للحاويات (Amazon ECR) وإرسال الوظائف باستخدام صور وقت تشغيل EMR ، والاستفادة من تحسينات الأداء التي يوفرها وقت تشغيل EMR.

قم بتثبيت Spark Operator مع Helm من Amazon ECR

يتم تخزين مخطط Spark Operator Helm في مستودع ECR. لتثبيت Spark Operator ، تحتاج أولاً إلى مصادقة عميل Helm الخاص بك مع مستودع ECR. يتم تخزين المخططات تحت المسار التالي: ECR_URI/spark-operator.

قم بمصادقة عميل Helm الخاص بك وقم بتثبيت Spark Operator:

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

يمكنك المصادقة مع EMR الأخرى على المناطق المدعومة من EKS من خلال الحصول على معرف حساب AWS للمنطقة المقابلة. لمزيد من المعلومات ، يرجى الرجوع إلى كيفية تحديد عنوان URI للصورة الأساسية.

تثبيت Spark Operator

يمكنك الآن تثبيت Spark Operator باستخدام الأمر التالي:

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

للتحقق من تثبيت المشغل بشكل صحيح ، قم بتشغيل الأمر التالي:

helm list --namespace spark-operator -o yaml

قم بإعداد دور تنفيذ مهام Spark وحساب الخدمة

في هذه الخطوة ، نقوم بإنشاء دور IAM لتنفيذ وظيفة Spark وحساب خدمة ، والذي سيتم استخدامه في Spark Operator و spark-submit أمثلة على تقديم الوظائف.

أولاً ، نقوم بإنشاء سياسة IAM التي سيتم استخدامها من قبل أدوار IAM لحسابات الخدمة (IRSA). تتيح هذه السياسة لقرون السائق والمنفذ الوصول إلى خدمات AWS المحددة في السياسة. أكمل الخطوات التالية:

  1. كشرط أساسي ، قم بإنشاء حاوية S3 (aws s3api create-bucket --bucket <ENTER-S3-BUCKET> --create-bucket-configuration LocationConstraint=us-west-1 --region us-west-1) أو استخدم حاوية S3 موجودة. يستبدل في الكود التالي مع اسم المستودع.
  2. قم بإنشاء ملف سياسة يسمح بالوصول للقراءة والكتابة إلى حاوية S3:
    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. أنشئ سياسة IAM بالأمر التالي:
    aws iam create-policy --policy-name emr-job-execution-policy --policy-document file://job-execution-policy.json

  4. بعد ذلك ، قم بإنشاء حساب الخدمة المسمى emr-job-execution-sa-role بالإضافة إلى أدوار IAM. الأتى eksctl يقوم الأمر بإنشاء حساب خدمة محدد نطاقه إلى مساحة الاسم وحساب الخدمة المحدد ليستخدمهما المنفذ والسائق. تأكد من استبداله بمعرف حسابك قبل تشغيل الأمر:
    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. أنشئ سياسة حاوية S3 للسماح فقط لدور التنفيذ الذي تم إنشاؤه في الخطوة 4 بالكتابة والقراءة من حاوية S3 التي تم إنشاؤها في الخطوة 1. تأكد من الاستبدال بمعرف حسابك قبل تشغيل الأمر:
    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. قم بإنشاء دور Kubernetes وربط الدور المطلوب لحساب الخدمة المستخدم في تشغيل وظيفة Spark:
    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. قم بتطبيق دور Kubernetes وتعريف ارتباط الدور باستخدام الأمر التالي:
kubectl apply -f emr-job-execution-rbac.yaml

حتى الآن ، أكملنا إعداد البنية التحتية ، بما في ذلك أدوار تنفيذ مهام Spark. في الخطوات التالية ، نقوم بتشغيل عينة من وظائف Spark باستخدام كل من Spark Operator و spark-submit مع وقت تشغيل EMR.

قم بتكوين وظيفة Spark Operator مع وقت تشغيل EMR

في هذا القسم ، نقدم نموذجًا لوظيفة Spark يقرأ البيانات من مجموعات البيانات العامة المخزنة في حاويات S3 ، ويعالجها ، ويكتب النتائج في حاوية S3 الخاصة بك. تأكد من تحديث دلو S3 في التكوين التالي عن طريق الاستبدال مع URI لحاوية S3 الخاصة بك المشار إليها خطوة 2 من "قم بإعداد دور تنفيذ مهام Spark وحساب الخدمة" قسم. لاحظ أيضًا أننا نستخدم ملفات data-team-a كمساحة اسم و emr-job-execution-sa كحساب خدمة ، أنشأناه في الخطوة السابقة. هذه ضرورية لتشغيل مجموعات عمل Spark في مساحة الاسم المخصصة ، ويتم استخدام دور IAM المرتبط بحساب الخدمة للوصول إلى حاوية S3 لقراءة البيانات وكتابتها.

الأهم من ذلك ، لاحظ image مع صورة Docker المحسّنة لوقت تشغيل EMR ، والتي تم تعيينها حاليًا على emr-6.10.0. يمكنك تغيير هذا إلى إصدار أحدث عندما يتم إصداره بواسطة فريق Amazon EMR. أيضًا ، عند تكوين وظائفك ، تأكد من تضمين ملف sparkConf و hadoopConf الإعدادات على النحو المحدد في البيان التالي. تتيح لك هذه التكوينات الاستفادة من أداء وقت تشغيل EMR ، غراء AWS تكامل كتالوج البيانات وموصل EMRFS المحسن.

  1. قم بإنشاء الملف (emr-spark-operator-example.yaml) محليًا وتحديث موقع حاوية S3 بحيث يمكنك إرسال الوظيفة كجزء من الخطوة التالية:
    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. قم بتشغيل الأمر التالي لإرسال المهمة إلى مجموعة EKS:
    kubectl apply -f emr-spark-operator-example.yaml

    قد يستغرق إكمال المهمة من 4 إلى 5 دقائق ، ويمكنك التحقق من الرسالة الناجحة في سجلات جراب برنامج التشغيل.

  3. تحقق من الوظيفة عن طريق تشغيل الأمر التالي:
kubectl get pods -n data-team-a

تمكين الوصول إلى Spark UI

تعد Spark UI أداة مهمة لمهندسي البيانات لأنها تتيح لك تتبع تقدم المهام ، وعرض معلومات مفصلة عن الوظيفة والمرحلة ، وتحليل استخدام الموارد لتحديد الاختناقات وتحسين التعليمات البرمجية الخاصة بك. بالنسبة إلى وظائف Spark التي تعمل على Kubernetes ، يتم استضافة Spark UI على جراب برنامج التشغيل ويقتصر وصولها على الشبكة الداخلية لـ Kubernetes. للوصول إليه ، نحتاج إلى إعادة توجيه حركة المرور إلى الحجرة باستخدام kubectl. تنقلك الخطوات التالية إلى كيفية إعداده.

قم بتشغيل الأمر التالي لإعادة توجيه حركة المرور إلى جراب السائق:

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

يجب أن ترى نصًا مشابهًا لما يلي:

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

إذا لم تحدد اسم جراب برنامج التشغيل عند تقديم ملف SparkApplication، يمكنك الحصول عليه بالأمر التالي:

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

افتح المتصفح وادخل http://localhost:4040 في شريط العنوان. يجب أن تكون قادرًا على الاتصال بواجهة Spark UI.

شرارة واجهة المستخدم لقطة شاشة

خادم سبارك هيست

إذا كنت ترغب في استكشاف وظيفتك بعد تشغيلها ، فيمكنك عرضها من خلال خادم Spark History. السابقة SparkApplication يحتوي التعريف على سجل الأحداث ممكّنًا ويخزن الأحداث في حاوية S3 بالمسار التالي: s3://YOUR-S3-BUCKET/. للحصول على إرشادات حول إعداد خادم Spark History واستكشاف السجلات ، ارجع إلى بدء تشغيل خادم Spark history وعرض Spark UI باستخدام Docker.

شرارة تقديم

شرارة تقديم هي واجهة سطر أوامر لتشغيل تطبيقات Apache Spark على مجموعة أو محليًا. يسمح لك بتقديم الطلبات إلى مجموعات Spark. تتيح الأداة تكوينًا بسيطًا لخصائص التطبيق ، وتخصيص الموارد ، والمكتبات المخصصة ، وتسهيل نشر وإدارة وظائف Spark.

بدءًا من Amazon EMR 6.10 ، spark-submit يتم دعمه كطريقة لتقديم الوظيفة. تدعم هذه الطريقة حاليًا فقط وضع المجموعة كآلية التقديم. لتقديم الوظائف باستخدام spark-submit الطريقة ، فإننا نعيد استخدام دور IAM لحساب الخدمة الذي أنشأناه مسبقًا. نستخدم أيضًا دلو S3 المستخدم في طريقة Spark Operator. تنقلك الخطوات الواردة في هذا القسم إلى كيفية تكوين وإرسال الوظائف باستخدام spark-submit والاستفادة من تحسينات وقت تشغيل EMR.

  1. لتقديم وظيفة ، تحتاج إلى استخدام إصدار Spark الذي يتطابق مع الإصدار المتاح في Amazon EMR. بالنسبة إلى Amazon EMR 6.10 ، فأنت بحاجة إلى قم بتنزيل إصدار Spark 3.3.
  2. أنت أيضا بحاجة للتأكد من أن لديك جافا مثبتة في بيئتك.
  3. قم بفك ضغط الملف وانتقل إلى جذر دليل Spark.
  4. في الكود التالي ، استبدل ملف نقطة نهاية EKS فضلا عن دلو S3 ثم قم بتشغيل البرنامج النصي:
./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

تستغرق المهمة حوالي 7 دقائق لإكمالها مع اثنين من منفذي نواة واحدة و 1 جيجا بايت من الذاكرة.

استخدام برامج جدولة kubernetes المخصصة

قد يواجه العملاء الذين يشغلون عددًا كبيرًا من الوظائف بشكل متزامن تحديات تتعلق بتوفير وصول عادل إلى سعة الحوسبة التي لا يمكنهم حلها من خلال الجدولة القياسية وإدارة استخدام الموارد التي تقدمها Kubernetes. بالإضافة إلى ذلك ، لن يتمكن العملاء الذين يرحلون من Amazon EMR على Amazon Elastic Compute Cloud (Amazon EC2) والذين يديرون جدولهم باستخدام قوائم انتظار YARN من نقلهم إلى إمكانات جدولة Kubernetes.

للتغلب على هذه المشكلة ، يمكنك استخدام برامج الجدولة المخصصة مثل اباتشي يونيكورن or بركانيدعم Spark Operator أصلاً هذه المجدولين ، ويمكنك معهم جدولة تطبيقات Spark استنادًا إلى عوامل مثل الأولوية ومتطلبات الموارد وسياسات الإنصاف ، بينما يبسط Spark Operator عملية نشر التطبيقات وإدارتها. لإعداد Yunikorn مع جدولة العصابات واستخدامها في تطبيقات Spark المقدمة من خلال Spark Operator ، راجع عامل شرارة مع YuniKorn.

تنظيف

لتجنب الرسوم غير المرغوب فيها على حساب AWS الخاص بك ، احذف جميع موارد AWS التي تم إنشاؤها أثناء هذا النشر:

eksctl delete cluster -f eks-cluster.yaml

وفي الختام

في هذا المنشور ، قدمنا ​​ميزة وقت تشغيل EMR لمشغل Spark و spark-submit، واستكشف مزايا استخدام هذه الميزة على مجموعة EKS. مع وقت تشغيل EMR المحسّن ، يمكنك تحسين أداء تطبيقات Spark بشكل كبير مع تحسين التكاليف. أظهرنا نشر الكتلة باستخدام eksctl أداة ، يمكنك أيضًا استخدام ملف بيانات عن مخططات EKS لنشر EKS الجاهزة للإنتاج والتي يمكنك استخدامها لـ EMR على EKS والاستفادة من طرق النشر الجديدة هذه بالإضافة إلى EMR على طريقة تقديم مهمة EKS API. من خلال تشغيل تطبيقاتك في وقت تشغيل EMR المحسّن ، يمكنك زيادة تحسين سير عمل تطبيق Spark ودفع الابتكار في خطوط أنابيب معالجة البيانات الخاصة بك.


حول المؤلف

لطفي مهيب هو مهندس حلول أقدم يعمل مع فريق القطاع العام مع Amazon Web Services. يساعد عملاء القطاع العام في منطقة أوروبا والشرق الأوسط وإفريقيا على إدراك أفكارهم وبناء خدمات جديدة والابتكار للمواطنين. في أوقات فراغه ، يستمتع لطفي بركوب الدراجات والجري.

فارا بونثو هو متخصص تقني متخصص وقائد تقني عالمي للبيانات على EKS ، متخصص في مساعدة عملاء AWS بدءًا من الحسابات الإستراتيجية إلى المؤسسات المتنوعة. إنه متحمس لتقنيات المصادر المفتوحة وتحليلات البيانات و AI / ML و Kubernetes ، ويفتخر بخلفية واسعة في التطوير و DevOps والهندسة المعمارية. ينصب تركيز Vara الأساسي على بناء بيانات قابلة للتطوير بدرجة كبيرة وحلول AI / ML على منصات Kubernetes ، مما يساعد العملاء على تسخير الإمكانات الكاملة للتكنولوجيا المتطورة في مساعيهم القائمة على البيانات.

بقعة_صورة

أحدث المعلومات الاستخباراتية

بقعة_صورة