1

一. HDFS简介

  • HDFS(Hadoop Distributed File System)是 Apache Hadoop 项目的一个子项目,它的设计初衷是为了能够支持高吞吐和超大文件读写操作
  • HDFS是一种能够在普通硬件上运行的分布式文件系统,它是高度容错的,适应于具有大数据集的应用程序,它非常适于存储大型数据 (比如 TB 和 PB)
  • HDFS使用多台计算机存储文件, 并且提供统一的访问接口, 像是访问一个普通文件系统一样使用分布式文件系统

二. HDFS发展历史

  • Doug Cutting 在做 Lucene 的时候, 需要编写一个爬虫服务, 这个爬虫写的并不顺利, 遇到 了一些问题, 诸如: 如何存储大规模的数据, 如何保证集群的可伸缩性, 如何动态容错等
  • 2013年的时候, Google 发布了三篇论文, 被称作为三驾马车, 其中有一篇叫做 GFS
  • GFS是描述了 Google 内部的一个叫做 GFS 的分布式大规模文件系统, 具有强大的可伸缩性和容错
  • Doug Cutting后来根据 GFS 的论文, 创造了一个新的文件系统, 叫做 HDFS

三.HDFS设计目标

  • HDFS集群由很多的服务器组成,而每一个机器都与可能会出现故障。HDFS为了能够进行故障检测、快速恢复等
  • HDFS主要适合去做批量数据出来,相对于数据请求时的反应时间,HDFS更倾向于保障吞吐量
  • 典型的HDFS中的文件大小是GB到TB,HDFS比较适合存储大文件
  • HDFS很多时候是以: Write-One-Read-Many来应用的,一旦在HDFS创建一个文件,写入完后就不需要修改了

四.HDFS应用场景

1. 适合的应用场景

  • 存储非常大的文件:这里非常大指的是几百M、G、或者TB级别,需要高吞吐量,对延时没有要求
  • 基于流的数据访问方式: 即一次写入、多次读取,数据集经常从数据源生成或者拷贝一次,然后在其上做很多分析工作 ,且不支持文件的随机修改。
  • 正因为如此,HDFS适合用来做大数据分析的底层存储服务,并不适合用来做网盘等应用,因为,修改不方便,延迟大,网络开销大,成本太高。
  • 运行于商业硬件上: Hadoop不需要特别贵的机器,可运行于普通廉价机器,可以处节约成本
  • 需要高容错性
  • 为数据存储提供所需的扩展能力

2. 不适合的应用场景

  • 低延时的数据访问不适合采用HDFS。HDFS是为高吞吐数据传输设计的,因此可能牺牲延时
  • 大量小文件:小文件的元数据保存在NameNode的内存中, 整个文件系统的文件数量会受限于NameNode的内存大小。 经验而言,一个文件/目录/文件块一般占有150字节的元数据内存空间。如果有100万个文件,每个文件占用1个文件块,则需要大约300M的内存。因此十亿级别的文件数量在现有商用机器上难以支持
  • 多方读写,需要任意的文件修改 HDFS采用追加(append-only)的方式写入数据。不支持文件任意offset的修改,HDFS适合用来做大数据分析的底层存储服务,并不适合用来做.网盘等应用,因为,修改不方便,延迟大,网络开销大,成本太高。

五.HDFS重要特性

1. 主从架构

HDFS采用master/slave架构。一般一个HDFS集群是有一个Namenode和一定数目的Datanode组成。Namenode是HDFS主节点,Datanode是HDFS从节点,两种角色各司其职,共同协调完成分布式的文件存储服务。
image.png

2.分块机制

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

3.副本机制

为了容错,文件的所有block都会有副本。每个文件的block大小(dfs.blocksize)和副本系数(dfs.replication)都是可配置的。应用程序可以指定某个文件的副本数目。副本系数可以在文件创建的时候指定,也可以在之后通过命令改变。
默认dfs.replication的值是3,也就是会额外再复制2份,连同本身总共3份副本。
image.png

4.Namespace

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

5.元数据管理

在HDFS中,Namenode管理的元数据具有两种类型

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

    6.数据块存储

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

    六.微博HDFS 案例

    1. 背景

    微博有大量的用户数据,为了分析微博用户的行为。我们可以将微博的数据上传到HDFS,然后供其他大规模文本、情感分析程序来处理。

    2. HDFS目录规划

    当前我们的HDFS集群中应该是空空如也。因为我们并没有做任何的文件操作。为了方便我们将来管理文件系统,我们也对HDFS需要有一个目录规划,就像Linux一样。

目录说明
/source用于存储原始采集数据
/common用于存储公共数据集,例如:IP库,省份信息等
/workspace工作空间,存储各团队计算出来的结果数据
/tem存储临时数据,需要定时清理
/warehouse存储hive数据仓库中的数据

3. HDFS操作-shell客户端

HDFS是存取数据的分布式文件系统,那么对HDFS的操作,就是文件系统的基本操作,比如文件的创建、修改、删除、修改权限等,文件夹的创建、删除、重命名等。对HDFS的操作命令类似于Linux的shell对文件的操作,如ls、mkdir、rm等。

1.语法格式

Hadoop提供了文件系统的shell命令行客户端,使用方法如下:

Usage: hdfs [SHELL_OPTIONS] COMMAND [GENERIC_OPTIONS] [COMMAND_OPTIONS]

选项:

COMMAND_OPTIONSDescription
SHELL_OPTIONS常见的shell选项,例如:操作文件系统、管理hdfs集群
GENERIC_OPTIONS多个命令支持的公共选项
COMMAND COMMAND_OPTIONS用户命令、或者是管理命令

示例

# 查看HDFS中/parent/child目录下的文件或者文件夹
hdfs dfs -ls  /parent/child  
  • 所有HDFS命令都可以通过bin/hdfs脚本执行
  • 还有一个hadoop命令也可以执行文件系统操作,还可以用来提交作业,此处我们均使用hdfs,为了更好地区分和对hdfs更好的支持
2.说明
  • 文件系统shell包括与Hadoop分布式文件系统(HDFS)以及Hadoop支持的其他文件系统(如本地FS,HFTP FS,S3 FS等)直接交互的各种类似shell的命令
  • 所有FS shell命令都将路径URI作为参数。URI格式为scheme://authority/path。对于HDFS,该scheme是hdfs,对于本地FS,该scheme是file。scheme和authority是可选的。如果未指定,则使用配置中指定的默认方案

命令示例:

# 查看指定目录下的文件
hdfs dfs -ls  hdfs://namenode:host/parent/child
# hdfs-site.xml中的fs.defaultFS中有配置
hdfs dfs -ls  /parent/child    
hdfs dfs -ls  / #查看根目录文件
  
3. hadoop dfs / hdfs dfs / hadoop fs 三者的区别
  • hadoop dfs 只能操作HDFS 文件系统(包括与Local FS间的操作),已经 Deprecated
  • HDFS dfs 只能操作HDFS 文件系统相关,常用
  • hadoop fs 可操作任意文件系统,不仅仅是HDFS文件系统,使用范围更广

官方推荐使用 hadoop fs
例如:
查看文件根目录

hadoop fs -ls /
4.创建目录规划
  1. mkdir 命令
    格式:

    hdfs dfs [-p] -mkdir <paths>

    作用:以<paths>中的URI作为参数,创建目录。使用-p参数可以递归创建目录

hdfs dfs -mkdir /dir1
hdfs dfs -mkdir /dir2
hdfs dfs -p -mkdir /aaa/bbb/ccc
  1. 创建规划目录
[root@node1 ~]# hdfs dfs -mkdir /common
[root@node1 ~]# hdfs dfs -mkdir /workspace
[root@node1 ~]# hdfs dfs -mkdir /tmp/
[root@node1 ~]# hdfs dfs -mkdir /warehouse
[root@node1 ~]# hdfs dfs -mkdir /source
  1. 在WebUI中查看目录
    image.png
5. 需求:使用命令查看HDFS中的目录
  1. ls命令

格式:

hadoop fs -ls URL

作用:类似linux 的ls命令,显示文件列表

hadoop fs -ls /

选项:

  • -R 表示递归展示目录的内容
6. 需求:上传微博评论数据到HDFS

数据集:
链接:https://pan.baidu.com/s/1dyXj...
提取码:rmh0
我们需要将这些数据集上传到HDFS中。此处,我们需要将这些原始数据集上传到以下目录:
/source/weibo/star/comment_log/20190810_node1.uuicon.cn/
命名方式:/source/{产品线}/{业务线}/{日志名称}/{日期}_{上报日志的机器}。

  1. put 命令

-put 参数可以将单个源文件 或者多个源文件 从本地文件拷贝到目标文件系统中,也可以从标准输入中输入,写入目标文件系统中
语法格式:

hdfs dfs -put <localsrc >  ... <dst>
  1. 上传微博评论数据
    创建对应的文件夹
hdfs dfs -mkdir -p /source/weibo/star/comment_log/20190810_node1.uuicon.cn/

上传文件:
先将文件上传到linux 中,在使用-put 上传文件到hdfs

hadoop fs -put caixukun.csv /source/weibo/star/comment_log/20190810_node1.itcast.cn/
7. 要求上传后把linux 本地文件自动删除

数据一旦上传到HDFS中后,就会一直保存下来,为了节省空间,可以把Linux本地的文件删除了。我们只需要执行 rm -f caixukun.csv即可。但我们想将来让HDFS上传后就自动删除该文件,我们可以使用moveFromLocal命令

hadoop fs -moveFromLocal caixukun.csv /source/weibo/star/comment_log/20190810_node1.itcast.cn
8.需求:查看HDFS文件内容

要查看HDFS上的内容,有一种办法,我们可以先从HDFS将文件下载到Linux,然后我们用less命令、或者cat命令就可以查看了
操作步骤如下:

  1. 使用get命令,从HDFS下载文件到Linux
  2. 使用less命令,在Linux上查看下载的文件
  3. -get
    将文件拷贝到本地文件系统,可以通过指定-ignorecrc选项拷贝CRC校验失败的文件。-crc选项表示获取文件以及CRC校验文件
    语法格式:
hdfs dfs -get [-ignorecrc ]  [-crc]  <src> <localdst>
9. 需求:直接查看HDFS中的文件内容

上面这种方法稍微有点麻烦,每次查看都得先下载,然后再查看。在HDFS中,可以使用-cat命令直接查看。

  1. cat 命令
    将参数所指示的文件内容输出到控制台。
    语法格式:

    hdfs dfs  -cat  URI [uri  ...]
  2. 查看hdfs文件
hadoop fs  -cat  /source/weibo/star/comment_log/20190810_node1.itcast.cn/caixukun.csv
  1. head命令
    显示要输出的文件的开头的1KB数据
    语法格式:
hadoop fs -head URL

4.tail命令
显示文件结尾的1kb数据。
语法格式:

hdfs dfs -tail [-f] URI

与Linux中一样,-f选项表示数据只要有变化也会输出到控制台

10.需求:拷贝一份数据到20190811目录

假设现在需要开始分析20190811这一天的用户行为信息。但分析的同时,我们需要也一并把上一天的数据加载进来。所以,此处我们需要将20190810这一天的数据,拷贝到20190811这一天的数据。
我们首先需要把 20190811 这一天的目录创建出来,然后可以开始拷贝了。

  1. cp拷贝命令
    将文件拷贝到目标路径中。如果<dest> 为目录的话,可以将多个文件拷贝到该目录下。

语法格式:
hdfs dfs -cp URI [URI ...] <dest>
命令行选项:

  • -f 选项 如果目标存在将覆盖目标
  • -p 选项 将保留文件属性
  1. 执行拷贝数据到新的目录
# 创建文件夹
hadoop fs  -mkdir /source/weibo/star/comment_log/20190811_node1.itcast.cn 
# 拷贝文件夹
hadoop fs -cp /source/weibo/star/comment_log/20190810_node1.itcast.cn/caixukun.cvs /source/weibo/star/comment_log/20190811_node1.itcast.cn
11.需求:追加数据到HDFS数据文件

在数据集中有一个caixukun_new.csv数据集,是20190811这一天重新生成的数据。我们需要将这个文件上传到HDFS中。有两种做法:

  1. 直接将新文件上传到HDFS中20190811文件夹中。
  2. 将新文件追加到之前的数据文件caixukun.csv中

使用第二种方案。HDFS设计的初衷就是存储超大型的文件,文件数量越少,也可以减小HDFS中的NameNode压力。

  1. appendToFile 命令
    追加一个或者多个文件到hdfs指定文件中.也可以从命令行读取输入
    语法格式:
hdfs dfs -appendToFile <localsrc> ... <dst>

2.追加文件到HDFS已有文件中
查看追加前大小:

hadoop fs -ls -h /source/weibo/star/comment_log/20190811_node1.itcast.cn/

image.png

追加文件:

 hadoop fs -appendToFile caixukun_new.csv  /source/weibo/star/comment_log/20190811_node1.itcast.cn/caixukun.csv

查看追加文件后的文件大小:

hadoop fs -ls -h /source/weibo/star/comment_log/20190811_node1.itcast.cn/

image.png

12.需求:查看当前HDFS磁盘空间

每一天微博都会产生很多的数据,我们非常有必要定期检查HDFS的整体磁盘空间,如果发现磁盘空间已经到达某个阈值,就需要新增新的DataNode节点了

  1. df命令
    df命令用来查看HDFS空闲的空间

    hdfs dfs -df [-h] URI [URI ...]

    2.查看HDFS磁盘使用情况

hadoop fs -df -h /
13. 需求: 查看微博数据占用的空间

我们想知道当前微博数据占用了多少空间。可以使用du命令。

  1. du命令
    显示目录中所有文件大小,当只指定一个文件时,显示此文件的大小。
    语法格式:
hdfs dfs -du [-s] [-h] [-v] [-x] URI [URI ...]

命令选项:

  • -s:表示显示文件长度的汇总摘要,而不是单个文件的摘要。
  • -h:选项将以“人类可读”的方式格式化文件大小
  • -v:选项将列名显示为标题行
  • -x:选项将从结果计算中排除快照
  • 查看微博数据占用空间大小
14.需求:将20190810的数据移动到temp目录

经分析程序检测,20190810这一天的数据里面存在大量垃圾数据,项目组决定,先将这些垃圾数据处理了,再放回到20190810目录中。首先需要将数据移动到tmp目录中,进行处理

  1. mv 命令
    将hdfs上的文件从原路径移动到目标路径(移动之后文件删除),该命令不能跨文件系统
    hdfs dfs -mv URL <dest>
  2. 移动到tem目录
hadoop fs -mv /source/weibo/star/comment_log/20190811_node1.itcast.cn/caixukun.csv /tmp/caixukun_dirtydata.csv
15.需求:减少副本数提升存储资源利用率

HDFS中默认每个block会保存三个副本,同样一份数据需要存3份。假设,此处我们需要将 /source/weibo/start/comment_log/20190811_node1.itcast.cn 因为已经过去了很久,我们对该目录下的文件容错要求较低、而且数据使用频率也较低,所以,我们可以将它的副本数调整为2,此时我们需要使用setrep命令。

  1. setrep命令
hdfs dfs -setrep [-R] [-w] <numReplicas> <path>

更改文件的副本因子。 如果path是目录,则该命令以递归方式更改以path为根的目录树下所有文件的复制因子
参数:

  • -w:标志请求命令等待复制完成。 这可能会花费很长时间。
  • -R:标志是为了向后兼容。 没有作用。
    2.设置/source/weibo/star/comment_log/ 副本数
hadoop fs -setrep -w 2 /source/weibo/star/comment_log

image.png
image.png


捕风
47 声望16 粉丝