0


大数据技术|第二章 Hadoop HDFS(分布式文件系统)

本“大数据技术”专题的文章基于B站“黑马程序员”的大数据技术系列课程(强推!黑马的课易懂且全面),作为自用的复习笔记。

大家有需要也可以作为参考,但是由于刚入门大数据并且刚开始写博客,很多地方可能会缺乏一些细节或者存在一些问题,欢迎大家提出宝贵的建议和意见。

为什么需要分布式存储

单台服务器承担不了大文件

对于很大的文件,单台服务器无法承担。

因此可以使用多台服务器,靠数量取胜。具体来说,可以把文件划分成多个部分,存在多个服务器里。

分布式带来两好处

  • 能存海量数据
  • 性能up

分布式同样也使得性能得到了提升。

把一个文件分成三部分放到三个服务器,从而网络传输有了三倍的传输效率以及三倍的磁盘写入效率。

分布式的基础架构分析

分布式带来的问题:

两种分布式的调度方式:

  • 去中心化模式

  • 中心化模式

以一个节点作为中心,去统一调度其他节点。

绝大数的架构都用主从模式(中心化模式):

我们学习的Hadoop框架,就是一个典型的主从模式架构的技术框架。

HDFS的基础架构

HDFS是什么

完成海量数据的存储工作

HDFS的基础架构

上面说了两种基础架构:去中心化和中心化架构。HDFS就是中心化架构。

HDFS集群有三种角色:

  • 主角色NameNode发布命令(老板)
  • 从角色Datanode根据命令干活(员工)
  • SecondaryNameNode帮主角色打杂,完成一些元数据的处理(老板的秘书)

细说三个角色的作用:

HDFS集群环境部署

这部分实操,我之前已经部署完了,简单复习一下部署过程

  1. 下载安装包
  2. 由于之前已经配好了三台虚拟机(三个节点),三个节点分配的角色如下:
  3. 将安装包上传到node1中,并解压到指定路径
  4. 看看Hadoop文件夹的内部结构(没有实际功能,只是看看学习一下)
  5. 修改配置文件
  • workers记录了DataNode有哪些。我们之前设立了三台虚拟机作为集群的三个节点,所以在这里就是node1~3。
  • hadoop-env里配置了相关环境变量。比如JAVA_HOME(Java的安装位置),因为Hadoop是用Java开发的,所以运行过程中需要JAVA环境;
  • core-site.xml文件(核心端的配置)配置了两个东西:fs.defaultFS(下面的8020是规定俗称的,如果换一个8030其实也可以但没必要)以及io.file.buffer.size,即io操作文件缓冲区大小:

  • hdfs-site.xml文件配置了6个项:

  1. 准备数据目录

  1. 分发Hadoop文件夹

将node1中的Hadoop安装文件夹远程复制到node2和node3中。

  1. 配置环境变量

为了方便操作Hadoop,可以将一些脚本、程序配置到PATH里面,然后后续直接敲命令就可以了。

在/etc/profile里面配置(三个node都要):

  1. 授权为Hadoop用户

以普通用户Hadoop来启动整个Hadoop服务。(因为用root权限太大了,不安全,一般操作都不会直接用root)

以root身份,在三个节点中执行:

上面9个步骤就将集群的部署完成了,下面开始执行相关的命令来启动:

  1. 格式化整个文件系统

由于hdfs是一个分布式文件系统,起分布式存储的功能。所以要对这个存储系统进行初始化:

格式化成功后,可以在data/nn的文件夹里面看见出现东西了,后续会说这些东西是什么。反正这里证明格式化成功了。

  1. 启动HDFS

启动:在node1执行start-dfs.sh,然后就能启动namenode、datanode、secondarynamenode。

然后用jps就能显示这三个进程。

在node2和node3中,datanode也通过start-dfs命令被启动成功。

在namenode的9870端口可以直接查看hdfs的WEB UI。

HDFS的Shell操作

HDFS相关进程的启停管理命令

一键启停脚本:

单进程的启停:

上面这些命令之所以可以直接用,而不用进入对应路径是因为之前在配置PATH的时候将bin和sbin都配好了,所以可以直接执行。

HDFS文件系统基础操作(命令操作、在WEBUI里操作)

HDFS文件系统的基本信息(路径表达方式)

和Linus系统一样,均以/作为根目录的组织形式。

比如:

那么如何区分我们要进入Linux的路径还是HDFS的呢?答:加上协议头。

  • Linux的协议头:file://
  • HDFS的协议头:hdfs://namenode:port(namenode和port要具体写,比如node1:8020)

比如:

但是真正不需要用协议头,因为写起来很麻烦。在真正操作的时候,可以省略不写:

Hadoop有2套命令体系

具体命令的学习:
  1. 创建文件夹

下面两个指令都OK,一个老版本一个新版本,只是开头不一样。

hadoop fs -mkdir [-p] <path>
hdfs dfs -mkdir [-p] <path>

  1. 查看指定目录下的内容
hadoop fs -ls [-h] [-R] [<path>...]
hdfs dfs -ls [-h] [-R] [<path>...]

  1. 上传文件到HDFS指定目录下
hadoop fs -put [-f] [-p] <localsrc> ... <dst>
hdfs dfs -put [-f] [-p] <localsrc> ... <dst>

例如:(注意第一个路径参数:localsrc默认就是本机,可以但没必要写file://,第二个参数dst默认是hdfs,同样没必要写hdfs://node1:8020)

  1. 查看HDFS文件内容:
hadoop fs -cat <src> ...
hdfs dfs -cat <src> ...

读取src的文件内容,显示在sio控制台上。大文件可以使用管道符|配合more:

more:可以对内容进行翻页(用空格来进行翻页)查看。(一直滚动会让终端奔溃)

  1. 下载HDFS文件(和第3个从本机传到hdfs的put命令相反,现在是从hdfs到本机)
hadoop fs -get [-f] [-p] <src> ... <localdst>
hdfs dfs -get [-f] [-p] <src> ... <localdst>

注意:localdst必须是目录

  1. 拷贝HDFS文件
hadoop fs -cp [-f] <src> ... <dst>
hdfs dfs -cp [-f] <src> ... <dst>
  • src是hdfs里面的文件
  • dst是hdfs里面的文件夹或不存在的文件(如文件不存在,则创建,并且不存在的文件可以和src的名字不一样)

其中的-f用于覆盖已存在的目标文件。

  1. 追加数据到HDFS文件中
hadoop fs -appendToFile <localsrc> ... <dst>
hdfs dfs -appendToFile <localsrc> ... <dst>

注意不能修改HDFS中文件的某一处,只能删/追加。

  1. HDFS数据移动操作
hadoop fs -mv <src> ... <dst>
hdfs dfs -mv <src> ... <dst>

  1. HDFS数据删除操作
hadoop fs -rm -r [-skipTrash] URI [URI ...]
hdfs dfs -rm -r [-skipTrash] URI [URI ...]

-r:删除文件夹。

上面的1440和120的单位都是分钟,1440表示保留1天,120表示2个小时检查一次。

如果回收站功能开启,执行上面-rm -r操作就相当于移动到了回收站路径,没有真正从hdfs删除。

在WEB UI操作文件系统:

补充知识:hdfs权限

HDFS客户端-Jetbrians产品插件

上面敲命令来进行操作的方式不方便,可以用图形化的工具BigDataTools。

使用NFS网关功能将HDFS挂载到本地系统

HDFS的存储原理

存储原理

如何存储数据(分布式存储)

一个大文件如何在多台服务器存储呢?答:如果有三台服务器,则将文件分为三份,并各自存到服务器中:

那么如何从服务器取回来呢?答:从三台服务器取出每个part,然后组装回去。

引出分布式存储的概念:每个服务器(节点)存储文件的一部分。

多个文件的存储:

假设有多个文件,大小不一。还是划分为三部分。

block(块)的引出:

但是这样导致一个问题:文件大小不一,不利于统一管理。

所以要划分为统一的单位:block 块。

块丢失存在的问题:

但是如果某个块丢失了,这个文件就还原不了了。并且block越多,损坏的几率越大。

解决块丢失的方案:

准备多个副本来备份。(备份放在其他的服务器上)

fsck命令

HDFS副本块数量的配置

方式一:在hdfs-site.xml中配置如下属性:

<property>
    <name>dfs.replication</name>
    <value>3</value>
</property>

方式二:

方式三:

用fsck命令检查文件的副本数

fsck=file system check

hdfs fsck path [-files[-blocks[-locations]]]

block配置

NameNode元数据

namenode如何管理block

namenode能基于一批edits文件和一个fsimage文件来管理block。

edits文件

但是随着每次操作的记录,edits文件会越来越大,为了避免超大的edits文件:

fsimage文件

那么即使有了多个edits文件,也存在以下问题:

为了解决这个问题:

由于edits就是流水账,中间所有乱七八糟的操作都被记下来了。但是往往有用信息只在于“最终的状态”,中间一个个的状态对用户来说没有意义。所以要“合并”。

如何合并呢?

见下面的例子,右边等价于左边:

左边的这个记录的文件就叫fsimage。

流水账:一堆edits;

最终的结果:一个fsimage。

namenode基于这两种文件管理fs的具体流程

下图[2.]更正:上线->上限

元数据合并的控制参数

合并元数据的工作是谁做的呢?

HDFS数据的读写流程

数据写入的流程

数据写入指的是从客户端写数据到hdfs里面。那么客户端是什么呢?之前用到的Hadoop fs和hdfs dfs的这些命令就是一个客户端(Linux命令构建的客户端),包括之前的Big Data Tools也是一种图形化的客户端。

数据写入流程如下:

数据读取流程

标签: 大数据 hadoop hdfs

本文转载自: https://blog.csdn.net/Ann_hahahah/article/details/138246520
版权归原作者 AnnFang_2003 所有, 如有侵权,请联系我们删除。

“大数据技术|第二章 Hadoop HDFS(分布式文件系统)”的评论:

还没有评论