@
集群启动顺序:
NameNode
启动
NameNode启动时,首先将镜像文件(Fsimage)
载入内存,并执行编辑日志(Edits)
中的各项操作。一旦在内存中成功建立文件系统元数据的映像,则创建一个新的Fsimage文件和一个空的编辑日志。此时,NameNode开始监听DataNode
请求。这个过程期间,NameNode
一直运行在安全模式
,即NameNode的文件系统对于客户端来说是只读
的,并且是有限只读
,即在没有启动DataNode
的机器上的文件依旧不可读!DataNode
启动
系统中的数据块的位置并不是由NameNode维护的,而是以块
列表的形式存储在DataNode
中。在系统的正常操作期间,NameNode
会在内存中保留所有块
位置的映射
信息。在安全模式
下,各个DataNode会向NameNode发送最新的块列表信息,NameNode了解到足够多
的块位置信息之后,即可退出安全模式。安全模式
退出判断
如果满足“最小副本条件”,NameNode会在30秒钟之后就退出安全模式。所谓的最小副本条件指的是在整个文件系统中99.9%的块满足最小副本级别(默认值:dfs.replication.min=1)。在启动一个刚刚格式化的HDFS集群时,因为系统中还没有任何块,所以NameNode不会进入安全模式。
关于安全模式的一些操作
集群处于安全模式,不能执行重要操作(写操作)。集群启动完成后,自动退出安全模式。
(1)bin/hdfs dfsadmin -safemode get
(功能描述:查看安全模式状态[on/off])
(2)bin/hdfs dfsadmin -safemode enter
(功能描述:进入安全模式)
(3)bin/hdfs dfsadmin -safemode leave
(功能描述:离开安全模式)
(4)bin/hdfs dfsadmin -safemode wait
(功能描述:输入写操作的命令,但不立即执行,而是放在缓存队列中,等待安全模式退出再依次执行)
强调一下块(block)
、副本数(replication)
的概念
在hadoop2.x中,一个块
的默认大小是128M
,至于是为什么请看我之前的文章HDFS的文件块大小,
而一个块的副本数
默认是3
。
这些参数在hdfs-default.xml
文件中有体现:
<property>
<name>dfs.blocksize</name>
<value>134217728</value>
<description>
The default block size for new files, in bytes.
You can use the following suffix (case insensitive):
k(kilo), m(mega), g(giga), t(tera), p(peta), e(exa) to specify the size (such as 128k, 512m, 1g, etc.),
Or provide complete size in bytes (such as 134217728 for 128 MB).
</description>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
<description>Default block replication.
The actual number of replications can be specified when the file is created.
The default is used if replication is not specified in create time.
</description>
</property>
知道了上面的概念,那么就考大家一个小问题:
:如果一个文件130M,将文件以块的方式分割,去存储,怎样实现?
实际存储 大小 副本
块A: 128M 128M A0 A1 A2
块B: 2M 128M B0 B1 B2
很明显,130M的文件,128M的块是存不下的,还需要2M的空间,虽然只有2M,但还是得分配一个块。
再来一个进阶题:
: 块大小128m,副本数3份,一个文件260m,请问多少块,多少实际存储?
存储块数:260%128=2块…4M,所以需要3个块,一个块有3个副本,所以最后需要3*3=9块实际存储
:260m * 3 =780M
有人看到这儿就懵了,为什么是260*3呢?
分开算就一目了然了!
第一块有128M,第二块也是128M,第三块是剩下的4M,每一块有三个副本,那么:
128 * 3 + 128 * 3 + 4 * 3 = (128+128+4) * 3 = 260 * 3