你想要什么?你在做什么?它们一样吗?你今天比昨天更好吗?
文章目录
- 一、背景
- 二、Hadoop是什么?
- 三、HDFS
- 1 HDFS存储模型
- 2 HDFS架构
- 3 HDFS 元数据持久化
- 4 HDFS 启动过程(HA 模式)
- 5 HDFS 安全模式
- 6 HA 切换过程
- 7 FS Shell
- 四、MapReduce
- 1 执行流程
- 2 Map
- 3 Reduce
- 五、Yarn
- 1 资源分配过程
- 2 Yarn Commond
- 参考链接
我的Hadoop笔记
一、背景
起源于google的3篇论文中的GFS和MapReduce,作者是Doug cutting,截止到2021-04-07为止,最新的正式版本为3.2.2,本笔记还是基于Hadoop2.x的内容
二、Hadoop是什么?
狭义的Hadoop包括HDFS(Hadoop Distributed File System)和MapReduce,本篇笔记只包括狭义的Hadoop
HDFS是一个分布式文件存储系统,MapReduce是计算框架
广义的Hadoop可以理解为Hadoop生态(hdfs,mapreduce,hive,hbase,yarn,oozie,sqoop,flume,phoenix,kafka,spark)
三、HDFS
是一个分布式文件系统,从用户角度看就是个存文件的地方,可以创建目录,创建文件,上传文件,下载文件等等。
支持Java API、RestFul API操作HDFS。
1 HDFS存储模型
- 文件被切割成一个个block,每个block大小默认128兆
- 单个block大小一致,文件和文件的block大小可以不一致
- block分散存储在集群的多个节点
- block可以设置副本个数,默认值是3,一般副本数不建议超过节点数
- 已存储的block副本数可以重新设置数量,大小不可变
- 支持一次写入多次读取,同一时刻只能有一个写入者
- 只支持append操作,不支持修改,修改可以通过删除文件重写实现
2 HDFS架构
NameNode 管理结点
职责:
存储元数据,数据存储在内存中
元数据包括三类:
1.文件与目录的属性,包括文件名、创建时间、修改时间等
2.数据所在DataNode、偏移量,block副本位置(由DataNode上报)
3.记录所有DataNode的信息,管理DataNode
接收客户端的读写服务
DataNode 数据结点
存储数据
职责:
1.存储数据和block元数据
2.向NameNode汇报block信息
3.向NameNode保持心跳
如果NameNode10分钟未收到DataNode心跳认为该DataNode已经无效
将会拷贝无效DataNode上的block到其他DataNode
JournalNode 存储数据变动记录
职责:
保存editlog(数据变化记录)
Client 客户端
职责:
切分数据文件
从NameNode读取文件元数据
从DataNode读取数据
FailoverController
职责:
检测NameNode的健康状况
选举Active NameNode
架构示意图:
3 HDFS 元数据持久化
元数据分为两个文件,其一是fsimage,是内存中元数据的一个快照;其二是editslog,记录了快照之后的所有编辑操作。
集群重启后,通过合并fsimage和editslog来恢复元数据。
4 HDFS 启动过程(HA 模式)
- 启动2个NameNode,一个为Active(主),一个是Standby(备)
- Active NameNode读取元数据fsimage,加载到内存中
- Active NameNode读取editslog,合并到fsimage中,将fsimage传输给Standby NameNode,在磁盘上生成一个新的fsimage文件,同时创建新的editslog。Active NameNode将其不断发送到JournalNode
- Standby NameNode不间断的从JournalNode读取editslog,合并到fsimage
- DataNode启动,向NameNode报告block信息
- 进入SafeMode(安全模式),此时只响应读取操作
- 退出安全模式
5 HDFS 安全模式
- Hadoop集群启动后会进入安全模式,此时HDFS只响应读请求,不会响应删除修改请求。
- Active NameNode获得DataNode上报的block信息,检查block副本数是否满足条件(NameNode统计元数据和DataNode发送过来的块报告中的统计信息匹配度达到99.999%),满足条件则会退出安全模式。
- 如果块有丢失,会自动复制丢失副本的block到DataNode上,直至达到配置的副本数为止,复制后,过一段时间会退出安全模式。
# 退出安全模式
hdfs dfsadmin -safemode leave;
# 强制退出安全模式,上面命令不生效可使用下面的命令
hdfs dfsadmin -safemode forceExit;
6 HA 切换过程
1 当Active NameNode挂掉
- Active NameNode挂了
- Zookeeper删除Active NameNode 对应的FailoverController创建的结点,Active NameNode 对应的FailoverController之后将Active NameNode的状态修改为Standby状态
- Standby NameNode 对应的FailoverController发现删除了,则立即到Zookeeper创建节点,之后将Standby NameNode的状态调整为Active
2 当FailoverController挂掉
- Active NameNode对应的FailoverController挂了
- Zookeeper中Active NameNode对应的FailoverController创建的临时结点被删除
- Standby NameNode对应的FailoverController在Zookeeper
- Active FailoverController控制当前的Active NameNode状态变为Standby
- Active FailoverController控制之前为Standby的NameNode的状态变为Active
7 FS Shell
常用的一些shell命令,命令和linux shell命令很相似
# 创建目录
hdfs dfs -mkdir /test_mkdir
# 查看制定目录内容,类似shell命令里的ls
hdfs dfs -ls /
# 删除目录
hdfs dfs -rm -R /test_mkdir
四、MapReduce
MapReduce思想认为所有的数据计算都可以通过map和reduce的组合实现。
1 执行流程
一段数据的处理过程:
- 一行一行读取数据
- 按分隔符切割一行数据
- map进行转换映射
- 拉取相同的key到一个reduce
- reduce将拿到的数据聚合
- 将所有reduce的输出汇聚到一起即是最终的结果
2 Map
- map接收到前面输入的一条数据
- 按一条记录为单位进行拆分,形成一条Key-Value数据
- 计算Key-Value数据的Partition(哈希取余),把KVP存进buffer里,排序
- 达到阈值溢写磁盘,写成小文件
- 合并成一个大文件(大文件中分区相同的分区的数据放到一起,相同key的放到一起)
- map完全执行完毕
map完全执行完毕才会执行reduce
3 Reduce
- 拉取map执行完后的结果,进行归并排序,生成一个大文件
- 从其他map中拉取key相同的数据,再归并排序,但不生成大文件
- 一条条的计算key相同的数据
read,split,map,collect,spill,combine,copy,sort,reduce
五、Yarn
1 资源分配过程
yarn资源分配过程
- 用户向YARN提交应用程序,包括ApplicationMaster程序,启动ApplicationMaster的命令、用户程序等。
- Resource Manager通知不忙的NodeManager,为该应用程序分配一个Container,并在Container中启动一个负责管理此次运行的ApplicationMaster
- ApplicationMaster启动后,向Resource Manager注册,方便用户通过Resource Manger查看程序的运行状态。之后Application Master为此次任务向Resource Manger申请资源,同时监控程序运行状态,直到程序运行结束。如果没有足够资源,会重复第4步,直到申请到足够资源
- Application Master 采用轮巡方式通过RPC协议向Resource Manger申请和领取资源
- 一旦Application Master申请到足够的内存和core,就会要求对应的NodeManager启动任务
- NodeManger设置运行环境(包括环境变量、jar包、二进制程序等),将任务启动命令写到脚本中,通过运行脚本启动任务
- 各个任务通过RPC协议向Application Master汇报状态和进度,既可以让Application Master掌握任务运行状态,又可以在任务失败时进行重试。
8.程序运行完毕后,Application Master向Resource Manager注销,然后关闭自己
2 Yarn Commond
常用命令
# 查看所有已缓存的包
yarn cache list
# 查看缓存位置
yarn cache dir
# 查看应用列表
yarn application -list
# 查看指定应用程序id或应用名的程序的状态
yarn application -status <ApplicationId or ApplicationName>
# 杀死指定Application ID的程序
yarn application -kill <Application ID>
# 查看指定Application ID的程序的日志
yarn logs -applicationId <application ID> [options]