AWS EKS Spark 3.0、Hadoop 3.2 错误 - NoClassDefFoundError:com/amazonaws/services/s3/model/MultiObjectDeleteException

Pra*_*bey 3 hadoop amazon-s3 apache-spark amazon-eks

我在 EKS 上运行 Jupyterhub,并希望利用 EKS IRSA 功能在 K8s 上运行 Spark 工作负载。我之前有使用 Kube2IAM 的经验,但现在我计划转向 IRSA。

此错误不是由于 IRSA 造成的,因为服务帐户已完美附加到 Driver 和 Executor Pod,并且我可以通过 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
  • Python 3.7.3

我也用不同的版本进行了测试。

  • aws-java-sdk-1.11.563.jar

如果有人遇到过这个问题,请帮忙提供解决方案。

PS:这也不是 IAM 策略错误,因为 IAM 策略完全没问题。

Pra*_*bey 8

最后所有问题都通过下面的罐子解决了 -

任何尝试使用 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()
Run Code Online (Sandbox Code Playgroud)