一.HDFS分布式文件系统基础

1. 1 文件系统,分布式文件系统

1.1.1 文件系统定义

  • 文件系统是一种存储和组织数据的方法,实现了数据的存储、分级组织、访问和获取等操作,使得用户对文件访问和查找变得容易;
  • 文件系统使用树形目录的抽象逻辑概念代替了硬盘等物理设备使用数据块的概念,用户不必关心数据底层存在硬盘哪里,只需要记住这个文件的所属目录和文件名即可;
  • 文件系统通常使用硬盘和光盘这样的存储设备,并维护文件在设备中的物理位置。

1.1.2 传统的文件系统

  • 所谓传统常见的文件系统更多指的的单机的文件系统,也就是底层不会横跨多台机器实现。比如windows操作系统 上的文件系统、Linux上的文件系统、FTP文件系统等等。
  • 这些文件系统的共同特征包括:
  1. 带有抽象的目录树结构,树都是从/根目录开始往下蔓延;
  2. 树中节点分为两类:目录和文件;
  3. 从根目录开始,节点路径具有唯一性。

1.2 数据 .元数据

  • 数据

​ 指存储的内容本身,比如文件、视频、图片等,这些数据底层最终是存储在磁盘等存储介质上的,一般用户无需关心, 只需要基于目录树进行增删改查即可,实际针对数据的操作由文件系统完成。

  • 元数据

​ 元数据(metadata)又称之为解释性数据,记录数据的数据; 文件系统元数据一般指文件大小、最后修改时间、底层存储位置、属性、所属用户、权限等信息。

  1. 大数据时代,面对海量数据,传统的文件存储系统 会面临哪些挑战呢?

1.2.1海量数据遇到数据的问题

  • 成本高

​ 传统存储硬件通用性差,设备投资加上后期维护、升级扩容的成本非常高。

  • 如何支撑高效的计算分析

​ 传统存储方式意味着数据:存储是存储,计算是计算,当需要处理数据的时候把数据移动过来。 程序和数据存储是属于不同的技术厂商实现,无法有机统一整合在一起。

  • 性能低

​ 单节点I/O性能瓶颈无法逾越,难以支撑海量数据的高并发高吞吐场景。

  • 可扩展性差

​ 无法实现快速部署和弹性扩展,动态扩容、缩容成本高,技术实现难度大。

1.2.2 思考

  1. 当遇到海量数据存储的场景,传统的文件系统如何 解决海量数据的存储问题?

  2. 一款能够支撑海量数据存储的系统需要追求什么? 吞吐量?性能?安全?效率?

  3. 如果让你设计一款存储系统软件来支撑海量数据存 储,如何设计?

1.3 分布式存储的核心

分布式存储系统核心属性

  • 分布式存储
  • 元数据记录
  • 分块存储
  • 副本机制

1.3.1 分布式存储的优点

  • 问题:数据量大,单机存储遇到瓶颈

  • 解决:

    • 单机纵向扩展:磁盘不够加磁盘,有上限瓶颈限制
    • 多机横向扩展:机器不够加机器,理论上无限扩展

image-20230109165359069

1.3.2 元数据记录功能

  • 问题:文件分布在不同机器上不利于寻找

  • 解决:元数据记录下文件及其存储位置信息,快速定位文件位置

image-20230109165605074

1.3.3分块存储的好处

  • 问题:文件过大导致单机存不下、上传下载效率低

  • 解决:文件分块存储在不同机器,针对块并行操作提高效率

image-20230109165801026

1.3.4 副本机制的作用

  • 问题:硬件故障难以避免,数据易丢失
  • 解决:不同机器设置备份,冗余存储,保障数据安全

image-20230109170022677

1.3.5 总结

  1. 分布式存储的优点是什么?

​ 无限扩展支撑海量数据存储

  1. 元数据记录的功能是什么?

​ 快速定位文件位置便于查找

  1. 文件分块存储好处是什么?

​ 针对块并行操作提高效率

  1. 设置副本备份的作用是什么?

​ 冗余存储保障数据安全

二.HDFS简介

1.1 简介

  • HDFS(Hadoop Distributed File System ),意为:Hadoop分布式文件系统。

  • 是Apache Hadoop核心组件之一,作为大数据生态圈最底层的分布式存储服务而存在。也可以说大数据首先要解 决的问题就是海量数据的存储问题。

  • HDFS主要是解决大数据如何存储问题的。分布式意味着是HDFS是横跨在多台计算机上的存储系统。

  • HDFS是一种能够在普通硬件上运行的分布式文件系统,它是高度容错的,适应于具有大数据集的应用程序,它非 常适于存储大型数据 (比如 TB 和 PB)。

  • HDFS使用多台计算机存储文件, 并且提供统一的访问接口, 像是访问一个普通文件系统一样使用分布式文件系统。

image-20230109171329731

1.2 HDFS起源

  • Doug Cutting领导Nutch项目研发,Nutch的设计目标是构建一个大型的全网搜索引擎,包括网页抓取、索引、 查询等功能。
  • 随着爬虫抓取网页数量的增加,遇到了严重的可扩展性问题——如何解决数十亿网页的存储和索引问题。
  • 2003年的时候, Google 发表的论文为该问题提供了可行的解决方案。 《分布式文件系统(GFS),可用于处理海量网页的存储》
  • Nutch的开发人员完成了相应的开源实现HDFS,并从Nutch中剥离和MapReduce成为独立项目HADOOP。

image-20230109175045334

1.3 HDFS设计目标

  • 硬件故障(Hardware Failure)是常态, HDFS可能有成百上千的服务器组成,每一个组件都有可能出现故障。因 此故障检测和自动快速恢复是HDFS的核心架构目标。

  • HDFS上的应用主要是以流式读取数据(Streaming Data Access)。HDFS被设计成用于批处理,而不是用户交互 式的。相较于数据访问的反应时间,更注重数据访问的高吞吐量。

  • 典型的HDFS文件大小是GB到TB的级别。所以,HDFS被调整成支持大文件(Large Data Sets)。它应该提供很 高的聚合数据带宽,一个集群中支持数百个节点,一个集群中还应该支持千万级别的文件。

  • 大部分HDFS应用对文件要求的是write-one-read-many访问模型。一个文件一旦创建、写入、关闭之后就不需 要修改了。这一假设简化了数据一致性问题,使高吞吐量的数据访问成为可能。

  • 移动计算的代价比之移动数据的代价低。一个应用请求的计算,离它操作的数据越近就越高效。将计算移动到数据 附近,比之将数据移动到应用所在显然更好

  • HDFS被设计为可从一个平台轻松移植到另一个平台。这有助于将HDFS广泛用作大量应用程序的首选平台。

1.4 HDFS 适用场景

  • 大文件
  • 数据流式访问
  • 一次写入多次读取
  • 低成本部署,廉价PC
  • 高容错

不适合

  • 小文件
  • 数据交互式访问
  • 频繁任意修改
  • 低延迟处理

1.5 HDFS重要特性

  • 主从架构
  • 分块存储
  • 副本机制
  • 元数据记录
  • 抽象统一的目录树结构(namespace)

主从架构

  • HDFS集群是标准的master/slave主从架构集群。
  • 一般一个HDFS集群是有一个Namenode和一定数目的Datanode组成。
  • Namenode是HDFS主节点,Datanode是HDFS从节点,两种角色各司其职,共同协调完成分布式的文件存储服 务。
  • 官方架构图中是一主五从模式,其中五个从角色位于两个机架(Rack)的不同服务器上。

image-20230109175748914

1.6分块存储

  • HDFS中的文件在物理上是分块存储(block)的,默认大小是128M(134217728),不足128M则本身就是一块 。
  • 块的大小可以通过配置参数来规定,参数位于hdfs-default.xml中:dfs.blocksize。

1.7 副本机制

  • 文件的所有block都会有副本。副本系数可以在文件创建的时候指定,也可以在之后通过命令改变。
  • 副本数由参数dfs.replication控制,默认值是3,也就是会额外再复制2份,连同本身总共3份副本。

1.8 元数据管理

  • 文件自身属性信息
    • 文件名称、权限,修改时间,文件大小,复制因子,数据块大小。
  • 文件块位置映射信息
    • 记录文件块和DataNode之间的映射信息,即哪个块位于哪个节点上。

1.9 namespace

  • HDFS支持传统的层次型文件组织结构。用户可以创建目录,然后将文件保存在这些目录里。文件系统名字空间的 层次结构和大多数现有的文件系统类似:用户可以创建、删除、移动或重命名文件。
  • Namenode负责维护文件系统的namespace名称空间,任何对文件系统名称空间或属性的修改都将被Namenode 记录下来。
  • HDFS会给客户端提供一个统一的抽象目录树,客户端通过路径来访问文件,形如:hdfs://namenode:port/dira/dir-b/dir-c/file.data。

image-20230109184727864

2.0 数据块存储

  • 文件的各个block的具体存储管理由DataNode节点承担。
  • 每一个block都可以在多个DataNode上存储。

image-20230109184918014

三.HDFS命令行

1.1 介绍

  • 命令行界面(英语:command-line interface,缩写:CLI),是指用户通过键盘输入指令,计算机接收到指令后 ,予以执行一种人际交互方式。

  • Hadoop提供了文件系统的shell命令行客户端: hadoop fs [generic options]

image-20230110093509194

1.2 文件系统协议

  • HDFS Shell CLI支持操作多种文件系统,包括本地文件系统(file:///)、分布式文件系统(hdfs://nn:8020)等

  • 具体操作的是什么文件系统取决于命令中文件路径URL中的前缀协议。

  • 如果没有指定前缀,则将会读取环境变量中的fs.defaultFS属性,以该属性值作为默认文件系统。

1
2
3
hadoop fs -ls file:/// #操作本地文件系统
hadoop fs -ls hdfs://node1:8020/ #操作HDFS分布式文件系统
hadoop fs -ls / #直接根目录,没有指定协议 将加载读取fs.defaultFS值

区别

  • hadoop dfs 只能操作HDFS文件系统(包括与Local FS间的操作),不过已经Deprecated;

  • hdfs dfs 只能操作HDFS文件系统相关(包括与Local FS间的操作),常用;

  • hadoop fs 可操作任意文件系统,不仅仅是hdfs文件系统,使用范围更广;

  • 目前版本来看,官方最终推荐使用的是hadoop fs。当然hdfs dfs在市面上的使用也比较多。

  • HDFS文件系统的操作命令很多和Linux类似,因此学习成本相对较低。

  • 可以通过hadoop fs -help命令来查看每个命令的详细用法。

1
2
3
4
5
6
7
8
9
10
11
Usage: hadoop fs [generic options]
[-appendToFile <localsrc> ... <dst>]
[-cat [-ignoreCrc] <src> ...]
……
-appendToFile <localsrc> ... <dst> :
Appends the contents of all the given local files to the given dst file. The dst
file will be created if it does not exist. If <localSrc> is -, then the input is
read from stdin.
-cat [-ignoreCrc] <src> ... :
Fetch all files that match the file pattern <src> and display their content on
stdout

1.3 FDHS基础命令

1.3.1 创建文件夹

  • hadoop fs -mkdir [-p] …
    • path 为待创建的目录
    • -p选项的行为与Unix mkdir -p非常相似,它会沿着路径创建父目录。
1
2
hadoop fs -mkdir /itcast

1.3.2 查看指定目录下的内容

  • hadoop fs -ls [-h] [-R] [ …]
    • path 指定目录路径
    • -h 人性化显示文件size
    • -R 递归查看指定目录及其子目录

image-20230110094428899

1.3.3上传文件到HDFS指定目录下

  • hadoop fs -put [-f] [-p] …
    • -f 覆盖目标文件(已存在下)
    • -p 保留访问和修改时间,所有权和权限。
    • lcalsrc 本地文件系统(客户端所在机器)
    • dst 目标文件系统(HDFS)
1
2
hadoop fs -put zookeeper.out /itcast
hadoop fs -put file:///etc/profile hdfs://node1:8020/itcast

1.3.4 查看HDFS文件内容

  • hadoop fs -cat …
    • 读取指定文件全部内容,显示在标准输出控制台。
    • 注意:对于大文件内容读取,慎重。
1
2
hadoop fs -cat /itcast/zookeeper.out

1.3.5 下载HDFS文件

  • hadoop fs -get [-f] [-p] …
    • 下载文件到本地文件系统指定目录,localhst必须是目录
    • -f 覆盖目标文件(已存在下)
    • -p 保留访问和修改时间,所有权和权限。
1
2
3
4
5
6
7
8
[root@node2 ~]# mkdir test
[root@node2 ~]# cd test/
[root@node2 test]# ll
total 0
[root@node2 test]# hadoop fs -get /itcast/zookeeper.out ./
[root@node2 test]# ll
total 20
-rw-r--r-- 1 root root 18213 Aug 18 17:54 zookeeper.out

1.3.6 拷贝HDFS文件

  • hadoop fs -cp [-f] …
    • -f 覆盖目标文件(已存在下)
1
2
3
4
5
6
[root@node3 ~]# hadoop fs -cp /small/1.txt /itcast
[root@node3 ~]# hadoop fs -cp /small/1.txt /itcast/666.txt #重命令
[root@node3 ~]# hadoop fs -ls /itcast
Found 4 items
-rw-r--r-- 3 root supergroup 2 2021-08-18 17:58 /itcast/1.txt
-rw-r--r-- 3 root supergroup 2 2021-08-18 17:59 /itcast/666.txt

1.3.7 追加数据到HDFS文件种

  • hadoop fs -appendToFile
    • 将所有给定本地文件的内容追加到给定dst文件。
    • dst如果文件不存在,将创建该文件。
    • 如果为-,则输入为从标准输入中读取。
1
2
3
4
5
6
7
8
9
10
11
12
[root@node3 ~]# echo 1 >> 1.txt
[root@node3 ~]# echo 2 >> 2.txt
[root@node3 ~]# echo 3 >> 3.txt
[root@node3 ~]# hadoop fs -put 1.txt /
[root@node3 ~]# hadoop fs -cat /1.txt
1
[root@node3 ~]# hadoop fs -appendToFile 2.txt 3.txt /1.txt
[root@node3 ~]# hadoop fs -cat /1.txt
1
2
3

1.3.8 HDFS 数据移动操作

  • hadoop fs -mv < src> ..
    • 移动文件到指定文件夹下
    • 可以使用该命令移动数据,重命名文件的名称

1.3.9 指导文档

1
https://hadoop.apache.org/docs/r3.3.0/hadoop-project-dist/hadoop-common/FileSystemShell.html