HDFS

1. 基本概念

1.1 hdfs是什么?

分布式的文件系统,由多个服务器联合起来实现功能。用来解决海量数据的存储问题。

1.2 hdfs概念和特性

hdfs有一个统一的命名空间——目录树

(1) hdfs文件系统会给客户端提供一个统一的抽象目录树,客户端访问hdfs文件时就是通过指定这个抽象目录中的路径来访问

(2) Hdfs中的文件都是分块(block)存储的,块的大小可以通过配置参数(dfs.blocksize)来规定,默认大小在hadoop2.x版本中是128M,老版本中是64M

(3) 文件的各个block由谁来进行真实的存储呢?----分布在各个datanode服务节点上,而且每一个block都可以存储多个副本(副本数量也可以通过参数设置dfs.replication)

(4) Hdfs中有一个重要的角色:namenode,负责维护整个hdfs文件系统的目录树,以及每一个路径(文件)所对应的block块信息(block的id,及所在的datanode服务器)

1.3 hdfs使用场景

hdfs是设计成适应一次写入,多次读出的场景,并不支持文件的修改(适合用来做数据分析)

hadoop不适合处理小文件,存储小文件的效率非常低,而且大量的小文件会造成namenode中的元数据过多,负载过高。

注:hdfs并不适合用来做网盘应用,因为,不便修改,延迟大,网络开销大,成本太高

2. Hadoop 各个节点的工作职责(Hadoop 2.6 HA 模式)

  1. NameNode:(1)负责客户端请求的响应、(2)元数据的管理(查询,修改)、(3) 维护hdfs系统的目录树结构,记录每一个文件对应的block信息(block id, 服务器地址, 文件分成几块)

  2. ResourceManager:负责整个集群的资源管理

  1. ZKFC:负责切换主备的 namenode。

  2. NodeManager:节点管理器是每个节点的代理框架。负责启动容器,监控容器的资源使用(cpu,内存,io),并把这些信息发送给调度器。

  1. DataNode:存储管理用户的文件块数据

  2. JournalNode:负责 active 和 standby namenode的元数据同步。

3. HDFS 合并元数据的过程

FSImage文件和EditsLog文件可以通过ID来互相关联。在参数dfs.namenode.name.dir设置的路径下,会保存FSImage文件和EditsLog文件,如果是QJM方式HA的话,EditsLog文件保存在参数dfs.journalnode.edits.dir设置的路径下。

image

在上图中可以看到,edit log文件以edits_开头,后面跟一个txid范围段,并且多个edit log之间首尾相连,正在使用的edit log名字为edits_inprogress_txid。该路径下还会保存两个fsimage文件,文件格式为fsimage_txid。上图中可以看出fsimage文件已经加载到了最新的一个edit log文件,仅仅只有inprogress状态的edit log未被加载。在启动HDFS时,只需要读入fsimage_0000000000000008927以及edits_inprogress_0000000000000008928就可以还原出当前hdfs的最新状况。

3.1 什么时候合并元数据

什么时候进行 checkpoint 由两个参数 dfs.namenode.checkpoint.preiod (默认值是3600,即 1 小时)和 dfs.namenode.checkpoint.txns (默认值是 1000000 )来决定。period 参数表示,经过 1 小时就进行一次 checkpoint,txns 参数表示,hdfs 经过 100 万次操作后就要进行 checkpoint 了。这两个参数任意一个得到满足,都会触发 checkpoint 过程。进行 checkpoint 的节点每隔 dfs.namenode.checkpoint.check.period (默认值是 60 )秒就会去统计一次 hdfs 的操作次数。

3.2 HA 模式下合并元数据的过程

在HA模式下checkpoint过程由StandBy NameNode来进行,以下简称为SBNN,Active NameNode简称为ANN。

主要由4个步骤:

  1. SBNN 检查是否达到 checkpoint 条件:离上一次 checkpoint 操作是否已经有一个小时,或者 HDFS 已经进行了100万次操作。

  2. SBNN 检查达到 checkpoint 条件后,将该 namespace 以 fsimage.ckpt_txid 格式保存到 SBNN 的磁盘上,并且随之生成一个 MD5 文件。然后将该 fsimage.ckpt_txid 文件重命名为fsimage_txid。

  3. 然后 SBNN 通过 HTTP 联系 ANN。

  4. ANN 通过 HTTP 从 SBNN 获取最新的 fsimage_txid 文件并保存为 fsimage.ckpt_txid,然后也生成一个 MD5,将这个 MD5 与 SBNN 的 MD5 文件进行比较,确认 ANN 已经正确获取到了 SBNN 最新的 fsimage 文件。然后将 fsimage.ckpt_txid 文件重命名为 fsimage_txit。

通过上面一系列的操作,SBNN 上最新的 FSImage 文件就成功同步到了 ANN 上。

4. HDFS 读写数据的流程

4.1 读数据流程

  1. client跟namenode通信查询元数据,找到文件块所在的datanode服务器

  2. 分别连接目标datanode,并发读取文件块,并在合并读取到的文件

4.2 写数据流程

1.根namenode通信请求上传文件,namenode检查目标文件是否已存在(文件已存在则报错不能上传),父目录是否存在(目录不存在报错无法上传),以及客户端是否有新建文件的权限。

2.namenode返回是否可以上传,如果可以上传,namenode会返回这个文件是否被分块以及分块的具体信息。

3.client请求第一个 block该传输到哪些datanode服务器上

4.namenode返回3个datanode服务器ABC

5.client请求3台dn中的一台A上传数据(本质上是一个RPC调用,建立pipeline,连接离自己最近的datanode),当第一个datanode写完后,这个datanode会将剩余的两个副本进行水平备份

6.内部会维护一个确认队列"ack queue",收到所有datanode确认信息后,才确认数据块写入完毕了。

7.当一个block传输完成之后,client再次请求namenode上传第二个block的服务器,以此类推。

  1. 如果传输过程中,有某个 datanode 出现了故障,那么当前的 pipeline 会被关闭,出现故障的 datanode 会从当前的 pipeline 中移除,剩余的 block 会继续剩下的 datanode 中继续以 pipeline 的形式传输,同时 Namenode 会分配一个新的 datanode,保持 replicas 设定的数量。

5. NameNode 如何实现高可用

在主备切换上Zookeeper可以干的事:

  1. 失败探测 在每个NameNode启动时,会在Zookeeper上注册一个持久化的节点,当这个NameNode宕机时,它的会话就会终止,Zookeeper发现之后,就会通知备用的NameNode,Hi,老兄,你该上岗了。

  2. 选举机制, Zookeeper提供了一个简单的独占锁,获取Master的功能,如果那个NameNode发现自己得到这个锁,那就预示着,这个NameNode将被激活为Active状态

    当然,实际工作中Hadoop提供了ZKFailoverController角色,在每个NameNode的节点上,简称zkfc,它的主要职责如下:

  3. 健康监测,zkfc会周期性的向它监控的NameNode发送健康探测命令,从而来确定某个NameNode是否处于健康状态,如果机器宕机,心跳失败,那么zkfc就会标记它处于一个不健康的状态

  4. 会话管理,如果NameNode是健康的,zkfc就会在zookeeper中保持一个打开的会话,如果NameNode同时还是Active状态的,那么zkfc还会在Zookeeper中占有一个类型为短暂类型的znode,当这个NameNode挂掉时,
    这个znode将会被删除,然后备用的NameNode,将会得到这把锁,升级为主NameNode,同时标记状态为Active,当宕机的NameNode,重新启动时,它会再次注册zookeper,发现已经有znode锁了,便会自动变为Standby状态,如此往复循环,保证高可靠,需要注意,目前仅仅支持最多配置2个NameNode。

  5. master选举,如上所述,通过在zookeeper中维持一个短暂类型的znode,来实现抢占式的锁机制,从而判断那个NameNode为Active状态。

6. HDFS 的副本如何存放

第一个block副本放在和client所在的node里(如果client不在集群范围内,则这第一个node是随机选取的)

第二个副本放置在与第一个节点不同的机架中的node中(随机选择)。

第三个副本放置在与第一个副本所在节点同一机架的另一个节点上。

如果还更多的副本就随机放在集群的node里。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容