5

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

存在教程,介绍如何在旧 Cassandra 版本 (0.7) 上为 MR 设置 Hadoop。对于当前版本,我找不到这样的。

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

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

我需要 Cassandra Enterprise 吗?

4

2 回答 2

14

Cassandra 包含一些足以与 Hadoop 集成的类:

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

基本上使用提供的 Hadoop 集成可以在数据所在的主机上执行 Map 作业,而 Reduce 函数可以将结果存储回 Cassandra——这就是我所需要的。

执行 Map-Reduce 有两种可能性:

  • org.apache.hadoop.mapreduce.Job- 此类在一个进程中模拟 Hadoop。它执行 Map-Resuce 任务并且不需要任何额外的服务/依赖项,它只需要访问临时目录来存储映射作业的结果以进行 shuffle。基本上我们必须在 Job 类上调用一些设置器,其中包含诸如 Map 任务、Reduce 任务、输入格式、Cassandra 连接的类名,当设置完成job.waitForCompletion(true)时必须调用 - 它启动 Map-Reduce 任务并等待结果。该解决方案可用于快速进入 Hadoop 世界并进行测试。它不会扩展(单个进程),它会通过网络获取数据,但仍然 - 它可以开始。
  • 真正的 Hadoop 集群 - 我还没有设置它,但据我了解,上一个示例中的 Map-Reduce 作业可以正常工作。我们还需要额外的 HDFS,它将用于在 Hadoop 集群中分发包含 Map-Reduce 类的 jar。
于 2012-10-17T06:59:17.140 回答
3

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

于 2012-10-06T14:11:13.367 回答