云计算 频道

云计算技术介绍:神奇的小飞象Hadoop

  这里提供一个示例,帮助您理解它。假设输入域是:我爱中国云计算网,我爱云计算技术论坛。在这个域上运行Map 函数将得出以下的键/值对列表:

  如果对这个键/值对列表应用Reduce 函数,将得到以下一组键/值对:结果是对输入域中的单词进行计数,这无疑对处理索引十分有用。但是,现在假设有两个输入域,第一个是“我爱中国云计算网”,第二个是“我爱云计算技术论坛”。您可以在每个域上执行Map 函数和Reduce 函数,然后将这两个键/值对列表应用到另一个Reduce 函数,这时得到与前面一样的结果。换句话说,可以在输入域并行使用相同的操作,得到的结果是一样的,但速度更快。这便是MapReduce 的威力;它的并行功能可在任意数量的系统上使用。图5 演示了MapReduce 的思想。

5. 任务粒度——Hadoop 是如何并行的
▲  

5. 任务粒度——Hadoop 是如何并行的

5. 任务粒度——Hadoop 是如何并行的
▲图5

  一个代表客户机在单个主系统上启动的MapReduce 应用程序称为JobTracker。类似于NameNode,它是Hadoop 集群中惟一负责控制MapReduce 应用程序的系统。在应用程序提交之后,将提供包含在HDFS 中的输入和输出目录。

  JobTracker 使用文件块信息(物理量和位置)确定如何创建其他TaskTracker 从属任务。MapReduce 应用程序被复制到每个出现输入文件块的节点。将为特定节点上的每个文件块创建一个惟一的从属任务。每个TaskTracker 将状态和完成信息报告给JobTracker。

  5. 任务粒度——Hadoop 是如何并行的

  Map 调用把输入数据自动分割成M 片,并且分发到多个节点上,使得输入数据能够在多个节点上并行处理。Reduce 调用利用分割函数分割中间key,从而形成R片(例如,hash(key) mod R),它们也会被分发到多个节点上。分割数量R 和分割函数由用户来决定。

5. 任务粒度——Hadoop 是如何并行的
▲图6

  由上的分析可知,我们细分map 阶段成M 片,reduce 阶段成R 片。在理想状态下,M 和R 应当比worker 机器数量要多得多。每个worker 执行许多不同的工作来提高动态负载均衡,并且能够加快故障恢复的速度,这个失效机器上执行的大量map 任务都可以分布到所有其他worker 机器上执行。

  但是在具体编程中,实际上对于M 和R 的取值有一定的限制,因为master 必须执行O(M+R)次调度,并且在内存中保存O(M*R)个状态。(对影响内存使用的因素还是比较小的:O(M*R)块状态,大概每对map 任务/reduce 任务1 个字节就可以了)。

  进一步来说,用户通常会指定R 的值,因为每一个reduce 任务最终都是一个独立的输出文件。在实际中,我们倾向于调整M 的值,使得每一个独立任务都是处理大约16M 到64M 的输入数据(这样,上面描写的本地优化策略会最有效),另外,我们使R 比较小,这样使得R 占用不多的worker 机器。我们通常会用这样的比例来执行MapReduce: M=200,000,R=5,000,使用2,000 台worker 机器。

  本节内容参考MapReduce: Simplified Data Processing on Large Clusters 原文。

0
相关文章