【发布时间】:2019-01-24 20:30:28
【问题描述】:
目标
我正在尝试从运行在 Yarn 上的 Spark 应用程序写入 Oracle 的 ADWC(基本上是 oracle 数据库)。连接到此数据库的唯一方法是使用 Oracle Wallet 文件,该文件基本上是一个 Java 密钥库。
问题
当 JDBC 驱动程序尝试从 HDFS 读取钱包时,就会出现问题。如果我包含 hdfs:// 前缀,则 JDBC 驱动程序中的解析器会引发错误,如果我不包含,则它无法找到该文件。
以前的尝试
- 包括连接字符串中的目录(前缀和非)
jdbc:oracle:thin:@luigi_low?TNS_ADMIN=/user/spark/wallet_LUIGI - 将目录包含为
spark.driver.extraJavaOptions和-Doracle.net.tns_admin和-Doracle.net.wallet_location
所有代码都在GitHub上,具体的错误信息在这里https://github.com/sblack4/kafka-scala-jdbc/blob/master/ERROR.md
我在这里有一个相同连接的工作示例https://github.com/sblack4/scala-jdbc-adwc
帮助我 StackOverflow。你是我唯一的希望
如果您需要更多说明,请不要犹豫:)
更新(SparkFiles 尝试)
代码位于同一存储库的单独分支上,https://github.com/sblack4/kafka-scala-jdbc/tree/sparkfiles
此错误消息让我感到困惑,因为我的 JDBC 库似乎已停止尝试读取钱包文件。可能和之前的问题无关
Exception in thread "main" java.sql.SQLRecoverableException: IO Error: Invalid connection string format, a valid format is: "host:port:sid"
我已通过 Ambari 从我的类路径中删除了其他 JDBC 库,因为此错误可能与 spark 获取旧版本的 JDBC 库有关
【问题讨论】:
-
简而言之:JDBC驱动程序内部的代码没有HDFS的概念,它需要一个普通本地文件系统中的普通文件(或者可能是
InputStream?)那么,为什么不使用 Spark 将钱包下载到本地(临时)文件(或者在 HDFS 上打开一个流?) 并将其传递给驱动程序?? -
@thatjeffsmith 是的,连接在本地完美运行
-
@SamsonScharfrichter 我会尝试
InputStream的想法,但我不确定如何在本地下载驱动程序。如果我可以在连接字符串中将该驱动程序本地路径传递给 JDBC,这听起来相当简单 -
您是否在 Spark 驱动程序中打开 JDBC 连接 和 执行程序(即并行读取/写入 DataFrame 中的 Oracle 数据)以及多个“独立”会话,或者仅在驱动程序中(使用自定义代码运行 Spark JDBC 接口不支持的命令)?因为您可以告诉驱动程序将文件分发给其执行程序,但是本地路径会不同,JDBC URL 也会不同...
标签: oracle apache-spark hdfs hadoop-yarn ojdbc