大数据启蒙-学习Hadoop-HDFS(六)

691 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第22天,点击查看活动详情

前言

终究还是难逃一劫,这几天中招休息了,趁着今天好一些,赶紧结束这一部分,拖得有点长了,抱歉。

HDFS读流程

HDFS读流程.png

读流程看似非常简单,比如说客户端想把已上传的文件下载到本地,这是不是属于读流程。客户端第一步,无论读写都要和NameNode联系,取回块信息,因为只有它才存有元数据,知道每一个块存放的具体位置。取回信息之后,客户端会从块信息中距离自己最近的副本逐一下载。

那么既然客户端可以从HDFS下载整个文件,那么也可以有选择的下载其中的部分块。这一点的意义在于可以暴露块的位置信息,块的偏移量,支持客户端读取块的任意位置,这样就可以方便快捷的并行计算,且不需要重复读取数据。

回忆一开始的时候我们说到的案例,1T的数据切成2000个文件,然后每个文件中并行计算。我们现在就分三个块,分布在三台机器中,将计算程序放到这三台机器中,计算程序是为了并行计算1T文件,所以每个程序要计算一个块的内容。计算程序只知道这个文件,并没有块这个概念,他们都希望只计算自己需要计算的文件。当他们都打开文件的时候,他们都读到了第一个块的起始位置。通过刚才讲述的功能,HDFS可以让计算程序获取到对应的偏移量,让计算程序可以读取到他们分配到的文件数据,这就实现了并行计算。

HDFS读流程要点

  • 为了降低整体的带宽消耗和读取延时,HDFS会尽量让读取程序读取离它最近的副本

  • 如果在读取程序的同一个机架上有一个副本,那么就读取该副本

  • 如果一个HDFS集群跨越多个数据中心,那么客户端也将首先读本地数据中心的副本

  • 语义:下载一个文件:

    • Client和NN交互文件元数据获取fileBlockLocation
    • NN会按距离策略排序返回
    • Client尝试下载block并校验数据完整性
  • 语义:下载一个文件其实是获取文件的所有的block元数据,那么子集获取某些block应该成立

    • Hdfs支持client给出文件的offset自定义连接哪些block的DN,自定义获取数据
    • 这个是支持计算层的分治、并行计算的核心

THE END.