AWS EKS Spark 3.0, Hadoop 3.2 Hatası - NoClassDefFoundError: com / amazonaws / services / s3 / model / MultiObjectDeleteException

Nov 01 2020

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

2 PrateekDubey Nov 01 2020 at 01:55

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()
1 VitaminGauGau Nov 02 2020 at 00:49

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