带钱包的spark流oracle jdbc接收器

n53p2ov0  于 2021-05-26  发布在  Spark
关注(0)|答案(1)|浏览(411)

我正在开发一个spark流应用程序,它将侦听一个文件夹(分区为yyyymmdd)并聚合每分钟写入的记录数,然后将结果持久化到oracle表中。
我已经开发了一个jdbcsink(foreachwriter),在open方法中,我试图打开到oracle的连接,但是我得到了 "oracle.net.ns.NetException: could not resolve the connect identifier" 创建oracle连接时出现异常。我使用的是oracle wallet(sso),通过设置tns\u admin环境变量,我可以使用这个wallet通过sqlplus进行连接。
我正在用spark submit--files选项推送tnsnames.ora、sqlnet.ora、cwallet.sso和ewallet.p12,并且我已经用 SparkFiles.get sink类中的方法。我还为带有spark submit--jars选项的oracle wallet添加了第三方oracle依赖项(即ojdbc7.jar、oraclepki.jar、osdt\u cert.jar、osdt\u 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 service xe的凭据:

comment mkstore -wrl . -listCredential

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

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

mctunoxg

mctunoxg1#

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

相关问题