【Hadoop】(二) Hadoop分布式存储HDFS

Hadoop简介

大数据4V特征
1.Volumn : 体量大
2.Velocity : 速度快
3.Variaty : 样式多
4.Value : 价值密度低
分布式
由分布在不同主机上的进程(程序)协同子程序一起才能构成整个应用。
hadoop下载地址:
http://archive.cloudera.com/cdh5/cdh/5/hadoop-2.6.0-cdh5.14.2.tar.gz
Hadoop
   可靠的、可伸缩的、分布式计算的开源软件是一个框架、允许跨越计算机集群的大数据集处理,使用简单的编程模型(MapReduce)。可从单个服务器扩展到几千台主机,每个节点提供了计算和存储的功能。而不是依赖高可用性的机器
依赖于应用层面上的实现

相关技术
在这里插入图片描述
在这里插入图片描述

Hadoop架构

在这里插入图片描述
  HDFS:分布式文件系统
  MapRedurce:分布式计算框架
  Yarn:资源管理调度系统框架
  Hadoop Common:公共类库,Java库和其他Hadoop组件所需的实用工具

Hadoop核心之一HDFS

HDFS工作原理:
在这里插入图片描述数据块(Block) HDFS最基本的存储单元,默认128MB(可配)
 存放机制:
   一个在本地节点
   一个在同一个机架不同节点
   一个在不同机架的节点
fsimage:元数据镜像文件。存储某一时段NameNode内存元数据信息。
edits:操作日志文件。
fstime:保存最近一次checkpoint的时间

NameNode:元数据节点

  • 存储元数据
  • 接收用户操作请求
  • 维护文件系统的目录结构
  • 保存文件、block、datanode之间的映射关系
  • 持久化(fsimage,eidts log)不会持久化block的位置信息(不保存到镜像,关闭后即消失)
  • block:偏移量,因为block不可以调整大小,hdfs不支持修改文件 , 偏移量不会改变

DataNode:数据节点

  • 保存数据
  • 心跳包检测是否宕机
  • 避免数据丢失,文件会有多个副本

Secondary NameNode(SNN):从数据节点

  • 辅助NameNode工作
  • 文件元数据 MetaData
  • 文件数据 . 元数据 :数据本身

HDFS具有主从架构
(主)NameNode 节点保存文件元数据:单节点 posix
(从)DataNode 节点保存文件Block数据:多节点
结构模型关系介绍
DataNode与NameNode保持心跳,提交Block列表
HdfsClient与NameNode交互元数据信息
HdfsClient与DataNode交互文件Block数据

HDFS写文件

在这里插入图片描述
  1.客户端通过调用 DistributedFileSystem 的create()方法,创建一个新的文件。
  2.DistributedFileSystem 通过 RPC(远程过程调用)调用 NameNode,去创建一个没有blocks关联的新文件。创建前,NameNode 会做各种校验,比如文件是否存在,客户端有无权限去创建等。如果校验通过,NameNode 就会记录下新文件,否则就会抛出IO异常。
  3.前两步结束后会返回 FSDataOutputStream 的对象,和读文件的时候相似,FSDataOutputStream 被封装成 DFSOutputStream,DFSOutputStream 负责处理namenode和datanode之间的通信。客户端开始写数据到DFSOutputStream,DFSOutputStream会把数据切成一个个小packet(64k),然后排成队列 data queue。 使用管道 与 切割成packet的理由:并行存储,增加效率。
  4.DataStreamer 会去处理接受 data queue,它先问询 NameNode 这个新的 block 最适合存储的在哪几个DataNode里,比如重复数是3,那么就找到3个最适合的 DataNode,把它们排成一个 pipeline。DataStreamer 把 packet 按队列输出到管道的第一个 DataNode 中,第一个 DataNode又把 packet 输出到第二个 DataNode 中,以此类推。
  5.DFSOutputStream 还有一个队列叫 ack queue,也是由 packet 组成,等待DataNode的收到响应,当pipeline中的所有DataNode都表示已经收到的时候,这时akc queue才会把对应的packet包移除掉。
  6.客户端完成写数据后,调用close方法关闭写入流。
  7.DataStreamer 把剩余的包都刷到 pipeline 里,然后等待 ack 信息,收到最后一个 ack 后,通知 DataNode 把文件标示为已完成

HDFS读文件

在这里插入图片描述
  1.首先客户端调用FileSystem对象的open方法在HDFS中打开要读取的文件,其实获取的是一个DistributedFileSystem的实例。
  2.DistributedFileSystem通过RPC(远程过程调用)来调用namenode,确定文件起始块的位置,即获得文件的第一批block的locations,同一block按照重复数会返回多个locations,这些locations按照hadoop拓扑结构排序,距离客户端近的排在前面。
  3.前两步会返回一个支持文件定位的输入流 FSDataInputStream对象,该对象会被封装成 DFSInputStream对象(存储着文件起始几个块的datanode地址),DFSInputStream可以方便的管理datanode和namenode数据流。客户端调用read方法,DFSInputStream就会找出离客户端最近的datanode并连接datanode。
  4.数据从datanode源源不断的流向客户端。
  5.如果第一个block块的数据读完了,就会关闭指向第一个block块的datanode连接,接着读取下一个block块。这些操作对客户端来说是透明的,从客户端的角度来看只是读一个持续不断的流。
  6.如果第一批block都读完了,DFSInputStream就会去namenode拿下一批blocks的location,然后继续读,如果所有的block块都读完,这时就会关闭掉所有的流

发布了27 篇原创文章 · 获赞 19 · 访问量 1288

猜你喜欢

转载自blog.csdn.net/weixin_42804692/article/details/103432724