【问题标题】:Cloud Bigtable multi-prefix scan in dataflow数据流中的 Cloud Bigtable 多前缀扫描
【发布时间】:2019-01-26 04:25:52
【问题描述】:

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

BigtableIO.readPBegin 作为输入,我想知道是否有类似SpannerIOreadAll API,其中BigtableIO 的读取API 输入可能是PCollectionReadOperations(例如,扫描),并从ReadOperations 中生成PCollection<Result>

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

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

【问题讨论】:

  • 我们的问题一模一样!!

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


【解决方案1】:

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

你的行有多大,是否足够小,一个工作人员可以处理几十万行?

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

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

如果您的行很大并且您需要将每个前缀扫描拆分到多个工作人员中,那么您将不得不增加上述方法:

  • 在 main() 中,发出 SampleRowKeys 请求,将给出粗略的分割点
  • 在手动扫描 DoFn 之前在管道中插入一个步骤,以使用来自 SampleRowsKeys 的结果拆分前缀。 IE。如果前缀是 a 并且 SampleRowKeys 包含 'ac'、'ap'、'aw',那么它应该发出的范围是 [a-ac)、[ac-ap)、[ap-aw)、[ aw-b)。分配一个分片 ID 并按它分组。
  • 将前缀输入到上面的手动扫描步骤。

【讨论】:

    猜你喜欢
    • 2020-04-14
    • 2019-10-13
    • 2018-04-05
    • 2017-04-08
    • 2018-11-03
    • 2017-08-23
    • 2015-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多