并行将数据写入实木复合地板格式

时间:2020-06-05 20:33:48

标签: apache-spark amazon-s3 aws-glue

我有一个相对较大的本地表(约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 我对此有两个问题:

  1. 我不知道Spark何时真正将这些查询激发到数据库。我知道不是如上所述定义数据帧的时候,所以我无法弄清楚如何序列化第1阶段。
  2. 我环顾四周,找不到将多个数据帧并行写入镶木地板分区的选项。我应该只使用python将数据帧并行化为镶木地板写操作语句吗?这样做是否明智?

1 个答案:

答案 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还能够以镶木地板格式导入数据。

胶水最适合用于转换现有数据并迁移大数据,您应该寻求其他服务的帮助。