Spark 执行器在 jdbc 源中没有增加

Posted

技术标签:

【中文标题】Spark 执行器在 jdbc 源中没有增加【英文标题】:Spark executor not increasing in jdbc source 【发布时间】:2019-07-25 13:21:04 【问题描述】:

在尝试使用 spark jdbc 连接读取大型 oracle 表时,即使启用了动态分配并且作业被卡在那里,也只有一个执行程序正在调用

我正在运行一个 spark 应用程序来读取两个 oracle 表 -

1) 对于我正在运行具有动态资源分配的 spark 提交应用程序的小表,它会创建 15 个执行程序并在 2 分钟内完成 100 条记录

2) 对于同样使用相同配置的大表,但作业仅在单个 executor 上执行 4 小时,它并没有增加

numpartitions 为 10,但仍使用一个执行器

spark-submit --master yarn-cluster --driver-cores 2 --driver-memory 2G --jars /tmp/ojdbc8.jar --master yarn /tmp/vol_1.py location --executor-memory 12G  --executor-cores 5

这是火花限制吗?读取总是发生在单个 executor 上吗?

【问题讨论】:

【参考方案1】:

如果没有明确指定,Spark SQL 不会对任何数据进行分区,所有行都由单个执行程序处理。设置分区列(partitionColumn 必须是数字、日期或时间戳列)、下限和上限以及 num 个分区。Check this link

【讨论】:

谢谢,但这似乎不是一个优雅的解决方案,因为不读取数据就不可能得到上限和下限。 sqoop 做同样的事情,不需要任何限制

以上是关于Spark 执行器在 jdbc 源中没有增加的主要内容,如果未能解决你的问题,请参考以下文章

JAVA-JDBC连接数据库一个问题:我采用通过事务提交添加属性值,为啥没有虽然没有添加,但是ID自动增加

如何使用Spark执行MySQL(JDBC)连接?

如何在 Spark 中增加 Presto 的查询执行时间

从 Spark 到 Oracle 服务器的 JDBC 连接

YARN 上 Spark 应用程序的物理内存使用量不断增加

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