我使用JDBC connection使用Spark连接到oracle database,并尝试读取包含4,000,000行的oracle表。在启动spark-shell/submit时,我为每个执行器使用了30个执行器、5个执行器内核和4g内存。当读取数据帧的计数或尝试写入数据时,它只使用一个执行器从oracle读取/写入数据。尝试对数据帧进行重新分区,但仍然只使用一个执行器,导致性能大幅下降。
下面是使用的语法,任何建议都是非常有用的。
命令片段:-
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发布于 2020-10-30 21:06:26
在oracle db中允许用户并发连接的数量也很重要。
https://spark.apache.org/docs/latest/sql-data-sources-jdbc.html
numPartitions
可用于表读写并行的最大分区数。这也决定了并发JDBC连接的最大数量。如果要写入的分区数量超过此限制,则在写入之前调用coalesce(numPartitions)将其减少到此限制。
https://stackoverflow.com/questions/64608185
复制相似问题