HDFS--hadoop分布式文件系统模型

HDFS的Shell命令练习

查看HDFS根目录

hadoop fs -ls /

在根目录创建一个目录test

hadoop fs -mkdir /test

上传文件

hadoop fs -put ./test.txt /test 
或 hadoop fs -copyFromLocal ./test.txt /test

下载文件

hadoop fs -get /test/test.txt .
或 hadoop fs -getToLocal /test/test.txt .

拷贝文件

hadoop fs -cp /test/test.txt /test1

删除文件

hadoop fs -rm /test1/test.txt

移动文件

hadoop fs -mv /test/test.txt /test1

递归删除文件目录

hadoop fs –rm -r /test1 

HDFS架构

-NameNode
-DataNode
-Secondary NameNode
这里写图片描述

MetaData(元数据)

——元数据:好比仓库管理员记账的账本(100斤白菜,存放在哪,几号存放的;
图书管理系统,存放一本书,需要记录书名,存放位置,存放时间,有几个副本…
元数据存储细节

NameNode

  • 是整个文件系统的管理节点。它维护着整个文件系统的文件目录树,文件/目录的元信息和每个文件对应的数据块列表。接收用户的操作请求。
  • 文件包括:
    ① fsimage:元数据镜像文件。存储某一时段NameNode内存元数据信息(hadoop1.0和hadoop2.0的伪分布式并不是和内存中的内存元数据实时同步的)。
    ② edits:操作日志文件。
    ③ fstime:保存最近一次checkpoint的时间(比如windows系统的还原点)
     以上这些文件是保存在linux的文件系统中。
     Namenode始终在内存中保存metedata,用于处理“读请求”
     到有“写请求”到来时,namenode会首先写editlog到磁盘,即向edits文件中写日志,成功返回后,才会修改内存,并且向客户端返回
     Hadoop会维护一个fsimage文件,也就是namenode中metedata的镜像,但是fsimage不会随时与namenode内存中的metedata保持一致(1.0集群和2.0的伪分布式),而是每隔一段时间通过合并edits文件来更新内容。Secondary namenode就是用来合并fsimage和edits文件来更新NameNode的metedata的。

SecondaryNameNode

  • HA的一个解决方案。但不支持热备。配置即可。
  • 执行过程:从NameNode上下载元数据信息(fsimage,edits),然后把二者合并,生成新的fsimage,在本地保存,并将其推送到NameNode,替换旧的fsimage.
  • 默认在安装在NameNode节点上(1.0),但这样…不安全!

secondary namenode的工作流程:
这里写图片描述
- secondary通知namenode切换edits文件
- secondary从namenode获得fsimage和edits(通过http)
- secondary将fsimage载入内存,然后开始合并edits
- secondary将新的fsimage发回给namenode
- namenode用新的fsimage替换旧的fsimage

什么时候开始checkpiont(同步)?

这里写图片描述

  • fs.checkpoint.period 指定两次checkpoint的最大时间间隔,默认3600秒

  • fs.checkpoint.size
    规定edits文件的最大值,一旦超过这个值则强制checkpoint,不管是否到达最大时间间隔。默认大小是64M

满足以上任何两个条件,就开始合并

Datanode

  • 提供真实文件数据的存储服务。
  • 文件块(block):最基本的存储单位。对于文件内容而言,一个文件的长度大小是size,那么从文件的0偏移开始,按照固定的大小,顺序对文件进行划分并编号,划分好的每一个块称一个Block。HDFS默认Block大小是128MB,以一个256MB文件,共有256/128=2个Block.
  • 不同于普通文件系统的是,HDFS中,如果一个文件小于一个数据块的大小,并不占用整个数据块存储空间
  • Replication。多复本。默认是三个。(hdfs-site.xml的dfs.replication属性)
    (复本所保存的那个机器down掉了,namenode会主动发送复制命令再复制一个复本到其他datanode,这其中包含了datanode的心跳机制,datanode会定期发送心跳给namenode,如果datanode过了这个周期没有发送心跳,namenode会认为这个datanode down掉了。)

hdfs是怎么分配块大小的?(Shell命令练习:验证块大小)

  • 方法:上传大于128MB的文件,观察块大小
  • 验证:使用 http://hadoop0:50070 观察
    清除# hadoop fs -ls / 下所有文件:hadoop fs - rm –r 文件夹名.. (递归删除)
    文件大小:154773078 字节(147M)——-jdk-7u79-linux-i586.gz 上传到HDFS的 /jdk1.7 目录下
    hadoop fs -put /root/jdk-7u79-linux-i586.gz /jdk1.7

在/itcast/hadoop-2.4.1/tmp/dfs/data/current/BP-1152942234-192.168.1.10-1458206501707/current/finalized目录下找到这4条记录:

-rw-r--r--. 1 root root 134217728 Mar 20 01:52 blk_1073741839
-rw-r--r--. 1 root root   1048583 Mar 20 01:52 blk_1073741839_1015.meta
-rw-r--r--. 1 root root  20555350 Mar 20 01:52 blk_1073741840
-rw-r--r--. 1 root root    160599 Mar 20 01:52 blk_1073741840_1016.meta

其中不带.meta后缀的文件是block文件,可以看到其中一个block大小是128M(134217728字节),另一个则占剩余的大小。

原文地址:https://www.cnblogs.com/shiguangmanbu2016/p/5932894.html