Hadoop -- HDFS原理超全总结!!!

目录

一、概述

二、HDFS -- Shell相关命令

三、基础原理

1.HDFS组件的角色是如何划分的?

2.namenode如何管理datanode?

3.namenode如何管理元数据/Block块?

4.SecondaryNameNode如何辅助namenode管理元数据?

5.HDFS写数据的流程

6.HDFS读数据的流程

四、HDFS进阶原理

1.HDFS的安全模式(Safemode)

2.HDFS的归档(Archive)

3.HDFS的垃圾桶(Trash)

总结


一、概述

简介
   全称叫Hadoop Distributed File System, 是Hadoop框架的一个组件, 分布式文件存储系统, 采用分布式的方式来存储数据用于实现: 分布式存储的.
HDFS的适用场景: 历史数据
        1. 存储海量的大文件.
        2. 对数据的时效性要求相对较低的.
        3. 一次写入, 多次读取.
        4. 随机读写要求相对较低的.

二、HDFS -- Shell相关命令

格式        hadoop fs -命令名 [选项] [参数]
相关命令

ls    hadoop fs -lsr /	# 查看目录的信息(包括所有子集), 已过时, 推荐使用 -ls -R
		
mkdir       hadoop fs -mkdir /aa
            hadoop fs -mkdir -p /aa/bb/cc
put        把Linux文件上传到HDFS中.
			# 格式: hadoop fs -put Linux文件路径 HDFS目录路径
            hadoop fs -put /root/1.txt /aa/bb/cc
get
		    从HDFS中下载文件到本地(Linux系统)
			# 格式: hadoop fs -get HDFS文件路径 Linux目录路径
            hadoop fs -get /aa/bb/cc/1.txt ./
		
cat
			hadoop fs -cat /aa/bb/cc/1.txt
		
mv
			hadoop fs -mv /aa/bb/cc/1.txt /aa/bb
		
cp
			必须是: HDFS <=> HDFS
			hadoop fs -cp /aa/bb/cc/1.txt /aa/b
		
rmr
			hadoop fs -rmr /aa
		
appendToFile

			唯一一个可以修改HDFS文件内容的命令, 即: 把1个文件数据追加到某个文件中.

# 细节: Linux => HDFS
# hadoop fs -appendToFile Linux文件路径 HDFS文件路径
hadoop fs -appendToFile /root/2.txt  /aa/1.txt

三、基础原理

1.HDFS组件的角色是如何划分的?

HDFS Client(客户端)
    负责文件切分的, 负责和namenode, datanode交互的, 负责副本策略, 集群的启动和关闭.
    由对文件进行切块(128MB/块, 默认, 可修改), 然后由namenode分配到不同的datanode上存储.

namenode : 主节点
        1. 管理整个HDFS集群.
        2. 维护和管理元数据.


SecondaryNameNode:         辅助节点辅助namenode管理元数据的.

datanode: 从节点
         1. 负责具体数据(块)的存储.
         2. 负责数据的读写操作.
         3. 定时向namenode汇报自己的块信息.

2.namenode如何管理datanode?

心跳机制, 副本机制, 负载均衡.
    
副本机制
    # 问题: HDFS的默认副本数是3, 那么这3个副本是如何存储的呢?
 答案:
      第1副本: 优先本机, 否则就近随机.
      第2副本: 相邻(的不同的)机架的某台服务器上.
      第3副本: 和第2副本同一机架的不同服务器上
    注意点
        实际开发中, 副本数一般是2-5, 副本数越高带来的好处是容错率越高, 带来的弊端是磁盘的利用率降低.
        每个Block块的大小为: 128MB
        HDFS块的大小 和 副本数都是可以设置的
            即: /export/server/hadoop/etc/hadoop/hdfs-site.xml 文件即可.
详细信息查看笔记

 3.namenode如何管理元数据/Block块?

1. namenode通过管理 Edits文件 和 FsImage文件来实现管理元数据的目的.
2. Edits文件, 相对较小, 修改起来速度较快, 记录的是最近一段时间的元数据信息.
3. FSImage文件, 相对较大, 记录的是HDFS的所有元数据.
4. HDFS集群启动的时候, namenode会去加载FsImage文件 和 最近的那个 Edits文件的元数据进内存.

4.SecondaryNameNode如何辅助namenode管理元数据?

1. SecondaryNameNode会实时监听(间隔60秒)Edits文件的状态, 当其(Edits文件)达到一定的阈值(1个小时或者100W次),SecondaryNameNode就会通知namenode禁用该Edits文件, 然后创建1个新的Edits文件, 继续往里写入.
2. SecondaryNameNode会通过Http协议将namenode中的Edits文件 和 FsImage文件拉取到本地进行合并, 形成新的FsImage文件.合并全程, namenode不参与.
3. 然后SecondaryNameNode会将合并后的新的FsImage文件推送给namenode, 用来替代旧的FsImage文件.
4. namenode上会有大量的Edits文件和一堆的FsImage文件, 这些文件不会被立马删除, 而是在服务重启的时候, 或者达到一定阈值的时候, namenode才会删除.

5.HDFS写数据的流程

    1. Client请求namenode, 上传文件.
    2. namenode接收到请求后, 校验权限, 然后告知Client是否可以写数据.
    3. 假设可以写数据, 此时, Client对文件进行切块(默认: 128MB/块)
    4. Client重新请求namenode, 第1个Block的上传位置.
    5. namenode返回第1个块的上传位置, 即: datanode列表, 例如: node1, node2, node3
    6. Client和最近的那个datanode建立连接, 并依次和其它的datanode建立连接, 形成 传输管道(pipeline)
    7. 采用数据报包(默认: 64KB)的方式传输数据, 并建立反向应答机制(Ack).
    8. 依次传输, 直至第1个Block块传输完毕.
    9. 回到第4步, Client重新请求第2个Block的上传位置, 重复后续动作, 直至所有的Block传完.
    10. 至此, HDFS写数据流程结束.

6.HDFS读数据的流程

1. Client请求namenode, 读取文件数据.
2. namenode校验权限合法后, 返回该文件的部分或者全部的Block块信息(即: 这些块在哪些datanode上存储)
3. Client连接这些datanode, 并行的从中读取这些Block块的信息.
4. 当上述的块信息读取完毕后, Client会请求namenode获取剩下的全部或者部分的块信息, 直至所有的块读取完毕.
5. 按照块的编号, 对读取到的数据做合并, 获取最终结果文件, 至此HDFS读数据流程完毕.

四、HDFS进阶原理

1.HDFS的安全模式(Safemode)

概述
        安全模式是HDFS的一种保护机制, 其特点是: 在安全模式下, 只能读, 不能更新(因为更新会修改元数据)

什么时候会进入到安全模式?

情况1: 启动HDFS集群的时候, namenode会去读取Edits文件 和 FsImage文件的元数据信息到内存中, 该过程中会强制进入到安全模式.过程结束(HDFS自检动作没问题), 会自动退出安全模式.

情况2: 当datanode的数量 小于 副本数的时候, 会强制进入到安全模式.

情况3: 手动进入到安全模式, 一般用于排错.

涉及到的命令
hdfs dfsadmin -safemode get         查看安全模式的状态, OFF:关, ON:开
hdfs dfsadmin -safemode enter       进入到安全模式
hdfs dfsadmin -safemode leave       退出安全模式

2.HDFS的归档(Archive)

 概述
        HDFS适用于存储海量的大文件, 那如果要用HDFS存储大量的小文件时, 每个小文件都会占用1个Block块, 就会导致元数据过多, 针对于这种情况,就可以用 归档 技术来解决.
与spark中wholeTextFiles算子作用相似

本质
        归档相当于把大量的小文件放到一起, 形成1个整体, 类似于压缩包的动作, 但是只有压, 没有缩

好处
         n个小文件 = n个Block块 = N份元数据    => 归档后,  n个小文件 = 1个归档包(文件) = 1个Block块 = 1份元数据信息

结论
        归档操作实际开发中, 一般是一周或者1个月做一次, 把该周或者该月所有的数据放到1个归档包中, 降低元数据, 且后期需要单独使用的时候, 也可以很方便的从归档包拷贝数据出来.

相关操作
1. 在HDFS下创建data文件夹, 里边有1.txt, 2.txt, 3.txt三个文件.
            hadoop fs -put *.txt /data
2. 把 /data目录下的 3个txt文件 合并成 1个归档包, 放到 /output目录下.
            细节: 归档的底层其实是MR程序.
            格式如下:
                hadoop archive -archiveName 归档包名 -p 要归档的文件路径 存放归档包的路径
            例如:
                hadoop archive -archiveName myTest.har -p /data /output
3. 去 /output目录下查看内容, 发现(直接)看不到 1.txt, 2.txt, 3.txt的信息.
            hadoop fs -ls /output/myTest.har            -- 看不到 1.txt, 2.txt, 3.txt的信息. 因为文件系统前缀是  hdfs://ndoe1:8020/
            hadoop fs -cat /output/myTest.har/1.txt
 4. 如何去归档包中查看归档前的内容内? 命令如下:
            hadoop fs -ls har:///output/myTest.har     -- 可以看到, 因为用的是 har:///这个前缀, 全称是:  har://hdfs-node1:8020/
            hadoop fs -cat har:///output/myTest.har/1.txt
            hadoop fs -ls har://hdfs-node1:8020/output/myTest.har
            即: 写不同的前缀, 意味着用不同的文件系统来识别该文件.
5. 删除/data目录下的 3个txt文件, 然后从 /output 的归档包中拷贝 3个txt文件 到 /data目录下.
            hadoop fs -cp /output/myTest.har/ /data           -- 把归档包拷贝到 /data目录下, 拷贝的是 myTest.har包下的内容, 达不到我们要的效果.
            hadoop fs -cp har:///output/myTest.har/ * /data     -- 把归档包拷贝到 /data目录下, 归档拷贝.

3.HDFS的垃圾桶(Trash)

概述
        如果没有开启HDFS的垃圾桶机制, 默认是直接删除文件或者文件夹的, 不走垃圾桶(不可恢复, 相当于永久删除).
如果开启了HDFS的垃圾桶机制, 则删除数据(文件或者目录)的时候, 本质是将该 文件/目录 移动到垃圾桶中(可恢复的).

开启垃圾桶的方式
1. 修改 /export/server/hadoop/etc/hadoop/core-site.xml 文件, 加入如下内容:
    <property>
        <name>fs.trash.interval</name>
        <value>1440</value>     # 垃圾桶保留多长时间, 单位是: 分钟, 即: 1天.
    </property>
2. 记得将 core-site.xml文件分发给node2, node3, 即: 三台机器都要修改.
            scp core-site.xml node2:$PWD
            scp core-site.xml node3:$PWD
           如果你不想拷贝, 就手动逐个机器修改, 修改node1的core-site.xml, 修改node2的, 修改node3的...
3. 重启Hadoop集群.
            stop-all.sh
            start-all.sh        # 这两个命令均是在 node1中执行的.
4. 之后就可以测试删除的功能了, 涉及到的HDFS Shell命令如下.
            hadoop fs -rm /data/2.txt                                      -- 此时的删除就是 剪切到 垃圾桶中.
            hadoop fs -mv /user/root/.Trash/Current/data/2.txt /data       -- 从垃圾桶中恢复源文件.
            hadoop fs -rm -skipTrash /data/2.txt                           -- 跳过垃圾桶, 相当于永久删除.


总结

以上就是今天要讲的内容,本文介绍了Hadoop集群中HDFS的Shell命令和相关原理.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hadoop是一个开源的分布式计算框架,其中的Hadoop Distributed File System(HDFS)是其核心组件之一。HDFS是一个设计用于存储大规模数据的分布式文件系统,其目标是提供高可靠性、高性能和高可扩展性。下面对Hadoop 2.x HDFS的源码进行剖析。 HDFS的源码主要包含以下几个关键模块:NameNode、DataNode、BlockManager和FileSystem。 首先,NameNode是HDFS的主节点,负责管理文件系统的命名空间和元数据(例如文件的名称和位置等)。它通过解析客户端的请求,维护了一个表示文件和目录路径的层次结构,并使用高效的数据结构(如内存中的树状结构)来存储和管理元数据。 其次,DataNode是HDFS的工作节点,负责存储和处理实际的数据块。每个DataNode都与一个或多个存储介质(如磁盘)相连,可以提供数据的读取和写入操作。DataNode定期向NameNode报告其存储的数据块的状态,并接收来自NameNode的指令,如复制、移动和删除数据块。 BlockManager是NameNode的重要组成部分,负责管理数据块的复制和位置信息。它通过与DataNode的交互,监控和维护数据块的复制系数(即数据块的副本数),确保数据块的可靠性和可用性。 最后,FileSystem是用户与HDFS进行交互的接口。它提供了一系列的API和命令,例如创建、读取和写入文件等,以便用户可以对HDFS中的文件进行操作。 Hadoop 2.x HDFS的源码剖析主要涉及上述模块的实现细节,包括具体数据结构的设计和实现、请求处理的流程、数据块的复制策略以及与底层存储介质的交互等。剖析源码可以深入了解HDFS的内部工作原理,帮助开发者理解和优化系统的性能,同时也有助于扩展和改进HDFS的功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值