更新:似乎最近发布了org.apache.beam.sdk.io.hbase-2.6.0
包括HBaseIO.readAll()
API。我在谷歌数据流中进行了测试,它似乎有效。使用 HBaseIO
会不会有任何问题或陷阱?直接在 Google Cloud Dataflow 设置中吗?
BigtableIO.read
需要PBegin
作为输入,我想知道是否有类似 SpannerIO
的内容的readAll
API,其中BigtableIO
的读取 API 输入可能是 PCollection
的ReadOperations
(例如,扫描),并生成 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/