专栏首页算法channelHDFS|基本概念和读写原理

HDFS|基本概念和读写原理

01

HDFS设计目的

A distributed file system that provides high-throughput access to application data.

HDFS(Hadoop Distributed File System )是Hadoop分布式文件系统,设计目的是为了存储超大文件,主要是针对几百MB,GB,甚至TB的文件,流式读取方式,主要是针对一次写入,写入的过程使用的是append的方式,多次读出的使用模式。

该分布式系统构建在普通PC机组成的集群上,大大降低了构建成本,并屏蔽了系统故障,保存多个副本,且提供容错机制,副本丢失或宕机自动恢复(默认存3份),使得用户可以专注于自身的操作运算。

02

HDFS相关的基本概念

block

这是HDFS的基本思想了,把大的文件分成块,每块64M。

备份(replicas)

  • 热备份:b是a的热备份,如果a坏掉。那么b马上运行代替a的工作。
  • 冷备份:b是a的冷备份,如果a坏掉。那么b不能马上代替a工作。但是b上存储a的一些信息,减少a坏掉之后的损失。

机架 (rack)

由几个DataNode组成的部件称为机架

MetaData

描述我们要存储数据的数据结构

HDFS namespace

这个命名空间指的是文件的目录结构,与我们单个电脑的文件的结构树相似。

EditLog

记录文件系统的metadata变化的事务日志,是HDFS的核心数据结构。 例如,写入一个文件或修改复制因子都会向EditLog中写入一条record。

FsImage

整个文件系统的命名空间,包括block到文件的映射,文件系统的属性(大小,被分为几个block,只读,权限等信息),都被存储在一个文件中,这个文件就是FsImage。

HDFS namespace,EditLog,FsImage都存储在NameNode上。

HeartBeat

NameNode和DataNode通过HeartBeat进行通信,每隔一定时间,DataNode就会向NameNode发送心跳信号,以此报告给NameNode,说我还活着,这样NameNode 在接到读写任务时,会发命令给它。

02

HDFS如何分解文件

HDFS默认会将文件分割成 block,64M为1个block,然后将block按键值对存储在HDFS上,并将键值对的映射存到内存中。每个文件默认会保存3份。

如下图所示为HDFS的基本架构,按照Master和Slave的结构,主要的组件包括:NameNode、SecondaryNameNode、DataNode。

NameNode:是Master节点,

  • 处理客户端的读、写请求;
  • 管理数据块映射;
  • 管理HDFS的名称空间;
  • 配置副本策略;

SecondaryNameNode:合并fsimage和fsedits,然后再发给namenode,尽量不要与NameNode部署在同一个host上,这样避免内存的过多消耗;NameNode的冷备份;

DataNode:Slave节点,干活的。负责存储client发来的数据块block,执行数据块的读写操作。

client分类

  1. DataNode节点可以为client
  2. 非DataNode节点可以为client,比如外部的host写入file1文件时,

如果client为DataNode,某个block的3份备份,如何选取DataNode进行存储呢?一般地,它会在自己所在的host上备份一个,然后在另外一台机架的不同DataNode上分别备份一个。

如果client不是DataNode所在的host,也就是我们比如在存入有道笔记一个pdf文件时,很明显我们不是在有道的集群上的DataNode的host上,而是在自己的主机上,此时,我们写入文件时,有道的HDFS会将此文件分解为块,然后根据某个算法,找到某个DataNode,然后在另外不同的机架上,选择两个DataNode,这是默认的行为。

03

向集群中写入一个文件FileA

FileA假定大小为100M。

  1. Client将FileA按64M分块。分成两块,block1和Block2;
  2. Client向NameNode发送写数据请求,如图蓝色虚线①。
  3. NameNode节点,记录block信息,经过一定的算法计算后返回可用的DataNode,如粉色虚线②,计算得出,block1和block2分别被存储在如下的host中:

block1: host2,host1,host3

block2: host7,host8,host4

d. client向DataNode发送block1;发送过程是以流式写入,直到将block1发送完毕,host2,host1,host3向NameNode,host2向Client发送通知,说“消息发送完了”。

分析写过程:

  • 写1T文件,我们需要3T的存储,3T的网络流量带宽。
  • 挂掉一个节点,没关系,还有其他节点可以备份;甚至,挂掉某一个rack,也没关系;其他rack上,也有备份。

04

从集群中读文件FileA

上面是写入FileA的过程,HDFS默认用户会多次读取这个文件FileA,那么如何读取呢?

a. client向NameNode发送读请求。

b. NameNode查看Metadata信息,返回fileAblock的位置给client。

block1:host2,host1,host3

block2:host7,host8,host4

c. block的位置是有先后顺序的,先读block1,再读block2,而且block1去host2上读取;然后block2,去host7上读取;

上面例子中,client位于机架外。

那么如果client位于机架内某个DataNode上,例如 client是host6。那么读取的时候,遵循的规律是:优选读取本机架上的数据。

05

HDFS的缺陷

hadoop的HDFS不是完美的,也有缺陷,比如只有一个NameNode节点,这样一旦宕机,整个系统就无法工作。比如hadoop如果接来的小文件太多,那内存的负担会很重。对于这小文件存储,hadoop后续给出了解决方案,之后可以总结这个问题。


参考文献:

http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html

https://www.cnblogs.com/laov/p/3434917.html

http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_design.html#%E5%BC%95%E8%A8%80

本文分享自微信公众号 - 算法channel(alg-channel),作者:alg-flody

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-01-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 4 个Python数据读取的常见错误

    read_csv()是python数据分析包pandas里面使用频次较高的函数之一。它包括的参数差不多20个,可能一开始未必需要完整知道每个参数作用。不过,随着...

    double
  • 1800字普林斯顿大学课程浓缩笔记:程序员必知的算法之查找和排序算法

    老生常谈,偶尔遇到阐述这两类问题相关的极好素材,它们结合示意图,言简意赅,清晰明了。故分享出来。

    double
  • Python解惑之对象可变与不可变

    面向对象的语言,普遍存在的一个问题就是对象的可变(mutable),与对象的不可变(immuatable)。它是重要的,理解这个概念对于我们认识面向对象,避免掉...

    double
  • 独家 | 带你认识HDFS和如何创建3个节点HDFS集群(附代码&案例)

    在本文中,大数据专家将为您介绍如何使用HDFS以及如何利用HDFS创建HDFS集群节点。

    数据派THU
  • Python|python文件打包实战之进阶篇

    在上周的文章中,小编给大家讲了python gui编程,做了一个有趣的“消息轰炸机”,如果想发给朋友用怎么办呢?所以今天,小编就通过实战来让大家学会用pyins...

    算法与编程之美
  • 学习 | 爬虫告诉你, 互联网大数据行业有多赚钱

    随着互联网大数据行业的日渐兴盛,越来越多的人投身其中,也有很多的朋友对此有着浓厚的兴趣,想要投身其中。本期我们带大家走进互联网大数据行业,了解数据挖掘&机器学习...

    灯塔大数据
  • 安全测试工具(连载10)

    apktool是一个为逆向工程师打造的用于反编译Android二进制APP的工具。它可以将资源解码为几乎原始的形式,并在修改之后重建它们。本书介绍的apktoo...

    小老鼠
  • Linux 文件类型+目录结构+常用命令(二)

    1、/- 根 每一个文件和目录从根目录开始。 只有root用户具有该目录下的写权限。请注意,/root是root用户的主目录,这与/.不一样

    wuweixiang
  • Python一条龙:创建、读取、更新、搜索Excel文件

    CSV文件是由逗号分隔的值文件,其中纯文本数据以表格格式显示。它们可以与任何电子表格程序一起使用,如Microsoft Office Excel、Google ...

    量化投资与机器学习微信公众号
  • python根据已有文件名的文件复制文件到新文件夹中

    最近需要对一些图片进行整理,需要从一堆图片中将已经存在在文件中的图片移动到另外一个新的文件夹中,所以就特意就写了一个小玩意方便使用.下面是代码实现:

    小海怪的互联网

扫码关注云+社区

领取腾讯云代金券