当前位置: 首页 > 面试题库 >

如何加快由多个工作人员批量导入Google云数据存储的速度?

严繁
2023-03-14
问题内容

我有一个基于apache-beam的数据流作业,要使用vcf源从单个文本文件(存储在Google云存储中)中进行读取,将文本行转换为数据存储Entities并将其写入数据存储接收器。工作流程工作正常,但我注意到的缺点是:

写入数据存储区的速度最多为每秒25-30个实体。
我尝试使用,--autoscalingAlgorithm=THROUGHPUT_BASED --numWorkers=10 --maxNumWorkers=100但是执行似乎更喜欢一个工作程序。

我没有使用祖先路径作为键。所有实体都是一样的kind。

管道代码如下所示:

def write_to_datastore(project, user_options, pipeline_options):
"""Creates a pipeline that writes entities to Cloud Datastore."""
  with beam.Pipeline(options=pipeline_options) as p:
  (p
   | 'Read vcf files' >> vcfio.ReadFromVcf(user_options.input)
   | 'Create my entity' >> beam.ParDo(
     ToEntityFn(), user_options.kind)
   | 'Write to datastore' >> WriteToDatastore(project))

因为我有数百万行要写入数据存储区,所以以30个实体/秒的速度写入将花费很长时间。

问题:输入只是一个巨大的压缩文件。我是否需要将其拆分为多个小文件以触发多个工作程序?还有什么其他方法可以使导入速度更快?我会错过num_workers设置中的某些内容吗?谢谢!


问题答案:

我对apache Beam不熟悉,答案是从一般流程的角度来看。

假设在各个输入文件部分的实体数据之间没有要考虑的依赖关系,那么是的,使用多个输入文件绝对有帮助,因为随后可以虚拟地并行处理所有这些文件(当然,这取决于可用的最大数量)。工作人员)。

您可能不需要事先拆分庞大的zip文件,如果与实际数据段处理相比,这种转换本身的开销可以忽略不计,则可能只需将单个输入数据流的段移交给单独的数据段工作者进行写入。 。

总体性能限制将是读取输入数据,将其拆分为多个段并移交给段数据工作者的速度。

数据段工作人员会将接收到的数据段进一步拆分为较小的块,最多等于最大500个实体,这些实体可以通过单个批处理操作转换为实体并写入到数据存储中。根据所使用的数据存储区客户端库的不同,有可能异步执行此操作,从而允许拆分成块并继续转换为实体,而无需等待之前的数据存储区写入完成。

数据段工作程序的性能限制将是将数据段拆分为多个块并将该块转换为实体的速度

如果异步操作不可用或吞吐量更高,则可以执行每个块的另一移交到段工作器,而段工作器执行到实体的转换和数据存储的批量写入。

那么,数据段工作程序级别的性能限制将仅仅是将数据段拆分为多个块并移交给块工作程序的速度。

使用这种方法,实际转换为实体并将它们批量写入数据存储区(无论是否异步)将不再位于拆分输入数据流的关键路径中,我认为这是您当前方法的性能限制。



 类似资料:
  • 人员管理-成员-批量导入-下载模板-上传文件

  • 我一直在通过与云存储桶直接关联的App Engine制作具有以下ACL属性的文件。 如果我想编辑和查看应用程序引擎脚本中的文件,这很好。然而,我希望能够从一个完全不同的Google App Engine项目ID.甚至是一个计算引擎访问这些文件。 由于当前ACL设置为private,我意识到这可能是不可能的。 在具有这些私有ACL文件的bucket中,我将不同项目ID的bucket权限设置为owne

  • 我正在从两个不同的谷歌工作表导入数据,并将它们合并到另一个工作表中。我使用的公式如下。 在上面的公式中,当两个工作表都有数据要导入时,importrange给出了结果,但是如果其中一个工作表没有数据要导入,则不会从另一个工作表导入数据。我在下面的链接中找到了一个解决方案,我们可以通过使用虚拟列引用来处理这个问题,当我们用很少的列导入很少的工作表时,这种方法是可以的,但是当我们从许多工作表和许多列导

  • 我在谷歌云存储中有各种存储桶,这些存储桶是从我的后端创建的。我想把这些桶导入firebase。在firebase中,有一个将google云存储桶导入firebase的选项,但我想自动化这些任务,因为我的应用程序中可以创建任意数量的存储桶,我无法始终转到firebase并将存储桶导入firebase。如何做到这一点?

  • 本文向大家介绍使用JDBC在MySQL数据库中如何快速批量插入数据,包括了使用JDBC在MySQL数据库中如何快速批量插入数据的使用技巧和注意事项,需要的朋友参考一下 使用JDBC连接MySQL数据库进行数据插入的时候,特别是大批量数据连续插入(10W+),如何提高效率呢? 在JDBC编程接口中Statement 有两个方法特别值得注意: Adds a set of parameters to t

  • 我已经为google cloud compute engine平台启用了使用导出设置,并为目标存储设置了桶。 已经快27个小时了,但报告说它不在桶里。 我读过这份文件,并遵循了完全相同的步骤。 桶的存储类重要吗?我有coldline存储类桶。