AWS EKS Spark 3.0 ข้อผิดพลาด Hadoop 3.2 - NoClassDefFoundError: com / amazonaws / services / s3 / model / MultiObjectDeleteException
ฉันใช้งาน Jupyterhub บน EKS และต้องการใช้ประโยชน์จากฟังก์ชัน EKS IRSA เพื่อเรียกใช้ปริมาณงาน Spark บน K8 ฉันมีประสบการณ์ในการใช้ Kube2IAM มาก่อน แต่ตอนนี้ฉันกำลังวางแผนที่จะย้ายไปที่ IRSA
ข้อผิดพลาดนี้ไม่ได้เกิดจาก IRSA เนื่องจากบัญชีบริการได้รับการเชื่อมต่ออย่างสมบูรณ์แบบกับพ็อดไดรเวอร์และผู้ดำเนินการและฉันสามารถเข้าถึง S3 ผ่าน CLI และ SDK จากทั้งสองได้ ปัญหานี้เกี่ยวข้องกับการเข้าถึง S3 โดยใช้ Spark บน Spark 3.0 / Hadoop 3.2
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
โปรดช่วยให้วิธีแก้ปัญหาหากมีใครพบปัญหานี้
ปล: นี่ไม่ใช่ข้อผิดพลาดของนโยบาย IAM เช่นกันเนื่องจากนโยบาย IAM นั้นใช้ได้ดี
คำตอบ
ในที่สุดปัญหาทั้งหมดจะได้รับการแก้ไขด้วยขวดด้านล่าง -
- 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 บน EKS โดยใช้ IRSA นี่คือการกำหนดค่า 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()
สามารถตรวจสอบบล็อกนี้ (https://medium.com/swlh/how-to-perform-a-spark-submit-to-amazon-eks-cluster-with-irsa-50af9b26cae) กับ:
- จุดประกาย 2.4.4
- Hadoop 2.7.3
- AWS SDK 1.11.834
ตัวอย่าง 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