您的位置:首页 > 编程语言

Hadoop系列之三:函数式编程语言和MapReduce

2013-01-02 13:49 393 查看
1、MapReduce和大数据问题

海量数据并行处理的核心思想无非是将一个较大的问题进行“分割包围、逐个歼灭”。然而其难点和关键点在于如何将一个大的问题分分割成多个可以分别在不同的CPU上或不同的主机上进行处理的独立小问题,而且这些独立进行处理的小问题所产生的中间结果又该如何合并成最终结果并予以输出。因此,看似简单的化整为零的处理思想却不得不面临如下的难题:

(1) 如何将大问题分割为小任务?进一步地,如何将大问题分解为可以并行处理的小任务?
(2) 如何将分解好的小任务派送给分布式系统中的某主机且是较为适合解决此问题的主机上的worker(进程)完成处理?
(3) 如何保证某worker获取所需的数据?
(4) 如何协调不同worker之间进行同步?
(5) 如何将某worker的部分结果共享给其它需要此结果的worker?
(6) 如何在出现软件或硬件故障时仍然能保证上述工作的顺利进行?

在传统的并行或分布式编程模型中,程序员不得不显式地解决上述的部分甚至是全部问题,而在共享内存编程中,程序员需要显式地协调对共享数据结构的如互斥锁的访问、显式地通过栅(barrier)等设备解决进程同步问题,并且要时刻警惕着程序中可能出现的死锁或竞争条件。虽然有些编程语言也或多或少地规避了让程序员面对上述问题,但却也避免不了将资源分配给各worker的问题。MapReduce的优势之一便是有效地向程序员隐藏了这些问题。

2、函数式编译语言

MapReduce是一种类似于Lisp或ML的函数式编程语言。函数式编程的核心特性之一是基于高阶函数完成程序开发,高阶函数是能够接受其它函数作为参数的函数,map和fold是两个著名的高阶函数。




如图所示,给定一个列表,map(接受一个参数)以函数f为其参数并将其应用于列表中的所有元素,其执行结束后生成一个新的列表;fold(接受两个参数)以函数g和一个初始值作为参数,然后将函数g应用于初始值和列表中的第一个元素,执行结果放置于中间变量中。中间变量和第二个元素将作为g函数下一次应用时的参数,而后如此操作直至将列表中的所有元素处理完毕,最后,fold返回中间变量的最终结果。map函数与fold函数通常要联合起来使用,由map函数完成第一阶段的数据转换操作,而后由fold完成数据聚合操作。

于是,基于上述过程,我们可以把map视作利用f函数将给定数据集完成形式转换的操作,同样地,fold就可以被看作利用g函数完成数据聚合的操作。由此可以得知,各函数式程序在运行时彼此间是隔离的,从而,在map中将f函数应用于列表中每一个元素的操作可以并行进行,甚至这些操作可以分布于集群中的不同节点上并行执行。然而,受限于数据的本地性,fold操作需要等到列表中的每一个元素都准备停当(即所有map执行完成并生成结果)并可由函数g访问之后才能进行。不过,好在现实生活中的应用程序并不要求一个g函数应用于列表中的所有元素,因此,要处理的列表中元素也可以被分为多个逻辑组,并将fold操作并行地应用在这些逻辑组上。此外,两个阶段的隔离进行也意味着fold并行执行的子任务个数未必与map并行执行的子任务个数相同。

上述过程也是MapReduce的工作过程的一个简单描述。MapReduce有两个最常用地内置高阶函数map和reduce,其map就类似于上述过程中的map操作,reduce对应于上述过程中的fold操作。只不过,MapReduce的执行框架能自行协调map与reduce并将其应用于在商业服务器硬件平台上并行处理海量数据。

更为精确地说,MapReduce有三个相互关联却各不相同的概念。首先,MapReduce是一个如上所述的函数式编程语言。其次,MapReduce也是一个运行框架,它能够协调运行基于MapReduce思想开发的程序。最后,MapReduce还可以被看作编程模型和执行框架的实现,例如Google的专有实现和另一个开源实现Hadoop中的MapReduce组件。

于是,部署应用MapReduce意味着这样的过程:在现有的多个节点上部署完成MapReduce软件(即MapReduce的实现)并启动集群服务,便准备好了一个MapReduce程序运行环境(即运行框架),此时只需要将用户开发的MapReduce程序(基于MapReduce函数式编程语言API开发)及其要处理的数据提交给MapReduce运行环境即可完成数据处理过程。因此,处理数据是由用户自己开发的MapReduce程序完成,而非运行的MapReduce集群服务。简单来讲,用户开发的MapReduce程序其实就是包含了类似上述的f函数和g函数的程序,只不过,在MapReduce中,它们分别被称作mapper和reducer。

参考文献:
Data-Intensive Text Processing with MapReduce
本文出自 “马哥Linux培训” 博客,转载请与作者联系!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: