Google cloud platform 使用Co-Group-by-SideInput-Apache梁连接解决方案

Google cloud platform 使用Co-Group-by-SideInput-Apache梁连接解决方案,google-cloud-platform,google-cloud-dataflow,apache-beam,Google Cloud Platform,Google Cloud Dataflow,Apache Beam,我有两个表要连接,它是一个左连接。下面是两个条件,我的管道是如何工作的 作业正在批处理模式下运行,其所有用户数据,我们希望在Google数据流中进行处理 第一天: 表A:500万条记录。(尺寸3TB) 表B:200项记录。(大小为1GB) 两个表通过SideInput连接,其中TableB数据被视为SideInput,并且工作正常 第2天: 表A:5000010条记录。(大小3.001TB) 表B:20 000项记录。(大小为100GB) 第二天,由于SideInput使用了缓存,并且由于Tab

我有两个表要连接,它是一个
左连接
。下面是两个条件,我的管道是如何工作的

作业正在批处理模式下运行,其所有用户数据,我们希望在Google数据流中进行处理

第一天:

表A:500万条记录。(尺寸3TB)

表B:200项记录。(大小为1GB)

两个表通过
SideInput
连接,其中
TableB
数据被视为
SideInput
,并且工作正常

第2天:

表A:5000010条记录。(大小3.001TB)

表B:20 000项记录。(大小为100GB)

第二天,由于
SideInput
使用了缓存,并且由于
TableB
的大小增加,我的缓存大小耗尽,因此我的管道速度变慢

因此,我尝试使用
Co-Group by
,但是
第1天的
数据处理速度非常慢,有一个日志:
单键上有10000多个值。


因此,当引入热键时,是否有更好的性能方法来执行连接。

一旦表B不再适合缓存,性能确实会急剧下降,而且没有很多好的解决方案。使用CoGroupByKey的速度变慢不仅仅是因为一个键上有许多值,还有一个事实,即您现在正在洗牌(aka grouping)表a(这是在使用边输入时避免的)

根据按键的分布情况,一种可能的缓解方法是将热键处理到一条路径中,使侧面输入像以前一样连接,并将长尾键处理到GoGBK中。这可以通过生成一个截断的TableB'作为侧输入来实现,如果在TableB'中找到一个PCollection,您的ParDo将尝试查找发送到该PCollection的键,如果不是[1]。然后将第二个PCollection传递给一个CoGroupByKey和所有TableB,并展平结果


[1]

你找过这篇有趣的文章吗?@muscat我已经看过了。但正如我上面所说的,我的工作变慢了,并在stackdriver中发送日志,称为“单键上有10000多个值”。因为对于~20K条记录,左表与表B具有相同的键。这使得管道运行缓慢。