我需要在我的Cassandra集群上执行MapReduce,包括数据局部性,即。每个作业仅查询属于运行作业的本地Casandra节点的行。
关于如何在较旧的Cassandra版本(0.7)上设置Hadoop for MR的教程已经存在。我找不到当前版本的内容。
在这方面自0.7以来发生了什么变化?
最小化设置需要哪些软件模块(Hadoop + HDFS + ...)?
我需要Cassandra Enterprise吗?
答案 0 :(得分:14)
Cassandra包含一些足以与Hadoop集成的类:
ColumnFamilyInputFormat
- 这是Map函数的输入,当使用Cassandra的随机分区器时,它可以读取单个CF中的所有行,或者当与Cassandra的有序分区器一起使用时,它可以读取行范围。 Cassandra集群具有环形形式,其中每个环部分负责具体的关键范围。输入格式的主要任务是将Map输入划分为可以并行处理的数据部分 - 这些部分称为InputSplits
。在Cassandra案例中,这很简单 - 每个环范围都有一个主节点,这意味着输入格式将为每个环元素创建一个InputSplit
,这将导致一个Map任务。现在我们想在存储数据的同一主机上执行Map任务。每个InputSplit
都会记住其环部分的IP地址 - 这是负责此特定密钥范围的Cassandra节点的IP地址。 JobTracker
将从InputSplits
创建地图任务,并将其分配给TaskTracker
以供执行。 JobTracker
会尝试查找与TaskTracker
具有相同IP地址的InputSplit
- 基本上我们必须在Cassandra主机上启动TaskTracker
,这样可以保证数据的位置。ColumnFamilyOutputFormat
- 这为Reduce函数配置上下文。这样结果可以存储在Cassandra 基本上使用提供的Hadoop集成可以在数据所在的主机上执行Map作业,而Reduce函数可以将结果存储回Cassandra - 这就是我所需要的。
执行Map-Reduce有两种可能性:
org.apache.hadoop.mapreduce.Job
- 此类在一个进程中模拟Hadoop。它执行Map-Resuce任务并且不需要任何其他服务/依赖项,它只需要访问临时目录来存储来自shuffle的map job的结果。基本上我们必须在Job类上调用几个setter,其中包含Map任务的类名,Reduce任务,输入格式,Cassandra连接等等,当设置完成时job.waitForCompletion(true)
必须被调用 - 它启动Map-Reduce任务并等待结果。该解决方案可用于快速进入Hadoop世界,并进行测试。它不会扩展(单个进程),它将通过网络获取数据,但仍然 - 它可以开始。答案 1 :(得分:3)
是的,我一直在寻找同样的东西,似乎DataStaxEnterprise有一个简化的Hadoop集成, 阅读此http://wiki.apache.org/cassandra/HadoopSupport