我需要在我的 Cassandra 集群上执行 MapReduce,包括数据局部性,即。每个作业仅查询属于作业运行的本地 Casandra 节点的行。
存在教程,介绍如何在旧 Cassandra 版本 (0.7) 上为 MR 设置 Hadoop。对于当前版本,我找不到这样的。
自 0.7 以来在这方面发生了什么变化?
最小设置(Hadoop+HDFS+...)需要哪些软件模块?
我需要 Cassandra Enterprise 吗?
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 中基本上使用提供的 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 世界并进行测试。它不会扩展(单个进程),它会通过网络获取数据,但仍然 - 它可以开始。是的,我一直在寻找同样的东西,似乎 DataStaxEnterprise 具有简化的 Hadoop 集成,请阅读此http://wiki.apache.org/cassandra/HadoopSupport