Hadoop入门
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框架
五、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程序