版本 hadoop-2.7.2
HDFS 运行模式
core-default.xml 中 fs.defaultFs
本地模式 fs,defaultFs=file:/// (默认)
分布式模式 fs.defaultFs=hdfs://
MR运行模式
core-default.xml 中 fs.defaultFs
本地模式 mapreduce.framework.name=local (默认)
分布式模式 mapreduce.framework.name=yarn
本地模式指在本地运行
hadoop 配置文件组成
4个默认配置文件
4个用户可以自定义的配置文件
用户自定义配置文件会覆盖同名默认配置文件中的参数
hadoop启动先加载默认配置文件 后加载自定义配置文件
默认配置文件
位置 HADOOP_HOME/share/xxx.jar/xxx-default.xml
core-default.xml
hdfs-default.xml
mapred-default.xml
yarn-default.xml
用户配置文件
core-site.xml
hdfs-site.xml
maperd-site.xml
yarn-site.xml
常用命令
hadoop fs : 可以操作本地文件系统模式的的hdfs 还可以分布式文件系统
hdfs dfs :只能操作分布式文件系统
调整副本数
hadoop fs -setrep 1 /wcinput
通讯协议
Client 与 NameNode 通讯使用RPC (远程调用协议)
hdfs 块大小
dfs.blocksize = 128m
1.x版本默认64m 2.x版本默认128m
基于最佳传输损耗理论:再一次传输中,寻址的时间占用传输时间1%时,本次传输的损耗最小,为最佳性价比传输
文件每次校验为64k 需64K倍数
普通磁盘传输速率大概为100m/s
若固态硬盘可调整到256m
影响速度的3大问题 1.网络io 2.寻址 3.校验
传输
pipeline 传输通道
packcet 小包64k传输
chunk 小块512b +4b 校验
Clinet 传输packcet完成后 DN会发送ack到客户端确认消息
HDFS的写数据流程
- 服务端启动HDFS中的NN和DN进程
- 客户端创建一个分布式文件系统客户端,由客户端向NN发送请求,请求上传文件
- NN处理请求,检查客户端是否有权限上传,路径是否合法等
- 检查通过,NN响应客户端可以上传
- 客户端根据自己设置的块大小,开始上传第一个块,默认0-128M,
NN根据客户端上传文件的副本数(默认为3),根据机架感知策略选取指定数量的DN节点返回 - 客户端根据返回的DN节点,请求建立传输通道
客户端向最近(网络举例最近)的DN节点发起通道建立请求,由这个DN节点依次向通道中的(距离当前DN距离最近)
下一个节点发送建立通道请求,各个节点发送响应 ,通道建立成功 - 客户端每读取64K的数据,封装为一个packet(数据包,传输的基本单位),将packet发送到通道的下一个节点
通道中的节点收到packet之后,落盘(检验)存储,将packet发送到通道的下一个节点!
每个节点在收到packet后,向客户端发送ack确认消息! - 一个块的数据传输完成之后,通道关闭,DN向NN上报消息,已经收到某个块
- 第一个块传输完成,第二块开始传输,依次重复⑤-⑧,直到最后一个块传输完成,NN向客户端响应传输完成!
客户端关闭输出流
异常写流程
1-6 见上 HDFS的写数据流程
- 客户端每读取64K的数据,封装为一个packet,封装成功的packet,放入到一个队列中,这个队列称为dataQuene(待发送数据包)
在发送时,先将dataQuene中的packet按顺序发送,发送后再放入到ackquene(正在发送的队列)。
每个节点在收到packet后,向客户端发送ack确认消息!
如果一个packet在发送后,已经收到了所有DN返回的ack确认消息,这个packet会在ackquene中删除!
假如一个packet在发送后,在收到DN返回的ack确认消息时超时,传输中止,ackquene中的packet会回滚到
dataQuene。
重新建立通道,剔除坏的DN节点。建立完成之后,继续传输!
只要有一个DN节点收到了数据,DN上报NN已经收完此块,NN就认为当前块已经传输成功!
NN会自动维护副本数!
NameNode工作原理
NN 存储元数据 负责接收客户端请求 、接收DN上报的信息,分配DN任务(维护副本数)
元数据存储在fsimage文件+edits文件中
fsimage (元数据快照文件)
路径:data/tmp/dfs/name/current
- 第一次格式化NN时,会创建NN工作目录 生成 fsimage_0000000000000文件
- 当NN启动时,会将所有edits文件和fsimages文件加载到内存并合并得到最新的元数据。并将新元数据持久化磁盘生成新的fsimage文件
- 如果启动了2NN 也会辅助NN合并元数据,会将合并后的元数据发送到NN
edits (元数据日志文件)
查看edits文件
hdfs oev -i edits_improgress_00000000000000000001 -o ~/edit.xml
NameNode总结
NN主要存储元数据
存储元数据分为2种:1. inodes:记录文件属性和文件由哪些块组成 2. 块位置的映射信息:由NN启动后,接收DN的上报,动态生成
2种存储文件的格式 edits 和fsimage
edits在NN启动后,保存新写入的命令,当满足checkpoint条件时(1H或1000w txid数据)时会进行edits与fsimage合并,合并后的元数据会持久化新的fsimage中间中
在NN启动时会先加载fsimage 之后加载edits,合并生成最新的元数据,并记录checkpoint
安全模式
在NN启动时会将所有元数据加载完成后,等待DN上报块的信息
当NN所保存所有块的最小副本数(默认为1)/块的总数>0.999 时,NN会自动离开安全模式
在安全模式中,客户端只能进行有限读操作,不能写
默认1小时或100万条记录会进行fsimage和edits合并操作
使用 hdfs dfsadmin -safemode wait|leave|enter
可进入或退出安全模式,也可使写入文件暂存缓冲区待退出安全模式时候进行写入hdfs
NameNode从节点
Secondary NameNode
元数据多目录配置
防止元数据丢失 hdfs-site.xml
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///${hadoop.tmp.dir}/dfs/name1,file:///${hadoop.tmp.dir}/dfs/name2</value>
</property>
DataNode
- DataNode 启动后向Namenode注册,上报block信息
- 之后每隔1小时上报一次块信息(前报时会进行块校验,查看是否损坏)
- 每3秒向NN发送一次心跳,同时NN会返回带有该DN的相关命令
- 默认超过10分钟没有收到DN心跳,则认为该节点不可用
DataNode 多目录
hdfs-site.xml
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///${hadoop.tmp.dir}/dfs/data1,file:///${hadoop.tmp.dir}/dfs/data2</value>
</property>
块校验
通过CheckSum(校验和)
奇偶校验缺点不能完全确定是否准确
hdfs 采用 **crc校验 **
服役新节点
一般磁盘超过70% 需要扩容节点操作
-
配置新节点和原有hadoop集群的hosts映射信息
-
配置新节点hadoop 配置文件NN和YARN地址
-
NN中slaves加入新节点
-
启动新节点DN
退役旧节点
白名单
只有在白名单中的节点才能访问NN,创建白名单文件witenamelist写入允许访问的节点名称,在hdfs-site.xml 中加入配置
<property>
<name>dfs.hosts</name>
<value>/opt/hadoop-2.7.2/etc/hadoop/witenamelist</value>
</property>
通常情况下需要重启生效,hadoop提供了 刷新命令 hdfs dfsadmin refreshNodes
黑名单
退役节点,移交块信息
同样编辑黑名单文件blacknamelist写入需要退役的节点名称,在hdfs-site.xml中加入配置
<property>
<name>dfs.exclude</name>
<value>/opt/hadoop-2.7.2/etc/hadoop/blacknamelist</value>
</property>
执行刷新命令 hdfs dfsadmin refreshNodes
集群间数据拷贝
bin/hadoop dictcp hdfs://hadoop1:9000/test/1.txt hdfs://hadoop2:9000/test/1.txt
har归档
解决小文件上传
-
从源头上解决
在上传时候把小文件 打成tar.gz
-
如果已经上传到了hdfs,可以使用在线归档
在线归档的功能实际是MR程序 ,可以使用命令把多个小文件归档成归档文件
hadooparchive -archiveName test.har -p /hello hi1 hi2 hi3 hi4 hi5 /
查看归档文件 hadoop fs -ls har://test2.har