0

我正在研究 Cassandra Hadoop 集成 (MapReduce)。我们习惯于RandomPartitioner插入数据以获得更快的写入速度。现在我们必须在 MapReduce 中从 Cassandra 读取该数据并对其执行一些计算。

从我们在 cassandra 中拥有的大量数据中,我们只想为特定的行键获取数据,但由于RandomPartitioner- 代码中有一个断言,我们无法做到这一点。

谁能指导我如何根据 Cassandra 级别本身的行键过滤数据(我知道数据使用行键的哈希分布在各个区域)?

使用二级索引(仍然试图了解它们是如何工作的)会解决我的问题还是有其他解决方法?

我想使用 cassandra MR 来计算一些 KPI 的数据,这些数据连续存储在 cassandra 中。所以这里每次都从 cassandra 获取整个数据对我来说似乎是一种开销?我使用的 rowkey 就像 "(timestamp/60000)_otherid"; 此 CF 包含对存储在其他 CF 中的实际数据的行键的引用。因此,为了计算 KPI,我将工作一分钟并从其他 CF 获取数据并进行处理。

4

3 回答 3

2

使用 RandomPartitioner 时,键未排序,因此您无法对键进行范围查询以限制数据。二级索引适用于列而不是键,因此它们也不会帮助您。您有两种过滤数据的选项:

选择一个允许您指定 thrift 的数据模型SlicePredicate,这将为您提供一系列列,而不管键如何,如下所示:

SlicePredicate predicate = new SlicePredicate().setSlice_range(new SliceRange(ByteBufferUtil.bytes(start), ByteBufferUtil.bytes(end), false, Integer.MAX_VALUE));
ConfigHelper.setInputSlicePredicate(conf, predicate);

或者使用您的地图阶段通过简单地忽略超出您所需范围的输入键来执行此操作。

于 2012-12-11T20:51:46.330 回答
0

我不熟悉 Cassandra Hadoop 集成,但尝试了解如何使用哈希系统自己查询数据可能是错误的方法。

我会查看您正在使用的 Cassandra 客户端(Hector、Astynax 等)并询问如何通过行键查询。

按行键查询是 Cassandra 中非常常见的操作。

于 2012-12-11T17:48:42.017 回答
0

本质上,如果您仍想使用 RandomPartitioner 并希望能够进行范围切片,则需要创建反向索引(也称为反向索引)。我在这里回答了一个涉及时间戳的类似问题。

具有以编程方式生成行键的能力允许您在行键上模拟范围切片。为此,您必须编写自己的 InputFormat 类并手动生成拆分。

于 2012-12-12T14:32:20.123 回答