我正在开发一个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
你有什么意见吗?提前谢谢。
1条答案
按热度按时间mctunoxg1#
我错了,我需要一个橡胶码头来定位!!!
SparkFiles.get("tnsnames.ora")).getParent.getName
返回相对路径,而不是绝对路径。我的问题现在解决了。