簡體   English   中英

在EMR上將Postgresql JDBC源與Apache Spark結合使用

[英]Using Postgresql JDBC source with Apache Spark on EMR

我已經在運行現有的EMR集群,並希望從Postgresql DB源創建DF。

為此,似乎您需要使用更新的spark.driver.extraClassPath修改spark-defaults.conf並指向已經在主節點和從屬節點上下載的相關PostgreSQL JAR, 或者可以將它們作為參數添加到提交火花的工作。

由於我想使用現有的Jupyter筆記本來整理數據,而不是真正希望重新啟動群集,因此解決此問題的最有效方法是什么?

我嘗試了以下方法:

  1. 在主目錄和從目錄上創建新目錄(/ usr / lib / postgresql /,並將PostgreSQL jar復制到該目錄。(postgresql-9.41207.jre6.jar)

  2. 編輯了spark-default.conf以包含通配符位置

     spark.driver.extraClassPath :/usr/lib/postgresql/*:/usr/lib/hadoop/hadoop-aws.jar:/usr/share/aws/aws-java-sdk/*:/usr/share/aws/emr/emrfs/conf:/$ 
  3. 嘗試使用以下代碼在Jupyter單元中創建數據框:

     SQL_CONN = "jdbc:postgresql://some_postgresql_db:5432/dbname?user=user&password=password" spark.read.jdbc(SQL_CONN, table="someTable", properties={"driver":'com.postgresql.jdbc.Driver'}) 

我收到如下的Java錯誤:

Py4JJavaError: An error occurred while calling o396.jdbc.
: java.lang.ClassNotFoundException: com.postgresql.jdbc.Driver

幫助表示贊賞。

檢查驅動程序的github倉庫。 類路徑似乎類似於org.postgresql.Driver 嘗試使用相同的。

我認為您不需要在從屬服務器中復制postgres jar,因為驅動程序和集群管理器會處理所有事情。 我通過以下方式從Postgres外部源創建了數據框:

下載postgres驅動程序jar

cd $HOME && wget https://jdbc.postgresql.org/download/postgresql-42.2.5.jar

創建數據框

atrribute = {'url' : 'jdbc:postgresql://{host}:{port}/{db}?user={user}&password={password}' \
        .format(host=<host>, port=<port>, db=<db>, user=<user>, password=<password>),
                 'database' : <db>,
                 'dbtable' : <select * from table>}
 df=spark.read.format('jdbc').options(**attribute).load()

提交到Spark作業:提交Spark作業時 ,將下載的jar添加到驅動程序類路徑。

--properties spark.driver.extraClassPath=$HOME/postgresql-42.2.5.jar,spark.jars.packages=org.postgresql:postgresql:42.2.5 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM