【问题标题】:Efficiently processing all data in a Cassandra Column Family with a MapReduce job使用 MapReduce 作业高效处理 Cassandra 列族中的所有数据
【发布时间】:2026-01-04 17:15:01
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: mapreduce cassandra


    【解决方案1】:

    我会作弊一点:

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

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

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

    这就是 Mahout CassandraDataModel 示例的功能:

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

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

    【讨论】:

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