Pyspark S3 त्रुटि: java.lang.NoClassDefFoundError: com / amazonaws / सेवाएं / s3 / मॉडल / MultiObjectDeleteException
एक स्पार्क क्लस्टर स्थापित करने में असफल रहा जो AWS s3 फ़ाइलों को पढ़ सकता है। मेरे द्वारा उपयोग किया जाने वाला सॉफ्टवेयर इस प्रकार है:
- Hadoop-एडब्ल्यूएस-3.2.0.jar
- एडब्ल्यूएस-जावा-sdk-1.11.887.jar
- चिंगारी 3.0.1-बिन-hadoop3.2.tgz
अजगर संस्करण का उपयोग करना: पायथन 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))
जब यह स्पार्क.ड्रेड.फॉर्मेट निष्पादित करना शुरू करता है तो कोड विफल हो जाता है। ऐसा प्रतीत होता है कि यह कक्षा को नहीं ढूंढ सकता है। 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)
मैं उपरोक्त जार और अजगर के लिए सही संयोजन खोजने की कोशिश कर रहा हूं, लेकिन मुझे सही मिश्रण नहीं मिला। मुझे NoClassDefFoundError के सभी प्रकार मिल रहे हैं, इसलिए मैंने ऊपर सूचीबद्ध सभी जारों और अजगर के नवीनतम संस्करणों का उपयोग करने का निर्णय लिया, लेकिन अभी भी असफल।
मैं यह जानना चाहूंगा कि जार और पाइथन के कौन से संस्करण हैं, जिनका उपयोग आपने सफलतापूर्वक एक क्लस्टर स्थापित करने के लिए किया है जो s3a को pyspark के माध्यम से उपयोग करने में सक्षम है? प्रतिक्रिया / सहायता के लिए अग्रिम धन्यवाद।
जवाब
Hadoop 3.2 को 1.11.563 के खिलाफ बनाया गया था; उस विशिष्ट संस्करण के पूर्ण छायांकित एसडीके को अपने क्लासपाथ "एवस-जावा-एसडीके-बंडल" में चिपका दें और सभी को अच्छी तरह से होना चाहिए।
SDK अतीत में "उधम मचाता" रहा है ... और अपग्रेड करने से आश्चर्यजनक रूप से आश्चर्य होता है। जिज्ञासु योग्यता के लिए एक एडब्ल्यूएस एसडीके अपडेट । यह शायद समय के बारे में है कि कोई इसे फिर से करे।
मैं स्पार्क 3.0 / Hadoop 3.2 पर इस मुद्दे को हल करने में सक्षम था। मैंने यहाँ भी अपना जवाब दिया - AWS EKS Spark 3.0, Hadoop 3.2 Error - NoClassDefFoundError: com / amazonaws / Services / s3 / model / MultiObjectDeleteException
AWS जावा SDK बंडल का उपयोग करें और यह समस्या हल हो जाएगी -
aws-java-sdk-bundle-1.11.874.jar (https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-bundle/1.11.874)
इसलिए मैंने सबकुछ साफ किया और जार के निम्नलिखित संस्करणों को फिर से स्थापित किया और यह काम किया: हडूप-एव्स-2.7.4.jar, aws-java-sdk-1.7.4.2.jar। स्पार्क इंस्टॉल संस्करण: स्पार्क-2.4.7-बिन-हडूप 2.7। पायथन संस्करण: पायथन 3.6।