我有一个DataFlow管道,它试图建立一个索引(键-值对)并计算一些指标(如每个键的值数)。输入数据总计约60 GB,存储在GCS上,管道中分配了约126个工作程序。每个Stackdriver的所有工作人员的CPU利用率约为6%。
尽管有126名工人,但是管道似乎没有任何进展,并且根据挂墙时间,瓶颈似乎是一个简单的计算步骤,紧随其后。尽管所有其他步骤平均花费不到1个小时,但计数步骤已经花费了50天的挂墙时间。日志中似乎没有所有警告的有用信息。
计算步骤是在WordCount示例中的相应步骤之后执行的:
def count_keywords_per_product(self, key_and_group):
key, group = key_and_group
count = 0
for e in group:
count += 1
self.stats.product_counter.inc()
self.stats.keywords_per_product_dist.update(count)
return (key, count)
上一步“组关键字”是一个简单的beam.GroupByKey()转换。
请告知可能的原因以及如何对其进行优化。
Current resource metrics:
Current vCPUs 126
Total vCPU time 1,753.649 vCPU hr
Current memory 472.5 GB
Total memory time 6,576.186 GB hr
Current PD 3.08 TB
Total PD time 43,841.241 GB hr
Current SSD PD 0 B
Total SSD PD time 0 GB hr
Total Shuffle data processed 1.03 TB
Billable Shuffle data processed 529.1 GB
答案 0 :(得分:1)
这里每个键的总和的最好方法是使用组合操作。原因是它可以缓解具有热键的问题。
尝试将count
替换为GroupByKey + ParDo
,或类似适合您的使用情况的组合转换。