关于Apache Spark:大量偏斜的数据,需要分区并转换为实木复合地板

Huge skewed data, Need to partition and convert to parquet

我在关系数据库中有非常大的数据(近70TB未压缩),需要在s3中加载并转换为镶木地板,并按年份,月份,col1和col2对数据进行分区。

这将是日常工作,我有70Node集群,每个集群有256GB Ram,每个集群有64Vcores。我们正在尝试使用spark通过properitery连接器转储数据,并且转储数据的速度非常快。它基本上以CSV格式分多个块转储到S3中的临时位置中,数据以64 mb csv文件的1M大块转储。

不进行分区,转换成镶木地板的数据将在3个小时内完成,包括数据的卸载。

问题陈述:

基于分区的要求,我的数据高度不对称,因为近年来有70%的数据,在此范围内,col1和col2的每个也都严重偏斜。

当我将文件转换为不分区的拼花地板时,我得到了成千上万个小文件,并且多个任务失败,并出现s3-slowdown请求率错误。如果我尝试合并或重新分区数据,则会遇到重新排列/内存中断的问题。我试图避免在多次迭代中读取数据,因为转储的数据是未分区的,我可能最终每次都会读取整个1M文件进行过滤。

有没有一种方法可以在分区后重新分区(合并)文件?


感谢您的所有评论。我能够解决问题并能够达到要求。

  • 我已经将Redshift的摘录分离到一个单独的过程中。由于Redshift的JDBC驱动程序存在多个问题。我在redshift上使用了本机卸载命令,该命令当前支持Parquet格式。因此,以拼花形式提取数据并写入s3。它已将我的数据大小从60TB减少到了9TB。
  • 编写了一个自定义的partitioner(salting)方法,并提出了一个算法来平均分配数据(至少是相等的,并将巨大的分区分成相等的块)。
  • 在写入之前,我将使用自定义分区程序对数据进行重新分区并写入数据。
  • 整个过程现在将在4-5小时内完成。