Pyspark S3 त्रुटि: java.lang.NoClassDefFoundError: com / amazonaws / सेवाएं / s3 / मॉडल / MultiObjectDeleteException

Oct 27 2020

एक स्पार्क क्लस्टर स्थापित करने में असफल रहा जो AWS s3 फ़ाइलों को पढ़ सकता है। मेरे द्वारा उपयोग किया जाने वाला सॉफ्टवेयर इस प्रकार है:

  1. Hadoop-एडब्ल्यूएस-3.2.0.jar
  2. एडब्ल्यूएस-जावा-sdk-1.11.887.jar
  3. चिंगारी 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 के माध्यम से उपयोग करने में सक्षम है? प्रतिक्रिया / सहायता के लिए अग्रिम धन्यवाद।

जवाब

1 stevel Oct 30 2020 at 15:02

Hadoop 3.2 को 1.11.563 के खिलाफ बनाया गया था; उस विशिष्ट संस्करण के पूर्ण छायांकित एसडीके को अपने क्लासपाथ "एवस-जावा-एसडीके-बंडल" में चिपका दें और सभी को अच्छी तरह से होना चाहिए।

SDK अतीत में "उधम मचाता" रहा है ... और अपग्रेड करने से आश्चर्यजनक रूप से आश्चर्य होता है। जिज्ञासु योग्यता के लिए एक एडब्ल्यूएस एसडीके अपडेट । यह शायद समय के बारे में है कि कोई इसे फिर से करे।

1 PrateekDubey Oct 31 2020 at 19:02

मैं स्पार्क 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)

banjoman Oct 27 2020 at 23:04

इसलिए मैंने सबकुछ साफ किया और जार के निम्नलिखित संस्करणों को फिर से स्थापित किया और यह काम किया: हडूप-एव्स-2.7.4.jar, aws-java-sdk-1.7.4.2.jar। स्पार्क इंस्टॉल संस्करण: स्पार्क-2.4.7-बिन-हडूप 2.7। पायथन संस्करण: पायथन 3.6।