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

Nov 01 2020

EKS에서 Jupyterhub를 실행 중이며 EKS IRSA 기능을 활용하여 K8에서 Spark 워크로드를 실행하려고합니다. Kube2IAM을 사용한 경험이 있었지만 이제 IRSA로 이동할 계획입니다.

이 오류는 IRSA 때문이 아닙니다. 서비스 계정이 Driver 및 Executor 포드에 완벽하게 연결되고 CLI 및 SDK를 통해 S3에 액세스 할 수 있기 때문입니다. 이 문제는 Spark 3.0 / Hadoop 3.2에서 Spark를 사용하여 S3에 액세스하는 것과 관련이 있습니다.

Py4JJavaError : None.org.apache.spark.api.java.JavaSparkContext를 호출하는 동안 오류가 발생했습니다. : java.lang.NoClassDefFoundError : com / amazonaws / services / s3 / model / MultiObjectDeleteException

다음 버전을 사용하고 있습니다.

  • APACHE_SPARK_VERSION = 3.0.1
  • HADOOP_VERSION = 3.2
  • aws-java-sdk-1.11.890
  • hadoop-aws-3.2.0
  • 파이썬 3.7.3

나는 다른 버전으로도 테스트했습니다.

  • aws-java-sdk-1.11.563.jar

누군가이 문제를 접한 경우 해결책을 제공하도록 도와주세요.

추신 : IAM 정책이 완벽하기 때문에 이것은 IAM 정책 오류도 아닙니다.

답변

2 PrateekDubey Nov 01 2020 at 01:55

마지막으로 모든 문제는 아래 항아리로 해결됩니다.

  • 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)

IRSA를 사용하여 EKS에서 Spark를 실행하려는 모든 사람이 올바른 Spark 구성입니다.

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

이 블로그 (https://medium.com/swlh/how-to-perform-a-spark-submit-to-amazon-eks-cluster-with-irsa-50af9b26cae) 함께 :

  • 스파크 2.4.4
  • 하둡 2.7.3
  • AWS SDK 1.11.834

스파크 제출의 예는 다음과 같습니다.

/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