分析 Cloud Data Flow BigQuery 吞吐量/流水线
Posted
技术标签:
【中文标题】分析 Cloud Data Flow BigQuery 吞吐量/流水线【英文标题】:Analyze Cloud Data Flow BigQuery Throughput / Pipelining 【发布时间】:2016-01-26 13:18:17 【问题描述】:我试图弄清楚 DataFlow 如何扩展某些操作以及如何使其表现最佳。首先,我刚刚创建了一个从 BigQuery 读取数据(约 2500 万行,总共 30GB)的简单流程,执行 JSON 提取,一个简单的按键分组,然后一个聚合分组(每个约 100 个元素),然后执行另一个对每个键进行转换并将其放回新表中(约 500k 行,总共 25gb)。
管道的总执行时间在 10 到 18 分钟之间,具体取决于我分配的工人数量或我是否使用多核机器等。我无法将其加速到低于此时间。我还没有确定确切的阈值,但基本上 20 个单核或 10 个四核之间的差异不再可靠。
所以我的问题是如何进一步调查并找出哪个步骤花费的时间最多以及如何改进它。我假设 DataFlow 本身负责扩展各个步骤并在它们之间进行平衡。但对我来说,例如现在看到收到的第一条消息和发送的最后一条消息会很有趣,也许每一步的吞吐量随时间变化。这是在某处可用的东西,还是我必须自己开始检测和记录它?有了这些信息,我将开始基于此优化各个步骤,并可能覆盖 DataFlows 缩放。
这是正确的方法,还是有更好的方法可用?
** 我的目标时间是缩短到 2 分钟。
【问题讨论】:
您对问题的表述方式对于 Stack Overflow 来说似乎过于宽泛。如果不查看您的管道,很难知道如何推荐性能改进。也许您可以查看FAQ。您还应该能够在开发者控制台中看到管道统计信息,以解决一般监控问题。 谢谢,问题更多是关于如何调试它,我会看看回复是否合适,如果讨论太多,我会拆分并清理问题。 【参考方案1】:Dataflow 首先执行 BigQuery 导出作业以将您的数据复制到 GCS,然后再将其读入并进行处理。同样,Dataflow 将数据写入 GCS,然后执行 BigQuery 导入作业以加载表。
如果您查看作业消息和/或日志,您应该能够看到导出作业何时完成(并且您的代码开始从导出的文件中读取)以及导入作业何时开始(并且您的代码已经完成写入所有输出数据)。如果 10-18 分钟的大部分时间都花在 BigQuery 导入/导出作业上,那么调整管道不会对性能产生重大影响。
其他常见问题是有一个或两个特别热的键(例如,包含大部分数据)。从您的描述看来,情况并非如此(您提到每个键大约有 100 个元素)。
【讨论】:
感谢提示,我们实际上删除了测试大查询输入操作,这将时间从 12 分钟缩短到 4 分钟。我还可以看到各个步骤的开始时间,但我看不到最后一个元素的处理时间。 将流导入 BigQuery 作为管道的一部分而不是一个导入作业不是更快吗? 通常没有。批量导入 BigQuery 通常比流式导入要快。 根据您上面的用例,假设系统可以以足够高的速率进行流式传输,流式传输行可能会优于使用加载作业。如果您可以通过实际处理对插入进行管道化,则更是如此。这是因为加载作业是异步/排队的,因此具有一些内置的自然调度/执行开销延迟。对于更大的数据大小,随着开销变得不那么重要,加载作业开始占优势,因为一旦作业开始执行,它可以以比流式传输快几个数量级的速率处理/摄取数据。 Sean 是对的,对于目标是最小化延迟的小型作业,流式插入可能会更快。不幸的是,我们(Dataflow)并没有让批量关闭加载作业变得容易——我们发现客户很欣赏加载方法带来的可扩展性和成本节约。如果至关重要,我们可以考虑重新考虑这个决定——在我们的 GitHub 存储库上提交功能请求? github.com/GoogleCloudPlatform/DataflowJavaSDK/issues以上是关于分析 Cloud Data Flow BigQuery 吞吐量/流水线的主要内容,如果未能解决你的问题,请参考以下文章
Swarm 的 Spring Cloud Data Flow 支持
Spring Cloud Data Flow 的自定义任务中缺少参数