无法在Spark应用程序中设置系统属性[在客户端和集群模式下}

时间:2019-08-21 09:35:43

标签: java apache-spark

要设置System.setProperty("oracle.net.tns_admin",path_of_ora),我尝试了以下方法。

  

方法1:使用广播变量将tns.ora文件复制到所有执行程序   sparkSession.sparkContext()。broadcast(“ / tmp / conf /”,classTagTest)

此方法的问题是"/tmp/conf/”被视为字符串变量而不是路径

  

方法2:在spark Submit命令中使用--files参数传递tns.ora文件并设置--conf spark.executor.extraJavaOptions = -Doracle.net.tns_admin = tnsnames.ora

     

方法3:使用sparkSession.addFile(“ tnsnames.ora”)设置--conf spark.executor.extraJavaOptions = -Doracle.net.tns_admin = tnsnames.ora

根据我们的分析,我们发现在主应用程序作为本地[*]和模式客户端运行spark应用程序时设置了系统属性。

即使在客户端模式下,也只能识别本地路径,而当我们尝试使用hdfs路径设置systemProperty时,也无法识别该路径。

但是要求是设置系统属性并以群集模式运行。

  

spark-submit --class Demo1 --master local [*] --deploy-mode client --driver-memory 5g --executor-memory 10g --executor-cores 5 --num-executors 36 --jars ojdbc15-11.1.0.6.jar --files /tmp/tnsnames.ora --conf spark.executor.extraJavaOptions = -Doracle.net.tns_admin = tnsnames.ora --driver-java-options -Doracle.net.tns_admin = tnsnames .ora test.jar tnsnames.ora

SparkConf sparkConf = new SparkConf()
               // .setMaster("local[*]")
                .setAppName("Iden");

SparkSession sparkSession = SparkSession.builder()
        .config(sparkConf).getOrCreate();

String username = "etldevapp";
String password = "etldevappstg";
String thinConn = "jdbc:oracle:thin:" + username + "/" + password + "@xxxxxxx";

System.setProperty("oracle.net.tns_admin","/tmp/");

try {
    DriverManager.registerDriver(new OracleDriver());
    Connection conn = DriverManager.getConnection(thinConn, username, password);

    PreparedStatement st = conn.prepareStatement("select * from xxxx where rownum < 10");

    final ResultSet rs = st.executeQuery();
    System.out.println(rs.getFetchSize());
} catch (Exception e) {
    System.out.println("Exception from try1 ");
}

用户类引发异常:java.sql.SQLException:Io异常:无法解析连接标识符“ xxxxx”

1 个答案:

答案 0 :(得分:0)

这就是我所做的。我在Spark配置文件中将其设置为属性,然后在代码中将其设置为系统属性。属性名称以“ spark。”开头很重要,因此如下所示:

System.setProperty("oracle.net.tns_admin",conf.get("spark.your.property.name"));