Pyspark S3 hatası: java.lang.NoClassDefFoundError: com / amazonaws / services / s3 / model / MultiObjectDeleteException
AWS s3 dosyalarını okuyabilen bir kıvılcım kümesi ayarlama başarısız oldu. Kullandığım yazılımlar aşağıdaki gibidir:
- hadoop-aws-3.2.0.jar
- aws-java-sdk-1.11.887.jar
- spark-3.0.1-bin-hadoop3.2.tgz
Python sürümünü kullanma: Python 3.8.6
from pyspark.sql import SparkSession, SQLContext
from pyspark.sql.types import *
from pyspark.sql.functions import *
import sys
spark = (SparkSession.builder
.appName("AuthorsAges")
.appName('SparkCassandraApp')
.getOrCreate())
spark._jsc.hadoopConfiguration().set("fs.s3a.access.key", "access-key")
spark._jsc.hadoopConfiguration().set("fs.s3a.secret.key", "secret-key")
spark._jsc.hadoopConfiguration().set("fs.s3a.impl","org.apache.hadoop.fs.s3a.S3AFileSystem")
spark._jsc.hadoopConfiguration().set("com.amazonaws.services.s3.enableV4", "true")
spark._jsc.hadoopConfiguration().set("fs.s3a.aws.credentials.provider","org.apache.hadoop.fs.s3a.BasicAWSCredentialsProvider")
spark._jsc.hadoopConfiguration().set("fs.s3a.endpoint", "")
input_file='s3a://spark-test-data/Fire_Department_Calls_for_Service.csv'
file_schema = StructType([StructField("Call_Number",StringType(),True),
StructField("Unit_ID",StringType(),True),
StructField("Incident_Number",StringType(),True),
...
...
# Read file into a Spark DataFrame
input_df = (spark.read.format("csv") \
.option("header", "true") \
.schema(file_schema) \
.load(input_file))
Spark.read.format dosyasını çalıştırmaya başladığında kod başarısız olur. Görünüşe göre sınıfı bulamıyor. java.lang.NoClassDefFoundError: com.amazonaws.services.s3.model.MultiObjectDeleteException
File "<stdin>", line 1, in <module>
File "/usr/local/spark/spark-3.0.1-bin-hadoop3.2/python/pyspark/sql/readwriter.py", line 178, in load
return self._df(self._jreader.load(path))
File "/usr/local/spark/spark-3.0.1-bin-hadoop3.2/python/lib/py4j-0.10.9-src.zip/py4j/java_gateway.py", line 1304, in __call__
File "/usr/local/spark/spark-3.0.1-bin-hadoop3.2/python/pyspark/sql/utils.py", line 128, in deco
return f(*a, **kw)
File "/usr/local/spark/spark-3.0.1-bin-hadoop3.2/python/lib/py4j-0.10.9-src.zip/py4j/protocol.py", line 326, in get_return_value
py4j.protocol.Py4JJavaError: An error occurred while calling o51.load.
: java.lang.NoClassDefFoundError: com/amazonaws/services/s3/model/MultiObjectDeleteException
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at org.apache.hadoop.conf.Configuration.getClassByNameOrNull(Configuration.java:2532)
at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:2497)
at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2593)
at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:3269)
at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:3301)
at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:124) at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:3352)
at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:3320) at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:479) at org.apache.hadoop.fs.Path.getFileSystem(Path.java:361) at org.apache.spark.sql.execution.streaming.FileStreamSink$.hasMetadata(FileStreamSink.scala:46)
at org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:366)
at org.apache.spark.sql.DataFrameReader.loadV1Source(DataFrameReader.scala:297)
at org.apache.spark.sql.DataFrameReader.$anonfun$load$2(DataFrameReader.scala:286) at scala.Option.getOrElse(Option.scala:189) at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:286) at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:232) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244) at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357) at py4j.Gateway.invoke(Gateway.java:282) at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132) at py4j.commands.CallCommand.execute(CallCommand.java:79) at py4j.GatewayConnection.run(GatewayConnection.java:238) at java.lang.Thread.run(Thread.java:748) Caused by: java.lang.ClassNotFoundException: com.amazonaws.services.s3.model.MultiObjectDeleteException at java.net.URLClassLoader.findClass(URLClassLoader.java:382) at java.lang.ClassLoader.loadClass(ClassLoader.java:418) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
Yukarıdaki kavanozlar ve piton için doğru kombinasyonu bulmaya çalışıyordum ama doğru karışımı bulamadım. Her tür NoClassDefFoundError alıyorum, bu yüzden yukarıda listelediğim tüm kavanozların ve python'un en son sürümlerini kullanmaya karar verdim ancak yine de başarısız oldum.
Pyspark aracılığıyla s3a kullanarak s3'e erişebilen bir kümeyi başarıyla kurmak için hangi jars ve python sürümlerini kullandınız? Yanıt / yardım için şimdiden teşekkür ederim.
Yanıtlar
Hadoop 3.2, 1.11.563'e karşı inşa edilmiştir; o belirli sürümün tam gölgeli sdk'sini sınıf yolunuzdaki "aws-java-sdk-bundle" içine yapıştırın ve her şey yolunda olmalıdır.
SDK geçmişte "telaşlı" idi ... ve yükseltme her zaman sürprizlere neden olur. Meraklı bir AWS SDK güncellemesine hak kazanmak için . Muhtemelen birinin bunu tekrar yapmasının zamanı gelmiştir.
Bu sorunu Spark 3.0 / Hadoop 3.2'de çözebildim. Cevabımı burada da belgeledim - AWS EKS Spark 3.0, Hadoop 3.2 Hatası - NoClassDefFoundError: com / amazonaws / services / s3 / model / MultiObjectDeleteException
Aşağıdaki AWS Java SDK paketini kullanın ve bu sorun çözülecektir -
aws-java-sdk-bundle-1.11.874.jar (https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-bundle/1.11.874)
Bu yüzden her şeyi temizledim ve aşağıdaki kavanoz sürümlerini yeniden yükledim ve işe yaradı: hadoop-aws-2.7.4.jar, aws-java-sdk-1.7.4.2.jar. Spark yükleme sürümü: spark-2.4.7-bin-hadoop2.7. Python sürümü: Python 3.6.