HDFS概述与架构

概述

HDFS即Hadoop分布式文件系统。源自GFS论文。

有以下特点:

        1、高容错性的分布式文件系统。

        2、可构建在廉价机器上,通过多副本机制,提高可靠性。

       3、易扩展、为用户提供性能不错的文件存储服务。

缺点: 

      1、不适合低延时数据访问,比如毫秒级的存储数据,是做不到的。

      2、无法高效的对大量小文件进行存储。

      3、不支持并发写入,不支持文件的随机修改(仅支持append)

HDFS为什么不适合存储小文件?

      1、HDFS中存储的数据的元数据信息会加载到NameNode的内存中,每个块大概占用内存中的150字节,存储大量小文件的话,它会占用NameNode大量的内存。因为NameNode的内存是有限的, 所以这样容易挤爆NameNode。

      2、一般来说,NN会不断跟踪并检查每个数据块的存储位置(通过DN的心跳信息)。数据节点需要上报的block越多,则也会消耗越多的网络带宽/时延。

      3、小文件存储的寻址时间会超过读取时间,它违反了HDFS的设计目标。

      解决方法: 合并小文件(合并后大小最好接近并小于等于块大小)

           

 

块(block)   

     HDFS中的文件在物理上是分块存储(block),块的大小可以通过配置参数( dfs.blocksize)来规定,默认大小在hadoop2.x版本中是128M,1.x中是64M。块的副本数是根据参数(dfs.replication)来规定的。

     HDFS的块比磁盘的块大,其目的是为了最小化寻址开销。如果块设置得足够大,从磁盘传输数据的时间会明显大于定位这个块开始位置所需的时间。因而,传输一个由多个块组成的文件的时间取决于磁盘传输速率。

     假一个文件260M,块大小为128,副本系数为3,则应有 3 * 3 个块,实际占用的空间为260M * 3  。

     注:当一个4M的文件存在128M的块中时,实际占用的空间是4M。

 

HDFS架构

 

        这种架构主要由四个部分组成,分别为HDFS Client、NameNode、DataNode和Secondary NameNode。其中Rack代表机架。

1)Client:客户端。

        (1)文件切分。文件上传HDFS的时候,Client将文件切分成一个一个的Block,然后进行存储;

        (2)与NameNode交互,获取文件的元数据信息;

        (3)与DataNode交互,读取或者写入数据;

        (4)Client提供一些命令来管理HDFS,比如启动、关闭、访问HDFS;

2)NameNode:NN 。管理者(老大),管理文件系统的命名空间。

        (1)管理 文件名称、文件目录结构、文件属性、创建时间、权限、副本数、块ID等;

          注:上述信息会以fsimage、editlog的方式持久化在硬盘上,启动时加载到内存中。

        (2)管理 数据块对应哪些datanode节点上;

          注: NN不会持久化存储以上这种映射关系,DN定期发送blockReport给NN,NN在内存中动态维护这种映射关系。

        (3)处理客户端读写请求。

                  

3) DataNode:DN。NameNode下达命令,DataNode执行实际的操作。

        (1)存储实际的数据块和数据块的校验和(判断该数据块是否损坏);

        (2)每隔3秒发送一次心跳,每10次心跳发送一次当前节点的blockreport。

        (3)执行数据块的读/写操作。

 

4) Secondary NameNode:SNN。NN的冷备份。

        (1)辅助NameNode,分担其工作量;

        (2)定期合并Fsimage和Edits为新的fsimage文件,并推送给NameNode;(checkpoint机制)

                 参数:dfs.namenode.checkpoint.period  3600s  (默认一小时备份一次。不可靠)

        (3)在紧急情况下,可辅助恢复NameNode(不能马上替换)。

 

HDFS常用命令

     1、ls

          hdfs dfs -ls /:查看hdfs中根目录/下的所有文件

          hdfs dfs -ls -R /:递归查看目录/下所有文件与文件夹

    2、put:从本地传文件去hdfs(与copyFromLocal类似)

          hdfs dfs -put [文件名] [hdfs目录]

       (hdfs dfs -put hello.txt /  即把hello.txt放在hdfs中的/下)

      (hdfs dfs -copyFromLocal hello.txt /text/h.txt  即把hello.txt放在hdfs中的/text下,并改名为h.txt)

   3、查看文件内容:text或者cat

          hdfs dfs -cat /hello.txt

    4、mkdir:创建一个目录 

          hdfs dfs -mkdir /text

          hdfs dfs -mkdir -p /text/a/b (创建递归文件夹)

   5、get:从hdfs中取得文件(类似于copyToLocal)

          hdfs dfs -get /text/a/b/h.txt (取得hdfs中的h.txt)

  6、rm:删除文件

         删除文件夹:  -rm -R

 

     

猜你喜欢

转载自blog.csdn.net/weixin_44591209/article/details/87874442