MapReduce&HDFS简介

一、Hadoop简介:

结构化数据:表,关系型数据库//有严格的约束

半结构化数据:html,json,yaml,有元数据// 有约束,缺少严格的约束

非结构化数据:没有预定义的模型,元数据 //日志数据等

搜索引擎:搜索组件、索引组件

    网络爬虫:爬到的内容多为半结构化或者非结构化数据

    构建倒排索引[基于精确搜索或模糊搜索基于相关度匹配]存储到存储系统[非RDBMS]中。

2003年:The Google File System//google如何实现文件存储,不支持对数据进行随机和实时访问,仅适用于存储少量的体积巨大的文件。

假如爬到html页面发生了改变,需要修改。则goole fs无法满足该需求

2004年:MapReduce: simplified Data Precessing On Large Cluster//MapReduce编程模型,一个任务分布在各个节点上运行,后收集结果

2006年:BigTable: A Distributed Storage System for Structure Data //存储结构化数据的分布式存储

GFS->山寨后HDFS:

MapReduce->MapReduce:

BigTable->HBase:

HDFS + MapReduce = Hadoop //作者儿子的一个玩具

HBase:hadoop 的database 

Nutch:一个网络爬虫程序,为Lucene爬取数据

Hadoop的一个缺陷:MapReduce是批处理程序,

HDFS采用的是有中心节点的存储格式

 client

|

元数据节点

|

===========================

node1  node2  node3  node n

1 1‘ 2 2’

        数据查询过程:client->元数据节点[数据分布在哪些节点上]-->[node 1,2,3,,n]-->client  用户查询[写代码]-->先调用MapReduce的开发框架-->交由该框架运行

Map:该代码需要分别运行在node1和node2上,各节点分别处理自己所用的那一部分

            //node1拥有1,node2拥有2

Reduce:最后要把node1和node2上的运行结果进行合并

最终速度:取决于速度最慢的 node

MapReduce:

1.开发API

2.运行框架

3.提供运行时环境

NAS和SAN的缺点:存储系统只有1个,面对海量数据,需要进行数据存取,磁盘IO和网络IO将面临极大挑战

因此出现了分布式存储

二、HDFS和MapReduce

1.无中心节点 

2.有中心节点HDFS //元数据节点是瓶颈和核心所在。//GFS,HDFS,

    元数据节点:NN: name node //HA,内存数据持久化。他的数据都是存储在内存中的

    //事务日志,写入到持久存储后,宕机后,重新加载,减少丢失的数据。

    后端主机要保证:服务可用+数据可用 //DN:data node 

    在宕机后回可能需要文件系统检测,数据量过大时,需要浪费大量时间。

    //简单的说:一旦NN崩溃,再次启动需要半个小时,因为hadoop 1.X NN不支持HA

        SNN:second namenode后期提供,

NN需要在内存中不断更新数据,写入日志,日志和映像文件合并等

SNN:负责合并数据,假如NN崩溃SNN加载共享存储的文件,自己工作。

    节省了时间,但是文件系统检测需要的时间,依然没有少。只是不用立即修复NN

LB:对不同的请求,分发到不同的主机

 client

|

NN--SNN

|

[镜像][SHM]

|

===========================

node1  node2  node3  node n

1 1‘ 2 2’

HDFS 2.0之后的NN可以高可用

元数据不再存放到本地存储,而是存储到一个共享存储存放,基于内存完成元数据存放。

例如:NFS[脑裂]不常用,ZooKeeper

NN1和NN2的更新 操作都向ZooKeeper同步,因此每一个节点都可以从ZooKeeper获取同样的数据。

//zookeeper:分布式协调工具(分布式锁),google的Chubby(不开源)

http://www.cnblogs.com/wuxl360/p/5817471.html //参考网站

数据节点:存放各个chunk的

每个数据存储副本:存储到其他节点。默认存储3个副本。

存储的时候,之存储一个,由HDFS另找两个节点进行存储。

每一个存储node会向服务node周期报告自己所存储 的数据块信息+自身状态信息。

NN有两个表:

1.以数据为中心,分布在哪些节点上

2.以节点为核心,持有哪些数据块

数据如何处理://运行程序的集群

MapReduce:集群方式工作。

Map:分散运行

Reduce:合并

一个任务可以分为几个Map,由MapReduce的框架进行控制的。

需要一个总的节点,进行调度 JobTracker

理想情况:让拥有请求数据的node都运行任务 //但是有的node可能已经很忙了

假如拥有数据的node繁忙解决方案:

1.等待

2.找副本所在节点 //可能副本节点也比较忙

3.找一个空闲的节点,运行任务。//可能需要复制副本到该空闲node

对于HDFS来说

Hadoop和MapReduce共用的数据节点

client

    |

JobTracker

    |

===========================

node1  node2  node3  node n

1 1'    2      2'

//只是这些节点,不再叫做Data Node而称为Task Tracker,

这些node需要运行两类进程:DataNode /Task Tracker  //负责数据的存储和处理

因此一个Hadoop就是两类集群的结合:存储数据和处理数据使用的是同一个类节点

三、数据处理模型

程序运行node把数据加载到程序所在node 进行运行 //数据向程序靠拢

Hadoop以数据为中心,让程序到数据所在节点上运行 //程序向数据靠拢

JobTracker和Name node的工作是不冲突的,因此可以部署在同一个节点上

[JobTracker/NameNode]

||

=====================================================================

taskTracker/DataNode1 taskTracker/DataNode2 taskTracker/DataNode3 ...

每个人提交的任务,不一定是运行在所有节点上的,很有可能是运行在几个节点上的

可以限制一个node最多可以运行多少个任务。

四、函数式编程:

Lisp:ML函数式编程语言:高阶函数;

map,fold

map:把一个任务映射为多个任务

fold:折叠

示例:map(f()} //map将把f函数运行为多份,分别运行在多个节点上。

map:接受一个函数为参数,并将其应用于列表中的所有元素;

示例列表为:1,2,3,4,5

要获取每个人age,分别在1,2,3,4,5上执行

例如map后的结果为:22,33,44,12,34

fold:接受两个参数 1:函数,2:初始值

fold(g(),init) //

把第一个的处理结果替换为init,然后使用g()和第一个的处理结果处理第二个数据,依次轮推

示例:22,33,44,12,34 // fold(g(1),init)=>foldg(g(2) 22)=>fold(g(g3),33),...

最后找出最大者。

MapReduce: //任何一个程序调用该APi之后,被分成两段

mapper:在task tracker上运行的一个实例,最后生成一个结果列表

reducer:从mapper得到的多个结果中

统计一本书中每个单词出现的次数:

mapper:每100页一个单位,5个mapper用于拆分成为单词;进行计数

例如拆成了10000个单词,其中不乏有重复的

mapper需要保证重复的单词发送给同一个reducer

称为:shuffle and sort //传输排序的过程

reducer

reducer1,reducer2//启动了两个reducer,mapper轮流发送给reducer1和2,重复的发送给同一个reducer,保证每个reducre统计的单词是不一样的

最后合并

reducer1: 

this:500

is:10

reducer2:

how: 30

do: 20

两者合并以后成为结果

MapReducer统计的对象数据都是key-value数据,不是kv数据需要先转换为kv数据

mapper://转换为kv数据

this 1,is 1, this 1,how 1 //出现一次标记为1

同一个键的数据只能发往同一个reducer

reducer: //也是kv数据

例如把this 对应的所有value相加

this:500

is:20 

mapper-reducer可能需要执行多次,才能达到结果,只是每次的目标不同而已。

也可以直接在mapper上统计本地的数据,再发送给reducer的时候

this:500

is:20 

//reducer可以和mapper一起启动,或者reducer在mapper之后运行


相同的key发送给同一个reducer:谁来保证

由mapper reducer的框架决定的,//启动几个reducer是由程序员定义的

MapReduce:

1.开发API

2.运行框架

3.提供运行时环境

Hadoop能够实现并行处理,

HDFS + MapReduce = Hadoop 

         调用MapReduce API的程序

            |

[NameNode] [JobTracker]

    || ||

=====================================================================

taskTracker/DataNode1 taskTracker/DataNode2 taskTracker/DataNode3 ...

Hadoop典型应用有:搜索、日志处理、推荐系统、数据分析、视频图像分析、数据保存等


图1:MapReduce框架

Hadoop入门_hadoop

五、MapReduce工作模型

MapReduce:工作模型

==================================================================================

[k1|m] [k2|n] [k3|r] [k4|s] [k5|m] [k6|t] [k7|m]

   \ /    \ /     \      /

 [mapper] [mapper]  [mapper]     [mapper]

    |         |        |       |

    V         V        V       V

[ik1|3] [ik3|1]  [ik1|6] [ik3|2]   [ik1|1] [ik1|4]  [ik2|3] [ik2|6]

【partitioner】  【partitioner】 【partitioner】  【partitioner】

+++++++++++++++++++++++++++++++++++++++++++++++++

// Shuffle & sort. aggressive values by keys //

++++++++++++++++++++++++++++++++++++++++++++++++

[ik1|3,6,1,4] [ik2|3,6] [ik3|1,2]

|                     |     |

V             V     V

    reducer reducer reducer

|     |     |

V     V     V

    [ok1|14] [ok2|9] [ok3|3]

====================================================================================

//mapper:读取键值对,生成键值对

//combiner:负责在mapper之后,在mapper上把相同的键进行合并,仅此而已,输入和输出的键必须一致。

//partitioner:负责分发同一个key到同一个reducer,所有的partioner都是一样的

生成的键值如何进行发送,由partitioner决定。

==================================================================================

[k1|m] [k2|n] [k3|r]      [k4|s]   [k5|m]     [k6|t] [k7|m]

    \ /   |          \     /        \  /

 [mapper] [mapper] [mapper] [mapper]

|           |     |                       |

V     V     V     V

    [ik1|3] [ik3|1] [ik1|6] [ik3|2]   [ik1|1] [ik1|4]  [ik2|3] [ik2|6]

    【combiner】 【combiner】  【combiner】   【combiner】

|    |     |      |

V    V     V      V

[ik1:3][ik3:1]    [ik1:6][ik3:2] [ik1:5]   [ik2:9]

【partitioner】  【partitioner】 【partitioner】  【partitioner】

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

// Shuffle & sort. aggressive values by keys //

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++

[ik1|3,6,1,4] [ik2|3,6] [ik3|1,2]

|     |     |

V     V     V

    reducer reducer reducer

|             |     |

V     V     V

[ok1|14] [ok2|9] [ok3|3]

====================================================================================

//combiner和partitioner都是由程序员写的

Maper启动的节点:可能没有一个目标分片,但是需要处理n个分片,需要从其他node复制分片到该节点执行Maper程序