分布式文件系统HDFS
- 随着数据量越来越大,在一个操作系统存不下所有数据的时候,那么需要将数据分配到更多的操作系统管理的磁盘中,但是这么做不方便管理和维护,所以需要一种系统来管理多台机器上的文件。这就是分布式文件管理系统。
- HDFS (全称:Hadoop Distribute File System,Hadoop 分布式文件系统)只是分布式文件管理系统中的一种。
- HDFS 是 Hadoop 核心组成,是一个分布式文件系统,用于存储文件,并且HDFS通过目录树来定位管理的文件。
- HDFS是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色(分布式本质是拆分,各司其职);
- HDFS横跨多台计算机,为存储和处理超大规模数据提供所需的扩展能力。
HDFS 使用场景
- HDFS适合一次写入,多次读出的场景,且不支持文件的修改。
- HDFS适合做数据分析,不适合用于做网盘类的应用。
HDFS的优点
- 高容错性:
- 数据自动保存多个副本,HDFS以增加数据副本的形式,提高容错性。
- HDFS在某个副本丢失后,可以自动恢复
- 数据自动保存多个副本,HDFS以增加数据副本的形式,提高容错性。
- HDFS适合处理大数据
- HDFS能处理数据规模达到GB,TB,甚至PB级别的数据。
- HDFS能够处理百万规模以上的文件数量,数据量很大。
- HDFS 可以构建在廉价的机器上,通过多副本机制,提高可靠性。
HDFS缺点
- HDFS不适合低延时数据访问,比如毫秒级的存储数据,HDFS做不了。
- HDFS无法高效的对大量小文件进行存储
- 存储大量小文件时,会占用NameNode大量的内存来存储文件目录和块信息,但是NameNode的内存总是有限的。
- 小文件存储的寻址时间会超过读取时间,违反了HDFS的设计目的
- HDFS不支持并发写入,文件随机修改
- HDFS只支持一个文件只能有一个写,不允许多个线程同时写。
- HDFS仅支持数append(追加)操作,不支持文件的随机修改。
HDFS 组织架构
- HDFS 的架构是典型的 Master/Slave 结构,并且HDFS 架构主要由四个部分组成,分别为HDFS Client、NameNode、DataNode和SecondaryNameNode。
- Client:就是客户端。
- 文件切分。文件上传HDFS的时候,Client将文件切分成一个一个的Block,然后进行存储;
- 与NameNode交互,获取文件的位置信息;
- 与DataNode交互,读取或者写入数据;
- Client可以使用一些命令来管理HDFS,比如NameNode格式化。
- Client可以使用一些命令来访问HDFS,比如对HDFS增删改查操作。
- NameNode(nn):Hdfs集群的管理者,即Master,其主要作用有:
- 管理HDFS的名称空间(NameSpace);
- 管理数据块(Block)映射信息;
- 配置副本策略;
- 负责处理客户端读写请求。
- DataNode:就是Slave。NameNode下达命令,DataNode执行实际的操作。
- 存储实际的数据块;
- 执行数据块的读/写操作。
- SecondaryNameNode(2N):2N不是NameNode的热备份,当NameNode挂掉的时候,SecondaryNameNode不能马上替换NameNode并提供服务。
- SecondaryNameNode辅助NameNode,分担NameNode的工作量,比如定期合并文件并推送给NameNode.
- SecondaryNameNode在紧急情况下,可辅助恢复NameNode.
- SecondaryNameNode帮助NameNode合并编辑日志,减少NameNode 启动时间
HDFS核心机制
-
分块存储(block机制):HDFS 中的文件在物理上是分块存储(block)的,block的大小可以通过配置参数来规定;Hadoop1.x版本中HDFS 默认 BlockSize是64M,Hadoop2.x版本中HDFS 默认 BlockSize是128M;HDFS 中的 block 默认保存3份
-
命名空间(NameSpace):
- HDFS 支持传统的层次型文件组织结构。用户或者应用程序可以创建目录,然后将文件保存在这些目录里。文件系统名字空间的层次结构和大多数现有的文件系统类似:用户可以创建、删除、移动或重命名文件。
- Namenode 负责维护文件系统的名字空间,任何对文件系统名字空间或属性的修改都将被Namenode 记录下来。
- HDFS提供给客户单一个抽象目录树,访问形式:hdfs://namenode的hostname:port/test/input hdfs://linux121:9000/test/input
-
NameNode元数据管理:
- HDFS把目录结构及文件分块位置信息叫做元数据
- NameNode的元数据记录每一个文件所对应的block信息(block的id,以及所在的DataNode节点的信息)
-
** DataNode数据存储**:
- 负责HDFS数据存储的是DataNode,文件的各个 block 的具体存储管理由 DataNode 节点承担。
- 一个block会有多个DataNode来存储,DataNode会定时向NameNode来汇报自己持有的block信息。
-
副本机制:
- 为了容错,文件的所有 block 都会有副本。每个文件的 block 大小和副本系数都是可配置的。
- 应用程序可以指定某个文件的副本数目。副本数量可以在文件创建的时候指定,也可以在之后改变。副本数量默认是3个。
-
一次写入,多次读出:
- HDFS 是设计成适应一次写入,多次读出的场景,且不支持文件的随机修改。 (支持追加写入,不只支持随机更新)。
- HDFS 适合用来做大数据分析的底层存储服务,并不适合用来做网盘等应用(主要是因为修改不方便,延迟大,网络开销大,成本太高)
HDFS文件块
- HDFS文件在物理上时分块存储(Block),Block块的大小可以通过配置参数(dfs.blocksize)规定,Hadoop1.x默认是64M,Hadoop2.x默认是128M。
- 如果寻址时间约为10ms,而传输速率为100MB/s,为了使寻址时间仅占传输时间的1%,块的大小:10ms×100×100M/s = 100M,如图
- HDFS的Block块不能设置太小,也不能设置太大:
- HDFS的块比磁盘的块大,其目的是为了最小化寻址开销。如果块设置得足够大,从磁盘传输数据的时间会明显大于定位这个块开始位置所需的时间。因而,传输一个由多个块组成的文件的时间取决于磁盘传输速率。
- Block块太小,会增加寻址时间,程序一直在找Blcok块开始的位置。
- Block块太大,从磁盘传输数据的时间会明显大于定位这个Block块开始位置所需要的时间,导致程序在处理这块数据时,会非常慢。
- HDFS块的大小设置主要取决于磁盘传输速率。
HDFS命令行操作
-
基本语法:
bin/hadoop fs 具体命令 OR bin/hdfs dfs 具体命令
-
查看命令提示:
bin/hdfs dfs
-
启动Hadoop集群:
sbin/start-dfs.sh sbin/start-yarn.sh
-
-help
:输出这个命令参数 :hadoop fs -help rm
-
-ls
:显示目录信息:hadoop fs -ls /
-
-mkdir
:在HDFS上创建目录:hadoop fs -mkdir -p /目录名
-
-moveFromLocal
:从本地剪切粘贴到HDFS:hadoop fs -moveFromLocal 文件位置 文件粘贴位置
-
-appendToFile
:追加一个文件到已经存在的文件末尾:hadoop fs -appendToFile 追加文件位置 被追加的文件位置
-
-cat:显示文件内容
:hadoop fs -cat 显示文件
-
-chgrp 、-chmod、-chown
:Linux文件系统中的用法一样,修改文件所属权限hadoop fs -chown root:root 文件名
-
-copyFromLocal
:从本地文件系统中拷贝文件到HDFS路径去hadoop fs -copyFromLocal 本地路径 HDFS路径
-
-copyToLocal
:从HDFS拷贝到本地hadoop fs -copyToLocal HDFS路径 本地路径
-
-cp
:从HDFS的一个路径拷贝到HDFS的另一个路径:hadoop fs -cp 原路径 目标路径
-
-mv
:在HDFS目录中移动文件:hadoop fs -mv 原路径 目标路径
-
-get
:等同于copyToLocal,就是从HDFS下载文件到本地:`hadoop fs -get HDFS路径 本地路径
-
-getmerge:合并下载多个文件,比如HDFS的目录 /user/atguigu/test下有多个文件:log.1, log.2,log.3,…
hadoop fs -getmerge /user/atguigu/test/* ./zaiyiqi.txt
-
-put
:等同于copyFromLoca[root@linux121 hadoop-2.9.2]$ hadoop fs -mkdir -p /user/root/test/ #本地文件系统创建yarn.txt [root@linux121 hadoop-2.9.2]$ vim yarn.txt resourcemanager nodemanager [root@linux121 hadoop-2.9.2]$ hadoop fs -put ./yarn.txt /user/root/test/
-
-tail
:显示一个文件的末尾:hadoop fs -tail /user/root/test/yarn.txt
-
-rm
:删除文件或文件夹:hadoop fs -rm /user/root/test/yarn.txt
-
-rmdir
:删除空目录hadoop fs -rmdir /test
-
-du
:统计文件夹的大小信息:hadoop fs -du -h /user/root/test
-
-setrep
:设置HDFS中文件的副本数量:hadoop fs -setrep 10 /lagou/bigdata/hadoop.txt
设置的副本数只是记录在NameNode的元数据中,是否真的会有这么多副本,还得看DataNode的数量。因为目前只有3台设备,最多也就3个副本,只有节点数的增加到10台时,副本数才能达到10