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具有相同的键。这使得管道运行缓慢。