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