在不同时间通过多个进程更新 Cassandra 行
Updating a Cassandra row by multiple processes in different times
我正在计划一些最终将 "fill" Cassandra 中的同一行的 ETL,即如果 table 定义为:
CREATE TABLE MyTable (
key text,
column1 text,
column2 text,
column3 text,
column4 text,
PRIMARY KEY (key)
)
很少有 ETL 会在不同时间在第 1-4 列中填写适当的值。
cassandra 处理此类操作的效果如何?我应该先读取该行,更新代码然后写回,还是一个 UPDATE 调用就可以解决问题?
我知道 Cassandra 针对写入吞吐量进行了高度优化,因为它从不修改磁盘上的数据,它只会附加到现有文件或创建新文件。知道了这一点,并且没有深入研究实现,我担心如果一个 ETL 将写入 column4,而 20 分钟后另一个 ETL 将写入 column2,与等待所有 ETL 完成相比,我将失去很多性能并且比批量保存所有数据(这本身并不是一个简单的实现)。
想法?
Cassandra中的所有inserts/updates都是Upserts,Cassandra使用last-write-wins来解决冲突。如果您的 ETL 正在更新不同的列,则不会有问题。如果他们更新同一列,则最后更新的列将获胜。如果这是一个问题,您可以添加一个时间戳列作为聚类键(允许数据的多个值),并在读取期间读取最新的一个。您还可以添加 TTL,以便清除不相关的旧值。
如果某些列已更新,而其他列未更新,则在查询时您将有效地为这些列获取空值。
我无法真正理解你的最后一段。您能解释一下您的顾虑吗?
我正在计划一些最终将 "fill" Cassandra 中的同一行的 ETL,即如果 table 定义为:
CREATE TABLE MyTable (
key text,
column1 text,
column2 text,
column3 text,
column4 text,
PRIMARY KEY (key)
)
很少有 ETL 会在不同时间在第 1-4 列中填写适当的值。
cassandra 处理此类操作的效果如何?我应该先读取该行,更新代码然后写回,还是一个 UPDATE 调用就可以解决问题?
我知道 Cassandra 针对写入吞吐量进行了高度优化,因为它从不修改磁盘上的数据,它只会附加到现有文件或创建新文件。知道了这一点,并且没有深入研究实现,我担心如果一个 ETL 将写入 column4,而 20 分钟后另一个 ETL 将写入 column2,与等待所有 ETL 完成相比,我将失去很多性能并且比批量保存所有数据(这本身并不是一个简单的实现)。
想法?
Cassandra中的所有inserts/updates都是Upserts,Cassandra使用last-write-wins来解决冲突。如果您的 ETL 正在更新不同的列,则不会有问题。如果他们更新同一列,则最后更新的列将获胜。如果这是一个问题,您可以添加一个时间戳列作为聚类键(允许数据的多个值),并在读取期间读取最新的一个。您还可以添加 TTL,以便清除不相关的旧值。
如果某些列已更新,而其他列未更新,则在查询时您将有效地为这些列获取空值。
我无法真正理解你的最后一段。您能解释一下您的顾虑吗?