HDFS读写和冷备份原理

HDFS写文件流程

当用户通过命令行或者JavaAPI向Hadoop集群发起写入文件操作时,将触发写文件流程,分为3个阶段:创建文件,建立数据流管道和写数据。

hdfs_write.png

1. 创建文件

  1. HDFS client调用DistributedFileSystem.create()

  2. 上述调用向namenode发起RPC create调用,请求指定路径创建一个新文件,并将操作记录存入edits.log,该调用返回一个FSDataOutputStream对象,该对象是DFSOutputStream的wrapper

2. 建立数据流管道

  1. HDFS client调用FSDataOutputStream.write()写block1

  2. 上述write()方法向namenode发起RPC addBlock调用,请求添加一个新的数据块,namenode会返回LocatedBlock对象

  3. LocatedBlock对象所含有的信息将告诉client数据会写到哪几个datanode上

  4. HDFS client根据返回的datanode信息,建立数据流管道pipeline

3. 写数据

  1. FSDataOutputStream对象开始写入数据,数据以512字节的chunk+4字节的checksum形式写入

  2. 每64KB形成一个packet,packet格式为header+checksums+DATA

  3. packet放入data queue队列等待被发送

  4. HDFS client将packet发送给datanode1,datanode1将packet发送到datanode2,datanode2将其发送到datanode3,以此类推

  5. HDFS client同时将packet写入ack queue队列

  6. 最后一个datanode(即这里的datanode3)对收到的packet进行校验,然后向上一个datanode(即datanode2)发送ack,datanode2同样进行校验,然后发送ack到datanode1,datanode1做完校验发送ack给HDFS client

  7. HDFS client判断收到的校验,如果成功,则删除ack queue队列中的packet,表示数据传递成功;如果失败,则将packet放回data queue进行重传

  8. 重复上述过程直到整个block发送完毕,此时所有datanode都收到了block1的完整副本,它们会向namenode的远程过程调用blockReceivedAndDeleted(),通知namenode该block已经发送成功,namenode更新内存中block与datanode的对应关系

  9. 关闭构建的pipeline,继续传输下一个block2时,从RPC addBlock重新开始,直到全部数据写完

  10. 调用DFSOutputStream的close()方法

  11. 客户端远程过程调用namenode的RPC complete(),告知namenode传输完成

4. 容错原理

数据传输过程中,如果datanode2突然挂掉了,HDFS会启动如下步骤进行容错。

  1. 将ack queue队列中所有的packet放回data queue队列

  2. HDFS client向namenode发起RPC调用updateBlockForPipeline(),为当前block生成新版本ts1(本质是时间戳)

  3. 故障datanode2从pipeline中删除

  4. DFSDataOutputStream发起RPC调用namenode的getAdditionalDatanode()方法,让namenode重新分配datanode,比如是datanode4

  5. DFSDataOutputStream将dn1,dn2和dn4组成新管道,更新上面的block版本为ts1

  6. HDFS client通知dn1和dn3将其上已完成传输的block数据拷贝到dn4,上,至此三者所获取的数据保持一致

  7. 新的数据管道建立后,DFSDataOutputStream调用upadatePipeline() RPC调用更新namenode元数据

  8. HDFS client按正常写入流程完成文件上传

  9. 故障dn2重启后,namenode发现它上面的block时间戳是老的,就会通知dn2将其删除

HDFS读文件流程

hdfs_read.png
  1. HDFS client向namenode通过远程过程调用请求下载文件

  2. namenode返回目标文件元数据

  3. HDFS client根据“先就近,后随机”的原则选择datanode,请求读取数据

  4. datanode开始以packet为单位传输数据给客户端

  5. 客户端以packet为单位接收,先本地缓存然后写入目标文件

  6. 客户端再向其他datanode请求下一个block,重复上述过程

元数据冷备份机制

hdfs_snn.png

namenode负责HDFS集群的元数据管理,要保证快速检索,namenode必须将数据放到内存中,但一旦断电或者故障,元数据会全部丢失,因此还必须在磁盘上做持久化。HDFS集群做元数据持久化的方式是edits.log+FSImage。edits.log存储近期的操作,FSImage存储以前的操作,这样是为了尽可能地保障namenode的启动速度。

  1. 每隔一分钟secondarynamenode会向namenode发起1次检查点请求

  2. 当发现edits.log中记录超过100w条或者时间达到一个小时,就会启动检查点机制

  3. snn向nn请求滚动生成新的edits_inprogress_XX.log,新的对HDFS的操作可以写入这个新文件中

  4. snn通过HTTP GET请求读取nn中的FSImage和原来的edits.log

  5. snn读取FSImage到内存,然后执行edits.log中的操作,创建一个新的FSImage.ckpt

  6. snn通过HTTP PUT将新的FSImage.ckpt发送到nn

  7. nn用新的FSImage替换旧的,更新记录检查点时间

  8. 此时nn拥有新的FSImage和更小的edits.log

  9. snn一般单独部署一台机器,因为它要占用大量CPU、内存和磁盘空间来执行合并操作

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

推荐阅读更多精彩内容