Hadoop的一些基本概念和原理

Hadoop

Hadoop的核心是HDFSMapReduce

一 HDFS

1.Hdfs是Hadoop的分布式文件存储系统,它的核心是解决大数据的存储问题。
2.基本概念
Namenode:是整个HDFS集群的总入口,存储这HDFS集群的文件元数据信息(如client上传的文件名,副本数,快数等相关信息)。
DataNode:是真正用来负责存储数据的节点,一个DataNode就是一个真实的物理主机。
Block:数据块,为了能通过多个节点保存大数据集,HDFS将大数据文件切分成一块块的数据块,在hadoop2版本中默认一个块大小为128M。
在这里插入图片描述3.ssh登录过程
在这里插入图片描述4.1NameNode的持久化
NameNode是用来存储元数据信息的,由于经常需要进行随机刚问,还有响应客户端请求,如果存放在磁盘中,效率必定是过低的,所以NameNode的元数据信息存放在内存中。这就导致了一个问题,如果断电,NameNode里的元数据信息不就丢失了吗,所以引入了在磁盘备份的FsImage(快照,记录了一个状态),但是这样又会导致一个新的问题,当内存中的元数据更新时,同时更新FsImage会导致效率过低,所以又引入了Edits文件(只进行追加操作,效率很高,每当元数据有更新或者添加元数据时,修改内存中的元数据并追加到Edits中)。这样,一旦断电,可以通过FsImage和Edits合并,合成新的FsImage。当然,如果你不合并的话,随着时间的累积,Edits文件会越来越大,Edits存储的效率会变低,并且,一旦断电,恢复元数据的时间会变长,所以要定期的进行合并操作,如果这个操作由NameNode节点完成又会效率过低,所以引入一个新的节点SecondaryNameNode,专门用于FsImage和Edits的合并。
总结:通过SecondaryNameNode定期对FsImage和Edits文件的合并来保证Name中数据的高可用。

4.2持久化机制工作原理
在这里插入图片描述第一阶段:NameNode启动
1)第一次启动NameNode格式化后,创建FsImage和Edits文件,如果不是第一次启动,直接加载镜像文件和编辑日志到内存。
2)客户端对元数据进行增删改的请求。
3)这些请求操作会被记录到edits中(查询元数据不会被记录在其中)。
4)NameNode在内存中对数据进行增删改。
第二阶段:SecondaryNameNode工作
1)SecondaryNameNode询问NameNode是否需要CheckPoint,直接带回NameNode是否检查结果。
2)SecondaryNameNode请求执行CheckPoint。
3)Edits滚动正在写的Edits日志,这里叫Edit_in(如果这时客户端对元数据进行增删改,这些记录会被存储在Edit_in中),将滚动前编辑的日志Edits2和镜像文件拷贝到SecondaryNameNode中。
4)SecondaryNameNode加载编辑日志和镜像文件到内存中并合并。
5)合并之后生成新的镜像文件fsimage.chkpoint。
6)从SecondaryNameNode中拷贝fsimage.chkpoint到NameNode。
7)NameNode将fsimage.chkpoint重命名为fsimage替换掉原来的fsimage。

二 MapReduce

1.MapReduce是hadoop体系下的一种计算框架,主要用来对存储在hdfs上的数据进行统计,分析的。
2.基本概念:
在这里插入图片描述①MapReduce:计算框架分为两个部分,Map(局部计算)和 Reduce(局部计算,汇总计算)。
②Yarn:资源调度,任务监控,用来整合hadoop集群中的资源(CPU,内存)进行统一调度,同时监控任务的执行情况。
③Job作业:一组MapReduce又称为一个Job作业,在一个Hadoop集群中可以有很多个job作业。
④设置job.setJarByClass(Myclass.class)的意义
在这里插入图片描述
3.hadoop中的包装类型
在这里插入图片描述4.MapReduce的高级特性
①MapReduce中Map数量
MapReduce运行过程中的Map数量是由block决定的,也就是一个文件分为几个block就是几个map。
注意:map数量由block决定,也就意味着一旦文件确定根据默认配置划分,block也将确定,所以我们不能干预map的执行数量。
②MapReduce中Reduce的数量
Reduce的数量可以在程序中手动指定
默认数量:1
可以通过:job.setNumReduceTask(0);数字几就是几个reduce。
0表示没有,在只有map的时候为0(数据清洗)。
如果设置多个,就会有相应数量的reduce,就会生成相应数量的结果文件,多个reduce同时处理数据,将原来一个reduce处理结果,分到了不同的reduce处理文件中。
总结
1)如果只想要数据清洗,设置为0。
2)如果想要将所有结果数据汇总在一起,只能设置为1。
3)如果想要将结果划分到多个文件中可以设置多个reduce数量。
③为什么要设置多个reduce数量
提高MapReduce运行效率,从而快速统计计算结果。
④多个Reduce如何去分配map中数据
一旦设置了多个reduce,如何让多个reduce均分map中统计的数据,这里有一个分区(Partition)的概念,一个Reduce会形成一个分区,默认使用的是HashPartitioner,会根据map输出的key做hash运算去决定map中输出的数据j交给哪个reduce去处理。

HashPartitioner源码
在这里插入图片描述当然也可以自定义分区,这里不过多介绍了

//设置分区
job.setPartitionerClass(ProvincePartitioner.class);
//设置reduce数量
job.setNumReduceTasks(5);

⑤Combiner合并
又称为map端的reduce,主要是通过对map的局部数据先进行一次reduce,从而减少map端输出数据频繁发送给Reduce处理时所带来的网络压力问题。通过这种提前对map输出做一次局部reduce,既可以减轻网络压力,又能提高效率,在mapreduce编程模型中默认是关闭的。

//设置Combiner,直接使用reduce的代码就行
job.setCombinerClass(AccessLogCustomerTypeReduce.class);

三 分析源码

① Input Format切片的计算方式

说明:128×1.1=140.8 260-128=132
① 当一个文件小于128M时一定会被分成一个逻辑切片,Block块与Split(切片)一一对应 。
② 当一个文件大于128M,剩余大小大于切片的1.1倍,Block块与Split(切片)一一对应。反之如果一个文件大于128M,剩余大小小于切片的1.1倍,此时将划分为一个切片。
在这里插入图片描述

② OutputFormat分析

通过源码得知默认的key和value输出分割符为"tab键"也就是这里的"\t"

③ Shuffle的分析

shuffle阶段是一个整体叫法: 其实又分为Map端的shuffle 和 Reduce端的Shuffle。

1)Map端shuffle

在这里插入图片描述

2)Reduce端的shuffle

在这里插入图片描述

四 MapReduce整体运行原理

在这里插入图片描述
① 计算切片
有几个切片就有几个map task
② 环形缓存区
经过map函数的逻辑处理后的数据输出之后,会通过OutPutCollector收集器将数据收集到环形缓存区保存。
环形缓存区的大小默认为100M,当保存的数据达到80%时,就将缓存区的数据溢出到磁盘上保存。
③溢出
环形缓存区的数据达到其容量的80%时就会溢出到磁盘上进行保存,在此过程中,程序会对数据进行分区(默认HashPartition)和排序(默认根据key进行快排)
缓存区不断溢出的数据形成多个小文件
④合并
溢出的多个小文件各个区合并在一起(0区和0区合并成一个0区),形成大文件
通过归并排序保证区内的数据有序
⑤shuffle
从过程2到过程7之间,即map任务和reduce任务之间的数据流称为shuffle(混洗),而过程5最能体现出混洗这一概念。一般情况下,一个reduce任务的输入数据来自与多个map任务,多个reduce任务的情况下就会出现如过程5所示的,
每个reduce任务从map的输出数据中获取属于自己的那个分区的数据。
⑥合并
运行reducetask的节点通过过程5,将来自多个map任务的属于自己的分区数据下载到本地磁盘工作目录。这多个分区文件通过归并排序合并成大文件,并根据key值分好组(key值相同的,value值会以迭代器的形式组在一起)。
⑦reducetask
reducetask从本地工作目录获取已经分好组并且排好序的数据,将数据进行reduce函数中的逻辑处理。
⑧输出
每个reducetask输出一个结果文件。

五 Job作业提交过程

在这里插入图片描述
客户端的配置信息mapreduce.framework.name为yarn时,客户端会启动YarnRunner(yarn的客户端程序),并将mapreduce作业提交给yarn平台处理。

1.向ResourceManager请求运行一个mapreduce程序。

2.ResourceManager返回hdfs地址,告诉客户端将作业运行相关的资源文件上传到hdfs。

3.客户端提交mr程序运行所需的文件(包括作业的jar包,作业的配置文件,分片信息等)到hdfs上。

4.作业相关信息提交完成后,客户端用过调用ResourcrManager的submitApplication()方法提交作业。

5.ResourceManager将作业传递给调度器,调度器的默认调度策略是先进先出。

6.调度器寻找一台空闲的节点,并在该节点隔离出一个容器(container),容器中分配了cpu,内存等资源,并启动MRAppmaster进程。

7.MRAppmaster根据需要运行多少个map任务,多少个reduce任务向ResourceManager请求资源。

8.ResourceManager分配相应数量的容器,并告知MRAppmaster容器在哪。

9.MRAppmaster启动maptask。

10.maptask从HDFS获取分片数据执行map逻辑。

11.map逻辑执行结束后,MRAppmaster启动reducetask。

12.reducetask从maptask获取属于自己的分区数据执行reduce逻辑。

13.reduce逻辑结束后将结果数据保存到HDFS上。

14.mapreduce作业结束后,MRAppmaster通知ResourceManager结束自己,让ResourceManager回收所有资源。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无敌火车滴滴开

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值