首页 > 解决方案 > Spark 在尝试从 Oracle 表读取数据并将数据写入 HDFS 时仅运行一个执行程序

问题描述

我正在连接oracle database使用JDBC connectionSpark尝试读取包含 4000 万行的 oracle 表。我在启动 spark-shell/submit 时为每个执行器使用 30 个执行器、5 个执行器核心和 4g 内存。在读取计数或尝试写入数据帧的数据时,它仅使用一个执行器从 oracle 读取/写入数据。尝试重新分区数据帧,但仍然只使用 1 个执行程序,导致性能大幅下降。

以下是使用的语法,非常感谢任何建议。

命令片段:-

spark-shell --executor-memory 4G --executor-cores 5 --num-executors 30
val source_df = spark.read.format("jdbc").option("url", JDBC_URL).option("dbtable", src_table).option("user", *****).option("password", *****).option("driver", "oracle.jdbc.driver.OracleDriver").option("numPartitions", 40).option("partitionColumn", "*****").option("lowerBound", 1).option("upperBound", 100000).load()

val df_1_msag=source_table_DF_raw_msag.repartition(40)
df_1_msag.count

[Stage 0:=======================================================> (39 + 1

标签: apache-spark

解决方案


oracle db 中允许用户的并发连接数也很重要。

https://spark.apache.org/docs/latest/sql-data-sources-jdbc.html

numPartitions
可用于表读写并行的最大分区数。这也决定了并发 JDBC 连接的最大数量。如果要写入的分区数超过此限制,我们会在写入前通过调用 coalesce(numPartitions) 将其减少到此限制。


推荐阅读