Cassandra和MapReduce - 最小的设置要求

时间:2012-09-25 13:19:39

标签: hadoop mapreduce cassandra

我需要在我的Cassandra集群上执行MapReduce,包括数据局部性,即。每个作业仅查询属于运行作业的本地Casandra节点的行。

关于如何在较旧的Cassandra版本(0.7)上设置Hadoop for MR的教程已经存在。我找不到当前版本的内容。

在这方面自0.7以来发生了什么变化?

最小化设置需要哪些软件模块(Hadoop + HDFS + ...)?

我需要Cassandra Enterprise吗?

2 个答案:

答案 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
  • 所有Map函数的结果必须在它们被传递到reduce函数之前组合在一起 - 这称为shuffle。它使用本地文件系统 - 从Cassandra的角度来看,这里没什么必须做的,我们只需要配置本地临时目录的路径。此外,没有必要用其他东西替换这个解决方案(比如坚持使用Cassandra) - 这些数据不需要复制,Map任务也是幂等的。

基本上使用提供的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世界,并进行测试。它不会扩展(单个进程),它将通过网络获取数据,但仍然 - 它可以开始。
  • 真正的Hadoop集群 - 我还没有设置它,但据我所知,上一个示例中的Map-Reduce作业可以正常工作。我们还需要HDFS,它将用于在Hadoop集群中分发包含Map-Reduce类的jar。

答案 1 :(得分:3)

是的,我一直在寻找同样的东西,似乎DataStaxEnterprise有一个简化的Hadoop集成, 阅读此http://wiki.apache.org/cassandra/HadoopSupport