(一)前言
对于大数据处理,传统的企业解决方式是:
一个企业将有一个计算机存储和处理大数据。对于存储而言,程序员会自己选择的数据库厂商,如Oracle,IBM等的帮助下完成,用户交互使用应用程序进而获取并处理数据存储和分析。
特点:
这种方式对结构化数据的处理非常方便,如今,每天网络上都会产生非常庞大的数据量。这些数据有很大一部分是由**关系数据库管理系统(RDBMS)**来处理的。通过应用实践证明,关系模型非常适合于客户服务器编程,如今它是结构化数据存储在网络和商务应用的主导技术。
但是,当代典型的关系数据库在一些数据敏感的应用中(例如为巨量文档创建索引、高流量网站的网页服务,以及发送流式媒体时)表现出的是糟糕的性能。
关系型数据库的典型的主要用于执行规模小而读写频繁,或者大批量极少写访问的事务中。
当涉及到处理大量的可伸缩数据,这是一个繁忙的任务,只能通过单一的数据库瓶颈来处理这些数据。
谷歌的解决方案
通过使用一种称为MapReduce的算法,谷歌解决了这个问题。这个算法将任务分成小份,并将它们分配到多台计算机,并且从这些机器收集结果并综合,形成了结果数据集。
Hadoop
使用谷歌提供的解决方案,后来诞生了一个开源项目叫做HADOOP。
Hadoop是一个能够对大量数据进行分布式处理的软件框架,并且是以一种可靠、高效、可伸缩的方式进行处理的。
Hadoop使用的MapReduce算法运行,其中数据在使用其他并行处理的应用程序。总之,Hadoop用于开发可以执行完整的统计分析大数据的应用程序。
(二)MapReduce
MapReduce背景
在 Google,每天在需要处理大量的原始数据,比如网页爬取文件、网络日志文件等等.庞大的数据输入量和计算量是一台或者几台机器难以承受的,只有将任务分配到成百上千台处理机上去并行处理,才能在合理时间内完成计算。
MapReduce 思想来源于 Lisp 函数式语言中的设计思想,提供了 Map 和 Reduce 两种函数来实现并行化操作。
MapReduce模型简介
- MapReduce将复杂的、运行于大规模集群上的并行计算过程高度地抽象到了两个函数:Map和Reduce
- 编程容易,不需要掌握分布式并行编程细节,也可以很容易把自己的程序运行在分布式系统上,完成海量数据的计算
-
- MapReduce 将分布式系统中如何分布、调度、监控以及容错等逻辑从复杂的细节中抽象出来,使得程序员不需要太多并发处理或者分布系统的经验,就可以处理超大的分布式系统的资源。
- MapReduce采用“分而治之”策略,一个存储在分布式文件系统中的大规模数据集,会被切分成许多独立的分片(split),这些分片可以被多个Map任务并行处理
- MapReduce设计的一个理念就是“计算向数据靠拢”,而不是“数据向计算靠拢”,因为,移动数据需要大量的网络传输开销
- MapReduce框架采用了Master/Slave架构,包括一个Master和若干个Slave。Master上运行JobTracker,Slave上运行TaskTracker
- Hadoop框架是用Java实现的,但是,MapReduce应用程序则不一定要用Java来写
- MapReduce 是一种简化的分布式编程模型,它可以自动解决输入数据的分布细节,跨越机器集群的程序执行调度,处理机器的时效,并且管理机器之间的通信请求。
MapReduce模型
上面提到MapReduce 中的操作只有两种:Map 和 Reduce,而这两种操作都是由用户定义的.Map 和 Reduce 的输入与输出数据都是键值对〈key/value〉,可以用两个公式对它们进行简单的描述.
M a p ( k 1 , v 1 ) → l i s t ( k 2 , v 2 ) ; Map (k1,v1)→list(k2,v2); Map(k1,v1)→list(k2,v2);
R e d u c e ( k 2 , l i s t ( v 2 ) ) → l i s t ( v 2 ) . Reduce (k2,list(v2))→list(v2). Reduce(k2,list(v2))→list(v2).
MapReduce如何工作
让我们用一个wordcount(词频统计)例子来理解这一点 :
- 输入:一个包含大量单词的文本文件
- 输出:各个单词的词频(按单词字母排序,每个单词及频数各占一行)
比如:
输入 | 输出 |
---|---|
Hello World Hello Hadoop Hello MapReduce |
Hadoop 1 Hello 3 MapReduce 1 World 1 |