AWS EKS Spark 3.0, Lỗi Hadoop 3.2 - NoClassDefFoundError: com / amazonaws / services / s3 / model / MultiObjectDeleteException

Nov 01 2020

Tôi đang chạy Jupyterhub trên EKS và muốn tận dụng các chức năng của EKS IRSA để chạy khối lượng công việc Spark trên K8s. Tôi đã có kinh nghiệm sử dụng Kube2IAM trước đây, tuy nhiên bây giờ tôi đang có ý định chuyển sang IRSA.

Lỗi này không phải do IRSA, vì các tài khoản dịch vụ đang được gắn hoàn toàn tốt với nhóm Trình điều khiển và Người thực thi và tôi có thể truy cập S3 qua CLI và SDK từ cả hai. Sự cố này liên quan đến việc truy cập S3 bằng Spark trên Spark 3.0 / Hadoop 3.2

Py4JJavaError: Đã xảy ra lỗi khi gọi None.org.apache.spark.api.java.JavaSparkContext. : java.lang.NoClassDefFoundError: com / amazonaws / services / s3 / model / MultiObjectDeleteException

Tôi đang sử dụng các phiên bản sau -

  • 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

Tôi cũng đã thử nghiệm với các phiên bản khác nhau.

  • aws-java-sdk-1.11.563.jar

Vui lòng giúp đưa ra giải pháp nếu ai đó gặp phải vấn đề này.

Tái bút: Đây không phải là lỗi Chính sách IAM, vì các chính sách IAM hoàn toàn ổn.

Trả lời

2 PrateekDubey Nov 01 2020 at 01:55

Cuối cùng, tất cả các vấn đề đã được giải quyết với các lọ bên dưới -

  • hadoop-aws-3.2.0.jar
  • aws-java-sdk-pack-1.11.874.jar (https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-bundle/1.11.874)

Bất kỳ ai đang cố gắng chạy Spark trên EKS bằng IRSA thì đây là cấu hình spark chính xác -

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

Có thể kiểm tra blog này (https://medium.com/swlh/how-to-perform-a-spark-submit-to-amazon-eks-cluster-with-irsa-50af9b26cae) với:

  • Tia lửa 2.4.4
  • Hadoop 2.7.3
  • AWS SDK 1.11.834

Ví dụ về spark-submit là

/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