当前位置: 首页 > 知识库问答 >
问题:

大开销Apache Beam中的批处理

李景天
2023-03-14

我目前正在使用Python API开发一个更大的Apache Beam管道,它从BigQuery中读取数据,并最终将其写回另一个BigQuery任务。

其中一个转换需要使用二进制程序来转换数据,为此,它需要加载一个23GB的二进制查找数据文件。因此,启动和运行该程序需要大量的开销(每次加载/运行大约需要2分钟)和RAM,并且仅为一条记录启动该程序是没有意义的。此外,每次都需要将23GB文件从云存储中复制到本地。

>

  • 从云存储中复制23GB的文件,如果它已经不在那里

    将记录保存到文件中

    用call()运行二进制文件

    我的两个问题是,在Apache Beam中实现这个用例的最佳方法是什么(性能方面),如果没有好的解决方案,是否有其他更适合的Google云服务可以使用,比如beam-->其他服务-->Beam

  • 共有1个答案

    楚灿
    2023-03-14

    不能在幕后拆分组,因此使用GroupByKey应该有效。事实上,这是一个要求,因为每个单独的元素必须在一台机器上处理,并且在GroupByKey之后,具有给定键的所有值都是同一个元素的一部分。

    您可能希望分配随机密钥。请记住,如果给定键的值太多,那么将所有这些值传递给程序可能也很困难--因此,您可能还希望限制一次传递给程序的值的数量和/或调整如何分配键。

    分配随机密钥的一个技巧是在start bundle中生成随机数(例如1到1000),然后在process元素中增加这个随机数,并将1001换到1000。这避免了为每个元素生成随机数,并且仍然确保了键的良好分布。

    您可以为这两个逻辑创建一个PTransform(将pCollection 分成pCollection > 块进行处理),这在类似的情况下可能是可重用的。

     类似资料:
    • 我有一个数据流工作,将单个文件分割成x个记录(表)。这些流在bigQuery没有问题。 不过,我发现没有办法在结果出来后执行管道中的另一个阶段。 举个例子 根据上述内容,我希望运行以下内容: 是有无论如何运行管道的另一个部分后,up到bigQuery或这是不可能的?提前感谢。

    • 问题内容: 我是Tensorflow的新手,所以我不明白为什么输入占位符经常根据用于训练的批次大小来确定尺寸。 在此示例中,我在此处以及在Mnist官方教程中找到了 那么确定尺寸并创建模型输入并对其进行训练的最佳和正确方法是什么? 问题答案: 您在此处指定模型输入。您希望将批处理大小保留为,这意味着您可以使用可变数量的输入(一个或多个)来运行模型。批处理对于有效使用您的计算资源很重要。 下一条重要

    • 在很多问题上,处理器的速度比硬件交流要快得多。这种代价通常是小的 I/O,可能包括网络消耗,磁盘 I/O,数据库查询,文件 I/O,还有其他与处理器不太接近的硬件使用。所以构建一个快速的系统通常是一个提高 I/O,而非在紧凑的循环里优化代码或者甚至优化算法的问题。 有两种基本的技术来优化 I/O:缓存和代表(译者注:比如用短的字符代表长的字符)。缓存是通过本地存储数据的副本,再次获取数据时就不需要

    • 我想运行一个批处理文件A,它调用/启动另一个批处理文件B,后者打开一个新的cmd窗口。然后,我想在这个新的cmd窗口中运行一个用户定义的命令。这个命令只有在运行文件B之后或者在这个新的cmd-window中才能被识别,但是命令本身的调用应该是写在文件A中的(文件B是设置好的,不能更改)。我该怎么做? 就我所理解的行为而言,我不能访问由另一个批处理文件打开的cmd窗口。我写了一个简单的测试用例来向你

    • 我有以下工作要处理在一定的时间间隔或特别的基础上。 作业中的步骤如下: 我也想要用户界面,在那里我可以触发一个特别的基础上的工作,而且我应该能够提供参数从用户界面。 我想用Spring batch来完成这个任务,但它更多的是用于读->处理->写之类的工作。这里,在第一步中,我正在生成由第二步读取的数据。我不确定我是否还可以使用Spring batch来实现这个,或者有更好的方法来实现这个。

    • 我是Spring批处理的新手,我只想问如何从多行结果集中检索数据。我有以下场景: > 有两个不同的表说员工 使用时,我只能创建一个工资单子级,但该表可能有多个子级。请帮助...