自己总结的,结合教材,很简单,就当作笔记了,小白~别笑话我啦
HDFS基础知识
文件系统
文件系统是一种存储和组织数据的方法,实现了数据的存储、分级组织、访问和获取等操作,使得用户对文件访问和查找变得容易;
文件系统使用树形目录的抽象逻辑概念代替了硬盘等物理设备使用数据块的概念,用户不必关心数据底层存在硬盘哪里,只需要记住这个文件的所属目录和文件名即可;
文件系统通常使用硬盘和光盘这样的存储设备,并维护文件在设备中的物理位置.
元数据(metadata)又称之为解释性数据,记录数据的数据;
文件系统元数据一般指文件大小、最后修改时间、底层存储位置、属性、所属用户、权限等信息。
海量数据存储遇到的问题
传统存储方式意味着数据:存储是存储,计算是计算,当需要处理数据的时候把数据移动过来。 程序和数据存储是属于不同的技术厂商实现,无法有机统一整合在一起。
性能低
单节点I/O性能瓶颈无法逾越,难以支撑海量数据的高并发高吞吐场景。
可扩展性差
无法实现快速部署和弹性扩展,动态扩容、缩容成本高,技术实现难度大
分布式文件系统
特性
一次写入多次读取,
分布式存储:方便横向扩展
元数据记录: 方便快速查找我们要定位的文件
文件分块存储: 大文件拆解为若干个数据块分散在不同的机器上 支持并发操作 提高性能
副本机制: 数据保护机制 保存数据的安全 每个数据块默认有三个副本
HDFS重要概念
HDFS三大角色
NameNode : 集群核心,负责元数据存储与管理 主角色
仅存储HDFS的元数据:文件系统中所有文件的目录树,并跟踪整个集群中的文件。
所在机器通常会配置有大量内存(RAM)。
DataNode : 负责集群实际数据的存储 从角色
负责将实际数据存储在HDFS中
所在机器通常配置有大量的硬盘空间
SecondaryNameNode : 辅助管理NameNode完成元数据数据 它和NameNode不是备份关系!!!
心跳检测机制
NameNode与DataNode是如何通信的?
DataNode会定时(3s)会发送一个心跳数据包给NameNode,如果30s内没有接收到心跳数据包,那么NN会认为DN处于"假死"状态,NN会每隔5分主动向DataNode发送确认信号,如果10分钟内没有收到任何信号,NN会认为DN处于"宕机"状态,当宕机发生时,NN会自动寻找新的机器存储宕机机器中的数据块信息.
负载均衡
集群中所有的服务器的,副本数量,和利用率都保持一致,或者在同一水平线上
副本机制
默认为三份,当某个副本不够三份时,NN会新增副本,当某个副本超过三份时,会删除新增副本
当某个块的副本不够三份,而且无法新增时,集群就会强制进入安全模式,(只能读,不能写)[保证数据准确性,和安全性]请检查备份的机器,手动解除安全模式
安全模式
只能读不能写
获取状态 hdfs dfsadmin -safemode get
进入安全模式 hdfs dfsadmin -safemode enter
离开安全模式 hdfs dfsadmin -safemode leave
HDFS shell操作
HDFS有两种访问方式
第一种:Web UI界面 node1:9870
第二种:命名行方式 hadoop fs
底层node1:8020
常见Shell命令
特别说明:关于HDFS的Shell操作,前缀写法有两种形式:
hadoop fs # 适用于所有的文件系统
hdfs dfs # 更适用于HDFS分布式文件系统
选项名称 | 使用格式 | 含义 |
---|---|---|
-ls | -ls <路径> | 查看指定路径的当前目录结构 |
-lsr | -lsr <路径> | 递归查看指定路径的目录结构 |
-du | -du <路径>,统计文件夹需要添加-s | 统计目录下个文件大小 |
-dus | -dus <路径> | 汇总统计目录下文件(夹)大小 |
-count | -count [-q] <路径> | 统计文件(夹)数量 |
-mv | -mv <源路径> <目的路径> | 移动 |
-cp | -cp <源路径> <目的路径> | 复制 |
-rm | -rm [-skipTrash] <路径> | 删除文件/空白文件夹 |
-rmr | -rmr [-skipTrash] <路径> | 递归删除 |
-put | -put <多个linux上的文件> <hdfs路径> | 上传文件 |
-copyFromLocal | -copyFromLocal <多个linux上的文件> <hdfs路径> | 从本地复制 |
-moveFromLocal | -moveFromLocal <多个linux上的文件> <hdfs路径> | 从本地移动 |
-getmerge | -getmerge <源路径> <linux路径> | 合并到本地 |
-cat | -cat <hdfs路径> | 查看文件内容 |
-text | -text <hdfs路径> | 查看文件内容 |
-copyToLocal | -copyToLocal [-ignoreCrc] [-crc] [hdfs源路径] [linux目的路径] | 从本地复制 |
-moveToLocal | -moveToLocal [-crc] <hdfs源路径> <linux目的路径> | 从本地移动 |
-mkdir | -mkdir <hdfs路径> | 创建空白文件夹 |
-setrep | -setrep [-R] [-w] <副本数> <路径> | 修改副本数量 |
-touchz | -touchz <文件路径> | 创建空白文件 |
-stat | -stat [format] <路径> | 显示文件统计信息 |
-tail | -tail [-f] <文件> | 查看文件尾部信息 |
-chmod | -chmod [-R] <权限模式> [路径] | 修改权限 |
-chown | -chown [-R] 属主] 路径 | 修改属主 |
-chgrp | -chgrp [-R] 属组名称 路径 | 修改属组 |
-help | -help [命令选项] | 帮助 |
这是官网:
Apache Hadoop 3.3.6 – Overview
HDFS工作流程与机制
HDFS工作机制
NameNode负责管理整个文件系统元数据;
DataNode负责管理具体文件数据块存储;
Secondary NameNode协助NameNode进行元数据的备份。
副本是如何存放的?
依据网络拓扑结构 + 机架感知原因
① 1副本:优先本机,否则随机
② 2副本:相近机架的不同节点(不同机器)
③ 3副本:与2副本相同机架不同节点(不同机器)
HDFS写数据流程:
第一步:客户端执行文件上传指令 => hadoop fs -put 本地文件 HDFS集群路径
第二步:namenode节点会对客户端上传进行校检:① 客户端是否有上传权限 ② 如果有上传权限,校检HDFS集群中是否存在该文件,如果有权限且集群中没有此文件,则通知客户端上传
第三步:客户端接收到namenode返回的上传信息以后,在客户端对文件进行切块操作,每128M为一个数据块,如300M的文件会切成3个数据块 => 128M、128M、44M
第四步:客户端拿着第一个数据块,重新向namenode节点发起请求,获取上传的datanode节点列表
第五步:namenode节点接收到数据块的上传请求后,根据副本机制(3副本)、机架感知原理 + 网络拓扑结构,寻找离数据块最近的datanodes列表(如datenode1、datanode2、datanode3)
第六步:客户端拿到对应的datanode节点以后,主动与datanode列表建立传输通道(pipeline)
第七步:客户端与datanode节点之间采用数据包(64KB)的方式发送数据块,每个数据包传输完成后,采用反向应答机制保证数据传输安全
第八步:当第一个数据块执行完毕后,重复执行第四步~第七步,直到所有数据块全部传输完成。
HDFS读数据流程:
第一步:客户端向HDFS集群的namenode节点发起读文件指令 => hadoop fs -cat /1.txt
第二步:namenode节点接收到客户端请求后,对客户端判断是否有读权限且判断HDFS集群中是否存在该文件,如果有读权限且HDFS集群中的确存在该文件,则允许读取;根据机架感知原理以及网络拓扑结构返回存储该文件的datanode列表 => datanode1、datanode2、datanode3
第三步:客户端根据namenode返回的datanodes列表,建立传输通管道,基于传输通道读取这个文件相关的数据块信息
第四步:当读取到所有的数据块后,根据block块编号在客户端对文件进行拼接,从而得到最终的文件,到此HDFS读文件操作就结束了
HDFS辅助工具
Archive档案的使用(归档模式)
归档模式主要用于解决HDFS集群中,小文件过多问题!!!
HDFS并不擅长存储小文件,因为每个文件最少一个block,每个block的元数据都会在NameNode占用内存,如果存在大量的小文件,它们会吃掉NameNode节点的大量内存。
Hadoop Archives可以有效的处理以上问题,它可以把多个文件归档成为一个文件,归档成一个文件后还可以透明的访问每一个文件
创建Archive
Usage: hadoop archive -archiveName name -p <parent> <src>* <dest>
-archiveName:归档后的文件名称
-p:指定要归档父文件夹,所有需要归档的文件都在此目录
其中-archiveName是指要创建的存档的名称。比如test.har,archive的名字的扩展名应该是*.har。 -p参数指定文件存档文件(src)的相对路径。
举个例子:-p /foo/bar a/b/c e/f/g
这里的/foo/bar
是a/b/c
与e/f/g
的父路径,
所以完整路径为/foo/bar/a/b/c
与/foo/bar/e/f/g
解压Archive
按顺序解压存档(串行):
Hadoop fs -cp har:///user/zoo/foo.har/dir1 hdfs:/user/zoo/newdir
要并行解压存档,请使用DistCp:
hadoop distcp har:///user/zoo/foo.har/dir1 hdfs:/user/zoo/newdir
因为distcp底层走MapReduce,MapReduce属于并行计算
注意事项:
-
Hadoop archives是特殊的档案格式。一个Hadoop archive对应一个文件系统目录。Hadoop archive的扩展名是*.har;
-
创建archives本质是运行一个MapReduce任务,所以应该在Hadoop集群上运行创建档案的命令;
-
创建archive文件要消耗和原文件一样多的硬盘空间(归档并没有压缩);
-
archive文件不支持压缩,尽管archive文件看起来像已经被压缩过;
-
archive文件一旦创建就无法改变,要修改的话,需要创建新的archive文件。事实上,一般不会再对存档后的文件进行修改,因为它们是定期存档的,比如每周或每日;
-
当创建archive时,源文件不会被更改或删除;
HDFS元数据管理机制
① 持久化存储:
1、文件、目录自身的属性信息,例如文件名,目录名,修改信息等。
2、文件记录的信息的存储相关的信息,例如存储块信息,分块情况,副本个数等。
② 非持久化存储:
3、记录HDFS的Datanode的信息,用于DataNode的管理。
按形式分为内存元数据和元数据文件两种,分别存在内存和磁盘上。