df.show रिटर्निंग java.lang.ClassNotFoundException: org.postgresql.Dadver
कृपया carrefully पढ़ इस के दोहराव नहीं है यह ।
मैं AWS पर EMR के माध्यम से एक RDS डेटाबेस तक पहुँचने का प्रयास कर रहा हूँ। मैंने ज़ेपेलिन पर ऐसा किया:
from pyspark.sql import SparkSession
spark = SparkSession \
.builder \
.appName("Python Spark SQL basic example") \
.config("spark.jars", "/home/hadoop/postgresql-42.2.18.jar") \
.getOrCreate()
df = spark.read \
.format("jdbc") \
.option("url", "jdbc:postgresql://host:5432/base") \
.option("dbtable", "tab") \
.option("user", "xx") \
.option("password", "xx") \
.option("driver", "org.postgresql.Driver") \
.load()
df.printSchema()
जब मैंने निष्पादित किया तो मुझे यह त्रुटि मिली:
java.lang.ClassNotFoundException: org.postgresql.Driver
तो मैंने पाया यह और यह ठीक काम किया के रूप में मैं अपने तालिका स्कीमा देख सकते हैं (मैं अपने दुभाषिया विन्यास में spark.driver.extraClassPath चर जोड़े):
root
|-- domaine: string (nullable = true)
|-- traitement: string (nullable = true)
|-- parquet: string (nullable = true)
|-- status: string (nullable = true)
|-- date: date (nullable = true)
लेकिन, जब मैं df.show()तालिका की सामग्री को देखने की कोशिश करता हूं, तो वह पहले से वही त्रुटि देता है:
Py4JJavaError: An error occurred while calling o118.showString.
: org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 0.0 failed 4 times, most recent failure: Lost task 0.3 in stage 0.0 (TID 3, host, executor 1): java.lang.ClassNotFoundException: org.postgresql.Driver
at org.apache.spark.repl.ExecutorClassLoader.findClass(ExecutorClassLoader.scala:124)
at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
मुझे समझ में नहीं आता कि मैं स्कीमा क्यों देख पा रहा हूं लेकिन सामग्री नहीं।
कोई मदद? धन्यवाद।
जवाब
जब आप एक हडप नौकरी आवेदन जमा करते हैं, तो मास्टर नोड (आपके कॉन्फ़िगरेशन के आधार पर) सहित आपके किसी भी कार्यकर्ता नोड पर बनाया जा सकता है। यदि आप EMR का उपयोग कर रहे हैं, तो आपका एप्लिकेशन मास्टर डिफ़ॉल्ट रूप से आपके किसी भी कार्यकर्ता नोड (CORE नोड) पर बनता है, लेकिन मास्टर पर नहीं।
आपकी फ़ाइल मौजूद है /home/hadoop/postgresql-42.2.18.jarमैं मान रहा हूँ कि मास्टर नोड पर इसका मतलब है।
आपका प्रोग्राम इस फ़ाइल को उस नोड पर खोजेगा जहाँ एप्लिकेशन मास्टर है और निश्चित रूप से यह आपके मास्टर नोड पर नहीं है क्योंकि इसके लिए आपको कोई त्रुटि नहीं मिलेगी।
इस मुद्दे को हल:
- हर कोर नोड में जार रखो (एक स्केलेबल समाधान नहीं)
- का उपयोग करें
hdfs://। इसे HDFS में रखना ज्यादा बेहतर विकल्प है। यहाँ HDFS को सभी कोर और TASK उदाहरण के साथ साझा किया गया है। - S3 के बजाय HDFS के समान है और EMRFS (
s3://) के माध्यम से प्राप्त करें
पुनश्च: मुझे नहीं पता कि आप स्कीमा को कैसे देख पा रहे हैं spark.driver.extraClassPath
मैंने Zeppelin दुभाषिया मेनू में निम्नलिखित मापदंडों को जोड़कर इस समस्या को हल किया:
spark.driver.extraClassPath=/home/hadoop/postgresql-42.2.18.jar
spark.jars.packages=org.postgresql:postgresql:42.2.18