Hdfs的Shell操作

hdfs的操作实际上和Linux很像,只是在前面添加了 hdfs dfs的前缀,例如:hdfs dfs mkdir /etc 【在dfs根目录下创建etc文件夹】 下面有是有关的基础Shell命令需要掌握

创建新目录:!注意,操作路径都是绝对路径 不存在cd 相对路径
》hdfs dfs -mkdir (-p) /目录《
$ hdfs dfs -mkdir /test # 在根目录下传建一个test文件夹
$ hdfs dfs -mkdir -p /test/a/b/c # 多级创建,在一个文件夹下在创建子级文件夹多加-p

上传命令:
》hdfs dfs -put /本地文件 /dfs路径《
$ hdfs dfs -put /sowfwares / # 上传/sowfwares到dfs的根目录上
$ hdfs dfs -put *.txt / # 上传当前目录下的txt文件到根目录上

本地移动文件到dfs:
》hdfs dfs -moveFromLocal /本地文件 /dfs路径《
$ hdfs dfs -moveFromLocal hello.jpg / # 上传当前目录下的txt文件到根目录上

查看hdfs文件:
》 hdsd dfs -ls (-hR) /dfs路径 《
$ hdsd dfs -ls / # 查看hdfs根目录文件
$ hdsd dfs -ls -h / # 带文件大小单位转换的展示
$ hdsd dfs -ls -R / # 递归查看hdfs根目录文件下所有文件(包括所有子文件)

查看hdfs文件的内容:
》 hdsd dfs -cat /dfs路径 《
$ hdsd dfs -cat /file/txt01.txt # 查看hdfs下的/file/txt01.txt文件
$ hdsd dfs -cat /file/*.txt # 查看hdfs下的/file/*.txt,所有txt文件夹

查看文件的头几行:
》 hdsd dfs -head /dfs路径 《
查看文件的后几行:
》 hdsd dfs -tail /dfs路径 《

下载hdfs的文件到本地: []下的东西为非必写
》 hdfs dfs -copyToLocal /dfs路径 [本地路径] 《   # 不写本地路径会下载到当前位置
$ hdfs dfs -copyToLocal /file/txt01.txt # 下载hdfs下的/file/txt01.txt文件
》 hdfs dfs -get /dfs路径 《
$ hdfs dfs -get /file/txt01.txt # 下载hdfs下的/file/txt01.txt文件

合并下载hdfs的文件到本地:
》 hdfs dfs -getmerge /dfs路径* 文件名(位置) 《
$ hdfs dfs -getmerge /input/file* file # 合并下载/input/file*的所有文件存在file文件中

删除hdfs的文件:
》 hdfs dfs -rm (-r) /dfs路径 《 # 删除文件没提示信息,注意
$ hdfs dfs -rm /file/*.txt # 删除/file下的所有txt文件夹
$ hdfs dfs -rm -r /file # 删除整个/file文件夹

拷贝文件
》 hdfs dfs -cp /dfs路径 /移动到的dfs路径 《
$ hdfs dfs -cp /file/file1.txt /file2_cp.txt # 拷贝hdfs的文件到其根目录下/file2_cp.txt的文件

文件重命名和移动文件
》 hdfs dfs -mv /dfs路径文件 /dfs(同级目录下)新路径文件 《
$ hdfs dfs -mv /file/file1.txt /file/txt01.txt # 把/file/file1.txt文件重命名为/file/txt01.txt
》 hdfs dfs -mv /dfs路径文件 /dfs新路径文件 《
$ hdfs dfs -mv /file/file1.txt / # 把/file/file1.txt文件移动到根目录

创建空文件
》 hdfs dfs -touchz /dfs文件夹名 《
$ hdfs dfs -touchz /file2 # 在dfs上创建了/file2文件夹

向文件中追加内容
!HDFS中不支持你编辑文件,只能向后追加内容
》 hdfs dfs -appendToFile /本地文件 /dfs文件《
$ hdfs dfs -appendToFile /file1 /file # 向dfs文件/file上追加本地的文件/file1到文件末尾

修改文件权限
》 hdfs dfs -chomd (-R) 权限符 /dfs位置 《
$ hdfs dfs -chomd 755 /file # 赋予dfs下/file文件权限为 755
$ hdfs dfs -chomd 755 /sofwares # 递归赋予dfs下/sofwares文件夹及其内部文件权限为 755

修改文件所属用户、组
》 hdfs dfs -chown [所属用户][:所属用户组] /dfs位置 《
$ hdfs dfs -chown hadoop /file # dfs下的/file文件所属用户变为hadoop
$ hdfs dfs -chown root:superroot /file # dfs下的/file文件所属用户变为root,用户组为superroot

修改文本副本数量
》 hdfs dfs -setrep 整数 /dfs位置 《
$ hdfs dfs setrep 3 /file # dfs下的/file文件副本数量为3
# 作用于文件夹下的时候下面所有文件都会被修改

文件的测试
参考使用:hdfs dfs -test -d /sowfares && echo "0K" || echo "no"
# /sowfares 是不是一个文件夹(-d) 如果是输出OK,不是no
# -d 是否为文件夹 -e 是否存在 -z 是否为空

查看文件夹和子文件夹数量
》 hdfs dfs -count /dfs位置 《
$ hdfs dfs -count / # 根目录下的子文件数量

磁盘利用率统计:
》 hdfs dfs -df (-h) / 《
统计文件文件夹大小:
》 hdfs dfs -du (-hs) /dfs位置 《 # -s求总和

文件状态查看:
》 hdfs dfs -stat [占位符] /dfs位置 《
# 占位符:%b 文件大小,%n 打印文件名,%o 打印block的size,%r 打印副本数量,%y 修改时间
$ hdfs dfs -stat %n-%b-%r-%o-%y /softwares/hadoop-3.3.1.tar.gz
# 查看dfs/softwares/hadoop-3.3.1.tar.gz 文件的名字,大小,副本数,修改时间和块大小

回收站:在dfs中是有回收站概念的,默认是不开启的,可以通过回收站找回被删除的文件,需要修改集群中的 core-site.xml 文件 。

回收站的基本原理: 当用户删除文件时,HDFS 并不会立即从磁盘中删除文件,而是将文件移动到一个称为回收站(Trash)的特定目录中,当保留时间设置为0代表不经过此文件夹立刻删除无法恢复。 检查点创建时间间隔 是防止存储出现意外设置的检查点将回收站的内容持久化一次。 这个值应该小于或等于 fs.trash.interval 的值。如果设置为 0,则会自动设置为与 fs.trash.interval 相同的值。

回收站路径:hdfs://h1:9820/user/root/.Trash/Current/……

文件找回: hdfs dfs -mv /user/root/.Trash/Current/xx / [将 /user/root/.Trash/Current/xx 文件移动到根目录下]

清空回收站: hdsf dfs -expunge

删除文件夹不通过回收站:hdsf -dsf -rm (-r) -skipTrash /xx

HDFS块

为了解决这个问题HDFS引用块的概念,块大小是固定的,可以根据实际需求自定义,块是HDSF中最小的存储单位,多个块存储在不同的dataNode上,dfs会保证一个块存在一个节点上。默认情况下的大小是128MB,这个大小是按照机械硬盘的平均读取速度/s制定的,可以按照实际需求更改,如果最后一个块不足128MB 这块不会占据整个块的大小。存储机制 三备份进一。

HDFS基础和架构原理_hdfs

为什么要设置块大小为128MB?

加块大小来提升传输效率 :这个数值是根据硬盘的读取速度来算的,机械硬盘的平均速度在128MB/s,可以充分的使用磁盘提高传输效率。

不适合存储小文件: HDFS块大小大,如果文件数量众多但文件较小,会占用较多的NameNode内存资源。例如,一个文件大小不足128MB,即使文件内容只有1MB,也会占用一个完整的块并持有相对的副本信息和块存储信息,导致内存浪费。

故事,128G磁盘理论每个块都存满128MB在这种情况下,磁盘的存储利用率最高128G/128MB150byte = 1024 块 约等于 0.14 MB。 每个块只存储1MB数据,加上150Byte的块信息 那么每个块大小就约等于 128G/1MB150byte = 131072 块 元数据占用达到了 18.75MB

设置块的大小:在hdfs-site.xml中就有相关配置 dfs.blocksize 134217728(kb)

HDFS优缺点

优点:

高容错性 数据在自动保存多个副本的情况下,副本丢失后,会自动恢复;

适合大数据量存储 支持GB、TB甚至PB级别的文件,能处理千万级以上的文件数量,能支持1000以上节点的集群。

高吞吐量 一次性读写,批量处理,保证速度快、安全性高;

可扩展性 可以扩展存储能力和处理能力。

高可靠性: Hadoop的任务在节点失败时能够动态调整,并保证每个节点的动态平衡,因故障处理非常快。

高效性: Hadoop的存储和计算分离使得系统能够高效处理大规模数据。

缺点:

不适合低延迟数据访问:HDFS设计目标是批处理数据,故不适合处理需要低延迟的交互式应用。

不适合存储小文件: 小文件过多会导致NameNode存储元数据的开销较大,容易造成性能瓶颈。

仅支持追加写入: HDFS上的文件只能追加写入,无法对文件进行随机写入或修改。

HDFS体系结构

HDFS基础和架构原理_元数据_02

HDFS HADDOP HA主要由三个部分组成 NameNode,DataNode ,JournalNode组成

首先Client发起文件上传或下载的清求到 Active NameNode,AN会根据 DataNode 的资源情况以及机架感知策略返回可用节点,然后直接和 DataNode 建立连接完成文件的上传下载 客户端需要设置一个文件分割阈值,例如 128M。当文件超过阈值时,对文件进行切分,切分为多个块上传。

元数据(Metadata)是指关于文件和块的信息,它们包括文件名、文件大小、块的编号、每个块的位置以及每个块的副本存储在哪些DataNode上。元数据由NameNode管理和维护。

NameNode负责存储文件的元数据和维护内部的文件目录树 元数据如何存储? 为了元数据不丢失和快速响应客户端,元数据还需要放入内存,将元数据中文件与块的映射关系存入内与与磁盘; 但是块与 DataNode 的映射关系只存入内存,因为 DataNode 可能会宕机,这层关系持久化无意义Client 发起文件上传或下载的请求到 Active NameNode,ANN 会根据 DataNode 的资源情况以及机架感知策略返回可用节点为了保证 NameNode 的高可用,Hadoop2.x版本中引入了ZooKeeper 解决单点故障问题,使用 ZooKeeper 完成 Hadoop集群的选主以及主备切换,主被称为 Active,备被称为 Standby

Hadoop的高可用使用ZooKeeper 完成,Hadoop 集群的选主以及主备切换,主被称为 Active ,备被称为 Standby 。Standby NameNode 的内存元数据和 Active Namenode 的内存元数据一模一样的,当 Active 宕机时可以随时顶替成为新的 Active节点。

StandbyNameNode 的磁盘元数据和 Active NameNode 的磁盘源数据是不一样的,因为谁是 Active 谁才会在磁盘中写入元数据,并实时写入 QJM,DataNode 需要同时向所有 NameNode 汇报自己的心跳(3s),主要包含资源情况和文件块与 DataNode 的映射

QJM 是一个文件存储集群,在内部已经实现了通过Paxos保证高可用和数据可靠性,他会存储由namenode中的操作日志edits,而操作日志它记录了对文件系统元数据的所有修改操作。这些修改操作包括文件创建、删除、重命名、块的分配等,一次操作一个edits文件数字是自增的编号是唯一的。

Standby NameNode 需要对元数据进行压缩合并,当触发一次检查点Chekpoint的时候会用最新的fsimage和之后的edits文件进行合并创建一个新的fsimage,例如 fsimage_0000000034,合井后Standby 会通知Active 拷贝走合井文件,该文件最多只存在最近两个版本,作为快照恢复使用。 检查点:时间维度:默认到达1小时合并一次 操作维度:默认一百万次写和改操作合并一次 操作检查时间:默认1分钟执行一次

主节点宕机或者集群重启流程:首先先等待一个namenode进场,然后他会拿取自己最新的fsimage文件恢复一部分文件,然后在QJM中拿取高于快照版本的日志加载推演元数据使其回到原始状态,最后在QJM中将未写完的edits文件也同步一下,完成后等待Datanode心跳反馈判断有没有出现块丢失,此时进入安全模式,当文件中可以拼成的副本数量大于文件的99%就会慢慢退出安全模式,在安全模式下可读但是不可写和改删文件,启动成功

HDFS基础和架构原理_HDFS_03

合并流程:Namenode最新的事务快照是49,从49开始操作到事务100触发检查点创建一个新的edits文件为101此时 fsimage和edits49-100的文件会被转发给SNameNode合并完之后再发送回去,不影响主节点工作。

心跳机制和dfs读写原理

心跳机制是一种用于NameNode监管DataNode存活状态的机制,默认3s,当节点长时间未响应会触发故障转移判定为死亡。当用户读取数据根据namenode返回的数据发现这个节点无法被访问,会汇报错误状态避免再次访问,然后访问下一个存有副本的节点,当达到10分30秒没有回应心跳和数据会开始备份和做数据转移。等上线后察觉到副本数量多了会自己动态平衡维护

属性:dfs.namenode.heartbeat.recheck-interval (健康检查点) 单位毫秒默认5分钟 属性:dfs.heartbeat.interval 默认值时3秒 (心跳汇报间隔) Datanode计算公式:2recheck+10heartbeat = 10分钟30秒

心跳中包含了多样的数据会包含有 --> DataNode的状态信息,确保存活。 -->存储容量信息,包括总容量,已使用存储容量,剩余容量。 -->块信息: 简要或者以详细的块报告的数据,将包含简要的块信息,例如有问题的块(失效块、恢复中的块等)信息发送给namenode。 --> DataNode的负载信息(I/O负担和CPU内存使用情况等) -->健康状态 包括网络或者磁盘故障 --> 块副本状态 确认存储在该DataNode上的每个块的副本是否完好,是否需要重新复制或修复。 --> 软件和版本信息

HDFS基础和架构原理_HDFS_04

首先客户端先发送一个请求给Namenode,他来判断你有没有权限去访问,读取,返回排序好的针对数据的元数据等信息通过列表返回,通过实例化的FSDelalnputStram来读取信息,选择最近的机器拿文件返回此对象,然后操作写在本地文件中,然后继续读取块2通过此对象写入到刚刚的文件的后面就实现了完整的读取文件的操作。如果出现了读取块中途出现错误会根据块的元组信息顺序去读下一个节点标记此节点确保下次读取此文件不在这里读文件。

HDFS基础和架构原理_hdfs_05

客户端要先给文件进行切块,然后请求文件,构建对象和Namenode通信,创建新文件,检查当前位置文件名是否存在以及是否有权限上传,然后创建文件,返回可以上传的指示。沟通完毕后将获得的数据注入FSDelalnputStram对象让他来实现文件的写入,将文件给对象后向Namenode请求上传的块信息,namenode根据压力和机架感知策略来返回列表给写入对象,根据这个列表先和列表中的1建立连接,然后1和2通信,2和3通信,3给2汇报,2给1 不同的服务器和节点通信将数据进行缓存 tmp/data 结束后返回应答给客户端节点,指示关闭写入流,最后向Namenode汇报操作结束 完整流程结束。

如果写入断电就先关闭管道,确认队列中的所有数据包都添加回到数据队列的前端,确保和之前没上传这个block时一样,然后根据下一个datenode写入并且保留一个标识就存两份,让Namenode发现这个坏掉节点重新工作后自动删除之前写一半的内容,Namenode发现副本数量不足会创建一个副本

联邦机制:

HDFS的联邦机制(Federation)是为了解决传统HDFS在大规模数据存储和管理上的瓶颈和限制。随着数据量的快速增长,单个NameNode的内存和处理能力可能无法满足需求,联邦机制通过引入多个NameNode来提升HDFS的可扩展性和性能。

HDFS联邦机制通过引入多个独立的NameNode和命名空间(Namespace)来分散元数据的管理压力。每个NameNode管理一个独立的命名空间,多个NameNode可以在同一个HDFS集群中共存,但它们彼此独立,互不干扰。

优点:扩展性,NameNode,可以显著提高HDFS的扩展性,支持更多的文件和更大的数据量。 性能提升,各个NameNode独立工作,可以并行处理请求,提高整体的吞吐量和响应速度。 隔离性,命名空间之间的隔离可以防止单个NameNode的故障或负载过高影响整个集群的性能和稳定性。

工作原理:

命名空间隔离:每个NameNode管理一个独立的命名空间,处理该命名空间内的所有文件操作,如创建、删除、重命名等,这样可以独立扩展和管理,不会因为其他命名空间的负载而受到影响。

DataNode共享:DataNode存储来自不同NameNode的块,在内部会对一个Namenode联邦维护一个块池,并向各个NameNode汇报其状态。DataNode将块数据按照块池ID进行分类管理,确保不同命名空间的块数据互不干扰。

访问独立:客户端可以通过配置文件访问不同的命名空间。客户端根据文件路径确定对应的NameNode,然后向该NameNode发送请求。

机架感知:

在一个大型集群中,节点通常分布在多个机架中。机架之间的网络带宽通常要低于机架内部的带宽。因此,为了提高数据的可靠性并减少网络开销,HDFS会将数据块的副本分散存储在不同的机架上,而不是将所有副本存储在同一个机架中。

这样可以解决单机架故障的情况和提高可用性,优化网络带宽介绍跨机架传输优化网络,HDFS的机架感知并不是自动完成的,需要管理员预先配置机架拓扑信息。具体来说,管理员需要定义集群中每个节点所属的机架,并通过配置文件和机架拓扑脚本将这些信息告知HDFS。

管理员需要为集群中的每个节点分配一个机架ID。可以使用像 /rack1/rack2 这样的标识来表示不同的机架。

ZKFC和Zookeeper 选主

ZKFC是一个负责监控NameNode健康状况并管理它们的主备转换的进程。每个NameNode(Active和Standby)都有一个对应的ZKFC进程。

当集群启动时,每个ZKFC进程都会在Zookeeper的某个目录(如/hdfs-ha)下创建一个临时顺序节点。这些临时顺序节点会有唯一的顺序编号。编号最小的节点的ZKFC进程会成为领导者,并把对应的NameNode设置为Active。

当集群启动时,ZKFC1和ZKFC2都会尝试在Zookeeper的/hdfs-ha目录下创建临时顺序节点,如/hdfs-ha/n_00000001/hdfs-ha/n_00000002

因为是顺序节点,编号最小的节点会被认为是领导者。此时node01 是主节点,如果node01挂了,Zookeeper临时节点文件被释放node02就可以创建了,此时当node01再回来就是从节点,设置的编号就应该是/hdfs-ha/n_00000003