Spark流媒体Oracle JDBC接收器和钱包
我正在开发一个Spark流应用程序,它将侦听一个文件夹(分区为yyyyMMdd),并聚合每分钟写入的记录数,然后将结果持久化到Oracle表中 我已经开发了一个JDBCSink(ForeachWriter),在open方法中,我试图打开到Oracle的连接,但是我在创建Oracle连接时遇到了Spark流媒体Oracle JDBC接收器和钱包,oracle,apache-spark,jdbc,streaming,wallet,Oracle,Apache Spark,Jdbc,Streaming,Wallet,我正在开发一个Spark流应用程序,它将侦听一个文件夹(分区为yyyyMMdd),并聚合每分钟写入的记录数,然后将结果持久化到Oracle表中 我已经开发了一个JDBCSink(ForeachWriter),在open方法中,我试图打开到Oracle的连接,但是我在创建Oracle连接时遇到了“Oracle.net.ns.NetException:无法解析连接标识符”异常。我使用的是Oracle wallet(SSO),通过设置TNS_ADMIN环境变量,我可以使用此wallet通过sqlplu
“Oracle.net.ns.NetException:无法解析连接标识符”
异常。我使用的是Oracle wallet(SSO),通过设置TNS_ADMIN环境变量,我可以使用此wallet通过sqlplus进行连接
我正在使用spark submit--files选项推送tnsnames.ora、sqlnet.ora、cwallet.sso和ewallet.p12,并且我已经使用sink类中的SparkFiles.get
方法验证了文件被推送到执行者。我还使用spark submit--jars选项(即ojdbc7.jar、oraclepki.jar、osdt_cert.jar、osdt_core.jar)为Oracle钱包添加了第三方Oracle依赖项
打开连接的代码如下所示:
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")
NAMES.DIRECTORY_PATH=(TNSNAMES, EZCONNECT)
SQLNET.WALLET_OVERRIDE=TRUE
SSL_CLIENT_AUTHENTICATION=FALSE
SSL_VERSION=0
我试着把问题孤立起来
Oracle版本是12.1.0.2(我使用的是Docker映像)
我的sqlnet.ora
文件如下:
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")
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
你有什么意见吗?提前谢谢。我的错误,我需要一个橡胶船坞来定位
SparkFiles.get(“tnsnames.ora”).getParent.getName
返回相对路径,而不是绝对路径。我的问题现在解决了