大数据
是指在一定时间范围内利用常规软件工具进行捕捉、管理和处理的数据集合。
1.分布式系统是一个硬件或软件分布在不同网络计算机上
2.彼此之间仅仅通过消息传递进行通信和协调的系统
3.一群互相独立的计算机集合共同对外提供服务
4.对于系统用户而言,就像是一台计算机在提供服务
相同点:多台机器
不同点:
分布式的多台机器部署着不同的组件(硬件或软件)
集群上的多台机器部署这相同组件
常见名词定义
负载均衡:一个处理不了,多个一起处理
故障转移(单点故障):解决单点故障,容忍错误发生,业务连续
伸缩性:动态扩容、缩容
狭义上,Hadoop是用java语言实现的开源软件框架;使用简单的编程模型跨计算机集群对大型数据及进行分布式处理;
广义上,Hadoop指的是围绕Hadoop打造的大数据生态圈;
四大特性
高扩容
低成本
高效率
高可靠性
定义:
一个文件系统,通过目录树定位,用于存储文件; 它是分布式的,有很多服务器联合起来实现其功能;
使用场景:适合一次写入,多次读出的场景。
优缺点:
优点:
可以部署在廉价的PC机上, 高容错性:通过副本机制自动保存多个副本
适合处理大数据:数据规模达到GB,TB,PB级别的数据;文件规模达到百万级规模以上的文件数量。
缺点:
1.不适合处理低延迟数据,如毫米级数据处理
2.不适合处理大规模数量的小文件,小文件元数据会很费NameNode的存储
3.无法并发写入数据,不支持随意修改。
组成架构:
NameNode
处理客户端请求 ;
存储文件元数据,文件快的信息 ;
配置副本策略 ;
DataNode
存储实际的数据块;
执行客户端对数据块的读写操作;
Client
切分文件为块 ;
与NameNode获取文件位置信息,DataNode交互读写数据;
提供一些管理,访问HDFS的命令,如格式化NameNode,对HDFS增删改查的操作;
SecondaryNameNode
备份Name Node上的元数据,;
提供单点故障后NameNode快速重启的辅助保障;
文件块大小:
- HDFS的文件在物理上是分块存储(block),块的大小可以通过配置参数(dfs.blocksize)来规定,默认大小128M,在Hadoop1时,默认是64M。
文件块的大小设置取决于磁盘传输速率
HDFS的API操作待补充
HDFS写数据流程待补充
1.客户端创建DistributedFileSystem对象,调用对象的create方法,通过RPC请求上传文件给NameNode;
2.NameNode检查客户端权限,检查自己目录内是否存在该文件,父目录;检查完毕;
3.NameNode返回响应和FSDataOutputStream对象,客户端通过该对象的write方法写入文件;
4.客户端在上传文件前,想NameNode请求文件传输的DataNode节点位置信息;NameNode通过本地原则,返回几个节点,这里是3个;dn1,dn2,dn3;
5.客户端向DataNode请求建立传输通道,3个节点串行应答成功,开始传输
6.客户端写入数据时,DFSOutputStream将数据分成一个个数据包(packet,默认64k),并写入一个发送队列(data queue),先在节点1中传输,然后串行方式由节点1传入节点2,节点2传入节点3。
7.传输完成后,会在等待队列ack中进行确认;DistributedFileSystem联系NameNode告知其文件写入完成,队列FSDataOutputStream调用close方法关闭流程;
8.如果文件大,会有多个block,则重复前几步即可。
MAPREDUCE(分布式计算分析框架)待补充
MapReduce是一个分布式运算程序的编程框架
MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发布在一个Hadoop集群上。
优缺点:
优点
MapReduce易于编程,简单实现一些接口,就可以完成一个分布式程序。
良好的扩展性;计算资源不足,简单增加机器解决扩展计算能力
高容错性;有一台服务器挂掉之后,它可以把上面的计算任务转移到另外一个节点上运行,不至于这个任务运行失败。
适合处理大数据的离线处理
缺点:
不适合实时计算
不擅长流失计算
不擅长DAG(有向无环图)计算
(1)分布式的运算程序往往需要分成至少2个阶段。
(2)第一个阶段的MapTask并发实例,完全并行运行,互不相干。
(3)第二个阶段的ReduceTask并发实例互不相干,但是他们的数据依赖于上一个阶段的所有MapTask并发实例的输出。
(4)MapReduce编程模型只能包含一个Map阶段和一个Reduce阶段,如果用户的业务逻辑非常复杂,那就只能多个MapReduce程序,串行运行。
一个完整的MapReduce程序在分布式运行时有三类实例进程:
(1)MrAppMaster:负责整个程序的过程调度及状态协调。
(2)MapTask:负责Map阶段的整个数据处理流程。
(3)ReduceTask:负责Reduce阶段的整个数据处理流程。
思考?在运行MapReduce程序时,输入文件格式包括:基于行的日志文件、二进制格式文件、数据库表等。那么针对不同数据类型,MapReduce如何读取? FileInputFormat常见的接口实现类包括:TextInputFormat(默认)、CombineTextInputFormat、自定义InputFormat等。1.数据切片与MapTask并行度决定机制
MapTask的并行度决定Map阶段的任务处理并发度,进而影响整个Job的处理速度。
思考?是否MapTask数量越多越好?
MapTask并行度决定机制
数据块:Block是物理上把数据分成一块一块的,数据块是HDFS存储数据单位
数据切片:是逻辑上对输入进行分片,并不会在磁盘上将其切分成片进行存储。数据切片是MapReduce程序计算输入数据的单位,一个切片会对应启动一个MapTask。
一个Job的Map阶段并行度由客户端在提交Job时的切片数决定
1.简单的按照文件的内容长度进行切片
2.切片大小,默认等于Block大小
3.切片时不考虑数据集整体,而是针对每一个文件单独切片
切片机制有 FileInputFormat切片机制 、 TextInputFormat、 CombineTextInputFormat切片机制
MapReduce工作流程- 通过InputFormat切片方式(根据文件数据类型不同,选择不同的切片类型,默认是TextInputFormat),这里用默认方式读取数据,通过getSplits方法对输入目录中文件进行逻辑规划进行切片。有多少split就启动多少个MapTask。逻辑规划后,通过RecordReader对象(LineRecordReader)对文件按行读取为
值(k是每行首字符偏移值,v表示这一行文本内容),以空格为分隔符。 - 将读取一对一对的
值给到MapTask中的Mapper类,进行用户自己写的业务逻辑map函数方法(这个方法是:一对 调用该方法一次)实现。每次map读取完成一条 后,通过context.write进行collect数据收集,在collect过程中,会对数据进行分区,默认使用HashPartitioner。(MapReduce提供Partitioner接口,它的作用就是决定当前的这对输出数据交由那个ReduceTask处理。用户如果有需求,可以自己设置到Job上) - 分区结束后,
值给到缓冲区中,缓冲区一边存 数据,另一边存元数据。(在 值进入缓冲区时,根据分区设置进入指定分区,默认分区partial为1)。在数据达到缓冲区存储量的80%时,开始溢写到磁盘中。在溢写之前会对 进行排序。 - 缓冲区数据溢写到磁盘中会生成一个个临时文件。当整个数据处理结束之后,开始通过Merge合并,将这些临时文件合并成一个大文件,并且为这个文件提供一个索引文件,以记录每个reduce对应数据的偏移量。等待ReduceTask来拉取。ReduceTask数量由分区数决定。
- ReduceTask中包含有eventFetcher,负责查看MapTask是否已完成工作。由Fetcher线程负责拉取文件到本地内存。这个过程会生成两个merge线程,分别是inMemoryMerger和onDiskMerger,分别将内存中数据merge到磁盘,和将磁盘中的数据进行merge,并且在磁盘中完成最后一次排序。
- 最后以相同key的小组给到Reduce(用户自己编写的reduce函数业务逻辑),进行求和,叠加等处理。最后通过默认输出组件TextOutputFormat(这里使用OutputFormat)的write写入输出到指定目录。·
- Mr提交任务到客户端
- 客户端通过YarnRunner向ResourceManager申请一个Application。
- ResourceManager,返回Application的提交路径和Application的Id
- Yarn Runner向指定路径提交上传Job运行所需文件,包含“job.split 、wc.jar 、 job.xml”,
- 资源提交完毕后,YarnRunner会向ResourceManager申请运行MrAppMaster
- RM会把用户的请求初始化成一个Task,放入到调度队列中。因为不止一个客户端的请求,许多客户端的请求需要在调度队列中等待。
- 空闲的NodeManager会到队列中领取Task任务,领取到任务后,在该节点上创建容器,运行MrAppMaster,并把路径中的job文件下载到本地。
- MrAppMaster会向RM申请MapTask资源,来处理Job任务。
- 其余空闲的NodeManager领取到任务,创建容器。
- MR向NodeManager发送程序启动脚本,启动Map Task对数据执行处理
- MR等待所有MapTask执行完毕,向RM申请,运行ReduceTask
- ReduceTask将所有MapTask输出的数据按照分区号,拉取过来
- 程序执行完毕后,MR会向RM申请注销自己。
FIFO Schedule
单队列,根据提交作业先后顺序,先来先服务。 简单易懂,不支持多队列,生产环境很少使用。
Capiti Schedule
容量调度。Apache Hadoop3默认调度策略。该策略允许多个组织共享整个集群资源。
容量调度器以队列为单位划分资源。就是一个队列有独立的资源,队列的结构和资源是可以进行配置的。在一个队列内部,资源的调度采用的是先进先出。每个队列可设定一定比例的资源最低保证和使用上限,防止滥用。
优势
1.层次化的队列设计
层次化的管理,更容易,更合理的分配和限制资源的使用
2.容量保证
每个队列上都可以设置一个资源的占比,保证每个队列不会占用整个集群的资源
3. 安全
每个队列有严格的访问控制,用户只能向自己的队列中提交任务,不能修改或访问其他队列的任务。
4. 弹性分配 空闲资源可以分配给其他队列
5.多租户租用
多个用户可以共享同一个集群
6. 操作性 支持动态修改配置,调正队列容量,权限等分配,可以在运行时直接修改 基于用户/组的队列隐射
允许用户基于用户或者组去映射一个作业到特定队列
Fair Schedule
公平调度,提供了YARN应用程序公平地共享大型集群中资源的另一种方式。是所有应用在平均情况下随着时间的流逝可以获得相等的资源份额。 公平调度可以在多个队列间工作,允许资源共享和抢占 **队列** 默认情况下,所有用户共享一个名为default的队列 可以在提交应用时指定队列,也可以通过配置根据请求中包含的用户名或组来分配队列 在每个队列中,使用调度策略在运行的应用程序之间共享资源。默认设置是基于内存的公平共享。 **特性优势** 分层队列:队列可以按层次结构排列一划分资源,并可以配置权重按特定比例共享集群 资源抢占:根据应用的配置,抢占和分配资源可以是友好或强制的。默认不启用资源抢占。 允许资源共享:当一个应用运行时,如果其他队列没有任务执行,则可以使用其它队列,当其他队列有需要时,再将占用的队列释放归还。
调度器的选择,可以根据业务需要;如果资源丰富,则可以选择容量调度,这个调度方式不会因为抢占机制而影响到任务执行的效率。当资源紧张的情况下,为了任务执行,可以使用公平调度方式,可以确保每个任务都会并行执行。



