Spark jdbc写入会让列数更多(400列和200行(的数据成为噩梦,即使列数更少、行数更多,也需要相当长的时间(200k条记录需要30到60分钟(。我们没有用于分区的主键,所以将很少使用相关的键(从jdbc/转换中读取没有问题,只有写入有问题(。
- Spark Cluster conf——1个主节点,2个工作节点>gt;8个核,每个32 Gb
- Spark sumit命令参数--'execute_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(。这对性能有很大帮助
- 减少批处理大小有助于写入数据库。通过反复试验,我们可以为环境确定合适的价值