jdbc - jdbc 写入 greenplum/postgres 问题
问题描述
Spark jdbc 写入为具有更多列(400 列和 200 行)的数据带来了噩梦,即使列更少而行更多,它也需要很长时间(200k 记录 30 到 60 分钟)。我们没有用于分区的主键,因此将使用很少的相关键(从 jdbc/transformations 读取没有问题,只有写入有问题)。
- Spark Cluster conf -- 1 个 master,2 个 worker >> 8 个核心,每个 32 Gb。
- Spark sumit 命令参数 -- 'executor_cores': 2,'executor_memory': '2G','num_executors': 2,'driver_memory': '2G'
根据其他stackoverflow建议尝试以下方式。
df.write.format('jdbc').options(url=url,driver=driver,dbtable=table,user=user,password=password,batchsize=20000,rewriteBatchedStatements=true).mode(mode).save()
df.repartition(15).write.format('jdbc').options(url=url,driver=driver,dbtable=table,user=user,password=password,batchsize=20000,rewriteBatchedStatements=true).mode(mode).save()
写入 mysql 工作正常。写入 greenplum 和 postgres 是个问题(两者均已验证)。我找不到太多选择。
解决方案
经过反复试验,发现了一些有助于提高性能的参数。
- 对于 Postgres,应使用 reWriteBatchedInserts=true 而不是 rewriteBatchedStatements=true(这仅适用于 mysql)。这对性能有很大帮助。
- 减少批量有助于写入数据库。通过反复试验,我们可以确定适合环境的价值。
推荐阅读
- html - 根据 parent_id 创建树视图
- react-native - 警告:列表中的每个孩子都应该有一个唯一的“关键”道具。我已经提供了那个道具,但总是出错
- javascript - require('.') 采用顶级 index.js 而不是本地的
- kotlin - 如何更改jetpack compose中BasicTextField的backgorundColor?
- javascript - 在 JavaScript 中从 1 个键数组和 1 个值数组创建一个数组?
- reference - 如何使用 apache poi 获取参考其他工作簿
- sql-server - 在 SSIS 中设置 DefaultBufferMaxRows 的最佳值是什么
- server-side-rendering - 未捕获(承诺中):TypeError:无法读取未定义(读取“调用”)角度 ssr 的属性
- c++ - 在 CMakeLists.txt 中执行 cmake 与在终端中执行 cmake 有什么区别,我们如何使其行为相同?
- c# - Xamarin/XAML/C# - 构建一个计算 DateTime 数组中所有周末天数的方法