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

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

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

BigtableIO.read 需要PBegin作为输入,我想知道是否有类似 SpannerIO 的内容的readAll API,其中BigtableIO的读取 API 输入可能是 PCollectionReadOperations (例如,扫描),并生成 PCollection<Result>来自那些ReadOperation s。

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

如果之前曾提出过类似问题,我们深表歉意。

最佳答案

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

您的行有多大,它们是否足够小以至于单个工作人员可以处理扫描几十万行?

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

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

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

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

关于google-cloud-dataflow - 数据流中的 Cloud Bigtable 多前缀扫描,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51923989/

相关文章:

go - 从 Go 应用的 Dataflow 模板创建作业

google-cloud-dataflow - 如何在IDE上本地开发Beam Pipeline并在Dataflow上运行?

java - 使用 Apache Beam 进行窗口化 - 修复了 Windows 似乎没有关闭的问题?

python - 将 Google Cloud Storage 数据加载到 bigtable 中

java - 如何使用 HBase API 删除 Google Cloud Bigtable 中单行的列

google-cloud-dataflow - 阅读前在数据流中解压缩文件

python - 如何在从数据实验室运行的数据流管道中使用谷歌云存储

google-cloud-bigtable - 使用 Deployment Manager 部署 Google Cloud Bigtable

azure - 用于查询某个范围内的值的表存储设计

json - Bigtable/HBase : Rich column family vs a single JSON Object