AWS EKS Spark 3.0, Lỗi Hadoop 3.2 - NoClassDefFoundError: com / amazonaws / services / s3 / model / MultiObjectDeleteException
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
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()
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