AWS EKS Spark 3.0, Hadoop 3.2 Hatası - NoClassDefFoundError: com / amazonaws / services / s3 / model / MultiObjectDeleteException
Jupyterhub'ı EKS üzerinde çalıştırıyorum ve K8'lerde Spark iş yüklerini çalıştırmak için EKS IRSA işlevlerinden yararlanmak istiyorum. Daha önce Kube2IAM kullanma deneyimim vardı, ancak şimdi IRSA'ya geçmeyi planlıyorum.
Bu hata IRSA'dan kaynaklanmıyor, çünkü hizmet hesapları Driver ve Executor bölmelerine mükemmel bir şekilde ekleniyor ve S3'e her ikisinden de CLI ve SDK aracılığıyla erişebiliyorum. Bu sorun, Spark 3.0 / Hadoop 3.2'de Spark kullanarak S3'e erişimle ilgilidir
Py4JJavaError: None.org.apache.spark.api.java.JavaSparkContext çağrılırken bir hata oluştu. : java.lang.NoClassDefFoundError: com / amazonaws / services / s3 / model / MultiObjectDeleteException
Aşağıdaki sürümleri kullanıyorum -
- APACHE_SPARK_VERSION = 3.0.1
- HADOOP_VERSION = 3.2
- aws-java-sdk-1.11.890
- hadoop-aws-3.2.0
- Python 3.7.3
Farklı sürümle de test ettim.
- aws-java-sdk-1.11.563.jar
Lütfen birisi bu sorunla karşılaştıysa bir çözüm bulunmasına yardımcı olun.
Not: Bu da bir IAM Politikası hatası değildir, çünkü IAM politikaları tamamen iyidir.
Yanıtlar
Sonunda tüm sorunlar aşağıdaki kavanozlarla çözüldü -
- hadoop-aws-3.2.0.jar
- aws-java-sdk-bundle-1.11.874.jar (https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-bundle/1.11.874)
Spark'ı IRSA kullanarak EKS üzerinde çalıştırmaya çalışan herkes bu doğru kıvılcım yapılandırmasıdır -
from pyspark.sql import SparkSession
spark = SparkSession.builder \
.appName("pyspark-data-analysis-1") \
.config("spark.kubernetes.driver.master","k8s://https://xxxxxx.gr7.ap-southeast-1.eks.amazonaws.com:443") \
.config("spark.kubernetes.namespace", "jupyter") \
.config("spark.kubernetes.container.image", "xxxxxx.dkr.ecr.ap-southeast-1.amazonaws.com/spark-ubuntu-3.0.1") \
.config("spark.kubernetes.container.image.pullPolicy" ,"Always") \
.config("spark.kubernetes.authenticate.driver.serviceAccountName", "spark") \
.config("spark.kubernetes.authenticate.executor.serviceAccountName", "spark") \
.config("spark.kubernetes.executor.annotation.eks.amazonaws.com/role-arn","arn:aws:iam::xxxxxx:role/spark-irsa") \
.config("spark.hadoop.fs.s3a.aws.credentials.provider", "com.amazonaws.auth.WebIdentityTokenCredentialsProvider") \
.config("spark.kubernetes.authenticate.submission.caCertFile", "/var/run/secrets/kubernetes.io/serviceaccount/ca.crt") \
.config("spark.kubernetes.authenticate.submission.oauthTokenFile", "/var/run/secrets/kubernetes.io/serviceaccount/token") \
.config("spark.hadoop.fs.s3a.multiobjectdelete.enable", "false") \
.config("spark.hadoop.fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem") \
.config("spark.hadoop.fs.s3a.fast.upload","true") \
.config("spark.executor.instances", "1") \
.config("spark.executor.cores", "3") \
.config("spark.executor.memory", "10g") \
.getOrCreate()
Bu bloga (https://medium.com/swlh/how-to-perform-a-spark-submit-to-amazon-eks-cluster-with-irsa-50af9b26cae) ile:
- Spark 2.4.4
- Hadoop 2.7.3
- AWS SDK 1.11.834
Örnek spark-submit
/opt/spark/bin/spark-submit \
--master=k8s://https://4A5<i_am_tu>545E6.sk1.ap-southeast-1.eks.amazonaws.com \
--deploy-mode cluster \
--name spark-pi \
--class org.apache.spark.examples.SparkPi \
--conf spark.kubernetes.driver.pod.name=spark-pi-driver \
--conf spark.kubernetes.container.image=vitamingaugau/spark:spark-2.4.4-irsa \
--conf spark.kubernetes.namespace=spark-pi \
--conf spark.kubernetes.authenticate.driver.serviceAccountName=spark-pi \
--conf spark.kubernetes.authenticate.executor.serviceAccountName=spark-pi \
--conf spark.hadoop.fs.s3a.aws.credentials.provider=com.amazonaws.auth.WebIdentityTokenCredentialsProvider \
--conf spark.kubernetes.authenticate.submission.caCertFile=/var/run/secrets/kubernetes.io/serviceaccount/ca.crt \
--conf spark.kubernetes.authenticate.submission.oauthTokenFile=/var/run/secrets/kubernetes.io/serviceaccount/token \
local:///opt/spark/examples/target/scala-2.11/jars/spark-examples_2.11-2.4.4.jar 20000