apache-spark - Spark 在尝试从 Oracle 表读取数据并将数据写入 HDFS 时仅运行一个执行程序
问题描述
我正在连接oracle database
使用JDBC connection
并Spark
尝试读取包含 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
解决方案
oracle db 中允许用户的并发连接数也很重要。
https://spark.apache.org/docs/latest/sql-data-sources-jdbc.html
numPartitions
可用于表读写并行的最大分区数。这也决定了并发 JDBC 连接的最大数量。如果要写入的分区数超过此限制,我们会在写入前通过调用 coalesce(numPartitions) 将其减少到此限制。
推荐阅读
- powershell - 使用 Powershell 和 Try/Catch 更新特定的注册表项?
- java - JTable滚动条右上角
- database - 图片未上传到数据库
- javascript - 从控制器返回变量值到视图
- ruby-on-rails - Rails - 将值附加到 JsonB 字段时的更好方法
- java - 如何使用 Jackson 中可重用的 json 属性创建 Java 类?
- ios - 如何使用预处理器标志 MIXPANEL_RANDOM_DISTINCT_ID=1 设置 Mixpanel / Swift SDK
- dns - FAILED_NOT_VISIBLE 错误 Google 管理的 ssl 证书,用于通过 Google 存储和负载平衡托管静态子域网站
- angular-reactive-forms - 如何在 Angular 中将 formControlName 值与 *ngFor 绑定
- html - 将带有html标签的列值转换为带有行和列的sql视图