2012-09-25 166 views
4

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

有关如何在较旧的Cassandra版本(0.7)上设置Hadoop for MR的教程。我无法找到当前版本。

这方面0.7以来有什么变化?

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

我需要Cassandra Enterprise吗?

回答

13

卡桑德拉包含几类这些都足以与Hadoop的集成:

  • ColumnFamilyInputFormat - 这是一个Map函数的输入,它可以在使用Cassandra的随机分区时读取单个CF中的所有行,也可以在与Cassandra的有序分区器一起使用时读取行范围。 Cassandra集群具有环形形式,其中每个环形部分负责具体的键范围。输入格式的主要任务是将Map输入分为可并行处理的数据部分 - 这些部分被称为InputSplits。在Cassandra的情况下,这很简单 - 每个环范围都有一个主节点,这意味着输入格式将为每个环元素创建一个InputSplit,并且将导致一个Map任务。现在我们想在存储数据的同一台主机上执行我们的Map任务。每个InputSplit都会记住其环部分的IP地址 - 这是负责该特定键范围的Cassandra节点的IP地址。 JobTracker将创建地图任务表InputSplits并将它们分配给TaskTracker执行。 JobTracker将尝试找到TaskTracker,它具有与InputSplit相同的IP地址 - 基本上我们必须在Cassandra主机上启动TaskTracker,这将保证数据的局部性。
  • ColumnFamilyOutputFormat - 为Reduce功能配置上下文。因此结果可以存储在Cassandra中
  • 所有Map函数的结果必须在它们传递给reduce函数之前合并在一起 - 这称为shuffle。它使用本地文件系统 - 从Cassandra的角度来看,这里不需要做任何事情,我们只需要配置到本地临时目录的路径。此外,没有必要用其他方法替代此解决方案(如坚持Cassandra) - 此数据不必复制,Map任务是幂等的。

基本上使用提供Hadoop的集成放弃可能性数据所在执行上的主机地图作业,减少功能可以存储结果返回到卡桑德拉 - 这是我所需要的。

有执行两种可能的map-reduce:

  • org.apache.hadoop.mapreduce.Job - 这个类的一个过程模拟的Hadoop。它执行Map-Resuce任务,不需要任何附加服务/依赖关系,只需访问临时目录即可存储来自映射作业的结果以进行随机播放。基本上我们必须在Job类中调用几个setter,它包含像Map任务,Reduce任务,输入格式,Cassandra连接等类的名称,安装完成后必须调用job.waitForCompletion(true) - 它会启动Map-Reduce任务并等待结果。此解决方案可用于快速进入Hadoop世界并进行测试。它不会扩展(单个进程),并且它会通过网络获取数据,但仍然 - 开始时会很好。
  • 真正的Hadoop集群 - 我没有设置它,但据我了解,从前面的例子的Map-Reduce作业将工作得很好。我们还需要HDFS,它将用于分发Hadoop集群中包含Map-Reduce类的jar。
3

是的,我一直在寻找同样的事情,似乎DataStaxEnterprise具有简化Hadoop的整合, 阅读本http://wiki.apache.org/cassandra/HadoopSupport

+2

DataStax Enterprise确实简化了Cassandra/Hadoop集成,每个节点花费约8000英镑。 – felbus