我有一个相对较大的本地表(约15亿行),我正尝试使用AWS Glue以拼花格式将其插入AWS S3。我正在使用spark JDBC读取表并将其写入S3。问题是我无法一口气从源表中提取所有数据,因为源DB会耗尽内存并抱怨。为了解决这个问题,我正在使用谓词选项来并行下推过滤器,该过滤器可以很好地提取2亿个左右的数据块。但是,当我尝试将此数据帧写入S3时,大约需要半小时才能完成:
df = spark.read.jdbc(url=host_url,
table="TABLENAME",
predicates=predicates,
properties= {
"user" : username,
"password" : password
}
)
所以我要做的是按顺序从DB阶段读取此信息:
Read Part 1 from DB --> Read Part 2 from DB --> Read Part 3 from DB
然后将所有数据并行写入S3
Write Part 1 || Write Part 2 || Write Part 3
我对此有两个问题:
答案 0 :(得分:0)
在执行操作后,Spark会立即读取数据,因为您只是在读写s3,因此在触发写入操作时便会读取数据。
Spark未优化为从rdbms读取大容量数据,因为它仅建立与数据库的单个连接。 如果您想继续阅读,请尝试将 fetchsize 属性增加到100000,默认值为1000。
对于数据的并行处理,您可以尝试利用python多处理并执行并行读写
Thread 1
Read 1 -> Write 1
Thread 2
Read 2 -> Write 2
但是首先尝试执行的只是顺序的
Read 1 -> Write 1 -> Read 2 -> Write 2
我建议的另一种方法是使用DMS或SCT将所有数据立即保存到s3。
DMS可以在s3中以Parquet格式转储数据,并且由于针对迁移任务本身进行了优化而非常快。
如果您不想使用DMS,则可以编写可通过瞬态EMR集群触发的sqoop导入作业。 Sqoop还能够以镶木地板格式导入数据。
胶水最适合用于转换现有数据并迁移大数据,您应该寻求其他服务的帮助。