Google cloud dataflow Google Cloud BigTable:更新列值
我有以下BigTable结构作为示例:Google cloud dataflow Google Cloud BigTable:更新列值,google-cloud-dataflow,apache-beam,bigtable,google-cloud-bigtable,Google Cloud Dataflow,Apache Beam,Bigtable,Google Cloud Bigtable,我有以下BigTable结构作为示例: Table1 : column_family_1 : column_1 : value 值这里是一个数字。这是由数据流管理的,我希望每次都更新该值 该值可能是一个金额,我希望在用户每次购买时更新该值(以保持截至日期的总花费),因此我在purchase event listener数据流中执行以下操作(每当遇到购买事件时): 发出BigTable请求以按id获取值 将新购买花费的金额添加到BigTable搜索响应中的金额 发出Put请求以更新值 虽然这
Table1 : column_family_1 : column_1 : value
值
这里是一个数字。这是由数据流管理的,我希望每次都更新该值
该值可能是一个金额,我希望在用户每次购买时更新该值(以保持截至日期的总花费),因此我在purchase event listener数据流中执行以下操作(每当遇到购买事件时):
- 发出BigTable请求以按id获取值
- 将新购买花费的金额添加到BigTable搜索响应中的金额
- 发出
请求以更新值Put
- Worker 1获取事件1,获取金额并将花费的金额添加到其中
- Worker 2获取事件2,获取旧的金额并将花费的金额添加到其中
- 两个工作人员都发出
请求,并被覆盖Put
为了防止出现这种情况,我试图发出一个请求,它只是用纯文本表示,
在“花费金额”值中添加10。这是我们在数据流中可以做的吗?Bigtable能够增加值。您可以在中看到更多详细信息
幂等性在理解Bigtable中的计数器方面起着重要作用。
在Bigtable中,Put
s通常是幂等的,这意味着您可以多次运行它们并始终得到相同的结果(a=2
将产生相同的结果,无论运行多少次)<代码>增量
s不是幂等的,因为多次运行它们将产生不同的结果(a++
,a++
的结果与a++
,a++
,a++
的结果不同)
瞬时故障可能执行或可能不执行增量
。客户端永远不清楚在这些瞬时错误期间,增量是否成功
由于这种幂等性,在数据流中构建这个增量
特性非常复杂。数据流有一个“bundle”的概念,它是作为工作单元的一组操作。对于瞬时故障,将重试这些捆绑包(您可以阅读有关数据流瞬时故障重试的更多信息)。数据流将“bundle”视为一个单元,bug Cloud Bigtable必须将“bundle”中的每个单独项目视为一个不同的事务,因为Cloud Bigtable不支持多行事务
鉴于“bundles”的预期行为不匹配,Cloud Bigtable将不允许您通过数据流运行Increment
s
您拥有的选项应该得到比我在此提供的更多的文档,但我可以提供一些高级别的选项:
对于发现的任何新事件,始终使用Put
,并对读取的值进行汇总。您还可以编写另一个作业,通过创建删除所有当前值的“事务”来定期清理行,并使用总和写入新单元格
用于侦听发布/订阅事件并执行增量。这是一个例子。您还可以使用您在帖子中描述的算法执行Get
、执行加法和执行CheckAndMutate
(如果我选择此选项,我个人会选择CheckAndMutate
以确保一致性)
用于编写自己的执行增量的DoFn
或CheckAndMutate
,但要理解这可能会导致数据完整性问题
如果系统足够大,选项#1是最稳健的选项,但会以系统复杂性为代价。如果你不想那么复杂,那么选择#2是你的下一个最佳选择(尽管我会选择CheckAndMutate
)。如果您不关心数据完整性,并且需要高吞吐量(如“页面计数”或其他遥测,在这些情况下,一小部分时间是错误的),那么选项3将是您的最佳选择。Bigtable具有增加值的功能。您可以在中看到更多详细信息
幂等性在理解Bigtable中的计数器方面起着重要作用。
在Bigtable中,Put
s通常是幂等的,这意味着您可以多次运行它们并始终得到相同的结果(a=2
将产生相同的结果,无论运行多少次)<代码>增量
s不是幂等的,因为多次运行它们将产生不同的结果(a++
,a++
的结果与a++
,a++
,a++
的结果不同)
瞬时故障可能执行或可能不执行增量
。客户端永远不清楚在这些瞬时错误期间,增量是否成功
由于这种幂等性,在数据流中构建这个增量
特性非常复杂。数据流有一个“bundle”的概念,它是作为工作单元的一组操作。对于瞬时故障,将重试这些捆绑包(您可以阅读有关数据流瞬时故障重试的更多信息)。数据流将“bundle”视为一个单元,bug Cloud Bigtable必须将“bundle”中的每个单独项目视为一个不同的事务,因为Cloud Bigtable不支持多行事务
鉴于“bundles”的预期行为不匹配,Cloud Bigtable将不允许您通过数据流运行Increment
s
您拥有的选项应该得到比我在此提供的更多的文档,但我可以提供一些高级别的选项:
对于您发现的任何新事件,始终使用Put
,并将Rea上的值相加