【问题标题】:Using Postgresql JDBC source with Apache Spark on EMR在 EMR 上将 Postgresql JDBC 源与 Apache Spark 一起使用
【发布时间】:2019-06-07 05:05:52
【问题描述】:

我正在运行现有的 EMR 集群并希望从 Postgresql 数据库源创建 DF。

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

由于我想使用现有的 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

帮助表示赞赏。

【问题讨论】:

  • 驱动程序应该在驱动程序和executor (spark.executor.extraClassPath) 上。此外,驱动程序的版本看起来很时髦——你不太可能使用 JRE 6..
  • 是否需要重新启动主/集群才能“读入”spark-defaults.conf 文件?还是会在进行 JDBC 调用时动态检查?
  • 应用程序必须是,集群号。也不是由@afaq制作的the point

标签: postgresql amazon-web-services apache-spark jdbc pyspark


【解决方案1】:

我认为您不需要在从属服务器中复制 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 作业时将下载的 jar 添加到驱动程序类路径。

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

【讨论】:

  • 谢谢 - 这对我有用。下一步是尝试使用环境变量隐藏 JDBC 访问凭据。不过似乎很难找到这个文档。
【解决方案2】:

查看Driver 的 github 存储库。类路径似乎是这样的org.postgresql.Driver。尝试使用相同的。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-27
  • 2015-12-21
  • 1970-01-01
  • 1970-01-01
  • 2016-03-22
相关资源
最近更新 更多