@

集群启动顺序:

  1. NameNode启动
    NameNode启动时,首先将镜像文件(Fsimage)载入内存,并执行编辑日志(Edits)中的各项操作。一旦在内存中成功建立文件系统元数据的映像,则创建一个新的Fsimage文件和一个空的编辑日志。此时,NameNode开始监听DataNode请求。这个过程期间,NameNode一直运行在安全模式,即NameNode的文件系统对于客户端来说是只读的,并且是有限只读,即在没有启动DataNode的机器上的文件依旧不可读!
  2. DataNode启动
    系统中的数据块的位置并不是由NameNode维护的,而是以列表的形式存储在DataNode中。在系统的正常操作期间,NameNode会在内存中保留所有位置的映射信息。在安全模式下,各个DataNode会向NameNode发送最新的块列表信息,NameNode了解到足够多的块位置信息之后,即可退出安全模式。
  3. 安全模式退出判断
    如果满足“最小副本条件”,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

07-10 16:03