在随机分区程序中过滤行键上的数据

时间:2012-12-11 04:28:26

标签: hadoop mapreduce cassandra

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

我们在cassandra中提供的大量数据中,我们只想获取特定行键的数据,但由于RandomPartitioner我们无法执行此操作 - 代码中存在断言。

任何人都可以指导我如何根据Cassandra级别本身的行键过滤数据(我知道数据是使用行键的散列分布在各个区域)?

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

我想使用cassandra MR来计算连续存储在cassandra中的数据的一些KPI。所以每次从cassandra中获取整个数据对我来说似乎是一个开销?我正在使用的rowkey就像“(timestamp / 60000)_otherid”;此CF包含存储在其他CF中的实际数据的rowkeys的引用。所以要计算KPI,我会在特定时间内工作并从其他CF获取数据,然后对其进行处理。

3 个答案:

答案 0 :(得分:2)

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

选择一个数据模型,允许您指定一个节俭SlicePredicate,它会为您提供一系列列,而不管是哪个键,如下所示:

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

或者通过忽略超出所需范围的输入键,使用地图阶段来完成此操作。

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

基本上,如果您仍想使用RandomPartitioner并希望能够执行范围切片,则需要创建反向索引(a.k.a.倒排索引)。我已经回答了一个涉及时间戳的类似问题here

能够以编程方式生成rowkeys,可以在rowkeys上模拟范围切片。为此,您必须编写自己的InputFormat类并手动生成拆分。