Hadoop原理之HDFS

小伙伴们大家好,今天给大家介绍一下HDFS部分的相关知识:
1.HDFS原理--架构

hdfs由三部分组成:分别是 namenode,SecondaryNameNode,datanode

   namenode: 主节点.
        1. 管理整个HDFS集群.
        2. 维护和管理元数据.
    SecondaryNameNode: 辅助节点.
        辅助namenode维护和管理元数据的.
    datanode: 从节点.
        1. 存储具体的数据.
        2. 负责源文件的读写操作.
        3. 定时和namenode发送心跳包.

2.HDFS的分块存储机制

1. 分块存储是为了方便统一管理的, 默认的块大小为: 128MB.    细节: Hadoop2.X开始才是128MB, Hadoop1.X是: 64MB.
    2. 副本机制是为了提高容错率, 副本数越多, 容错率越高.    带来的弊端是: 磁盘利用率下降了.
    3. 实际开发中, 建议副本数为: 2 ~ 5
    4. 如果要修改block块的大小 和 默认的副本数, 可以去: Hadoop的配置文件中修改.
        路径为:
            /export/server/hadoop/etc/hadoop/hdfs-site.xml
        官方配置文档路径为:
            https://hadoop.apache.org/docs/r3.3.0
            https://hadoop.apache.org/docs/r3.3.0/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml

3.namenode如何管理元数据

我把它理解成以下5点:

   1. namenode是通过一批Edits(小) 和 1个FSImage(大)两类文件来维护和管理元数据的.
    2. Edits文件相对较小, 操作起来速度相对较快, 它只记录HDFS最近一段状态的元数据信息.
       阈值: 1个小时 或者 100W次
    3. FSImage文件相对较大, 操作起来速度相对较慢, 它记录的是HDFS集群除最近状态外, 其它所有的元数据信息.
    4. HDFS集群启动的时候, 会自动加载FSImage文件 和 最新的Edits文件进内存, 用于记录元数据. 整个过程称为HDFS的自检动作, 此状态下, HDFS集群会强制进入到安全模式, 只能读, 不能写.
    5. 我们HDFS集群的Edits文件和FSImage文件存储在: /export/data/hadoop/dfs/name/current

4.HDFS原理--SecondaryNameNode如何辅助namenode管理元数据

问题5: SecondaryNameNode是如何辅助namenode管理元数据的?
    1. SecondaryNameNode会间隔60s(秒), 询问一次namenode, edits文件是否满足了阈值(1个小时, 或者100W次)
    2. 如果满足条件, 就通知namenode创建新的Edits文件, 继续往里写入元数据信息.
    3. 根据http协议, 从namenode上把要合并的edits文件 和 fsimage文件拉取到本地进行合并.
    4. 将合并后的新的FSImage文件推送给namenode, 用来替换之前旧的FsImage文件.
       细节: 旧的FSImage文件并不会被立即删除, 而是达到一定的阈值后, 才会被删除.
    5. 对于Edits文件和FSImage文件的合并操作, 是由SecondaryNameNode独立完成的, 全程namenode不参与.
    6. 实际开发中, namenode 和 SecondaryNameNode会被部署到不同的服务器上, 配置几乎一致, 只不过SecondaryNameNode的内存要稍大一些.
    7. 在紧急情况下, SecondaryNameNode可以用来恢复namenode的元数据.

5.HDFS是怎样写数据的呢?

 1. Client(客户端)请求namenode, 上传文件.
    2. namenode接收到客户端请求后, 会校验权限, 并告知客户端是否可以上传.
       校验: 客户端是否有写的权限, 及文件是否存在.
    3. 如果可以上传, 客户端会按照128MB(默认)对文件进行切块.
    4. Client(客户端)再次请求namenode, 第1个Block块的上传位置.
    5. namenode会根据副本机制, 负载均衡, 机架感知原理及网络拓扑图, 返回给客户端存储该Block块的DataNode列表.
        例如: node1, node2, node3
    6. Client(客户端)会先连接就近的datanode机器, 然后依次和其他的datanode进行连接, 形成: 传输管道(Pipeline)
    7. 采用数据报包(DataPacket)的形式传输数据, 每个包的大小不超过: 64KB, 并建立: 反向应答机制(ACK机制)
    8. 具体的上传动作: node1 -> node2 -> node3,  ACK反向应答机制: node3 => node2 => node1
    9. 重复上述的步骤, 直至第1个Block块上传完毕.
    10. 返回第4步, 客户端(Client)重新请求第2个Block的上传位置, 重复上述动作, 直至所有的Block块传输完毕

6.HDFS又是怎样读数据的呢?

 1. Client(客户端)请求namenode, 读取文件.
    2. namenode校验该客户端是否有读权限, 及该文件是否存在, 校验成功后, 会返回给客户端该文件的块信息.
        例如:
            block1: node1, node2, node5
            block2: node3, node6, node8
            block3: node2, node5, node6     这些地址都是鲜活的.
            ......
    3. Client(客户端)会连接上述的机器(节点), 并行的从中读取块的数据.
    4. Client(客户端)读取完毕后, 会循环namenode获取剩下所有的(或者部分的块信息), 并行读取, 直至所有数据读取完毕.
    5. Client(客户端)根据Block块编号, 把多个Block块数据合并成最终文件即可. 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

吃不到葡萄o

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

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

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

打赏作者

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

抵扣说明:

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

余额充值