### 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文件的数目,减少归并文件的次数