如何使用 JDBC 从 Oracle 读取数据集?

Posted

技术标签:

【中文标题】如何使用 JDBC 从 Oracle 读取数据集?【英文标题】:How to use JDBC to read datasets from Oracle? 【发布时间】:2017-12-19 09:07:03 【问题描述】:

在使用 jdbc 驱动程序连接时,真正执行了什么以及在哪里执行,例如甲骨文。? 1:我已经启动了一个火花大师

spark-class.cmd org.apache.spark.deploy.master.Master 

像这样的工人

spark-class.cmd org.apache.spark.deploy.worker.Worker spark://myip:7077  

和火花壳一样

spark-shell --master spark://myip:7077  

spark-defaults.conf我有

spark.driver.extraClassPath = C:/jdbcDrivers/ojdbc8.jar
spark.executor.extraClassPath = C:/jdbcDrivers/ojdbc8.jar

在 spark-env.sh 我有

SPARK_CLASSPATH=C:/jdbcDrivers/ojdbc8.jar

我现在可以在 spark-shell 中对 Oracle 运行查询:

val jdbcDF = spark.read.format("jdbc").option("url","jdbc:oracle:thin:@...

无需在 scala shell 中单独添加 jdbc 驱动程序 jar 即可正常工作。

    当我以相同的方式启动master和worker,但是在eclipse中创建一个scala项目并连接到master时如下:

    val sparkSession = SparkSession.builder.
    master("spark://myip:7077")
    .appName("SparkTestApp")
    .config("spark.jars", "C:\\pathToJdbc\\ojdbc8.jar")
    .getOrCreate()    
    

如果我没有在 scala 代码中明确添加 jdbc jar,它将失败。 执行方式有何不同?为什么我需要在代码中指定jdbc jar?如果不依赖master和worker启动,连接master的目的是什么? 如果我将多个工作人员与 jdbc 一起使用,他们会只使用一个连接还是会同时通过多个连接并行读取?

【问题讨论】:

【参考方案1】:

您肯定在样本中使用了太多,而您感到困惑。

spark-class.cmd org.apache.spark.deploy.master.Masterspark-class.cmd org.apache.spark.deploy.worker.Worker spark://myip:7077 这两行代码启动了一个包含一个 master 和一个 worker 的 Spark Standalone 集群。见Spark Standalone Mode。

除了在 Mesos 或 YARN 集群管理器上运行之外,Spark 还提供了一种简单的独立部署模式。您可以手动启动独立集群,手动启动主节点和工作节点,或使用我们提供的启动脚本。也可以在单台机器上运行这些守护进程进行测试。

您选择手动启动 Spark Standalone 集群(如 Starting a Cluster Manually 中所述)。

怀疑spark-defaults.conf 完全被集群使用。该文件用于将您的 Spark 应用程序配置为 spark-submit 到集群(如 Dynamically Loading Spark Properties 中所述):

bin/spark-submit 还会从 conf/spark-defaults.conf 读取配置选项,其中每一行由一个键和一个由空格分隔的值组成。

话虽如此,我认为我们可以放心地将 Spark Standalone 放在一边。它并没有给讨论增加太多内容(而且确实有点混乱)。

“安装”用于 Spark 应用程序的 JDBC 驱动程序

为了在您的 Spark 应用程序中使用 JDBC 驱动程序,您应该在spark-submit 中使用--driver-class-path 命令行选项(或spark.driver.extraClassPath 属性,如Runtime Environment 中所述):

spark.driver.extraClassPath 附加到驱动程序类路径前面的类路径条目。

注意:在客户端模式下,这个配置不能直接在你的应用程序中通过 SparkConf 设置,因为此时驱动程序 JVM 已经启动。相反,请通过 --driver-class-path 命令行选项或在您的默认属性文件中进行设置。

我强烈推荐使用spark-submit --driver-class-path

$ ./bin/spark-submit --help
...
  --driver-class-path         Extra class path entries to pass to the driver. Note that
                              jars added with --jars are automatically included in the
                              classpath.

您可以在Working with Datasets from JDBC Data Sources (and PostgreSQL) 中阅读我关于如何在 PostgreSQL 中使用 JDBC 驱动程序的说明。

PROTIP使用SPARK_PRINT_LAUNCH_COMMAND=1查看spark-submit的命令行。

以上所有内容也适用于spark-shell(因为它在封面下使用spark-submit)。

【讨论】:

阅读这些后,我理解为在 eclipse 中我可以在本地模式模式下运行代码,也可以使用独立集群远程运行代码。我尝试的是在独立集群上远程运行它,通过这样的连接:setMaster("spark://myip:7077")。在这种情况下,我需要在代码中添加罐子。据我了解,它将作为一个胖罐子推出。在本地模式下,代码将在同一个 jvm 中运行。本地模式用作:.setMaster("local[1]")。应用程序也可以通过 spark-submit 提交到独立集群。 如果使用 spark-shell,它似乎使用了 confs,因为它找到了 jdbc 而没有在 scala 中指定它。不过,在将它们放入 confs 之前,我必须使用 addJar 在 spark-shell 中添加 jdbc jar。 也有用:***.com/questions/31381975/spark-driver-not-found***.com/questions/29552799/…***.com/questions/38257958/…

以上是关于如何使用 JDBC 从 Oracle 读取数据集?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Java JDBC 中的 callableStatement 获取滚动不敏感的结果集?

如何通过 JDBC 从 Db2 匿名块返回动态结果集?

如何在java中读取oracle blob

java连oracle中连不上,错误是“无法从套接字读取更多的数据”,是啥问题?

Android Studio Oracle JDBC,结果集一直为空

Oracle 启动SQL Developer提示无法从套接字读取更多的数据