MapReduce简介
MapReduce源自于Google发表于2004年12月的MapReduce论文,Hadoop MapReduce是Google MapReduce克隆版。
MapReduce源于函数式编程,包括Map和Reduce两个算子,它是一个通用的计算引擎,所以易于编程,可以实现任意的算法,表达能力很强,只是效率有区别。
MapReduce是一个分布式应用框架,解决数据导入读取,用户只需要关心如何处理数据(Map方法和Reduce方法),可以支持数据规模不断增大,机器数量的增多不会影响程序运行。分布式计算以及资源协调的错误处理由计算框架内部处理。
MapReduce有以下特点:易于编程;良好的扩展性;高容错性;适合PB级以上海量数据的离线处理,PB级数据的处理,各个节点的通信花费的时间远远超过计算的时间,MapReduce可以解决这些问题。
搜索引擎建索引是MapReduce出现的背景,另外,MapReduce也适合海量数据查找,适合大数据批量处理,比如从海量日志问价中搜索异常信息;MapReduce可以做数据统计,比如网站pv(page view)和uv(user view)的简单数据统计,以及聚类算法、分类算法、推荐算法和图算法(比如搜索引擎算网页相关性)等一些复杂数据分析算法。MapReduce是一个通用的计算引擎,各种算法都可以通过Map和Reduce两个算子来实现,通用性很强,数据多轮计算,可以减少误差,但效率不一定高。
MapReduce不适合:
-
实时计算
不能像MySQL一样,在毫秒级或者秒级内返回结果,这是因为MapReduce是为大规模数据批量处理准备,具有比较大的启动开销(环境的准备,数据的准备等),所以不适合做到实时计算; -
流式计算(数据源不断变化)
MapReduce的输入数据集是静态的,不能动态变化,这是MapReduce自身的设计特点决定的,因为MapReduce有可能多次计算,所以如果数据不是静态的,那么不同次的计算就会不一样; -
DAG(有向无环图)计算
DAG是多个应用程序存在依赖关系,后一个应用程序的 输入为前一个的输出。MapReduce计算由多个子任务组成,子任务有各种依赖,必须将前面依赖的任务完成后才能继续后续的任务。MapReduce要将依赖关系转换为Map和Reduce两个算子,转换的过程遇到的问题就是数据无法共享,如果把数据共享到HDFS上,这样会产生大量的IO,会影响整个MapReduce的效率。
MapReduce编程模型
通过Wordcount示例解释:
问题:有一批文件(规模为TB级或 者 PB级),如何统计这些文件中所有单词出现的次数;
类似应用场景:搜索引擎中,统计最流行的K个搜索词; 统计搜索词频率,帮助优化搜索词提示。
方案1:用一个程序去读取和统计文件中所有单词出现的次数。
这个方案具有以下缺点:
1)执行效率低,用时长;
2)单点故障,造成程序停止;
3)网络传输效率低,IO消耗大;
4)如果文件太大,加载不到内存,那么这个程序是运行不了的,这是主要问题。
方案2:启动多个程序,分别读取不同文件中的单词出现次数,然后将这些结果进行合并。
这个方案具有以下优点:
1)本地计算,避免网络开销,IO效率高;
2)需要的内存减少;
3)执行效率高。