在EMR上使用带有apachespark的postgresqljdbc源代码

在EMR上使用带有apachespark的postgresqljdbc源代码,postgresql,amazon-web-services,apache-spark,jdbc,pyspark,Postgresql,Amazon Web Services,Apache Spark,Jdbc,Pyspark,我已经运行了现有的EMR集群,希望从Postgresql DB源创建DF 为此,您似乎需要使用更新的spark.driver.extraClassPath修改spark-defaults.conf,并指向已在主节点和从节点上下载的相关PostgreSQL JAR,或您可以将这些作为参数添加到spark提交作业中 既然我想使用现有的Jupyter笔记本来处理数据,而不是真正地重新启动集群,那么解决这个问题最有效的方法是什么 我尝试了以下方法: 在主目录和从目录上创建新目录(/usr/lib/pos

我已经运行了现有的EMR集群,希望从Postgresql DB源创建DF

为此,您似乎需要使用更新的
spark.driver.extraClassPath
修改spark-defaults.conf,并指向已在主节点和从节点上下载的相关PostgreSQL JAR,您可以将这些作为参数添加到spark提交作业中

既然我想使用现有的Jupyter笔记本来处理数据,而不是真正地重新启动集群,那么解决这个问题最有效的方法是什么

我尝试了以下方法:

  • 在主目录和从目录上创建新目录(/usr/lib/postgresql/),并将postgresqljar复制到其中。(postgresql-9.41207.jre6.jar)

  • 编辑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:/$
    
  • 尝试使用以下代码在Jupyter单元中创建数据帧:

    SQL\u CONN=“jdbc:postgresql://some_postgresql_db:5432/dbname?user=user&password=password"
    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 repo。类路径似乎是这样的
    org.postgresql.Driver
    。尝试使用相同的方法。

    我认为您不需要在从站中复制postgres jar,因为驱动程序和集群管理器会处理所有事情。我已经通过fo从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()
    
    创建数据帧

    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.executor.extraClassPath
    )。此外,驱动程序的版本看起来很时髦-您不太可能使用JRE 6。.是否需要重新启动主/群集以“读取”spark-defaults.conf文件?或者在进行JDBC调用时是否会动态检查此文件?应用程序必须是,群集号。也不是由。最好链接到文档:谢谢-这是下一步是尝试使用环境变量隐藏JDBC访问凭据。但似乎很难找到此文档。