### 1、hadoop
hadoop是一个分布式系统基础架构
集群:多个机器共同完成一件事
分布式:多个机器共同完成一件事,然后不同机器作用不同,各司其职
hadoop三大组件:
hdfs:高可靠,高吞吐量的分布式文件存储系统
mapReduce:一个分布式的离线并行计算框架
YARN:作业调度与资源管理平台
除了三大组件之外hadoop还提供了common工具模块用于支持其他模块的操作
### 2、HDFS
高可靠(多副本机制)、高吞吐的分布式文件存储系统
集群启动命令:安装目录下 ./sbin/start-dfs.sh
读写端口:9000
webui端口:50070
#### 2.1、组件
Namenode:主节点
作用:存储文件的元数据(描述数据的数据)信息
处理客户端读写请求
维护文件的多副本
DataNode:数据节点
作用:具体存储数据的节点,执行数据读写操作,负责数据校验和
Secondarynamenode:辅助节点
作用: 用来辅助主节点管理元数据信息,
定期合并主节点的Edits()文件和fsimage()文件并推送给namenode
client:客户端
作用:将文件切分成一个个block,然后按块上传、
与namenode交互获取存放文件的datanode位置
与datanode交互。读写数据
###### 注意:高可用模式下没有secondaryNameNode节点,此时由standby状态下的namenode
###### 负责辅助管理元数据信息,此时namenode节点之间的数据同步由journalNode负责
#### 2.2、特点
高可靠(多副本、自动回复),高吞吐,分布式、适合大数据处理、部署成本低(可部署在廉价机器上)
适合一次写入多次读取的场景,且不支持文件修改但可以删除
#### 2.3、缺点
不适合大量小文件存储:因为hdfs存储的基本单位是block块,一个block块大小是128M
不适合低延迟的数据访问
不支持数据修改
#### 2.4、hdfs 写流程
1、客户端上传文件,首先向namenode发送请求上传文件,namenode会进行验证目标文件是否存在或父目录是否存在
2、验证通过后、回复客户端可以上传
3、客户端接到可以上传的回复后,会向namenode询问第一个block块上传到哪几个节点
4、namenode返回客户端可用的datanode节点地址,并保存元数据信息
5、客户端请求写入第一个节点,第一个节点会与第二个节点建立通道、第二个节点会与第三个节点建立通道,以此类推直到通道全部打通
6、各节点逐级应答客户端,通道建立
7、客户端开始写数据到第一个datanode上,datanode存储数据到本地并且将数据通过通道传递到下一个datanode,以此类推
8、当前block传输完成后,客户端再次请求上传下一个block块
#### 2.5、hdfs 读流程
1、客户端向namenode请求下载文件
2、namenode通过查询元数据,找到文件所在datanode地址返回给客户端
3、客户端就近选择一台datanode,请求读取第一块数据
4、datanode传输第一块数据数据给客户端
5、客户端继续就近选择datanode请求后续数据块,直到数据块全部下载成功
6、客户端将所有数据块下载后,在本地将所有块拼接成一个文件
#### 2.6、namenode和secondarynamenode工作原理
namenode工作原理:
1、第一次启动namenode格式化后,创建fsimage镜像文件(存储的是元数据)和edits(存储的是生成元数据的操作,执行后会生成元数据)编辑日志文件
2、nomenode接受客户端对元数据的增删改请求时并不是直接写入内存,而是会将这些请求写入编辑日志中
3、namenode会将存储完成的编辑日志执行一遍形成元数据写入内存,当编辑日志文件达到一定大小后,会按照编号将其重命名,并创建新的编辑文件
4、namenode在内存中对元数据进行更改
secondarynamenode工作原理:
1、secondarynamenode向namenode询问是否需要checkpoint,并带回询问结果
2、secondarynamenode根据结果(条件:定时(一般一个小时)时间到了或者编辑日志文件写满了)向namenode请求checkpoint
3、namenode滚动正在写的edits编辑日志文件
4、将滚动前的edits编辑日志文件和fsimage镜像文件拷贝到secondarynamenode
5、secondarynamenode 加载编辑文件和日志文件到内存进行比对合并
6、secondarynamenode 生成新的fsimage.checkpoint镜像文件拷贝到namenode
7、namenode将fsimage.checkpoint镜像文件重命名为fsimage
### 3、YARN
作业调度与资源管理平台
启动命令:安装路径下 ./sbin/start-yarn.sh
webUI 端口:8088
#### 3.1、集群角色
ResourceManager:yarn集群的管理者
作用:处理客户端请求、监控ApplicationMaster、监控nodeManger、负责资源分配与调度
NodeManager:本台机器的管理者
作用:管理本台机器的资源,处理来自ResourceManager的命令、和来自ApplicationMaster
的命令,并为其分配资源
ApplicationMaster:mapruduce任务的管理者
作用:负责数据切分、处理来自ResourceManager的命令、为mr任务申请资源并分配给内部
任务,负责任务的监控和容错处理
container:运行环境的抽象
作用:运行mr任务的基本单位,内部封装了mr运行需要的cpu、内存等资源以及环境变量、
启动命令等任务运行相关的信息。
#### 3.2、yarn工作流程(mr为例)
1、mr提交到客户端,客户端向rm申请一个Application
2、resourcemanger返回资源提交地址
3、客户端将运行所需资源提交到hdfs上
4、资源提交完毕。申请运行mrapplicationMaster
5、recourseManger将客户端请求初始化成一个task,放入他的任务队列中
6、其中一个nodemanger领取到这个任务后,创建容器container、并产生mrapplicationMaster
7、mrapplicationMaster从hdfs拷贝程序运行所需资源
8、mrapplicationMaster向rm申请maptask资源
9、rm将指定nodemanger,这些nodemanger会领取任务创建程序运行所需的container
10、mrapplicationMaster给这些nodemanger发送程序启动脚本,这些nodemanger会分别启动maptask,对数据进行处理、分区、排序
11、mrapplicationMaster等所有maptask运行完毕后,向rm申请资源运行reduceTask
12、reduceTask向mapTask获取相应分区的数据进行聚合计算
13、程序运行完毕mrapplicationMaster向rm申请注销,释放资源
#### 3.3、yarn调度器
1、先进先出调度器(FIFO):一个队列。先来先运行
2、容量调度器:多个队列,多个任务可以同时运行,每个队列中遵循FIFO(适用于给多个组织提供服务的场景)
3、公平调度器:不分先后,任务过来就与当前的任务平均分配资源(对配置要求较高)
### 4、mapReduce
一个分布式的离线并行计算框架
#### 4.1、计算阶段
map(映射)阶段:读入数据并进行转换处理
reduce(归约)阶段:对map阶段处理的结果进行汇总
#### 4.2、特点
优点:易于编程、扩展性良好、具有高容错性,适合pb级以上海量数据的离线分析
缺点:无法做实时分析、流式计算和DAG有向图计算
#### 4.3、mapreduce工作原理
1、执行driver的main方法,写入数据切片规则,生成运行任务的配置文件,将程序打成jar包。准备好后将任务和相关资源提交给yarn的resourcemanger。
2、resourcemanger收到客户端提交的任务后,生成MRapplicationMaster,由该进程负责指挥调度刚刚提交的任务
3、MRapplicationMaster会解析任务。查看任务切片数量,启动相应数量的maptask
4、maptask,执行业务逻辑、将其负责的切片数据处理后,然后写入环形缓冲区(默认100M)(优化:增大缓冲区大小,减少溢写次数,减少磁盘io)
5、缓冲区占用达到一定比例时(一般是80%)开始溢写到磁盘,溢写时根据分区规则进行分区,和第一次排序(确保分区内有序)
6、当溢写次数过多,分区内小文件达到一定数量时,会触发shuffle,开始第一次归并并进行第二次排序,(把相同分区内小文件合并成成一个大文件,并且确保数据有序)
注:此时可以选择conbiner进行(map端)预聚合,可以减少网络传输次数,减少磁盘io(属于优化)
7、当map阶段结束后MRapplicationMaster会根据分区数,启动相应数量的reduceTask,各个reduceTask会从各个maptas拷贝相同分区的数据,然后进行第二次归并,和第三次排序
8、读取归并后的文件,调用reduce方法实现聚合逻辑
#### 4.4、优化
1、尽可能的使用map join 而不使用reduce join (减少磁盘io和网络传输)
2、自定义分区方式(写一个类集成partioner类),防止数据倾斜
3、合理设置map和reduce数量
4、增大环形缓冲区大小,减少溢写次数
5、map后、在不影响业务逻辑的前提下使用combiner在map端进行预聚合,减少网络传输
6、增大merge文件的数目,减少归并文件的次数