大数据基础课05 专为解决大数据存储问题而产生的 HDFS

86 篇文章 47 订阅

上一讲中,我们了解了在互联网公司中,数据一般都是从哪里来,以及如何进行数据的采集。而数据采集完成后需要进行长期的保存,以备我们在日后的生产活动中进行各种分析和使用,这就涉及了文件系统的问题,所以在这一讲中,我们就来讲解一下在 Hadoop 体系中的文件系统 HDFS 是如何运转的,同时,我们要动动手,搭建一个简单的 Hadoop 系统,并使用简单的命令感受一下 HDFS 可以进行什么样的操作。

文件系统

首先我们来看一下什么是文件系统。不管是操作系统还是运行的各种软件,抑或是我们所正在介绍的 Hadoop 工具,其实都是一些程序。在运行的时候,这些程序实际上都在存储和搜索数据。正如我们所熟知的,在电脑中,常用的存储有内存硬盘两种形式:

  • 内存的速度快,但是价格更贵,所以使用的存储容量较小;

  • 硬盘价格便宜,速度要慢很多。

在我们的电脑中一般都使用硬盘来进行长期存储,而内存用来存储程序运行时的数据。所以,对于我们的硬盘来说,最基本的功能就是读取和写入功能。但是,这里有很多问题需要解决:

  • 硬盘上的位置如何划分;

  • 怎么能够尽快在硬盘上找到需要的数据;

  • 对于一块空间如何保障读数据和写数据不是同时进行的;

  • ……

针对这么多的问题,提出了一个抽象的概念——文件。一个文件就是一个单元,占用一个独立的地址空间,程序可以读取文件或者创建新的文件。而对这些文件进行管理,解决这些文件的结构、访问、保护、寻址等功能的系统,我们就称为文件系统。而我们所要介绍的 HDFS,全称 Hadoop Distribute File System,也就是分布式文件系统的意思,HDFS 是文件系统的一种实例。

HDFS 基础

前面我们已经简单介绍过 HDFS,它可以利用廉价的普通服务器作为其存储,组建一个大规模存储集群,为各类计算提供数据访问的基础。那么 HDFS 的文件系统比起一般的文件系统有什么特色呢?其实 HDFS 文件系统最大的特色就是它在分布式架构上的处理,同时 HDFS 的设计适合一次写入,多次读出的场景,且不支持文件的修改,所以不适合反复修改数据的场景。

HDFS 的架构

在了解 HDFS 的整体架构前我们先来理解一下 HDFS 里的一些小知识。

(1)数据块

HDFS 默认最基本的存储单位是 64MB 的数据块(在 2.x 版本中是 128MB),大小通过配置可调。对于存储空间未达到数据块大小的文件,不会占用整个数据块的存储空间。

(2)元数据节点(NameNode)

元数据节点算是 HDFS 中非常重要的一个概念,用于管理文件系统的命令空间,将所有文件和文件夹的元数据保存在文件系统树中,通过在硬盘保存避免丢失,采用文件命名空间镜像(fs image)及修改日志(edit log)方式保存。

(3)数据节点(DataNode)

数据节点即是真正数据存储的地方。

(4)从元数据节点(Secondary NameNode)

从字面来看像是元数据节点的备用节点,但实际不然,它和元数据节点负责不同的事情,主要负责将命名空间镜像与修改日志文件周期性合并,避免文件过大,合并过后文件会同步至元数据节点,同时本地保存一份,以便在出现故障时恢复。

整体架构图如下所示:

图片1.png

在架构图中,除了我们上述介绍的几种节点,还有一个 Client,即客户端。

  • 客户端是我们平时用来和 HDFS 服务进行交互的部分,客户端中内置了一套文件操作命令来帮助我们访问 HDFS 服务,比如说我们上传文件、下载文件;

  • 同时客户端还负责把我们上传的文件按前面说的数据块进行切分,以方便后续的存储;

  • 因此,客户端当然也负责与 NameNode 和 DataNode 进行交互以获取文件位置或者读写文件操作等。

HDFS 的优缺点

1.优点

(1)高容错性。

在 HDFS 文件系统中,数据都会有多个副本。其中的某一个副本丢失(某一个节点的机器损坏)并不影响整体的使用,可以自动恢复。

(2)适合大数据处理。

  • 数据规模:能够处理数据规模达到 GB、TB、甚至 PB 级别的数据;

  • 文件规模:能够处理百万规模以上的文件数量,相当之大。

(3)提供数据一致性保障。

(4)任意一个节点所占用的资源较少,可以在廉价的机器上运行支持线性扩张

2.缺点

(1)不适合低延时数据访问,比如毫秒级的存储数据,是做不到的。

(2)无法高效地对大量小文件进行存储

  • 存储大量小文件的话,它会占用 NameNode 大量的内存来存储文件、目录和块信息。这样是不可取的,因为 NameNode 的内存总是有限的;

  • 小文件存储的寻址时间会超过读取时间,它违反了 HDFS 的设计目标。

(3)不支持并发写入文件随机修改

对于一个文件,只能有一个线程写入,不可以多个线程同时写入。基本不能进行文件的修改,只支持数据的追加,如果想修改需要使用新文件覆盖整个旧的文件。

了解了 HDFS 的基本构成,下面进入我们的动手环节。因为 HDFS 已经集成在了 Hadoop 系统中,所以我们来尝试安装一个单节点的 Hadoop 系统,然后就可以进行 HDFS 操作了。

动手安装 Hadoop

首先介绍一下,我使用的机器操作系统是 Windows 10。因为 Hadoop 需要 Java 的支持,我们先看一下电脑上是否已经安装了 JDK,并且配置好了环境变量。

进入 CMD 命令提示符中,使用下面这个命令查看 Java 版本,如果显示正常,说明已经安装了 Java,并且配置了环境变量。

C:\Users\userxxx>java -version
java version "1.8.0_231"
Java(TM) SE Runtime Environment (build 1.8.0_231-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.231-b11, mixed mode)

在 Windows 8 及以上版本,如果你的 Java JDK 安装在了 Program Files 路径下面,需要注意使用下面的方式来调整你的环境变量路径,否则我们的 Hadoop 配置会无法识别。

用 “Progra~1” 替代 “Program Files”
用 “Progra~2” 替代 “Program Files(x86)

由于在 Windows 系统下支持得并不是很好,原生的 3.2.1 版本可能需要做一些调整,我这里把调整好的项目放到了云盘上(提取码:k132),你可以下载我已经打包好的。

下载完,把文件解压到自己的电脑上,比如我这里是放在 D:\,打开 CMD 命令提示符,然后进入 Hadoop 的 bin 路径,如下所示:

D:\hadoop-3.2.1\hadoop-3.2.1\bin>

使用命令 Hadoop Version,如果正常可以看到如下版本信息:

Hadoop 3.2.1
Source code repository https://gitbox.apache.org/repos/asf/hadoop.git -r b3cbbb467e22ea829b3808f4b7b01d07e0bf3842
Compiled by rohithsharmaks on 2019-09-10T15:56Z
Compiled with protoc 2.5.0
From source with checksum 776eaf9eee9c0ffc370bcbc1888737
This command was run using /D:/hadoop-3.2.1/hadoop-3.2.1/share/hadoop/common/hadoop-common-3.2.1.jar

接下来我们需要修改几个配置文件,让 Hadoop 进行最基本的启动。

(1)修改 D:\hadoop-3.2.1\hadoop-3.2.1\etc\hadoop\core-site.xml 为:

<configuration>
<property>
      <name>fs.defaultFS</name>
      <value>hdfs://localhost:9820</value>
</property>
</configuration>

(2)修改 D:\hadoop-3.2.1\hadoop-3.2.1\etc\hadoop\mapred-site.xml 为:

<configuration>
   <property>
       <name>mapreduce.framework.name</name>
       <value>yarn</value>
   </property>
</configuration>

(3)修改 D:\hadoop-3.2.1\hadoop-3.2.1\etc\hadoop\hdfs-site.xml 为:

<configuration>
<property>
       <name>dfs.replication</name>
       <value>1</value>
   </property>
   <property>
       <name>dfs.namenode.name.dir</name>
       <value>file:///d:/hadoop-3.2.1/hadoop-3.2.1/data/dfs/namenode</value>
   </property>
   <property>
       <name>dfs.datanode.data.dir</name>
     <value>file:///d:/hadoop-3.2.1/hadoop-3.2.1/data/dfs/datanode</value>
   </property>
</configuration>

这里的 value 为 1 表明我们构建的系统只有一个节点,同时,定义了我们的 NameNode 根目录和 DataNode 根目录。

(4)修改 D:\hadoop-3.2.1\hadoop-3.2.1\etc\hadoop\yarn-site.xml 为:

<configuration>
   <property>
       <name>yarn.nodemanager.aux-services</name>
       <value>mapreduce_shuffle</value>
       <description>Yarn Node Manager Aux Service</description>
   </property>
</configuration>

然后输入 hadoop namenode -format,应该能看到这样的结果:

图片2.png

选择 Y,可以看到执行成功,如下图所示:

图片3.png

然后在 sbin 目录下输入 start-all,会有多个 CRM 窗口被创建,此时输入 jps,可以看到如下结果:

图片4.png

在浏览器中输入http://localhost:9870/dfshealth.html,你可以看到如下界面:

图片5.png

输入http://localhost:9864/datanode.html,你可以看到如下监控界面:

图片6.png

输入http://localhost:8088/cluster,你可以看到如下管理界面:

图片7.png

当年看到这些界面,说明已经部署成功了,我们已经创建了有 1 个节点的 Hadoop 系统。在课后,你可以尝试使用虚拟机来创建具有多个节点的 Hadoop 系统,那么在配置上会有什么不同呢,这个留给你自行探索。

如果你要关闭 Hadoop 服务,记得在 sbin 路径下使用命令:

.\stop-all

接下来,我们使用已经部署好的 Hadoop 系统来进行一些 HDFS 的文件操作。

HDFS 简单使用

根据部署的服务,我们的 HDFS 根目录是 hdfs://localhost:9820,下面我们尝试在根目录下面创建子目录 user,如下命令所示:

D:\hadoop-3.2.1\hadoop-3.2.1\bin>hadoop fs -mkdir  hdfs://localhost:9820/user/

创建目录使用的是 mkdir,接着我们来列出根目录下面的详情,看是否创建成功了。详情如下所示:

D:\hadoop-3.2.1\hadoop-3.2.1\bin>hadoop fs -ls  hdfs://localhost:9820/
Found 1 items
drwxr-xr-x   - LonnyHirsi supergroup          0 2021-01-23 17:49 hdfs://localhost:9820/user

可以看到,这里显示根目录下有一个项,就是我们刚创建的 user 目录。从这两个命令可以了解,HDFS 的文件操作命令与 Linux 的文件操作命令基本相同。

不过要注意,HDFS 中的路径只能一层一层创建,如果我们尝试下面的命令,会得到一个错误信息。

D:\hadoop-3.2.1\hadoop-3.2.1\bin>hadoop fs -mkdir  hdfs://localhost:9820/data/filedir
mkdir: `hdfs://localhost:9820/data': No such file or directory

这是因为我们的根目录下面还没有 data 目录。

除了这些命令,HDFS 的操作还有:

  • 显示文件内容的 cat 命令;

  • 上传文件的 put 命令;

  • 下载文件的 get 命令;

  • 移动文件的 mv 命令;

  • 删除文件的 rm 命令;

  • ……

如果你需要学习这部分内容可以找一本相关的书籍进行更深入的学习,在这个课程中我们就不再过多地进行介绍了。

总结

这一讲我们讲解了 HDFS 文件系统,它是 Hadoop 体系两大核心基石之一,主要负责存储的部分。另外一部分解决计算问题的 MapReduce 我们会在《11 | MapReduce 处理大数据的基本思想有哪些》详细介绍。

在介绍了 HDFS 的基础架构之后,我们安排了一个实践环节,也就是动手安装 Hadoop 系统,当然我们这里安装的是单机单节点,希望你也能够亲自去尝试一下,甚至是用虚拟机搭建一个小型的多机环境以熟悉 Hadoop 的实际情况,在此过程中有任何问题,都欢迎与我进行交流。

课程的最后,简单介绍了 HDFS 的一些使用命令,可以看到跟我们平时在 Linux 系统中使用的文件处理命令基本相同,HDFS 帮我们屏蔽了后端存储的细节,让我们能够顺畅地使用。

下一讲,我们将讲解在 Hadoop 体系中与存储相关的两个项目:数据库 HBase 和数仓工具 Hive,让我们下一讲再见吧。


精选评论

**5629:

etc下的hadoop-env.cmd最后一行要把“username”改成自己的用户名,否则执行hadoop verison时会报错

    讲师回复:

    这个是调用环境变量,如果环境变量中没有username确实需要改一下。

**玉:

找不到或无法加载主类 namenode-format

    讲师回复:

    操作不成功可以参考一下这个文章https://gist.github.com/vorpal56/5e2b67b6be3a827b85ac82a63a5b3b2e

*飞:

老师,您好,按您介绍的步骤操作时,遇到了一些问题麻烦解答一下,谢谢。1、修改几个配置文件这步操作,您发给我们文件已经修改过了,对吧?2、输入Hadoop Version可正常显示,但输入hadoop namenode-format时,报错:找不到或无法加载主类 namenode-format,目前卡在这一步了。

    讲师回复:

    1、已经是修改过的;2、是否是hadoop namenode -format没空格呀,你可以试试呢。

**3961:

😀😁

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

办公模板库 素材蛙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值