我想在MapReduce作业中处理列族中的所有数据。订购并不重要。
一种方法是迭代列族的所有行键以用作输入。这可能是一个潜在的瓶颈,可以用并行方法代替。
我愿意接受其他建议,或者有人告诉我,我在这个想法上浪费时间。我目前正在调查以下内容:
一种可能更有效的方法是为输入分配范围,而不是在所有行键上迭代(在映射器启动之前)。由于我使用的是RandomPartitioner
,是否有一种方法可以指定基于MD5的查询范围?
例如,我想将任务划分为16个作业。由于RandomPartitioner
是基于MD5的(根据我所读到的内容),我想查询从a
开始的第一个范围的所有内容。换句话说,我该如何在MD5上查询以a
开头、在b
之前结束的get_range。例如a0000000000000000000000000000000 - afffffffffffffffffffffffffffffff
?
我正在使用pycassa API(Python),但我很高兴看到Java示例。
我会作弊一点:
- 创建新行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:如何使用Cassandra';使用或不使用清管器的s Map Reduce?