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

Google cloud dataflow 数据流中的Cloud Bigtable多前缀扫描,google-cloud-dataflow,google-cloud-bigtable,Google Cloud Dataflow,Google Cloud Bigtable,更新:最近发布的org.apache.beam.sdk.io.hbase-2.6.0似乎包括HBaseIO.readAll()api。我在GoogleDataflow中进行了测试,它似乎正在工作。直接在谷歌云数据流设置中使用HBaseIO会有任何问题或陷阱吗 将PBegin作为输入,我想知道是否有类似span的readAllAPI的东西,BigtableIO的读取API输入可以是读取操作的PCollection(例如,扫描),并从这些ReadOperations生成PCollection 我有一

更新:最近发布的
org.apache.beam.sdk.io.hbase-2.6.0
似乎包括
HBaseIO.readAll()
api。我在GoogleDataflow中进行了测试,它似乎正在工作。直接在谷歌云数据流设置中使用
HBaseIO
会有任何问题或陷阱吗

PBegin
作为输入,我想知道是否有类似
span
readAll
API的东西,
BigtableIO
的读取API输入可以是
读取操作的
PCollection
(例如,扫描),并从这些
ReadOperation
s生成
PCollection

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


如果以前有人问过类似问题,请道歉。

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

您的行有多大,它们是否足够小,以至于一个工人可以扫描几十万行

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

  • 创建的子类
  • 在DoFn中,直接使用提供的客户机,对每个前缀元素进行扫描
  • 扫描产生的每一行应分配一个碎片id,并作为KV(碎片id,行)发射。shard id应该是worker数的整数倍
  • 然后在自定义DoFn之后执行GroupBy以扇出碎片。执行GroupByKey以允许扇出是很重要的,否则单个工作进程将不得不处理前缀的所有发出行
如果您的行很大,并且您需要将每个前缀扫描拆分为多个工作线程,那么您必须扩展上述方法:

  • 在main()中,发出SampleRowKeys请求,该请求将给出大致的分割点
  • 在手动扫描DoFn之前,在管道中插入一个步骤,以使用关键字的结果分割前缀。即,如果前缀为
    a
    且SampleRowKeys包含'ac','ap','aw',则其应发出的范围为[a-ac]、[ac-ap]、[ap-aw]、[aw-b)。分配碎片id并按其分组
  • 从上面将前缀输入手动扫描步骤

我们有完全相同的问题!!