Cloud DataFlow 性能——我们的时代值得期待吗?
Cloud DataFlow performance - are our times to be expected?
正在寻找一些关于如何最好地 architect/design 和构建我们的管道的建议。
经过一些初步测试后,我们没有得到预期的结果。也许我们只是在做一些愚蠢的事情,或者我们的期望太高了。
我们的data/workflow:
- Google DFP 将我们的广告服务器日志(CSV 压缩)直接写入 GCS(每小时)。
- 一天的这些日志有 30-70 百万条记录,一个月大约有 15-20 亿条记录。
- 对其中 2 个字段执行转换,并将该行写入 BigQuery。
- 转换涉及对其中 2 个字段执行 3 个 REGEX 操作(由于增加到 50 个操作),这会产生新的 fields/columns.
我们 运行ning 到目前为止:
- 构建了一个从 GCS 读取文件一天 (31.3m) 的管道,并使用 ParDo 执行转换(我们认为我们只需要一天就开始,但我们的要求是处理几个月 &年也是)。
- DoFn 输入是一个字符串,其输出是一个 BigQuery TableRow。
- 管道在云中执行,实例类型为 "n1-standard-1" (1vCPU),因为我们认为每个工作人员 1 vCPU 就足够了,因为转换不过分复杂,也不 CPU 密集,即只是字符串到字符串的映射。
我们已经 运行 使用几种不同的工作线程配置来查看其执行情况的作业:
- 5 名工人 (5 vCPUs) 花费了 ~17 分钟
- 5 名工人 (10 vCPUs) 花费了 ~16 分钟(在这个 运行 中我们将实例提升到 "n1-standard-2"获得双核,看看它是否提高了性能)
- 50 分钟和 100 个最大工作人员,自动缩放设置为 "BASIC"(50-100 vCPUs)花费了 ~13 分钟
- 100 分钟和 150 个最大工作人员,自动缩放设置为 "BASIC"(100-150 vCPUs)花费了 ~14 分钟
这些时间是否符合您对我们的用例和管道的预期?
BigQuery 的写入限制为每秒 100,000 行/table 或 6M/分钟。在 3100 万行的输入下,只需写入约 5 分钟即可。当您加回每个元素的离散处理时间,然后是图形的同步时间(从 GCS->dispatch->... 读取)时,这看起来是正确的。
我们正在研究 table 分片模型,因此您可以编写一组 table,然后在 BigQuery 中使用 table 通配符来聚合 tables(典型 BigQuery 流式处理用例的通用模型)。我知道 BigQuery 的人也在考虑增加 table 流媒体限制,但没有官方消息可以分享。
Net-net 增加的实例现在不会为您带来更多的吞吐量。
另一种方法 - 在我们致力于改进 BigQuery 同步的同时 - 将通过 TextIO 使用模式匹配对您的读取进行分片,然后 运行 X 个单独的管道针对 X 个 tables。可能是一个有趣的实验。 :-)
有道理吗?
您还可以将输出写入文件,然后使用命令 line/console 将其加载到 BigQuery 中。您可能会节省一些实例的正常运行时间。这就是我在 运行 遇到 Dataflow/BigQuery 界面问题后一直在做的事情。同样根据我的经验,启动和拆除实例会产生一些开销(可能需要 3-5 分钟)。你也把这个时间包括在你的测量中吗?
正在寻找一些关于如何最好地 architect/design 和构建我们的管道的建议。
经过一些初步测试后,我们没有得到预期的结果。也许我们只是在做一些愚蠢的事情,或者我们的期望太高了。
我们的data/workflow:
- Google DFP 将我们的广告服务器日志(CSV 压缩)直接写入 GCS(每小时)。
- 一天的这些日志有 30-70 百万条记录,一个月大约有 15-20 亿条记录。
- 对其中 2 个字段执行转换,并将该行写入 BigQuery。
- 转换涉及对其中 2 个字段执行 3 个 REGEX 操作(由于增加到 50 个操作),这会产生新的 fields/columns.
我们 运行ning 到目前为止:
- 构建了一个从 GCS 读取文件一天 (31.3m) 的管道,并使用 ParDo 执行转换(我们认为我们只需要一天就开始,但我们的要求是处理几个月 &年也是)。
- DoFn 输入是一个字符串,其输出是一个 BigQuery TableRow。
- 管道在云中执行,实例类型为 "n1-standard-1" (1vCPU),因为我们认为每个工作人员 1 vCPU 就足够了,因为转换不过分复杂,也不 CPU 密集,即只是字符串到字符串的映射。
我们已经 运行 使用几种不同的工作线程配置来查看其执行情况的作业:
- 5 名工人 (5 vCPUs) 花费了 ~17 分钟
- 5 名工人 (10 vCPUs) 花费了 ~16 分钟(在这个 运行 中我们将实例提升到 "n1-standard-2"获得双核,看看它是否提高了性能)
- 50 分钟和 100 个最大工作人员,自动缩放设置为 "BASIC"(50-100 vCPUs)花费了 ~13 分钟
- 100 分钟和 150 个最大工作人员,自动缩放设置为 "BASIC"(100-150 vCPUs)花费了 ~14 分钟
这些时间是否符合您对我们的用例和管道的预期?
BigQuery 的写入限制为每秒 100,000 行/table 或 6M/分钟。在 3100 万行的输入下,只需写入约 5 分钟即可。当您加回每个元素的离散处理时间,然后是图形的同步时间(从 GCS->dispatch->... 读取)时,这看起来是正确的。
我们正在研究 table 分片模型,因此您可以编写一组 table,然后在 BigQuery 中使用 table 通配符来聚合 tables(典型 BigQuery 流式处理用例的通用模型)。我知道 BigQuery 的人也在考虑增加 table 流媒体限制,但没有官方消息可以分享。
Net-net 增加的实例现在不会为您带来更多的吞吐量。
另一种方法 - 在我们致力于改进 BigQuery 同步的同时 - 将通过 TextIO 使用模式匹配对您的读取进行分片,然后 运行 X 个单独的管道针对 X 个 tables。可能是一个有趣的实验。 :-)
有道理吗?
您还可以将输出写入文件,然后使用命令 line/console 将其加载到 BigQuery 中。您可能会节省一些实例的正常运行时间。这就是我在 运行 遇到 Dataflow/BigQuery 界面问题后一直在做的事情。同样根据我的经验,启动和拆除实例会产生一些开销(可能需要 3-5 分钟)。你也把这个时间包括在你的测量中吗?