Hadoop之HDFS简介

女主宣言

HDFS作为运行在通用硬件上的分布式文件系统,和现有的分布式文件系统既有很多的共同点,也存在很多的差异。本文从HDFS是什么开始介绍,包括了HDFS架构、HDFS的读写、各个组件的作用、具体操作以及优缺点。给出了HDFS在分布式存储上的具体方案,可以使读者快速、清晰的理解HDFS系统。

PS:丰富的一线技术、多元化的表现形式,尽在“ 3 60云计算 ”,点关注哦!

1

主要内容

  1. HDFS是什么?是干什么用的?

  2. HDFS的架构是怎么样的?

  3. HDFS的怎样进行读写?副本怎样放置?

  4. HDFS各个组件的作用?

  5. HDFS的文件操作命令有哪些?

  6. HDFS的优缺点是什么?

2

引言

有这样一个需求:

由于公司某业务mysql服务器过保,为防止数据丢失,需要备份mysql数据库,这些库目前已经只读,每个库约1.5T,大概有130个库,共需要200T左右的空间,并且希望数据不易丢失,恢复数据速度快。

部分解决方案:

1)单机存储

有如下问题:

  1. 磁盘损坏或机器down机则无法下载;

  2. 单块磁盘的读写io会很高;

  3. 单块磁盘不能完整存储3个完整的库(存储大文件),只能存储2个,空间部分浪费;

  4. 平时如果不用做数据恢复,机器cpu、内存等利用率低。

2)分布式存储

可选用分布式存储,如HDFS、CEPH、S3等等。

3

HDFS是什么?是干什么用的?

HDFS(Hadoop Distributed File System)被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统。它和现有的分布式文件系统有很多共同点。但同时,它和其他的分布式文件系统的区别也是很明显的。HDFS是一个高度容错性的系统,适合部署在廉价的机器上。HDFS能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。HDFS放宽了一部分POSIX约束,来实现流式读取文件系统数据的目的。HDFS在最开始是作为Apache Nutch搜索引擎项目的基础架构而开发的。HDFS是Apache Hadoop Core项目的一部分。

首先来看看Hadoop架构,HDFS为Hadoop其他组件提供存储支持。

直观对比Linux文件系统和HDFS文件系统(执行ls命令)。

Linux:


  

#ls -l

-rw-r--r-- 1 root root 20 Jul 29 14:31 ms-server-download-zzzc_88888.idx

-rw-r--r-- 1 root root 8 Jul 29 14:31 ms-server-download-zzzc_88888.dat

HDFS:


 

#hadoop fs -ls /tmp/

-rw-r--r-- 2 xitong supergroup 181335139 2019-07-17 23:00 /tmp/java.tar.gz

-rw-r--r-- 2 xitong supergroup 181335139 2019-07-17 23:00 /tmp/jdk.tar.gz

可以看出HDFS和Linux文件系统很类似,都是有权限、文件所属用户、用户所在的组、文件名称等,但是也有不同: HDFS中的第2列表示副本数。

4

HDFS的架构是怎么样的?

HDFS架构如下:

  1. Client:客户端。

  2. NameNode:master,它是一个主管、管理者,存储元数据,存储元数据格式会在后面介绍。

  3. DataNode:slave,NameNode 下达命令,DataNode 执行操作并存储实际数据。

  4. SecondaryNameNode:和NameNode不是主备关系。当NameNode挂掉的时候,它并不能马上替换NameNode提供服务。主要作用会在后面介绍。

5

HDFS怎样进行读写

写文件

  1. 客户端调用create方法,创建一个新的文件;NameNode会做各种校验,比如文件是否已经存在,客户端是否有权限等。

  2. 如果校验通过,客户端开始写数据到DN(DataNode),文件会按照block大小进行切块,默认128M(可配置),DataNode构成pipeline管道,client端向输出流对象中写数据,传输的时候是以比block更小的packet为单位进行传输,packet又可拆分为多个chunk,每个chunk都携带校验信息。

  3. 每个DataNode写完一个块后,才会返回确认信息,并不是每个packet写成功就返回一次确认。

  4. 写完数据,关闭文件。

读文件

  1. 客户端调用open方法,打开一个文件。

  2. 获取block的location,即block所在的DN,NN(NameNode)会根据拓扑结构返回距离客户端最近的DN。

  3. 客户端直接访问DN读取block数据并计算校验和,整个数据流不经过NN。

  4. 读取完一个block会读取下一个block。

  5. 所有block读取完成,关闭文件。

副本放置

以经典的3副本为例(黄色方框表示客户端,绿色表示要写的block),Hadoop早期版本采用左边的放置策略,后期版本采用右边的放置策略放置副本。

图左:

  • 副本1:同机架的不同节点。

  • 副本2:同机架的另一个节点。

  • 副本3:不同机架的另一个节点。

  • 如果还有其他副本:随机。

图右:

  • 副本1:同Client的节点。

  • 副本2:不同机架的节点。

  • 副本3:同第2副本相同机架的不同节点。

  • 如果还有其他副本:随机。

两种策略的故障域都为机架,新版相对于旧版本,当本客户端再次读取新写的数据时,直接从本地读取,这样延迟最小,读取速度最快。

6

HDFS各个组件的作用?

先大致看下启动流程:

  1. 启动NameNode,读取FsImage元数据镜像文件,加载到内存中;读取EditLog日志文件,加载到内存中,使当前内存中元数据信息与上次关闭系统时保持一致。

  2. 启动DataNode,向NameNode注册,并向NameNode发送BlockReport。

  3. 退出安全模式后,Client可以对HDFS进行目录创建、文件上传等操作,改动的目录结构会记录在EditLog中,NameNode的内存中的目录结构也会改变。

NameNode

  1. 管理 HDFS 的命名空间。

  2. 管理数据块(Block)映射信息。

  3. 配置副本策略。

  4. 处理客户端读写请求。

Fsimage是一个二进制文件,格式如下:

FsImage文件第1行为image head,里面包含image的版本、文件和目录的个数等;第2行为一个目录格式(如果是目录,就是这种格式),包含了目录的路径、副本数、权限等,目录的blocksize都为0;第3行为一个文件格式(如果是文件,则在FsImage存储的格式),文件和目录格式包含的字段差不多,多了block信息;通过加载此文件和EditLog日志文件来构建整个文件系统的目录结构。

通过观察FsImage文件,里面并没有block和DN的对应关系,它是如何查到块所对应的DN的呢?

block和DN的对应关系并没有实际持久化,而是通过DN向NN(NameNode)汇报,此过程为BlockReport。通过blockReport构建BlocksMap的结构如下:

在blockInfo中保存了block所在的DN信息。

SecondaryNameNode

和NameNode并非主备关系,而是辅助NN进行合并FsImage和EditLog并起到备份作用。

7

HDFS文件操作命令有哪些?

和Linux操作文件类似,只列出常见几个,和Linux命令的功能也是类似的,如:cp即拷贝,rm即删除等等。

#hadoop fs [cat|chgrp|chmod|chown|count|cp|df|get|ls|put|mv|rm|mkdir|tail]

在HDFS中,提供了fsck命令,用于检查HDFS上文件和目录的健康状态、获取文件的block块信息和位置信息等。

#hdfs fsck [move|delete|files|blocks|locations|racks|blockId]

8

HDFS的优缺点是什么?

最后根据以上内容总结HDFS优缺点如下:

优点:

  1. 支持海量数据的存储。

  2. 检测和快速应对硬件故障。

  3. 流式数据访问。

  4. 简化的一致性模型。

  5. 高容错性。

  6. 商用硬件。

缺点:

  1. 不能做到低延迟数据访问。

  2. 不适合大量的小文件存储。

  3. 不支持修改文件(HDFS2.x开始支持给文件追加内容)。

  4. 不支持用户的并行写。

hadoop2.x新特性 引入了NameNode Federation,解决了横向内存扩展;引入了Namenode HA,解决了namenode单点故障。

相关文章

http://hadoop.apache.org/docs/r1.2.1/hdfs_design.html

https://www.jianshu.com/p/85b71d550c43

https://www.jianshu.com/p/f1e785fffd4d

https://blog.csdn.net/weixin_38750084/article/details/82963235

https://blog.csdn.net/macyang/article/details/7958862

360云计算

由360云平台团队打造的技术分享公众号,内容涉及 数据库、大数据、微服务、容器、AIOps、IoT 等众多技术领域,通过夯实的技术积累和丰富的一线实战经验,为你带来最有料的技术分享

我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章