Google cloud dataflow 超过8分钟阅读1 GB侧输入视图(列表)

Google cloud dataflow 超过8分钟阅读1 GB侧输入视图(列表),google-cloud-dataflow,Google Cloud Dataflow,我们有一个1GB的列表,它是在beam sdk 2.0上使用View.asList()方法创建的。我们正在尝试遍历列表中的每个成员,目前,对其不做任何有意义的事情(我们只是求和一个值)。仅仅读取这个1GB列表就需要8分钟(这是在我们设置workerCacheMb=8000之后,我们认为这意味着工作缓存是8GB)。(如果我们不将workerCacheMB设置为8000,则需要超过50分钟才能结束作业。)。我们使用的是n1-standard-32实例,它应该有足够的RAM。只有一个线程读取此8GB列

我们有一个1GB的列表,它是在beam sdk 2.0上使用View.asList()方法创建的。我们正在尝试遍历列表中的每个成员,目前,对其不做任何有意义的事情(我们只是求和一个值)。仅仅读取这个1GB列表就需要8分钟(这是在我们设置workerCacheMb=8000之后,我们认为这意味着工作缓存是8GB)。(如果我们不将workerCacheMB设置为8000,则需要超过50分钟才能结束作业。)。我们使用的是n1-standard-32实例,它应该有足够的RAM。只有一个线程读取此8GB列表。我们之所以知道这一点,是因为我们创建了一个一个整数的伪PCollection,然后用它来读取这个8GB的ViewList端输入

读取1GB的列表不应该需要6分钟,尤其是在内存足够的情况下即使如果列表具体化为磁盘(不应该是磁盘),正常的单个非ssd磁盘可以以100 MB/s的速度读取数据,因此在这种绝对最坏的情况下,读取数据应该需要约10秒


我们做错了什么?我们发现数据流错误了吗?或者workerCachMB实际上是KB而不是MB?我们在这里扯头发……

尝试使用setWorkervacheMb(1000)。1000MB=大约1GB。它将从每个工作节点的缓存中拾取侧面输入,这将非常快

DataflowWorkerHarnessOptions options = PipelineOptionsFactory.create().cloneAs(DataflowWorkerHarnessOptions.class);
        options.setWorkerCacheMb(1000);
是否真的需要每次迭代1GB的侧输入数据,或者您需要在迭代过程中获得一些特定的数据


如果您需要特定的数据,那么您应该通过在列表中传递特定的索引来获得它。获取特定于索引的数据比迭代整个1GB数据要快得多

尝试使用setWorkervacheMb(1000)。1000MB=大约1GB。它将从每个工作节点的缓存中拾取侧面输入,这将非常快

DataflowWorkerHarnessOptions options = PipelineOptionsFactory.create().cloneAs(DataflowWorkerHarnessOptions.class);
        options.setWorkerCacheMb(1000);
是否真的需要每次迭代1GB的侧输入数据,或者您需要在迭代过程中获得一些特定的数据


如果您需要特定的数据,那么您应该通过在列表中传递特定的索引来获得它。获取特定于索引的数据比迭代整个1GB数据要快得多

在与数据流团队核实后,8分钟内1GB的速率听起来差不多

数据流中的端输入总是序列化的。这是因为要有侧面输入,必须生成PCollection的视图。数据流通过将其序列化到一个特殊的索引文件来实现这一点


如果您提供有关您的用例的更多信息,我们可以帮助您思考以更快的方式完成此任务的方法。

与Dataflow团队核实后,8分钟内1GB的速率听起来差不多

数据流中的端输入总是序列化的。这是因为要有侧面输入,必须生成PCollection的视图。数据流通过将其序列化到一个特殊的索引文件来实现这一点


如果您提供有关您的用例的更多信息,我们可以帮助您思考以更快的方式执行的方法。

在实现数据流的侧输入时,必须将它们序列化到网络。侧输入从云存储中读取。因此,此步骤缓慢是正常的。我将研究1gb/8min是否太慢,但要知道在整个PCollectionView上进行迭代肯定会很慢。你想在这个集合上尝试什么样的操作,它需要用作辅助输入?即使对google云存储进行了系列化,我假设我们的速度应该与单个非SSD硬盘(约100MBs,或约0.8Gbs)一样快,这意味着加载二进制数据大约需要10秒。也就是说,为了回答您的问题:我们需要对所有元素运行单线程操作,以查看列表中的哪些元素可以合并或不合并。我们有类似于一百万个RangeSet对象的东西,我们需要将它们彼此合并,直到不再有合并的可能。然后,我们得到了最小的rangeSet对象,这些对象跨越了最初的100万个rangeSet。这种操作听起来像是可以由CombineFn完成的。您需要实现一个可交换和关联的CombineFn,以便能够在高性能的Map Worker和reduce Worker上执行它。如果这是不可能的,您也可以考虑尝试一个GypByKy,其中每个元素都有相同的密钥。在这种情况下,将从洗牌读取,而不是从地面军事系统读取。这可能会更快,但我不太确定。如果您愿意,您可以提交一个关于您的数据结构和操作细节的问题,我们可以尝试解决这个问题。在实现数据流的侧输入时,它们必须序列化到网络。侧输入从云存储中读取。因此,此步骤缓慢是正常的。我将研究1gb/8min是否太慢,但要知道在整个PCollectionView上进行迭代肯定会很慢。你想在这个集合上尝试什么样的操作,它需要用作辅助输入?即使对google云存储进行了系列化,我假设我们的速度应该与单个非SSD硬盘(约100MBs,或约0.8Gbs)一样快,这意味着加载二进制数据大约需要10秒。也就是说,为了回答您的问题:我们需要对所有元素运行单线程操作,以查看列表中的哪些元素可以合并或不合并。我们有类似于一百万个RangeSet对象的东西,我们需要将它们彼此合并,直到不再有合并的可能。然后,我们得到了最小的rangeSet对象,这些对象跨越了最初的100万个rangeSet。这种操作听起来像是可以由CombineFn完成的。您需要实现一个可交换和关联的CombineFn,以便能够在高性能的Map Worker和reduce Worker上执行它。如果这是不可能的,您也可以考虑尝试一个GypByKy,其中每个元素都有相同的密钥。在本例中,将从Shuffle读取,而不是从fr读取