Pyspark S3-Fehler: java.lang.NoClassDefFoundError: com / amazonaws / services / s3 / model / MultiObjectDeleteException
Es ist nicht gelungen, einen Spark-Cluster einzurichten, der AWS s3-Dateien lesen kann. Die Software, die ich verwendet habe, ist wie folgt:
- hadoop-aws-3.2.0.jar
- aws-java-sdk-1.11.887.jar
- spark-3.0.1-bin-hadoop3.2.tgz
Verwenden der Python-Version: 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))
Der Code schlägt fehl, wenn er beginnt, das spark.read.format auszuführen. Es scheint, dass es die Klasse nicht finden kann. 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)
Ich habe versucht, die richtige Kombination für die oben genannten Gläser und Python zu finden, aber ich konnte nicht die richtige Mischung finden. Ich bekomme alle Arten von NoClassDefFoundError, daher habe ich beschlossen, die neuesten Versionen aller oben aufgeführten Jars und Pythons zu verwenden, aber immer noch nicht erfolgreich.
Ich würde gerne wissen, mit welchen Versionen von Jars und Python Sie erfolgreich einen Cluster eingerichtet haben, der über sysa über pyspark auf s3 zugreifen kann. Vielen Dank im Voraus für die Antwort / Hilfe.
Antworten
Hadoop 3.2 wurde gegen 1.11.563 gebaut; Stecke das voll schattierte SDK dieser spezifischen Version in deinen Klassenpfad "aws-java-sdk-bundle" und alles sollte in Ordnung sein.
Das SDK war in der Vergangenheit "pingelig" ... und ein Upgrade sorgt immer für Überraschungen. Für das neugierige Qualifizieren eines AWS SDK-Updates . Es ist wahrscheinlich an der Zeit, dass jemand es wieder tut.
Ich konnte dieses Problem unter Spark 3.0 / Hadoop 3.2 lösen. Ich habe meine Antwort auch hier dokumentiert - AWS EKS Spark 3.0, Hadoop 3.2-Fehler - NoClassDefFoundError: com / amazonaws / services / s3 / model / MultiObjectDeleteException
Verwenden Sie das folgende AWS Java SDK-Bundle, und dieses Problem wird behoben.
aws-java-sdk-bundle-1.11.874.jar (https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-bundle/1.11.874)
Also habe ich alles aufgeräumt und die folgenden Versionen von Gläsern neu installiert und es hat funktioniert: hadoop-aws-2.7.4.jar, aws-java-sdk-1.7.4.2.jar. Spark-Installationsversion: spark-2.4.7-bin-hadoop2.7. Python-Version: Python 3.6.