Hadoop基础(一):分布式文件系统HDFS


一、HDFS架构

1.HDFS设计思想

随着互联网产生的数据量越来越大,单个操作系统不能满足海量数据的存储要求,因此需要更多的操作系统磁盘来分配存储数据,但由此带来的问题是不方便管理和维护。分布式文件系统的产生就是为了解决多台机器上的数据文件的系统。HDFS就是分布式文件系统的一种。 对于文件来说,HDFS也有一些独有的设计方式。它会将需要存储的文件切分成多个块,分散存储到多台机器上,同时针对每个文件块,还会在不同的机器上进行备份。这样做带来的好处就是没有超大文件,对机器性能要求不高,保证了低成本(可部署在廉价机器上)和高容错(副本机制)。

2.HDFS组成架构

架构主要由四个部分组成,分别是HDFS Client、NameNode、DateNode和Secondary NameNode。结合Hadoop安装环境启动的进程,HDFS启动的时候有NameNode、DateNode和Secondary NameNode进程。

Client:客户端

  • 文件切分(文件上传 HDFS 的时候,Client会将文件切分成多个Block进行存储)。
  • 与 NameNode 交互,获取文件的位置信息。
  • 与 DataNode 交互,读取或者写入数据。
  • 提供命令来管理 HDFS,如启动或关闭HDFS。
  • 通过命令访问HDFS。

NameNode:元数据节点(Master)

  • 管理 HDFS 的名称空间(文件目录树)。
  • 管理数据块(Block)映射信息。
  • 配置副本策略。
  • 处理客户端读写请求。

DateNode:数据存储节点(Slave)

  • 存储实际的数据块。
  • 执行数据块的读/写操作。

Secondary NameNode:从元数据节点(非NameNode热备)

  • 合并NameNode的edits到fsimage文件中。
  • 辅助NN将内存中元数据信息持久化。

3.HDFS副本机制

文件块

HDFS上的文件在物理上分块存储(block),块的大小可以通过配置参数(dfs.blocksize)来规定,Hadoop2.x版本中的默认大小是128M。传输一个由多个块组成的文件的时间取决于磁盘传输速率。举例来讲,如果寻址时间是10ms,传输速率是100M/s,假设寻址时间需要控制在传输时间的1%,那么blocksize = 10ms * 100 * 100M/s = 100M。

副本机制

副本数默认为3,默认情况下,存放机制为一个在本地机架节点,一个在同一机架不同节点,一个在不同机架的节点。

4.HDFS优缺点

优点

  • 高容错性
    文件上传时会自动保存多个副本,当某个节点坏掉或者副本丢失时,可以调取其他节点的备份继续执行任务。
  • 海量数据处理
    PB级数据规模,百万级文件规模。
  • 流式数据访问
    一次写入,多次读取。文件一旦写入,不能修改只能增加。保证了数据的一致性。
  • 搭建成本较低
    可构建在廉价机器上,通过副本机制提高可靠性。

缺点

  • 不适合低延时访问
    I/O操作频繁
  • 不适合大量小文件存储
    占用NameNode大量内存(一个block默认128M)
    寻址时间超过读取时间(多NN分布在多个DataNode上)
  • 不适合并发写入
    没有锁机制,一个文件只能有一个线程写,不允许多个线程同时写
    没有事务性,仅支持数据追加(append),不支持文件的随机修改

二、HDFS常用命令

基本语法

hdfs dfs 具体命令

常用命令

-help:查看命令的使用方式
	hdfs dfs -help rm
-ls: 显示目录信息
	hdfs dfs -ls /
-mkdir:在hdfs上创建目录
	hdfs dfs -mkdir /bigdata
	hdfs dfs -mkdir -p /kgc/test
-moveFromLocal:从本地剪切粘贴到HDFS文件系统
	hdfs dfs -moveFromLocal  ./hello.txt  /kgc/test
-appendToFile:追加一个文件到已经存在的文件末尾
	hdfs dfs -appendToFile test1.txt /kgc/test/hello.txt
-cat:显示文件内容
	hdfs dfs -cat /kgc/test/hello.txt
-tail:显示一个文件的末尾
	hdfs dfs -tail /kgc/test/hello.txt
-chgrp/-chmod/-chown:linux文件系统中的用法一样,修改文件所属权限
	hdfs dfs -chmod  666  /kgc/test/hello.txt
	hdfs dfs -chown  kgc:kgc   /kgc/test/hello.txt
-copyFromLocal:从本地文件系统中拷贝文件到hdfs路径去
	hdfs dfs -copyFromLocal README.txt /
-copyToLocal:从hdfs拷贝到本地
	hdfs dfs -copyToLocal /kgc/test/hello.txt ./
-cp:从hdfs的一个路径拷贝到hdfs的另一个路径
	hdfs dfs -cp /kgc/test/hello.txt /hello1.txt
-mv:在hdfs目录中移动文件
	hdfs dfs -mv /hello1.txt /kgc/test/
-get:等同于copyToLocal,就是从hdfs下载文件到本地
	hdfs dfs -get /kgc/test/hello.txt ./
-getmerge:合并下载多个文件,比如hdfs的目录 /aaa/下有多个文件:log.1, log.2,log.3,...
	hdfs dfs -getmerge /user/kgc/test/* ./merge.txt
-put:等同于copyFromLocal
	hdfs dfs -put ./merge.txt /user/kgc/test/
-rm:删除文件或文件夹
	hdfs dfs -rm /user/kgc/test/merge.txt
-rmdir:删除空目录
	hdfs dfs -rmdir /test
-du:统计文件夹的大小信息
	hdfs dfs -du -s -h /user/kgc/test
	hdfs dfs -du -h /user/kgc/test
-setrep:设置hdfs中文件的副本数量
	hdfs dfs -setrep 10 /kgc/test/hello.txt

三、HDFS Java API

四、HDFS读写流程

写数据流程

在这里插入图片描述

1.client请求
   client通过DistributeFileSystem向NameNode请求(源文件已存在)
2.NameNode确认
   目录不存在或用户无操作权限 return false
   否则 return true
3.client切分文件并请求第一个block的DateNode列表
   client将文件切成n个128M的Block
   client向NameNode请求第1个block的存储DateNode列表
4.NameNode返回DateNode列表
   假如返回:dn1 dn2 dn3
5.client写入
   a.FSDataOutputStream向dn1请求写入
   b.dn1请求dn2,dn2请求dn3,分别建立pipeline管道
   c.dn3响应dn2,dn2响应dn1,dn1响应client
   d.Block传输
      d.1:client读取(磁盘->缓存)第一个block并以Packet(64kb)为单位传输,dn1每收到一个Packet会逐级传输给dn2,dn3,并放入等待应答队列
      d.2:dn3,dn2,dn1逐级应答,并将结果反馈给client
      d.3:重复d.1~d.2直至block传输完成
   e.关闭FSDataOutputStream
6.client发送complete给NameNode
7.重复3~6直至所有block传输完成

读数据流程

在这里插入图片描述

1.client创建DistributeFileSystem的实例对象
   DistributeFileSystem dfs = FileSystem.open()
2.DistributeFileSystem向NameNode发起RPC请求获取文件开始部分或全部block列表
   DataNode按照Hadoop定义的集群拓扑结构得与client的距离升序排序
   每个block包含所在的DataNode地址,如果client就是DataNode,则本地读取
3.DistributeFileSystem向client返回支持文件定位的输入流对象FSDataInputStream
   FSDataInputStream中包含一个DFSInputStream对象,用来管理DataNode和NameNode之间的I/O
4.client调用DFSInputStream的read()方法找到离client最近的DataNode,并连接DataNode
5.DFSInputStream依次读取一个批次的block
   a.读取包含文件第一个block的最近DataNode地址
   b.重复调用read()方法直至第一个block全部读完
   c.关闭第一个block的DataNode连接
   d.重复a~c直至第一个批次的block全部读取完成
6.重复2~5直至所有批次的block读取完成
7.关闭DFSInputStream,FSDataInputStream,DistributeFileSystem

五、NameNode和Secondary NameNode工作机制

在这里插入图片描述

第一阶段:NameNode 启动
(1)第一次启动 NameNode 格式化后,创建 fsimage 和 edits 文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。
(2)客户端对元数据进行增删改的请求。
(3)NameNode 记录操作日志,更新滚动日志。
(4)NameNode 在内存中对数据进行增删改查。
第二阶段:Secondary NameNode 工作
(1)Secondary NameNode 询问 NameNode 是否需要 checkpoint。直接带回 NameNode 是否检查结果。
(2)Secondary NameNode 请求执行 checkpoint。
(3)NameNode 滚动正在写的 edits 日志。
(4)将滚动前的编辑日志和镜像文件拷贝到 Secondary NameNode。
(5)Secondary NameNode 加载编辑日志和镜像文件到内存,并合并。
(6)生成新的镜像文件 fsimage.chkpoint。
(7)拷贝 fsimage.chkpoint 到 NameNode。
(8)NameNode 将 fsimage.chkpoint 重新命名成 fsimage。

六、DateNode工作机制

在这里插入图片描述

一个数据块在 DataNode 上以文件形式存储在对应服务器的磁盘上。
包括两个文件,一个是数据本身,一个是元数据包括数据块的长度、块数据的校验和,以及时间戳。
DataNode 启动后向 NameNode 注册通过后,周期性(1 小时)向 NameNode上报所有的块信息。
心跳是每 3 秒一次,心跳返回结果带有 NameNode 给该 DataNode 的命令,如复制块数据到另一台机器,或删除某个数据块。
如果超过 10 分钟没有收到某个DataNode 的心跳,则认为该节点不可用。
集群运行中可以安全加入和退出一些机器。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值