google-cloud-dataflow – 数据流中的Cloud Bigtable多前缀扫描

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

BigtableIO.read将PBegin作为输入,我想知道是否有类似SpannerIO的readAll API,其中BigtableIO的读取API输入可以是ReadOperations的PCollection(例如,Scan),并产生PCollection 从那些ReadOperations.

我有一个用例,我需要有多个前缀扫描,每个前缀具有不同的前缀,并且具有相同前缀的行数可以很小(几百)或大(几十万).如果没有像ReadAll这样的东西可用.我正在考虑让DoFn进行“限制”扫描,如果限制扫描没有到达关键范围的末尾,我会将其拆分为更小的块.在我的情况下,密钥空间是均匀分布的,因此最后扫描的行可以很好地估计剩余行的数量(假设从扫描返回的所有密钥都小于最后扫描的密钥).

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

最佳答案 由于区域定位器逻辑,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和分组.
>从上面将前缀提供给手动扫描步骤.

点赞