数据流中的Cloud Bigtable多前缀扫描

时间:2018-08-20 04:00:20

标签: google-cloud-dataflow google-cloud-bigtable

更新:似乎最近发布的org.apache.beam.sdk.io.hbase-2.6.0包含HBaseIO.readAll() API。我在google dataflow中进行了测试,它似乎正在工作。在Google Cloud Dataflow设置中直接使用HBaseIO会不会有任何问题或陷阱?

BigtableIO.readPBegin作为输入,我想知道是否有像SpannerIO的{​​{1}} API这样的东西,其中readAll是读取的API输入可能是BigtableIO中的PCollection(例如,扫描),并从这些ReadOperations中产生了PCollection<Result>

我有一个用例,其中我需要进行多个前缀扫描,每个扫描具有不同的前缀,并且具有相同前缀的行数可以小(几百个)或大(几十万个)。如果没有类似ReadOperation的东西。我正在考虑让ReadAll进行“限制”扫描,如果限制扫描未达到键范围的末尾,我会将其分成较小的块。就我而言,密钥空间是均匀分布的,因此可以通过最后扫描的行很好地估计剩余行的数量(假设从扫描返回的所有小于最后扫描的密钥的密钥)。

道歉,如果以前曾问过类似的问题。

1 个答案:

答案 0 :(得分:1)

由于区域定位器逻辑,HBaseIO与Bigtable HBase连接器不兼容。而且我们还没有为Bigtable实现SplittableDoFn api。

您的行有多大,它们足够小以至于可以由一个工人处理数十万行的扫描?

如果是,那么我将假设您尝试并行化的昂贵工作在您的管道中进一步进行。在这种情况下,您可以:

  • 创建AbstractCloudBigtableTableDoFn的子类
  • 在DoFn中,直接使用提供的客户端,对每个前缀元素进行扫描
  • 应该将扫描产生的每一行分配一个碎片ID,并以KV(碎片ID,行)的形式发出。分片ID应该是int mod的增量模数,它是工作程序数量的倍数。
  • 然后在自定义DoFn之后执行GroupBy,以散开碎片。进行GroupByKey允许扇出非常重要,否则单个工作人员将不得不处理所有发出的行作为前缀。

如果行很大,并且您需要将每个前缀扫描划分给多个工作程序,则您将不得不增强上述方法:

  • 在main()中,发出SampleRowKeys请求,该请求将给出粗略的分割点
  • 在手动扫描DoFn之前使用您的SampleRowsKeys的结果在前缀中插入步骤,以拆分前缀。即。如果前缀为a,并且SampleRowKeys包含'ac','ap','aw',则它应发出的范围为[a-ac),[ac-ap),[ap-aw) ,[aw-b)。分配一个分片ID并按其分组。
  • 从上方将前缀提供给手动扫描步骤。