赞
踩
1.Block是HDFS中数据存储的基本形式,即在HDFS中,所有数据都是以Block形式来存储
2.从Hadoop2.x开始,如果不指定,那么Block的默认大小是134217728B(128M)。可以通过dfs.blocksize
来修改,单位是字节
3.如果一个文件不足一个Block的默认大小,那么这个文件是多大,所对应的Block就是多大。例如一个文件是50M,上传到HDFS上之后对应的Block就是50M
4.HDFS会为每一个Block分配一个递增的编号,称之为BlockId,从1073741825开始递增
5.Block的意义
①能够存储超大文件
②能够进行快速备份
6.经过经验计算,当数据往磁盘上写的时候,寻址时间/传出时间=1%,效率是最高的。实际过程中,服务器基本上使用的是机械磁盘,市面上大部分机械磁盘的寻址时间在10ms左右,也就是意味传输时间=10ms/0.01=1000ms=1s。市面上大部分机械磁盘的读写速度是100M/s150M/s,因此希望数据块大小是100M150M
1.NameNode是HDFS的主/核心节点,在Hadoop1.x中,NameNode只能有一个,容易产生单点故 障;在Hadoop2.x中,允许存在2个NameNode;在Hadoop3.x中,不再限制NameNode的数量
2.NameNode负责对外接受请求,对内负责记录元数据(metadata)以及管理DataNode
3.元数据是用于描述数据的数据,HDFS中的元数据会包含三十几项属性,例如:
1.上传的文件名
2.文件的大小
3.上传的用户和用于组
4.文件的权限
5.Block的大小
6.文件和BlockID的映射关系
7.Block和DataNode的映射关系
8.副本数量
NameNode会将元数据维系在内存以及磁盘中
元数据在磁盘上的存储位置由属性dfs.namenode.dir来决定,如果不指定,那么这个属性的默认值是file://${hadoop.tmp.dir}/dfs/name
和元数据相关的文件
当NameNode接受到写操作之后,试图将这个命令记录到edits_inprogress文件中,如果记录成功,则修改内存中的元数据,修改完成之后,会给客户端一个ACK信号。注意,此时fsimage文件中的元数据并没有发生变化
当达到指定条件的时候,edits_inprogress文件会产生滚动,滚动生成一个edits文件,同时会产生一个新的edits_inprogress,新的写操作会记录到新的edits_inprogress文件。滚动生成edits文件之后,会将edits文件中的命令一一取出,按照命令更新fsimage文件中的元数据
edits_inprogress文件的滚动条件
dfs.namenode.checkpoint.size
来指定)的时候,会产生滚动生成edits文件dfs.namenode.checkpoint.period
来指定),那么edits_inprogress文件也会产生滚动hdfs dfsadmin -rollEdits
来强制edits_inprogress文件的滚动HDFS会将每一个写操作看作是一个事物,分配一个递增的事物id,简称为txid
edits文件的查看命令
hdfs oev -i edits_0000000000000000035-000000000000000042 -o edits.xml
HDFS会将开始记录日志以及结束记录日志也看作是一个写操作,也会分配一个事物id。所以edits文件都是以OP_START_LOG_SEGMENT开头;edits文件是以OP_END_LOG_SEGMENT来作为结尾
上传操作
HDFS中,一但上传就无法修改
fsimages文件的查看命令
hdfs oiv -id fsimage_00000000000000000016 -o f.xml -p XML
每一个fsimage文件都对应一个md5文件,md5文件的作用是对fsimage文件进行校验
HDFS第一次启动1min之后,会自动触发一次edits_inprogress文件的滚动
NameNode通过心跳机制管理DataNode。DataNoda定时(默认是3s,通过dfs.heartbeat.interval
来修改,单位是秒)会给NameNode来发送心跳信号,如果超过一定时间,NameNode没有收到DataNode的心跳,才会认为这个DataNode已经lost(丢失),那么此时NameNode会将这个DataNode上的数据复制一份放到其他节点上,来保证整个集群中的副本数量
心跳的超时时间由属性dfs.namenode.heartbeat.recheck-interval
来影响,默认值是300000,单位是毫秒,即5min。心跳的超时时间=2*dfs.namenode.heartbeat.recheck-interval
+10*dfs.heartbeat.interval
=2\5min+10*3s=10min30s,即为210心跳未收到判断为丢失
心跳信号
hdfs namenode -format
)的时候,会自动计算产生一个clusterid。每一次格式化都会重新计算生成一个新的clusterid安全模式(safe mode)
在安全模式中,HDFS只能读不能写
如果HDFS集群在合理时间内没有退出安全模式,也就是某文件恢复不了,副本全部丢失,就意味着产生了不可逆的数据丢失
安全模式
命令 | 解释 |
---|---|
hdfs dfsadmin -safemode enter | 进入安全模式 |
hdfs dfsadmin -safemode leave | 退出安全模式 |
hdfs dfsadmin -safemode get | 获取安全模式的状态 |
1.DataNode作为HDFS的从节点,负责存储数据。数据是以Block形式存储在磁盘上
2.Block在DataNode上的存储位置由属性dfs.datanode.data.dir
决定,如果不指定,默认值是file://${hadoop.tmp.dir}/dfs/data
3.DataNode会为每一个Block产生一个校验文件blk_xxxx_xxx.meta
4.DataNode的状态:预服役、服役、预退役、退役、丢失(lost)
机架感知策略实际上通过脚本来进行映射。可以定义Shell/Python等脚本,在脚本中来定义一个Map,键是服务器的IP或者主机名,值表示机架。只要值一致,键对应的服务器就表示放在同一个机架上,例如
rack = {
"hadoop01":"r1",
"hadoop02":"r1",
"hadoop03":"r2",
"hadoop04":"r2"
}
在HDFS中,如果不指定,默认是不开启机架感知策略的。如果需要开启机架感知策略,需要hadoop-site.xml中配置
<property>
<name>topology.script.file.name</name>
<value>脚本的路径</value>
</property>
3.机架感知策略中的机架实际上指的不是物理机架而是逻辑机架,那么也就意味着可以将好多个物理机架上的节点映射到同一个逻辑机架上
命令 | 解释 |
---|---|
hadoop fs -put /a.txt / 或者hadoop fs -copyFromLocal /a.txt | 上传文件 |
hadoop fs -get /a.txt /home /或者hadoop fs -copyToLocal /a.txt /home/ | 下载文件 |
hadoop -mkdir /test | 创建目录 |
hadoop fs -cp /a.txt /test | 复制文件 |
hadoop fs -mv /nc.rpm /home | 剪切/重命名 |
hadoop fs -rm /a.txt | 删除文件 |
hadoop fs -rmdir /log | 删除目录 |
hadoop fs -rm -r /home | 递归删除 |
hadoop fs -checksum /test/a.txt | 计算校验和 |
hadoop fs -chgrp tedu /test | 改变用户组 |
hadoop fs -chmod 777 /test | 改变权限 |
hadoop fs -chown tom /test | 改变用户 |
hadoop fs -df /test | 查看HDFS磁盘信息 |
1.在Hadoop中,回收站默认是不开启的
2.开启回收站(core-site.xml)
<!--指定文件在回收站中的存储实际,单位是min-->
<!--如果超出指定时间没有将文件从回收站移出来,那么这个文件就会被清理-->
<property>
<names>fs.trash.interval</names>
<value>1440</value>
</property>
如果需要将文件从回收站中还原,那么使用 hadoop fs -mv /user/root/.Trash/Current/c.xml /c.xml
客户端发起RPC请求到NameNode,请求删除指定文件
NameNode在收到请求之后,会进行校验
校验知否有删除权限 - AccessControlException
目录和文件权限代表含义
目录/log | 解释 | 文件a.log | 解释 |
---|---|---|---|
r | 获取子目录和子文件 --> ls /log | r | 获取文件内容 -->cat a.long |
w | 创建/删除/修改子目录和子文件–> mkdir rm touch等 | w | 修改文件内容–> vi vim等 |
x | 打开目录–> cd | x | 可执行命令 --> sh bash等 |
校验是否有指定文件 - FileNotFoundException
如果校验失败,则抛出异常;如果校验成功,NameNode会将删除命令先记录到edits_inprogress文件中,记录成功之后,NameNode会修改内存中的元数据,修改完成之后,NameNode会给客户端返回一个ACK信号表示删除成功。注意,此时文件并没有从HDFS上移除,而仅仅是修改了元数据
NameNode会在等待DataNode的心跳,在收到心跳之后,NameNode在心跳响应中要求DataNode删除对应的Block
DataNode在收到心跳响应之后,会去磁盘删除对应的Block。注意,此时文件才真正从HDFS上移除
AccessControlException
FileAlreadyExistsException
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RDQfOf6j-1646391645832)(./images/HDFS写流程.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A15l5JCe-1646391645834)(./images/HDFS读流程.png)]
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。