繁体   English   中英

创建自定义源以使用最新的python apache_beam cloud datafow sdk从云数据存储读取

[英]Creating custom source for reading from cloud datastore using latest python apache_beam cloud datafow sdk

最近,云数据流python sdk可用了,我决定使用它。 不幸的是,从云数据存储中读取数据的支持还没有到来,因此我不得不依靠编写自定义源代码,以便我可以像承诺的那样利用动态拆分,进度估计等优势。 我确实仔细研究了文档,但是无法将各个部分放在一起,从而可以加快整个过程。

更清楚地说,我的第一种方法是:

  1. 查询云数据存储
  2. 创建ParDo函数并将返回的查询传递给它。

但这花了13分钟才能遍历20万个条目。

因此,我决定编写可有效读取实体的自定义源。 但是由于我缺乏将各部分组合在一起的理解,所以无法实现这一目标。 任何人都可以帮助我如何创建自定义源以从数据存储读取数据。

编辑:对于第一种方法,指向我的要旨的链接是: https : //gist.github.com/shriyanka/cbf30bbfbf277deed4bac0c526cf01f1

谢谢。

在您提供的代码中,对数据存储区的访问发生在构建管道之前:

query = client.query(kind='User').fetch()

这将执行整个查询并读取Beam SDK之前的所有实体。

更准确地说, fetch()返回查询结果的惰性迭代,并且当您在beam.Create(query)处构造管道时,它们会进行迭代 -但是,这再次发生在管道启动之前的主程序中。 这很可能是耗时13分钟,而不是管道本身(但是请随时提供工作ID,以便我们更深入地了解)。 您可以通过对代码进行一些小的更改来验证这一点:

query = list(client.query(kind='User').fetch())

但是,我认为您的意图是同时读取处理实体。

特别是对于Cloud Datastore,自定义源API并非最佳选择。 原因是底层的Cloud Datastore API本身当前不提供实现自定义源“好东西”所需的属性,例如进度估计和动态拆分,因为其查询API非常通用(例如Cloud Bigtable,它总是返回按键排序的结果,因此例如您可以通过查看当前键来估算进度)。

当前,我们正在重写Java Cloud Datastore连接器,以使用不同的方法,该方法使用ParDo拆分查询,并使用ParDo读取每个子查询。 有关详细信息,请参见此请求请求

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM