云计算旨在通过Internet提供按需资源或服务,通常以数据中心的规模和可靠性级别提供。 MapReduce是一种编程模型,旨在通过将工作划分为一组独立的任务来并行处理大量数据。 它是一种并行编程的样式,并由某些按需容量样式的云(例如Google的BigTable,Hadoop和Sector)支持。
在本文中,将使用遵循随机流体动力负载平衡技术方法的负载平衡算法(以下各节中将对此进行详细介绍)。 虚拟化用于减少物理服务器的实际数量和成本。 更重要的是,虚拟化用于提高物理机的CPU利用率。
为了从本文中获得最大收益,您应该对云计算概念,随机水力负载平衡技术以及Hadoop MapReduce编程模型有一个大致的了解。 对并行编程的基本了解将有所帮助,并且任何有关Java™或其他面向对象语言的编程知识都将是一个很好的支持工具。
对于本文,MapReduce算法是在使用以下系统的系统上实现的:
- Hadoop 0.20.1。
- Eclipse IDE 3.0或更高版本(或Rational Application Developer 7.1)。
- Ubuntu 8.2或更高版本。
在深入探讨MapReduce算法之前,我们将建立云架构,负载平衡,MapReduce和并行编程的基础知识-至少对于本文来说已经足够了。
云架构:基础
图1显示了完整的系统,平台,软件以及如何用于实现本文中设定的目标的详细图片。
图1.云架构
您可以看到Ubuntu 9.04和8.2用于操作系统。 平台的Hadoop 0.20.1,Eclipse 3.3.1和Sun Java 6; 用于编程的Java语言; 以及HTML,JSP和XML作为脚本语言。
这种云架构同时具有主节点和从节点。 在此实现中,维护一个主服务器,该服务器获取客户端请求并根据请求的类型处理它们。 主节点位于主服务器中,从节点位于辅助服务器中。
搜索请求被转发到主服务器中存在的Hadoop的NameNode,如图2所示。然后Hadoop NameNode通过启动大量的Map and Reduce流程来处理搜索和索引操作。 一旦针对特定搜索键的MapReduce操作完成,NameNode会将输出值返回到服务器,然后返回到客户端。
图2. Map和Reduce函数进行搜索和索引编制
如果请求是针对特定软件的,则根据客户租户ID,付款应付款,使用特定软件的资格以及该软件的租用期来完成身份验证步骤。 然后,服务器处理该请求,并允许用户使用选定的软件组合。
这里提供了SaaS的多租户功能,其中该软件的单个实例为多个租户提供服务。 对于每个特定于租户的请求,都会根据租户ID生成隔离的细线。 这些请求由单个实例提供。
当特定于租户的客户端请求想要搜索文件或使用任何其他多租户软件时,产品将在预配置的操作系统实例(PaaS)上使用Hadoop。 同样,为了将其数据(可能是数据库或文件)存储在云中,客户端将不得不从数据中心(IaaS)占用一些内存空间。 所有这些举动对最终用户都是透明的。
随机流体动力负载平衡:基础知识
负载平衡用于确保没有现有资源闲置而正在利用其他资源。 为了平衡负载分配,您可以将负载从源节点 (具有多余工作负载)迁移到负载相对较轻的目标节点 。
在运行时应用负载平衡时,这称为动态负载平衡 -这可以根据执行节点的选择以直接或迭代的方式实现:
- 在迭代方法中,最终目标节点是通过几个迭代步骤确定的。
- 在直接方法中,一步选择最终目标节点。
在本文中,使用了随机流体动力负载平衡方法,这是一种既利用直接方法又利用迭代方法的混合方法。
MapReduce:基础知识
MapReduce程序旨在以并行方式计算大量数据。 这需要将工作负载分配到大量计算机上。 Hadoop提供了一种系统的方式来实现这种编程范例。
该计算采用一组输入键/值对,并产生一组输出键/值对。 计算涉及两个基本操作:Map和Reduce。
用户编写的Map操作采用一个输入对,并产生一组中间键/值对。 MapReduce库将与同一中间键#1关联的所有中间值分组在一起,并将它们传递给Reduce函数。
还由用户编写的Reduce函数接受中间键#1和该键的一组值。 它将这些值合并在一起以形成可能较小的一组值。 通常,每个Reduce调用仅产生0或1的输出值。 中间值通过迭代器(允许程序员遍历集合的所有元素而不管其具体实现如何)提供给用户的Reduce函数。 这使您可以处理太大而无法容纳在内存中的值列表。
以WordCount问题为例。 这将计算大量文档中每个单词出现的次数。 Mapper和Reducer函数将类似于清单1。
清单1.映射和减少WordCount问题
mapper (filename, file-contents):
for each word in file-contents:
emit (word, 1)
reducer (word, values):
sum = 0
for each value in values:
sum = sum + value
emit (word, sum)
映射功能会发出每个单词以及相关的出现次数。 减少功能将特定单词发出的所有计数加在一起。 在群集上构建时,此基本功能可以轻松地变成高速并行处理系统。
以前,通常是在分布式环境中对大量数据执行计算。 Hadoop的独特之处在于其简化的编程模型-允许用户快速编写和测试分布式系统-以及高效,自动的数据分布和跨机器的工作,进而利用CPU内核的底层并行性。
让我们尝试使事情更清晰一些。 如前所述,在Hadoop集群中,您具有以下节点:
- NameNode(云主机)。
- 数据节点(或从节点)。
集群中的节点已预加载本地输入文件。 当MapReduce进程启动时,NameNode使用JobTracker
进程通过TaskTracker
进程分配必须由DataNodes执行的任务。 每个DataNode中将运行几个Map进程,并将中间结果提供给组合器进程,该组合器进程将生成一台机器的文件中的单词计数为(如果出现WordCount问题)。 值经过混洗并发送到Reduce流程,该流程会生成感兴趣问题的最终输出。
如何使用负载平衡
当节点的负载超过其阈值级别时,负载平衡有助于将负载平均分配到各个空闲节点上。 尽管负载均衡在执行MapReduce算法方面不是那么重要,但是在处理大型文件进行处理以及对硬件资源的使用至关重要时,负载均衡就变得至关重要。 作为重点,它可以在资源关键的情况下提高硬件利用率,并在性能上略有提高。
当某些数据节点已满或新的空节点加入群集时,实现了一个模块来平衡Hadoop分布式文件系统群集上的磁盘空间使用情况。 平衡器(类平衡器工具)从阈值启动; 此参数是0到100%之间的分数,默认值为10%。 这为群集是否平衡设定了目标。 阈值越小,群集将越平衡。 同样,平衡器的运行时间也更长。 (注意:阈值可能很小,以至于您无法平衡群集的状态,因为应用程序可能正在同时写入和删除文件。)
如果对于每个数据节点,该群集上的已用空间与该节点的总容量之比(称为节点的利用率 )不同于该群集上的已用空间与该节点的总容量之比,则认为该群集是平衡的。集群(集群的利用率 )不超过阈值。
该模块以迭代的方式将大量使用的数据块从块转移到使用不充分的块。 在每次迭代中,一个节点移动或接收的值不超过其容量的阈值分数,并且每次迭代运行不超过20分钟。
在此实现中,节点分为高利用 , 平均利用和利用不足 。 根据每个节点的利用率,负载在节点之间转移,并且群集达到平衡。 该模块的工作方式如下:
- 首先,它获取附近的详细信息:
- 当DataNode中的负载增加到阈值级别时,它将向NameNode发送请求。
- NameNode具有有关特定DataNode最近邻居的负载级别的信息。
- NameNode将比较负载,然后将有关最空闲邻居节点的详细信息发送到特定的DataNode。
- 接下来,DataNode开始工作:
- 每个DataNode会将自己的负载量与其最近邻居的负载量之和进行比较。
- 如果DataNode的负载级别大于其邻居的总和,则将随机选择负载目标节点(直接邻居和其他节点)。
- 然后将加载请求发送到目标节点。
- 最后,收到请求:
- 在每个节点上维护缓冲区以接收所接收的负载请求。
- 消息传递接口(MPI)管理此缓冲区。
- 主线程将侦听缓冲的队列并为其接收的请求提供服务。
- 节点进入负载平衡执行阶段。
评估表现
提供了不同的输入文件集,每个输入文件的大小都不同,并在单节点群集和两节点群集中执行了MapReduce任务。 测量了相应的执行时间,我们得出的结论是,在大量输入文件中,在集群中运行MapReduce到目前为止效率更高。
图3中的图形说明了我们在各种节点上运行的性能结果。
图3. MapReduce负载平衡在集群中更有效地工作
结论
我们对Hadoop MapReduce和负载平衡的实验得出两个不可避免的结论:
- 在云环境中,MapReduce结构可提高大型数据集的吞吐量效率。 相反,在非云系统中,您不一定会看到吞吐量的增加。
- 当数据集较小时,MapReduce和负载平衡不会影响云系统中吞吐量的明显增加。
因此,在计划处理云系统上的大量数据时,请考虑将MapReduce样式的并行处理与负载平衡相结合。
翻译自: https://www.ibm.com/developerworks/cloud/library/cl-mapreduce/index.html