【问题标题】:Filter data on row key in Random Partitioner在 Random Partitioner 中按行键过滤数据
【发布时间】:2012-12-13 21:59:52
【问题描述】:

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

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

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

使用二级索引(仍在尝试了解它们的工作原理)会解决我的问题还是有其他解决方法?

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

【问题讨论】:

  • 您是在编写自己的 InputFormat 还是使用 Cassandra 的?
  • @tysonjh 我正在使用 Cassandra MR 提供的默认 InputFormat - ColumnFamilyInputFormat.java。
  • @All 让我分享更多细节。我想使用 cassandra MR 来计算一些 KPI 的数据,这些数据连续存储在 cassandra 中。所以这里每次都从 cassandra 获取整个数据对我来说似乎是一种开销?我使用的 rowkey 就像 "(timestamp/60000)_otherid";此 CF 包含对存储在其他 CF 中的实际数据的行键的引用。因此,为了计算 KPI,我将工作一分钟并从其他 CF 获取数据并进行处理。
  • @AyushV 我在这里没有看到问题...您已经在 timestamp/60000_otherid 列族中使用二级索引从其他 CF 获取数据。您不会获取所有数据,而是根据您的索引 CF 获取您感兴趣的时间范围内的数据。假设你可以随意生成这个otherid,你可以模拟一个范围切片来创建你的 MapR 分割。
  • 您想按列范围获取。如果您的键只是存储桶,那么列名就是您所关心的。

标签: hadoop mapreduce cassandra


【解决方案1】:

使用 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);

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

【讨论】:

  • 感谢您的回复。根据 Cassandra API Wiki (wiki.apache.org/cassandra/API),SliceRange 可以被认为是 Cassandra 的 LIMIT 和 ORDER BY 版本。同时我无法在 Map 中过滤我的数据,因为它是 BigData,它会随着时间的推移不断增加。因此,我认为这不是一个好方法。似乎 cassandra 唯一的解决方案就是从 RandomPartioner 切换到 OrderPreserving 。我现在正在尝试集成 Hector 和 Hadoop code.google.com/p/hector-hadoop-integration/source/detail?r=3
  • 您不想使用 ByteOrderedPartitioner(OPP 的新名称),因为它会创建热点。我认为地图正是您想要的,正是因为您正在处理如此多的数据。 Hadoop 旨在读取每个作业中的所有数据,实际上这很常见。这就是您与数据局部性并行运行它的原因。此外,如果您有一个允许对列进行范围查询的数据模型,那么切片谓词对于 Hadoop 非常有用。由于此类模型是 Cassandra 中最常见的模型之一,因此这是一种有用的技术。
  • @rs_etl 虽然我的搜索要求符合 BOP,但由于写入性能高(14000 TPS),我必须使用 RandomPartioner。让我分享更多细节。我想使用 cassandra MR 来计算一些 KPI 的数据,这些数据连续存储在 cassandra 中。所以这里每次都从 cassandra 获取整个数据对我来说似乎是一种开销?我使用的 rowkey 就像 "(timestamp/60000)_otherid";此 CF 包含对存储在其他 CF 中的实际数据的行键的引用。因此,为了计算 KPI,我将工作一分钟并从其他 CF 获取数据并进行处理。
  • @AyushVatsyayan 为什么不使用时间桶作为您的行键,那么您可以使用复合列名,这样您就可以使用切片谓词进行范围查询。否则,只需在地图中执行,因为 14k TPS 并没有那么多,Hadoop 肯定可以处理它。
  • 然后按照之前的建议使用时间桶密钥。这将通过允许您在切片谓词中指定已知键范围来消除重复工作。
【解决方案2】:

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

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

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

【讨论】:

  • 问题是关于如何使用 Hadoop 来做到这一点,它根本不使用高级客户端。仅支持 thrift 查询谓词。
  • @Sarge,感谢您的回复。是的,你是对的,按行键搜索很常见,但它不适用于 RandomPartitioner,其中数据基于键的哈希分散在区域中(以避免热点)。 Cassandra的MR只支持thrift。我正在努力实现 Hadoop 和 Hector 的集成code.google.com/p/hector-hadoop-integration/source/detail?r=3
  • 按行键搜索确实适用于 RandomPartitioner - 这是假设您正在寻找单个行键。否则 rs_atl 的回答很好。
  • @Sarge 是的,我正在寻找单行键。能否请您帮助我如何使用随机分区器进行行键搜索。
  • 他说的是使用高级客户端而不是 Hadoop 进行的常规按键获取查询。
【解决方案3】:

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

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

【讨论】:

  • 这似乎是 Cassandra 建议中最常被重复的部分之一!
猜你喜欢
  • 2018-08-13
  • 1970-01-01
  • 2016-05-03
  • 1970-01-01
  • 2021-06-06
  • 2016-11-20
  • 1970-01-01
  • 2019-12-30
相关资源
最近更新 更多