【问题标题】:Spark Streaming Oracle JDBC sink with wallet带钱包的 Spark Streaming Oracle JDBC 接收器
【发布时间】:2021-03-23 16:49:17
【问题描述】:

我正在开发一个 Spark Streaming 应用程序,它会监听一个文件夹(分区为 yyyyMMdd)并聚合每分钟写入的记录数,然后将结果保存到 Oracle 表中。

我已经开发了一个 JDBCSink (ForeachWriter) 并且在 open 方法中我试图打开一个到 Oracle 的连接,但是在创建 Oracle 连接时我收到了"oracle.net.ns.NetException: could not resolve the connect identifier" 异常。我正在使用 Oracle 钱包 (SSO),我可以通过设置 TNS_ADMIN 环境变量使用此钱包通过 sqlplus 进行连接。

我正在使用 spark-submit --files 选项推送 tnsnames.ora、sqlnet.ora、cwallet.sso 和 ewallet.p12,并且我已验证文件通过 sink 类中的SparkFiles.get 方法推送到执行器。我还使用 spark-submit --jars 选项为 Oracle 钱包添加了第三方 Oracle 依赖项(即 ojdbc7.jar、oraclepki.jar、osdt_cert.jar、osdt_core.jar)

打开连接的代码如下:

Class.forName("oracle.jdbc.driver.OracleDriver")
  
System.setProperty("oracle.net.tns_admin", new Path(SparkFiles.get("tnsnames.ora")).getParent.getName)
val ds = new OracleDataSource()
val props = new Properties()
props.setProperty(OracleConnection.CONNECTION_PROPERTY_WALLET_LOCATION, 
      new Path(SparkFiles.get("cwallet.sso")).getParent.getName)
ds.setConnectionProperties(props)
ds.setURL("jdbc:oracle:thin:@xe")

我已尝试隔离问题 Oracle版本是12.1.0.2(我用的是Docker镜像)

spark-submit2 ^
    --master local ^
    --files "%CWD%\wlt\tnsnames.ora,%CWD%\wlt\sqlnet.ora,%CWD%\wlt\cwallet.sso,%CWD%\wlt\ewallet.p12" ^
    --jars "%CWD%\lib\ojdbc7.jar,%CWD%\lib\oraclepki.jar,%CWD%\lib\osdt_cert.jar,%CWD%\lib\osdt_core.jar" ^
    --class OJDBCSinkMain ^
    .\target\spark-streaming-ojdbc-sink-1.0-SNAPSHOT-jar-with-dependencies.jar 

我的sqlnet.ora文件如下:

NAMES.DIRECTORY_PATH=(TNSNAMES, EZCONNECT)
SQLNET.WALLET_OVERRIDE=TRUE
SSL_CLIENT_AUTHENTICATION=FALSE
SSL_VERSION=0

而我的tnsnames.ora 文件是:

xe =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = xe)
    )
  )

我还验证了我的钱包中存在 Oracle 服务 xe 的凭据:

comment mkstore -wrl . -listCredential

List credential (index: connect_string username)
1: xe system

你有没有cmets?提前致谢。

【问题讨论】:

    标签: oracle apache-spark jdbc streaming wallet


    【解决方案1】:

    我的错误,我需要一个橡胶底座才能发现!!! SparkFiles.get("tnsnames.ora")).getParent.getName 返回相对路径,而不是绝对路径。我的问题现在解决了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-31
      • 2023-03-06
      • 1970-01-01
      • 2015-09-20
      • 1970-01-01
      • 2020-01-11
      • 2017-04-13
      相关资源
      最近更新 更多