使用 MapReduce 作业高效处理 Cassandra 列族中的所有数据

Posted

技术标签:

【中文标题】使用 MapReduce 作业高效处理 Cassandra 列族中的所有数据【英文标题】:Efficiently processing all data in a Cassandra Column Family with a MapReduce job 【发布时间】:2012-02-06 02:41:21 【问题描述】:

我想在 MapReduce 作业中处理列族中的所有数据。排序并不重要。

一种方法是遍历列族的所有行键以用作输入。这可能是一个潜在的瓶颈,可以用并行方法代替。

我愿意接受其他建议,或者有人告诉我我在浪费时间在这个想法上。我目前正在调查以下内容:

一种可能更有效的方法是将范围分配给输入,而不是遍历所有行键(在映射器启动之前)。由于我使用的是RandomPartitioner,有没有办法根据MD5指定查询范围?

例如,我想将任务拆分为 16 个作业。由于RandomPartitioner 是基于MD5 的(根据我的阅读),我想查询以a 开头的所有内容以获取第一个范围。换句话说,我将如何查询以a 开头并在b 之前结束的MD5 上的get_range。例如a0000000000000000000000000000000 - afffffffffffffffffffffffffffffff?

我正在使用 pycassa API (Python),但我很高兴看到 Java 示例。

【问题讨论】:

【参考方案1】:

我会作弊一点:

    创建新行 job_(n),每列代表所需范围内的每个行键 从该特定行中提取所有列以指示您应该从 CF 中提取哪些行

我对用户这样做。来自特定国家/地区的用户会在特定国家/地区的行中获得一列。特定年龄的用户也会被添加到特定行。

允许我根据我想要的标准快速提取我需要的行,并且与提取所有内容相比效率更高。

这就是 Mahout CassandraDataModel 示例的功能:

https://github.com/apache/mahout/blob/trunk/integration/src/main/java/org/apache/mahout/cf/taste/impl/model/cassandra/CassandraDataModel.java

一旦您拥有数据并可以提取您感兴趣的行,您就可以将其交给您的 MR 工作。

或者,如果速度不是问题,请考虑使用 PIG:How to use Cassandra's Map Reduce with or w/o Pig?

【讨论】:

据我所知,您是在描述为每个行键创建一个面向列的索引(以及国家/年龄/等的隔离)?它并没有完全解决最初的问题,因为我还没有在列中索引这些。将它们编入索引将在将来为这项工作的多次重复节省时间,因此我会将您的答案作为潜在的接受。 啊,我明白了......然后误解了你的问题。当插入发生时,我确保它们被适当地填充,以节省我将来的返工。但是,当需要新索引时,我会将用户的所有数据提取到内存中的 lucene 索引中并使用它来生成...

以上是关于使用 MapReduce 作业高效处理 Cassandra 列族中的所有数据的主要内容,如果未能解决你的问题,请参考以下文章

Hadloop

大数据处理技术作业——使用HBase&MongoDB&MapReduce进行数据存储和管理

大数据处理技术作业——使用HBase&MongoDB&MapReduce进行数据存储和管理

使用MapReduce的优化

使用MapReduce的优化

减少 HFileOutputFormat 中待处理的作业