HDFS(一)

HDFS(一)

参考:

http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_design.html

https://www.cnblogs.com/zsql/p/11587240.html

Hadoop Distribute File SystemHadoop分布式文件系统,Hadoop核心组件之一,作为大数据生态圈最底层的分布式存储服务而存在。

架构

架构图:主从结构

在这里插入图片描述

一个HDFS集群是由一个Namenode和一定数目的Datanodes组成。

  • Namenode是一个中心服务器,负责存储和管理文件系统元数据信息(包括namespace目录结构、文件块位置信息等)以及客户端对文件的访问;
  • Datanode负责管理它所在节点上的存储;
  • SecondaryNameNode是主角色的辅助角色,帮助主角色进行元数据的合并
NameNode
  • 维护和管理文件系统元数据,包括名称空间目录树结构、文件和块的位置信息、访问权限等信息;HDFS的访问的唯一入口

  • 内部通过内存和磁盘文件两种方式管理元数据,其中磁盘文件上的元数据文件包括FileSystemimage内存元数据镜像文件(快照)和edits log编辑日志;
    在这里插入图片描述

DataNode

负责具体的数据块存储,DataNode的数量决定了HDFS集群的整体数据存储能力,通过与NameNode配合维护着数据块。
在这里插入图片描述

Secondary NameNode

充当NameNode的辅助接点,但不能替代NameNode。当NameNode启动时,NameNode合并FSimageedits log文件以还原当前文件系统名称空间,如果edits log过大不利于加载,Secondary NameNode就辅助NameNodeNameNode下载FSimage文件和edits log文件进行合并。

重要特性
  • 主从架构
  • 分块存储机制
  • 副本机制(冗余存储)
  • namespace: 层次性文件组织结构
  • 元数据管理:文件自身属性信息;文件块位置映射信息;
  • 数据块存储

HDFS写数据流程

Pipeline管道

客户端将数据块写入第一个数据节点,第一个数据节点保存数据之后再将块复制到第二个数据节点,后者保存后将其复制到第三个数据节点。

为什么datanode之间采用pipeline线性传输,而不是一次给三个datanode拓扑式传输?数据传输采用管道的方式,线性的沿着一个方向传输,这样能够充分的利用每个机器的带宽,避免网络瓶颈和高延迟时的连接,最小化推送所有数据的延时。在线性推送模式下,每台机器所有的出口带宽都用于以最快的速度传输数据,而不是在多个接受者之间分配带宽。

ACK应答响应
副本存储策略
  • 第一块副本:优先客户端本地,否则随机;
  • 第二块副本:不同于第一块副本的机架;
  • 第三块副本:与第二块副本相同机架的不同机器;
写数据流程

在这里插入图片描述

  1. HDFS客户端创建FileSystem对象实例DistributedFileSystemFileSystem封装了与文件系统操作的相关方法。
  2. 调用DistributedFileSystem对象的create()方法,通过RPC请求NameNode创建文件。NameNode执行各种检查判断:目标文件是否存在、父目录是否存在、客户端是否具有创建该文件的权限等,检查通过后,NameNode会为本次请求记下一条记录,返回FSDataOutputStream输出流对象给客户端用于写数据。
  3. 客户端通过FSDataOutputStream开始写入数据(FSDataOutputStreamDFSOutputStream包装类)。
  4. 客户端写入数据时,DFSOutputStream将数据分成一个个数据包(package默认64k),并写入一个内部数据队列中(data queue);DFSOutputStream有一个内部类DataStreamer,用于请求NameNode挑选出适合存储数据副本的一组DataNode,默认是3副本存储。DataStreamer将数据包流式传输到pipeline的第一个DataNode,该DataNode存储数据包并将它发送到pipeline的第二个DataNode,同样,第二个DataNode存储数据包并且发送给第三个DataNode
  5. DFSOutputStream也维护着一个内部数据包队列来等待DataNodeack,称之为确认队列(ack queue),收到pipeline中所有DataNode确认信息后,该数据才会从确认队列中删除。
  6. 客户端完成数据写入后,在FSDataOutputStream输出流上调用close()方法关闭。
  7. DistributedFileSystem联系NameNode告知其文件写入完成,等待NameNode确认。

HDFS读数据流程

在这里插入图片描述

  1. HDFS客户端创建FileSystem对象实例DistributedFileSystemFileSystem封装了与文件系统操作的相关方法,调用DistributedFileSystem对象的open()方法来打开希望读取的文件。
  2. DistributedFileSystem使用RPC调用NameNode来确定文件前几个块的快位置(分批次读取)信息。对于每个块,NameNode返回具有该块所有副本的DataNode位置地址列表,并且该地址列表是排序好的(与客户端的网络拓扑距离近的排序靠前)。
  3. DistributedFileSystemFSDataInputStream输入流返回到客户端以供其读取数据。
  4. 客户端在FSDataInputStream输入流上调用read()方法,然后,已存储DataNode地址的DFSInputStream连接到文件中第一块的最近DataNode,数据从DataNode流回客户端。
  5. 当该块结束时,DFSInputStream将关闭与DataNode的连接,然后寻找下一块的最佳DataNode。客户端从流中读取数据时,也会根据需要询问NameNode来检索下一批数据块的DataNode位置信息。
  6. 一旦客户端完成读取,就对FSDataInputStream调用close()方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/309660.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[开源] .Net orm FreeSql 1.5.0 最新版本(番号:好久不见)

废话开头这篇文章是我有史以来编辑最长时间的,历时 4小时!!!原本我可以利用这 4小时编写一堆胶水代码,真心希望善良的您点个赞,谢谢了!!很久很久没有写文章了,上一次还是…

MapReduce简述

MapReduce 参考: https://www.cnblogs.com/lixiansheng/p/8942370.html https://baike.baidu.com/item/MapReduce/133425?fraladdin 概念 MapReduce是面向大数据并行处理的计算模型,用于大规模数据集的并行计算。它提供了一个庞大但设计精良的并行计算…

调试实战 —— dll 加载失败之全局变量初始化篇

前言 最近项目里总是遇到 dll 加载不上的问题,原因各种各样。今天先总结一个虽然不是项目中实际遇到的问题,但是却非常经典的问题。其它几种问题,后续慢慢总结。示例代码包含一个 exe 工程,两个 dll 工程。exe 会加载两个 dll 并调…

MongoDB副本集

参考:https://www.cnblogs.com/littleatp/p/8562842.html https://www.cnblogs.com/ilifeilong/p/14347008.html MongoDB副本集 MongoDB副本集是由一组Mongod实例(进程)组成,包含一个Primary节点和多个Secondary节点。客户端的所…

博客系统知多少:揭秘那些不为人知的学问(一)

点击上方蓝字关注“汪宇杰博客”导语在我们生活的年代,博客并不稀奇,甚至可以说是随处可见。从最早的搜狐、新浪博客,再到每个人都曾记录青春的 QQ 空间,再到现在的 Vlog 与 Plog,似乎拥有一个自己的博客并不是什么难事…

MongoDB 分片

MongoDB 分片 高数据量(消耗内存)和高吞吐量(消耗CPU)的数据库应用会对单机的性能造成较大压力,为了解决这些问题,一般采用两种方法:水平扩展(将数据集分布在多个服务器上&#xff…

How many ways HDU - 1978(记忆化搜索关于求多少种方式模板)

题目: 这是一个简单的生存游戏,你控制一个机器人从一个棋盘的起始点(1,1)走到棋盘的终点(n,m)。游戏的规则描述如下: 1.机器人一开始在棋盘的起始点并有起始点所标有的能量。 2.机器人只能向右或者向下走,并且每走一步消耗一单位…

Sql Server之旅——第七站 复合索引和include索引到底有多大区别?

索引和锁,这两个主题对我们开发工程师来说,非常的重要。。。只有理解了这两个主题,我们才能写出高质量的sql语句,在之前的博客中,我所说的索引都是单列索引。。。当然数据库不可能只认单列索引,还有我这篇的…

掌握了Docker Layer Caching才敢自称精通Dockerfile

长话短说:本次原创将向您展示在Docker中使用Layer Cache以加快镜像构建。“这个话题的初衷在于:应用打包过程是很慢的(下载并安装框架&第三方依赖包、生成assets),这个过程在Docker中也不能避免。About Layer Caching in DockerDocker使…

How Many Answers Are Wrong HDU - 3038(带权并查集)

题意: TT写一个数列,现在TT会选择一个区间,然后让FF计算这个区间里面所有数的和,FF准备捉弄一下TT,有时候她会故意计算出来一个错的答案,当然TT也比较聪明,他会发现这个答案跟以前的答案会有冲…

ASP.NET Core on K8s学习之旅(14)Ingress灰度发布

【云原生】| 作者/Edison Zhou这是恰童鞋骚年的第236篇原创文章上一篇介绍了Ingress的基本概念和Nginx Ingress的基本配置和使用,然后我还录了一个快速分享小视频介绍了一下蓝绿发布和灰度发布策略的基本概念,本篇介绍一下如何实战使用Nginx Ingress实现…

[汇编语言]实验:应用更灵活的寻址方式来定位内存地址

实验内容: (1)将datasg段中每个单词的头一个字母改成大写字母。 datasg段中的数据为: (2) 将datasg段中每个单词的字母改成大写字母。 datasg段中的数据为: ibm dec dos vax …

你需要了解操作系统发展历程

本文我们大概回顾计算机操作系统发展历程,这里不会记录关于操作系统的完整历史记录,只是记录那些里程碑事件,看看各位接触计算机时,操作系统发展正处于哪个年代起初没有操作系统,没有编程语言或编译器,甚至…

基于 abp vNext 和 .NET Core 开发博客项目 - 使用Redis缓存数据

上一篇文章完成了项目的全局异常处理和日志记录。在日志记录中使用的静态方法有人指出写法不是很优雅,遂优化一下上一篇中日志记录的方法,具体操作如下:在.ToolKits层中新建扩展方法Log4NetExtensions.cs。//Log4NetExtensions.cs using log4…

第一讲 工作区和GOPATH

此为 《极客时间&Go语言核心36讲》 个人笔记,具体课程详见极客时间官网。 Table of Contents generated with DocToc 第一讲 工作区和GOPATH 1. 环境变量配置2. 配置GOPATH的意义 2.1 Go语言源码的组织方式2.2 源码安装后的结果(归档文件、可执行文…