HDFS(Hadoop Distributed File System):Hadoop分布式文件系统
HDFS上的文件被划分为块大小的多个分块(chunk),作为独立的存储单元。在2.X版本默认块大小为128MB,旧版本块大小默认为64MB。
查看文件块大小和副本数
## 语法
hadoop fs [generic options] -stat [format] <path> ...
## format 格式
%b:打印文件大小(目录为0)
%n:打印文件名
%o:打印block size (我们要的值)
%r:打印备份数
%y:打印UTC日期 yyyy-MM-dd HH:mm:ss
%Y:打印自1970年1月1日以来的UTC微秒数
%F:目录打印directory, 文件打印regular file
当使用-stat选项但不指定format时候,只打印文件创建日期,相当于%y
[hadoop@pg1 soft]$ hadoop fs -put ./jdk-8u202-linux-x64.tar.gz /
[hadoop@pg1 soft]$ hadoop fs -ls /
Found 4 items
drwxr-xr-x - hadoop supergroup 0 2020-09-07 09:48 /hadoop
drwxr-xr-x - hadoop supergroup 0 2020-09-09 10:18 /hbase
-rw-r--r-- 2 hadoop supergroup 194042837 2020-09-25 09:28 /jdk-8u202-linux-x64.tar.gz
drwxrwx--- - hadoop supergroup 0 2020-09-07 09:00 /tmp
[hadoop@pg1 soft]$ hadoop fs -stat "%o %r" /jdk-8u202-linux-x64.tar.gz
134217728 2
[hadoop@pg1 soft]$
jdk-8u202-linux-x64.tar.gz文件块大小为128M,有2个副本
列出各个HDFS文件组成块信息
[hadoop@pg1 soft]$ hdfs fsck / -files -blocks
Connecting to namenode via http://pg2:50070/fsck?ugi=hadoop&files=1&blocks=1&path=%2F
FSCK started by hadoop (auth:SIMPLE) from /192.168.10.190 for path / at Fri Sep 25 09:34:42 CST 2020
/ <dir>
/hadoop <dir>
/hadoop/hadoop-2.10.0.tar.gz 392115733 bytes, 3 block(s): OK
0. BP-2081959867-192.168.10.190-1599396161857:blk_1073741828_1004 len=134217728 Live_repl=2
1. BP-2081959867-192.168.10.190-1599396161857:blk_1073741829_1005 len=134217728 Live_repl=2
2. BP-2081959867-192.168.10.190-1599396161857:blk_1073741830_1006 len=123680277 Live_repl=2
......
HDFS采用master/slave架构。一个HDFS集群是由一个Namenode和一定数目的Datanodes组成。
Namenode是一个中心服务器,负责管理文件系统的名字空间(namespace)以及客户端对文件的访问。
它管理文件系统树及整棵树内所有文件和目录。这些信息通过命名空间镜像文件和编辑日志文件这2种文件形式保存到本地磁盘上
## 命名空间镜像文件
fsimage_0000000000000003271
fsimage_0000000000000003271.md5
## 编辑日志文件
edits_0000000000000002476-0000000000000002477
namenode记录着每个文件中各个块所在的数据节点信息,但不永久保存块的位置信息
若namenode机器毁坏,文件将会丢失。提供下面2种机制,实现容错
集群中的Datanode一般是一个节点一个设备,负责管理它所在节点上的数据存储。
辅助namenode(secondary namenode):负责定期合并编辑日志和命名空间镜像
HDFS暴露了文件系统的名字空间,用户能够以文件的形式在上面存储数据。从内部看,一个文件其实被分成一个或多个数据块,这些块存储在一组Datanode上。Namenode执行文件系统的名字空间操作,比如打开、关闭、重命名文件或目录。它也负责确定数据块到具体Datanode节点的映射。Datanode负责处理文件系统客户端的读写请求。在Namenode的统一调度下进行数据块的创建、删除和复制。
Namenode和Datanode被设计成可以在普通的商用机器上运行。这些机器一般运行着GNU/Linux操作系统(OS)。HDFS采用Java语言开发,因此任何支持Java的机器都可以部署Namenode或Datanode。由于采用了可移植性极强的Java语言,使得HDFS可以部署到多种类型的机器上。一个典型的部署场景是一台机器上只运行一个Namenode实例,而集群中的其它机器分别运行一个Datanode实例。这种架构并不排斥在一台机器上运行多个Datanode,只不过这样的情况比较少见。
集群中单一Namenode的结构大大简化了系统的架构。Namenode是所有HDFS元数据的仲裁者和管理者,这样,用户数据永远不会流过Namenode。
HDFS支持传统的层次型文件组织结构。用户或者应用程序可以创建目录,然后将文件保存在这些目录里。文件系统名字空间的层次结构和大多数现有的文件系统类似:用户可以创建、删除、移动或重命名文件。当前,HDFS不支持用户磁盘配额和访问权限控制,也不支持硬链接和软链接。但是HDFS架构并不妨碍实现这些特性。
Namenode负责维护文件系统的名字空间,任何对文件系统名字空间或属性的修改都将被Namenode记录下来。应用程序可以设置HDFS保存的文件的副本数目。文件副本的数目称为文件的副本系数,这个信息也是由Namenode保存的。
namenode在内存中保存每个文件和每个数据块的引用关系。对于拥有大量文件的集群来说,内存将成为横向扩展的瓶颈。在2.X中引入联邦HDFS允许系统通过添加namenode实现扩展,其中每个namenode管理文件系统命名空间的一部分。
在联邦环境下,每个namenode维护一个命名空间卷(namespace volume),由命名空间的元数据和一个数据块池(block pool)组成。数据块池包含该命名空间下文件的所有数据块。命名空间卷相互独立,两两之间并不相互通信。
Hadoop2针对namenode存在的单点失效(SPOF, single point of failure)问题,提供对HDFS的高可用性(HA)支持。通过配置一对活动-备用(active-standby) namenode。当活动namenode失效时,备用namenode自动接管它的任务并开始服务于来自客户端的请求。
Hadoop HA默认使用zookeeper作为故障转移控制器,它(zookeeper)负责监视(心跳机制)namenode是否失效并在namenode失效时进行故障转移。zookeeper确保集群中有且仅有一个活动namenode。
fencing方法用于确保先前活动的namenode不会执行危害系统并导致系统崩溃的操作。
同一时间QJM仅允许一个namenode向编辑日志写入数据。
当使用NFS过滤器实现共享编辑日志时,由于不能同一时间只允许一个namenode写入数据,更加需要有力的规避方法
原文:https://www.cnblogs.com/binliubiao/p/13760225.html