热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

大数据开发之HDFS分布式文件存储系统详解

大数据开发之HDFS分布式文件存储系统详解-HDFS(HadoopDistributedFileSystem)分布式文件存储系统,主要为各类分布式计算框架如Spark、MapRed

HDFS(Hadoop Distributed File System)分布式文件存储系统,主要为各类分布式计算框架如Spark、MapReduce等提供海量数据存储服务,同时HBase、Hive底层存储也依赖于HDFS。HDFS提供一个统一的抽象目录树,客户端可通过路径来访问文件。HDFS集群分为两大角色:Namenode、Datanode(非HA模式会存在Secondary Namenode)
Namenode
Namenode是HDFS集群主节点,负责管理整个文件系统的元数据,所有的读写请求都要经过Namenode。
元数据管理
Namenode对元数据的管理采用了三种形式:
1) 内存元数据:基于内存存储元数据,元数据比较完整
2) fsimage文件:磁盘元数据镜像文件,在NameNode工作目录中,它不包含block所在的Datanode 信息
3) edits文件:数据操作日志文件,用于衔接内存元数据和fsimage之间的操作日志,可通过日志运算出元数据
fsimage + edits = 内存元数据
注意:当客户端对hdfs中的文件进行新增或修改时,操作记录首先被记入edit日志文件,当客户端操作成功后,相应的元数据会更新到内存元数据中

可以通过hdfs的一个工具来查看edits中的信息
bin/hdfs oev -i edits -o edits.xml
查看fsimage
bin/hdfs oiv -i fsimage_0000000000000000087 -p XML -o fsimage.xml

元数据的checkpoint(非HA模式)
Secondary Namenode每隔一段时间会检查Namenode上的fsimage和edits文件是否需要合并,如触发设置的条件就开始下载最新的fsimage和所有的edits文件到本地,并加载到内存中进行合并,然后将合并之后获得的新的fsimage上传到Namenode。checkpoint操作的触发条件主要配置参数:

dfs.namenode.checkpoint.check.period=60 #检查触发条件是否满足的频率,单位秒
dfs.namenode.checkpoint.dir=file://${hadoop.tmp.dir}/dfs/namesecondary
dfs.namenode.checkpoint.edits.dir=${dfs.namenode.checkpoint.dir}

以上两个参数做checkpoint操作时,secondary namenode的本地工作目录,主要处理fsimage和edits文件的

dfs.namenode.checkpoint.max-retries=3 #最大重试次数
dfs.namenode.checkpoint.period=3600 #两次checkpoint之间的时间间隔3600秒
dfs.namenode.checkpoint.txns=1000000 #两次checkpoint之间最大的操作记录

checkpoint作用

  1. 加快Namenode启动
    Namenode启动时,会合并磁盘上的fsimage文件和edits文件,得到完整的元数据信息,但如果fsimage和edits文件非常大,这个合并过程就会非常慢,导致HDFS长时间处于安全模式中而无法正常提供服务。SecondaryNamenode的checkpoint机制可以缓解这一问题
  2. 数据恢复
    Namenode和SecondaryNamenode的工作目录存储结构完全相同,当Namenode故障退出需要重新恢复时,可以从SecondaryNamenode的工作目录中将fsimage拷贝到Namenode的工作目录,以恢复Namenode的元数据。但是SecondaryNamenode最后一次合并之后的更新操作的元数据将会丢失,最好Namenode元数据的文件夹放在多个磁盘上面进行冗余,降低数据丢失的可能性。
    注意事项:
  3. SecondaryNamenode只有在第一次进行元数据合并时需要从Namenode下载fsimage到本地。SecondaryNamenode在第一次元数据合并完成并上传到Namenode后,所持有的fsimage已是最新的fsimage,无需再从Namenode处获取,而只需要获取edits文件即可。
  4. SecondaryNamenode从Namenode上将要合并的edits和fsimage拷贝到自己当前服务器上,然后将fsimage和edits反序列化到SecondaryNamenode的内存中,进行计算合并。因此一般需要把Namenode和SecondaryNamenode分别部署到不同的机器上面,且SecondaryNamenode服务器配置要求一般不低于Namenode。
  5. SecondaryNamenode不是充当Namenode的“备服务器”,它的主要作用是进行元数据的checkpoint
    Datanode
    Datanode作为HDFS集群从节点,大数据培训负责存储管理用户的文件块数据,并定期向Namenode汇报自身所持有的block信息(这点很重要,因为,当集群中发生某些block副本失效时,集群如何恢复block初始副本数量的问题)。
    关于Datanode两个重要的参数:
  6. 通过心跳信息上报参数


dfs.blockreport.intervalMsec
3600000
Determines block reporting interval in milliseconds.

  1. Datanode掉线判断时限参数
    Datanode进程死亡或者网络故障造成Datanode无法与Namenode通信时,Namenode不会立即把该Datanode判定为死亡,要经过一段时间,这段时间称作超时时长。HDFS默认的超时时长为10分钟30秒。如果定义超时时间为timeout,则超时时长的计算公式为:
    timeout = 2 heartbeat.recheck.interval(默认5分钟) + 10 dfs.heartbeat.interval(默认3秒)。

    heartbeat.recheck.interval

    单位毫秒

    2000


    dfs.heartbeat.interval

    单位秒

    1

HDFS读写数据流程
了解了Namenode和Datanode的作用后,就很容易理解HDFS读写数据流程,这个也是面试中经常问的问题。
HDFS写数据流程

注意:
1.文件block块切分和上传是在客户端进行的操作
2.Datanode之间本身是建立了一个RPC通信建立pipeline
3.客户端先从磁盘读取数据放到一个本地内存缓存,开始往Datanode1上传第一个block,以packet为单位,Datanode1收到一个packet就会传给Datanode2,Datanode2传给Datanode3;Datanode1每传一个packet会放入一个应答队列等待应答
4.当一个block传输完成之后,客户端会通知Namenode存储块完毕,Namenode将元数据同步到内存中

  1. Datanode之间pipeline传输文件时,一般按照就近可用原则
    a) 首先就近挑选一台机器
    b) 优先选择另一个机架上的Datanode
    c) 在本机架上再随机挑选一台
    HDFS读数据流程

    注意:
  2. Datanode发送数据,是从磁盘里面读取数据放入流,以packet为单位来做校验
  3. 客户端以packet为单位接收,先在本地缓存,然后写入目标文件
    客户端将要读取的文件路径发送给namenode,namenode获取文件的元信息(主要是block的存放位置信息)返回给客户端,客户端根据返回的信息找到相应datanode逐个获取文件的block并在客户端本地进行数据追加合并从而获得整个文件
    HDFSHA机制
    HA:高可用,通过双Namenode消除单点故障。

    双Namenode协调工作的要点:
  4. 元数据管理方式需要改变
    a) 内存中各自保存一份元数据
    b) edits日志只能有一份,只有active状态的Namenode节点可以做写操作
    c) 两个Namenode都可以读取edits
    d) 共享的edits放在一个共享存储中管理(qjournal和NFS两个主流实现,图中以放在一个共享存储中管理(qjournal和为例)
  5. 需要一个状态管理功能模块
    a) 实现了一个zk failover,常驻在每一个Namenode所在的节点
    b) 每一个zk failover负责监控自己所在Namenode节点,利用zk进行状态标识,当需要进行状态切换时,由zk failover来负责切换,切换时需要防止brain split现象的发生

推荐阅读
  • Hadoop2.6.0 + 云centos +伪分布式只谈部署
    3.0.3玩不好,现将2.6.0tar.gz上传到usr,chmod-Rhadoop:hadophadoop-2.6.0,rm掉3.0.32.在etcp ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
  • 一面自我介绍对象相等的判断,equals方法实现。可以简单描述挫折,并说明自己如何克服,最终有哪些收获。职业规划表明自己决心,首先自己不准备继续求学了,必须招工作了。希望去哪 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • LeetCode笔记:剑指Offer 41. 数据流中的中位数(Java、堆、优先队列、知识点)
    本文介绍了LeetCode剑指Offer 41题的解题思路和代码实现,主要涉及了Java中的优先队列和堆排序的知识点。优先队列是Queue接口的实现,可以对其中的元素进行排序,采用小顶堆的方式进行排序。本文还介绍了Java中queue的offer、poll、add、remove、element、peek等方法的区别和用法。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
author-avatar
手机用户2502923261
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有