Warm tip: This article is reproduced from serverfault.com, please click

其他-带钱包的Spark Streaming Oracle JDBC接收器

(其他 - Spark Streaming Oracle JDBC sink with wallet)

发布于 2020-12-12 13:26:16

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

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

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

用于打开连接的代码段如下:

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

你有什么意见吗?提前致谢。

Questioner
Yeliz Pehlivanoğlu
Viewed
11
Yeliz Pehlivanoğlu 2020-12-18 15:05:42

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