目录

一.HDFS 角色

二.HDFS 设计思想

        1.分块存储(block):使用分而治之的思想让很多服务器对同一个文件进行联合管理

        2.备份存储:每个小文件做冗余备份,并且分散存到不同的服务器,做到高可靠不丢失

三.HDFS 四大机制

         1.心跳机制:

        2.安全模式:

        3.机架策略:副本存放策略

        4.负载均衡:


前言

        HDFS:Hadoop Distributed File System Hadoop 分布式文件系统,主要用来解决海量数据的存储问题。

        HDFS 是设计成适应一次写入,多次读出的场景,且不支持文件的修改 (PS:适合用来做数据分析,并不适合用来做网盘应用,因为,不便修改,延迟大,网络开 销大,成本太高)

一.HDFS 角色

        了解角色和工作机制,其实我们可以来看下HDFS本身提供给我们的功能,然后我们通过功能来分解下这些实现这些功能的后台分工分别是通过谁来实现。

        (1)首先HDFS本质是一个文件系统,一个文件系统有目录,比如看一本书,最开始的是书的目录,相当于文件的路径,官方叫法为:抽象目录树,而HDFS文件的目录最合适的管理角色是我们的boss:namenode,

         (2)  HDFS是分布式文件系统,数据分布存储,而文件系统无非就是提供读写请求,那么我们在读取这份文件,逻辑思路为:找到文件的路径,然后看下文件被切分了哪几个数据块,每个数据块放在哪台datanode,然后取出datanode相关的数据块,拼接起来,然后读取。 

        这里就涉及两个关键信息点:

                a.文件跟数据块的关系数据

                b.数据块存放的位置关系(放在哪个datanode上)

        而这个信息也是放在namenode上

        那么一个文件/数据过来存储的时候,也是经历类似的事情,到底切成多少个数据块,数据块应该放在哪里,也是namenode上

         (3)  当客户端的读写请求,首先都会经过namenode过目,所以namenode的性能和稳定性是非常重要,而这边就需要一个助手:secondarynamenode,会备份namenode的元数据,以及分担namenode一小部分工作,合并元数据,下面会详细说。因为secondarynamenode只是帮忙备份,不会接替namenode工作,所以也叫做冷备份,能接替namenode工作的是standby namenode,叫热备份。

       (4)那真正存储,真正处理读写请求永远是我们的打工干饭人:datanode

  综合以上总结:

        

namenode

secondarynamenode

datanode

存储

元数据信息:

      1)抽象目录树

      2)数据和块的对应关系

     3)数据块的存储节点

元数据的备份数据

真正存储的数据

工作

1)存储元数据信息

2)接受客户端的读写请求,负责管理工作

1)备份namenode的元数据信息   帮助namenode进行数据恢复

2)分担namenode的压力

1)负责数据的真正的存储

2)处理客户端真正的读写请求

hadoop fsimage 备份 hdfs默认备份_安全模式

二.HDFS 设计思想

                解决海量数据的存储,首要两个问题是:如何存储海量数据?如何保证数据安全?而HDFS的设计思想用了分块存储和备份存储来回答这两个问题。

        1.分块存储(block):使用分而治之的思想让很多服务器对同一个文件进行联合管理

                一份数据过来要存到hdfs,首先要切块,那块的大小应该是多少?

                这里我们理解两点:

               (1) 过大不合适,会导致负载不均衡,如果一个块是1个T,一台机器比别人多装1T,如果有多个这样的块的话,会造成某个节点的压力过大,

              (2) 过小也不合适,会导致namenode压力过大,因为namenode有项任务是记录数据与块的关系,块的位置关系,过小,会导致这个信息过大,会占据namenode的存储空间。

                而在Hadoop中已经对这个块的大小有了默认设置值:

                Hadoop 1.0 -------------------------- 64M 

                Hadoop 2.0 -------------------------- 128M 

                Hadoop 3.0 -------------------------- 256M

                在hdfs-default.xml 可以找到默认设置,需要修改可以复制到site.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>

        2.备份存储:每个小文件做冗余备份,并且分散存到不同的服务器,做到高可靠不丢失

                如果一个数据块只放在一个节点,这个节点宕机,那么这块数据就被损坏,所以Hadoop会对数据块备份,我们称为副本。

                (1)副本没有主次之分

                (2)同一个块的不同副本存储在不同的节点

                 在hdfs-default.xml 可以找到默认设置,需要修改可以复制到site.xml文件:

<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>

默认是3个副本:

        (1)假设配置为3个副本,实际只有2台机器,那么namenode对第三个副本会进行记账,不会落地到原来的机器上,因为同一个数据块如果多个副本在同一台机器上是无意义的,后面如果有扩充机器,则会将另一个副本放到新增的机器上;

        (2)如果原来配置是4个副本,后面改配置3个副本,namenode会将多的副本进行删除。

三.HDFS 四大机制

         1.心跳机制:

        datanode与namenode保持联系的机制 

hadoop fsimage 备份 hdfs默认备份_hadoop_02

                其中,心跳报告的内容为:

                            1)报告自己的存活状况
                            2)报告自己的块信息   (身上存储着哪些数据块)

                datanode向namenode报告周期,默认3s,配置项(这里单位为s)为:

<property>
  				<name>dfs.heartbeat.interval</name>
  				<value>3</value>
  				<description>Determines datanode heartbeat interval in seconds.</description>
				</property>

                namenode在没收到datanode的报告后,主动向datanode发送检查周期设置(这里单位为ms):

<property>
  						<name>dfs.namenode.heartbeat.recheck-interval</name>
  						<value>300000</value>
  						<description>
    						This time decides the interval to check for expired datanodes.
    						With this value and dfs.heartbeat.interval, the interval of
    						deciding the datanode is stale or not is also calculated.
    						The unit of this configuration is millisecond.
  						</description>
					</property>

        

        2.安全模式:

                 安全模式是集群的一个自我保护的模式,集群处于安全模式的时候不对外提供服务的  不对外提供写服务 ,对外提供读的服务。

                手动启动和关闭安全模式的shell命令:
                hdfs dfsadmin -safemode enter/leave/get/wait
                enter  进入安全模式
                leave   离开安全模式
                get       获取安全模式的状态
                wait   等待离开安全模式

其实,在启动集群的时候,集群会自动进入安全模式,那么集群可以离开安全模式,可以进行正常的读写服务的依据是:

                首先集群的启动顺序为:namenode--->datanode---->secondarynamenode

              (1)datanode节点的启动的个数:默认0,默认情况下  集群中的datanode节点启动0个也可以离开安全模式
     

<property>
                      <name>dfs.namenode.safemode.min.datanodes</name>
                      <value>0</value>
                      <description>
                        Specifies the number of datanodes that must be considered alive
                        before the name node exits safemode.
                        Values less than or equal to 0 mean not to take the number of live
                        datanodes into account when deciding whether to remain in safe mode
                        during startup.
                        Values greater than the number of datanodes in the cluster
                        will make safe mode permanent.
                      </description>
     </property>

                    
                (2)数据块(排除副本)的汇报情况集群处于安全模式的时候,每一个数据块的副本最小保证个数 ,默认1个,也就是所有数据块至少有一个副本是正常的。
              

<property>
                      <name>dfs.namenode.replication.min</name>
                      <value>1</value>
                      <description>Minimal block replication. 
                      </description>
   </property>

                 (3)   所有数据块的存活率(不考虑副本的)
                        假设集群中  10000个数据块   至少0.999*10000=9990个数据块正常的才能离开安全模式,如果数据块少于这个数  这个时候集群一直处于安全模式
              

<property>
                      <name>dfs.namenode.safemode.threshold-pct</name>
                      <value>0.999f</value>
                      <description>
                        Specifies the percentage of blocks that should satisfy 
                        the minimal replication requirement defined by dfs.namenode.replication.min.
                        Values less than or equal to 0 mean not to wait for any particular
                        percentage of blocks before exiting safemode.
                        Values greater than 1 will make safe mode permanent.
                      </description>
    </property>

当集群满足了以上3个配置项,集群就会离开安全模式,正常启动

        3.机架策略:副本存放策略

                (1)就近原则:第一个副本存放在客户端所在节点(客户端是集群中的某一个节点)
                如果客户端不是集群中的某一个节点,任意存储

                (2)不同副本要放在不同的机架上:第二个副本存储在与第一个副本不同机架的任意节点上 
                (3)当副本数大于机架数:第三个副本存储在与第二个副本相同机架的不同节点上,这是为了减少数据传输的成本和数据丢包的可能性。

        4.负载均衡:

         负载均衡指的是每一个datanode节点上存储的数据和他的硬件匹配,而不是说平均分配,如有台机器有10T的大小,其他机器只有5T的大小,那么10T的机器存储的时候可以多分配点。

          因为一些配置和策略,如机架策略,会让客户端的节点的机器的负载过高,使得集群处于负载不均衡的状况,HDFS内部会进行自动负载均衡,也就是将数据块的移动到其他机器的过程 ,这个过程在生产环境中肯定跨节点 和跨机架,需要网络传输 ,而默认配置是1M/s,是很慢的,当集群规模小,20个节点以下,自动进行负载均衡就可以了。

        但当集群规模很大,如果单靠集群自动负载均衡是不可行的,我们可以进行手动配置:

                (1)修改负载均衡的带宽,加大带宽:

<property>
			  <name>dfs.datanode.balance.bandwidthPerSec</name>
			  <value>1048576</value>
			  <description>
					Specifies the maximum amount of bandwidth that each datanode
					can utilize for the balancing purpose in term of
					the number of bytes per second.
			  </description>
</property>

                (2)告诉集群及时进行负载均衡,也就是手动触发:

                        shell命令:

                        start-balancer.sh -t 10%

                      10%的意思是:负载均衡的评价标准:最大的节点的占有百分比 和最小节点占有的百分比差值不能超过10% ,因为不存在绝对的负载均衡,在10%的偏差时可以接受的。
                        这个命令  提交的时候不会立即执行,类似于java中的垃圾回收,集群空闲的时候进行。