【博学谷IT技术支持】
zookeeper
基础
- 架构是:主从架构
- 安装虚拟机必须安装jdk
- 角色:leader, Follower ,Observer
zookeeper的特性
- 全局一致性
- 顺序性
- 原子性
- 实时性
zookeeper的watch机制
zookeeper的选举机制
hadoop
基础
主从集群
NameNode SecondaryNamenode DataNode
HDFS页面端口:9870
YARN页面端口:8088
historyServer端口:19888
hadoop启动
在node1上使用以下命令启动HDFS NameNode:
hdfs --daemon start namenode
在三台机器上使用以下命令启动HDFS DataNode:
hdfs --daemon start datanode
在node2上使用以下命令启动HDFS SecondaryNameNode:
hdfs --daemon start secondarynamenode
在node1上使用以下命令启动YARN ResourceManager:
yarn --daemon start resourcemanager
在三台机器上使用以下命令启动YARN nodemanager:
yarn --daemon start nodemanager
hdfs
HDFS来自谷歌的论文GFS
HDFS页面的端口号: 8020
特性
- 存储能力强
- 理论上可以无限扩展
- 适合存储大文件
- HDFS只支持追加写入
- 适合离线数据存储
HDFS的架构
NameNode
1、NameNode管理整个HDFS集群
2、NameNode管理整个HDFS的所有元数据
3、Client要上传或者下载文件必须先找NameNode
4、一旦NameNode挂掉,整个HdFS集群将无法工作
5、各个DataNode隔一段时间向NameNode汇报自己的Block信息和磁盘信息
DataNode
1、DataNode是具体存数据的,HDFS所有真实数据都在DataNode存储
2、各个DataNode隔一段时间向NameNode汇报自己的Block信息和磁盘信息
3、Client在上传和下载文件时,和NameNode交流之后,真实的数据上传和下载是在Client和DataNode之间
SecondaryNameNode
辅助NameNode进行元数据管理,将NameNode内存中元数据保存到硬盘上
HDFS的读写流程
上图是HDFS的写流程图
主要步骤如下
- client向服务器发起上传请求(RPC)
- NameNode接受到请求之后会进行权限检查(目录是否存在权限,目录是否存在)
- NameNode会给client反馈是否可以上传标记
- Client会将要上传的文件安装设置的Block大小进行切片
- Client向NameNode请求上传第一个Block
- 当NameNode收到上传Block请求之后,会根据副本放置策略和主机的优秀程度选出最优主机
- NameNode返回最优的主机列表给Client
- Client和主机列表排在最前的主机建立pipeline
- dataNode告诉应答成功
- Client开始传输第一个Block数据,传输数据的单位是package(64K)
- 收到一个package就会缓存datanodeDatas
- HDFS会产生一个应答队列,从最后一个开始,收到packet,就会将一个ACK应答放入应答队列
- Client判断应答队列的ACK是否完整,如果完整,则判断此次packet发送成功,继续发送第二个package
- 当最后一个package发送完成之后,每一个DataNode会将缓存的Package数据存储到硬盘上,也就是一个Block
- Client重新执行第五步,请求Namenode上传第二个block,
- client向Namenode汇报文件上传完毕
- NameNode更新自己内存中的元数据
写流程简单概况
- client向namenode发起上传请求,namenode判断权限等告诉client是否可以上传,并返回主机列表。
- client与主机建立pipeline,分别上传所有的block。
- 上传完毕汇报client,client告诉namenode更新自己内存中的元数组。
HDFS读流程
- Client向服务端发起文件下载请求
- 服务器做权限检查,判断文件是否存在以及权限问题
- namenode获取该文件的block信息列表,并且对每一个block的主机进行排序(策略)
block1: node1 node3 node4
block2: node1 node2 node4
block3: node2 node3 node4
- 将文件的block列表发送到client
block1: node1 node3 node4
block2: node1 node2 node4
block3: node2 node3 node4
- client分别和三个block所在的主机建立管道通信
- client分别从三台主机读取数据,读取是并行执行(读取的单位是packet,64k)
- client将这三个block进行合并(字节数组的合并)
读流程简单概况
- 向namenode发起下载请求,namenode判断权限并返回主机列表
- client与主机列表建立pipeline并读取数据
- client对数据进行合并