`

hadooop

 
阅读更多

查看博客:http://blog.csdn.net/qq_20641565/article/details/53328279

第一阶段:hadoop hdfs

1.     hadoop是大象的意思(哈度破):两个重点是:存(hdfs)、算(yarn

2.     文件数据分成namenode元数据(基于内存存储)datanode多节点数据(节点保存的是block数据块)。基于内存存储,但是内存断电会丢失,因此要先持久化到磁盘。

3. edits记录metadata的增删改的操作。fsimage(作用如快照)用来放metadata的。定期将editsfsimage合并,用其他服务器(其他节点)去做这件事

4datanode存储block块的元数据信息

5. HDFS写流程:

  第一:datanode节点数据处理:首先在一个整个文件中取一个block数据块,在传输的时候会再次分成更小的块(block1block2block3),并用流式传输,如同流水线传送给第一个datanode服务器, 第一个datanode在接收block2的同时又把block1传给了datanode2。效率高。

  第二:namenode元数据处理:在第一步的同时,把该节点数据block的静态信息存储到namenode服务器,该信息是记录block块在整个文件中的位置、block发到了哪个datanode上了。block块的大小等静态信息。(写成日志的形式记录下来了)

  第三:当block1block2block3都放在了各个datanode之后,说明整个文件中的一个block块中的节点数据处理完成了;完成之后会通知namenode服务器操作完成。

  第四:namenode元数据与datanode节点数据都完成传输之后,此时由datanodenamenode发送心跳,3秒发一次;如果namenode十分钟内都没收到此datanode发送来的心跳,那么它就会把block块拷贝到其他备份服务器上。

 

 

6.HDFS读流程:

 第一:首先元数据在namenode服务器上已存在,节点数据在datanode上也已存在。

 第二:客户端在读数据的时候,先回向namenode发送请求,然后客户端直接在主datanode中去取数据

 第三:在取到datanode中的数据之后,先要验证此black数据完整性。然后在取走。

 第四:如果数据不完整了,那就去备份datanode服务器中去取

 

7. hdfs默认端口号为50070

8.解决namenode内存受限是使用高可用

(1).水平扩展、支持多个namenode(联邦机制)

(2).所有NameNode共享所有DataNode存储资源

(3).每个NameNode分管一部分目录

总结:两个NN是互相独立的,共用所有DN。但是每个NN在处理所有DN数据的时候,只能处理DN中有关自己的数据。

9.解决namenode单点故障

a.昨天的课中DN只向一个NN发送心跳。现在DN会给两个NN分别发送心跳。

b.NN中的静态信息(位置信息、文件大小、偏移量等)是客户端发送来的,此时也要保证两个NN都收到客户端发来的静态信息,

c.做法就是NN在记录日志文件的时候往一个设备(jnn一个小集群)中记录(重定向)日志文件,而不是记录在主NN上,

d.然后这个设备在往主备NN发日志文件。这样最终主备NN互相没有影响,各自玩各自的。但是数据还都是全的。

 

10.在第9中手动解决了namenode单点故障问题,现在要自动解决单点故障问题

10.1使用zkfczkfc故障转移控制,是个进程。它左手抓着NN,右手抓着zookeeper

10.2zkfcNN做健康检测,并在zookeep(根据目录存储的小数据库)中创建了一个文件,哪个zkfc先创建了这个文件,哪个就是主NN

10.3如果一段时间后主NN挂了,此时zkfc通过检查会知道,知道之后会把zookeep

中的这个文件删除(一个删除事件)。由于有了删除事件,此时zookeep会回调另一个zkfc,让另一个zkfc创建文件,之后另一个NN就变成主NN了。即使第一台NN重新启动,它也不会变成主NN了(因为两个NN硬件配置一样,但是第二台NN数据最新)。

10.4如果此时第二台NNzjfc进程被杀死了但是第二台的NN还在(第二台出现故障了),此时第一台NNzkfc会利用远程免密钥的方式把第二台的配置级别降低(降低成备NN),

此时第一台自己在升级为主NN

11.副本放置策略

 

  第一个副本:放置在上传文件的DN;如果是集群外提交,则随机挑选一台磁盘不太满,CPU不太忙的节点。

  第二个副本:放置在于第一个副本不同的 机架的节点上。

  第三个副本:与第二个副本相同机架的节点。

  更多副本:随机节点

12.block块大小128M,过大过小都不好

 过小:产生小文件过多,导致读时IO多、写时IO多,产生的对象多(因为每个小block块在进入mapreduce阶段的时候都会根据代码产生大量对象。如果block块数量少就能少产生一些对象)

过大:block块过大就会导致并行度不是很好。也不利于数据本地化计算(计算向数据移动)

 

 

 

第二阶段: mapreduce阶段(记住FileInputFormatFileOutputFormat)

1.mapreduce定义:输入(格式化kv)数据集,经过map映射成一个中间的数据集,然后交给reduce进行计算。reduce认为'相同'key为一组,在调用reduce方法的时候,方法内迭代这一组数据进行计算

2.split的概念: 每个split切片会经过一个map映射成一个中间数据集,key决定reduce的并行(同时人也能决定reduce,因为人能控制切片的大小),split切片默认的大小跟block块的大小一样,但是split切片是人为可以调整大小的。

3.讲述过程:用户输入一组数据(其实是个文件),会用spilt进行分割,分割成很多切片,把多切片放到多map中进行并行,切片进入map之后,我们调整map程序把切片数据进行加工,数据的特征放在key里,最后产生一个中间数据集。然后把所有中间集汇总在一起,然后相同的key为一组,调用reduce方法。

4.Map任务处理

  4.1 读取HDFS中的文件。每一行解析成一个<k,v>。每一个键值对调用一次map函数。                数据如下:<0,hello you>   <10,hello me>                    

  4.2重写map(),接收4.1中产生的<k,v>,进行处理,转换为新的<k,v>输出。          <hello,1> <you,1> <hello,1> <me,1>

  4.3 4.2输出的<k,v>进行分区。默认分为一个区。详见《Partitioner

  4.4 对不同分区中的数据进行排序(按照k)、分组。分组指的是相同keyvalue放到一个集合中。排序后:<hello,1> <hello,1> <me,1> <you,1> 

分组后:<hello,{1,1}><me,{1}><you,{1}>

注意:分区是在进入buffer的时候发送的,排序和分组是buffer溢写的时候产生的。排序并溢写之后就形成了磁盘小文件。

  4.5 (可选)对分组后的数据进行归约。详见《Combiner

5.Reduce任务处理

  5.1 多个map任务的输出,按照不同的分区,通过网络copy到不同的reduce节点上。(shuffle)详见《shuffle过程分析》

  5.2 对多个map的输出进行合并、排序。重写reduce函数,接收的是分组后的数据,实现自己的业务逻辑,处理后,产生新的<k,v>输出。<hello,2> <me,1> <you,1>

2.3  reduce输出的<k,v>写到HDFS中。

6.计算向数据移动(也体现了splitblock的区别)

6.1.数据文件放在hdfs-->nanenode-->datanone(在服务器中)中,此datanode中分block,并且有备份。map信息放在 reduce-->jobtracker--->task(也在服务器中,mapreduce计算的过程需要申请资源,即resourcemanager)

6.2.这里提现了计算向数据移动:因为数据已经分在hdfs的各个datanode服务器中了,因此mapreduce在计算的要去找数据。一个map处理一个black,所以datanodetask在一起呢,然后就能计算了(计算向数据移动)

6.3. splitMapReduce里的概念,是切片的概念,split是逻辑切片 ;而blockhdfs中切块的大小,block是物理切块;

6.4. split的大小在默认的情况下和HDFSblock切块大小一致,为了是MapReduce处理的时候减少由于splitblock之间大小不一致,可能会完成多余的网络之间的传输。

 

 

6.整个过程:

第一步:客户端通过初始化得到split切片,split切片进入map,按行读取,每行都会解析成<k,v>格式。

第二步:程序员会重写map方法。

第三步:map<key,value>处理后的数据会进入buffer缓冲区(进入buffer的时候会进行分区),缓冲区达到80%(阈值)的时候会溢写(把内存的数据写到硬盘中形成一个个的临时小文件(已经按照分区排序过了分区规则是key模上reduce个数,也已经按照key进行分组了)),溢写小文件的时候是使用的快速排序算法sort(此快排的过程叫做combine),整个过程叫排序并溢写。每次排序并溢写形成一个小文件的时候会有一次combiner。注意:(1.在溢写的过程中可以没有combiner的过程的。2.buffer环形缓冲区中的数据和溢写之后的小文件形成的数据格式是kvp,即<key,value,partition>

第四步:等此map的所有缓冲区都准备好了之后,会把小文件合并成一个大文件,并且按分区排序了。组成了外部(每个分区)有序,内部(每个key)无序的文件。是个buffer环。

第五步:(可选)。针对这个文件我们可以做了combiner(微缩版的reduce,在map阶段就计算一遍数据,传入reduce的时候数据量就少了)。

第六步:shufflereduce将众多服务器中的文件抓取并用归并排序进行合并(归并文件的时候,由于文件都是内部有序的了,只需一次IO就行了)。

第七步:调用reduce方法,key相同的一组数据为一组。一个分区调用一次reduce方法,一个分区可以有很多组。

 

 

7.hadoop on yarn资源管理

 

 

7.1YARN:解耦资源与计算

7.2.ResourceManager :主节点,核心 。集群节点资源管理

7.3.NodeManager :与RM汇报资源 ,管理Container生命周期 ,计算框架中的角色都以Container表示

7.4Container:【节点NMCPU,MEM,I/O大小,启动命令】,容器的意思。

默认NodeManager启动线程监控Container大小,超出申请资源额度会杀死它。

7.5.MR数据提交过程 : 客户端-ApplicationMaster-Container;作业为单位,避免单点故障,负载到不同的节点;创建Task需要和RM申请资源(Container

7.6RM-Client:请求资源创建AM

7.7.AM-Client:与AM交互。

7.8任务提交过程:

第一步:client端提交MapReduce job任务给resourcemanager

第二步:resourcemanager随机找一台nodemanager启动applicationmanager(图中有两个client,因此启动了两个applicationmanager

第三步:amrs申请启动Container

第四步:rs找到一台符合资源要求的节点启动Container,并反向注册给client

第五步:client的任务提交到对应的Container上。

 

 

 

八:mapreduce的四个阶段

 

 

 

mapreduce有四个阶段:split map shuffle reduce

1).split进行切片

2).map需要我们重新map方法

3).shufflepartition分区(默认是key的哈希值模上reduce个数)、sort排序(字典序,keyASCII值排序。或者二次排序,例如我们的天气案例中)、group分组(默认按key分组,即key相同的为一组)。shuffle阶段在mapreudce阶段都有。

4).reducereduce也需要我们重写。

注意:如果计算非常简单,我们可以把shuffleredcue过程去掉。这样速度快。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics