如何使用 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.Master
和 spark-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 获取滚动不敏感的结果集?
java连oracle中连不上,错误是“无法从套接字读取更多的数据”,是啥问题?