我正在试图弄清楚DataFlow如何扩展某些操作以及如何使其表现最佳。首先,我创建了一个从BigQuery读取数据的简单流程(大约25M行,总共30GB),一个JSON提取,一个简单的按键组合,然后一个聚合组(每个大约100个元素),另一个转换每个键并将其放回一个新表(约500k行,总共25gb)。
总管道执行时间在10-18分钟之间,具体取决于我分配的工作人员数量,或者我是否使用多核机器等。我无法在此速度以下加速。我还没有确定确切的阈值,但基本上20个单核或10个四核之间的差异不再可靠地测量。
所以我的问题是如何进一步调查这一点,并找出哪个步骤需要花费大部分时间以及如何改进它。我假设DataFlow本身负责扩展各个步骤并在它们之间进行平衡。但对我来说,现在看到收到的第一条消息和最后一条消息的发送,以及每步的吞吐量随时间变化都会很有趣。这是某种可用的东西,还是我必须自己开始检测和记录?有了这些信息,我将开始基于此优化各个步骤,并可能覆盖DataFlow缩放。
这是正确的方法,还是有更好的方法?
**我的目标时间是将其缩短到2分钟。
答案 0 :(得分:5)
Dataflow首先执行BigQuery导出作业,以便在将数据读入并处理之前将数据复制到GCS。同样,Dataflow将数据写入GCS,然后执行BigQuery导入作业以加载表。
如果您查看作业消息和/或日志,您应该能够看到导出作业何时完成(并且您的代码开始从导出的文件中读取)以及导入作业何时开始(并且您的代码已完成)写所有输出数据)。如果10-18分钟中的大部分花在BigQuery导入/导出作业上,那么调整管道不会对性能产生重大影响。
其他常见问题是有一个或两个特别热的键(例如,包含大部分数据)。根据你的描述,听起来并非如此(你提到每个键有大约100个元素)。