文档章节

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

马哥linux运维
 马哥linux运维
发布于 2016/01/11 21:53
字数 1563
阅读 30
收藏 0

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培训” 博客,转载请与作者联系!

© 著作权归作者所有

马哥linux运维
粉丝 21
博文 57
码字总数 102602
作品 0
CEO
私信 提问
2014-11-12--Hadoop的基础学习(三)--Hadoop中MapReduce框架入门

1.MapReduce的简单概念 百度百科:MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。概念"Map(映射)"和"Reduce(归约)",和他们的主要思想,都是从函数式编程语言里借来的...

查封炉台
2014/11/16
8.3K
8
Hadoop简要介绍

本文大部分内容都是从官网Hadoop上来的。其中有一篇介绍HDFS的pdf文档,里面对Hadoop介绍的比较全面了。我的这一个系列的Hadoop学习笔记也是从这里一步一步进行下来的,同时又参考了网上的很...

晨曦之光
2012/03/09
224
0
Hadoop 版本 生态圈 MapReduce模型

一 Hadoop版本 和 生态圈 1. Hadoop版本 (1) Apache Hadoop版本介绍 Apache的开源项目开发流程 : -- 主干分支 : 新功能都是在 主干分支(trunk)上开发; -- 特性独有分支 : 很多新特性稳定性很...

日拱一卒
2014/05/17
73
0
浅析hadoop 简历就写这个了

为什么选择hadoop 下面列举hadoop主要的一些特点: 1)扩容能力(Scalable):能可靠地(reliably)存储和处理千兆字节(PB)数据。 2)成本低(Economical):可以通过普通机器组成的服务器群来分发以及处...

月黑风高杀人夜
2015/07/16
1K
0
从分治算法到 MapReduce

从分治算法说起 要说 MapReduce 就不得不说分治算法,而分治算法其实说白了,就是四个字 分而治之 。其实就是将一个复杂的问题分解成多组相同或类似的子问题,对这些子问题再分,然后再分。直...

终日而思一
2018/11/23
42
0

没有更多内容

加载失败,请刷新页面

加载更多

前端技术之:Prisma Demo服务部署过程记录

安装前提条件: 1、已经安装了docker运行环境 2、以下命令执行记录发生在MackBook环境 3、已经安装了PostgreSQL(我使用的是11版本) 4、Node开发运行环境可以正常工作 首先需要通过Node包管...

popgis
今天
5
0
数组和链表

数组 链表 技巧一:掌握链表,想轻松写出正确的链表代码,需要理解指针获引用的含义: 对指针的理解,记住下面的这句话就可以了: 将某个变量赋值给指针,实际上就是将这个变量的地址赋值给指...

code-ortaerc
今天
4
0
栈-链式(c/c++实现)

上次说“栈是在线性表演变而来的,线性表很自由,想往哪里插数据就往哪里插数据,想删哪数据就删哪数据...。但给线性表一些限制呢,就没那么自由了,把线性表的三边封起来就变成了栈,栈只能...

白客C
今天
43
0
Mybatis Plus service

/** * @author beth * @data 2019-10-20 23:34 */@RunWith(SpringRunner.class)@SpringBootTestpublic class ServiceTest { @Autowired private IUserInfoService iUserInfoS......

一个yuanbeth
今天
5
0
php7-internal 7 zval的操作

## 7.7 zval的操作 扩展中经常会用到各种类型的zval,PHP提供了很多宏用于不同类型zval的操作,尽管我们也可以自己操作zval,但这并不是一个好习惯,因为zval有很多其它用途的标识,如果自己...

冻结not
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部