hadoop 概述(二)

hadoop 概述一,已经写了hdfs的一些基本概念,那作为分布式文件系统,是怎么进行读写的?下边讲述hdfs的读写流程

HDFS中读写流程中有一些额外的小的概念,下面讲述一下

  1. block
    blokc块,一般是128M,可以修改大小,但不推荐,原因如下:
  • 如果块设置过大,
    一方面,从磁盘传输数据的时间会明显大于寻址时间,导致程序在处理这块数据时,变得非常慢;
    另一方面,mapreduce中的map任务通常一次只处理一个块中的数据,如果块过大运行速度也会很慢。

  • 如果块设置过小,
    一方面存放大量小文件会占用NameNode中大量内存来存储元数据,而NameNode的内存是有限的,不可取;
    另一方面文件块过小,寻址时间增大,导致程序一直在找block的开始位置。

  1. packet
    packet 它是client端向DataNode,或者DataNode之间使用PipLine传输的基本单位,默认64KB

  2. chunk
    它是client向DataNode,或者DataNode之间PipLine之间进行数据校验的基本单位,默认是512Byte,因为要用作校验,
    故每个chunk需要带有4Byte的校验位,一个chunk的大小是516Byte

HDFS写流程

写流程步骤

  1. 客户端向NameNode发出写文件请求,

  2. 检查文件是否已经存在,是否有权限写,如果校验通过,写入到edits log,并返回输出流对象和可写的DataNode列表

  3. 客户端按128MB的大小切分文件

  4. 客户端根据NameNode返回的可分配的可写DataNode列表,将Data数据发送给最近的一个DataNode节点写入一个packet,
    列表中其他可写DataNode节点会和第一个节点形成pipline管道,将packet在多个节点写入,使得多个DataNode节点可以同时写入

  5. 给个DataNode写完一个块后,会返回确认信息

  6. 写数据完成,关闭输出流

  7. 发送完成信号给NameNode

HDFS读流程

读流程步骤

  1. 客户端访问NameNode,查询元数据信息,获取这个文件按照距离排序的位置信息,返回输入流对象

  2. 选择最近的一台DataNode服务器,请求建立输入流

  3. 客户端从DataNode读取数据,以packet为单位,还要校验完整性

  4. 关闭输入流

从我们之前搭建的hadoop来看HDFS存在如下问题

  1. NameNode 单点故障,难于应用于在线场景
  2. NameNode 压力过大,且内存受限,影响系统扩展性
  3. MapReduce jobTracker访问压力过大,影响系统扩展性

那有没有解决方案呢?
解决单点故障:HDFS HA 通过主备NameNode解决
解决系统扩展性问题:使用HDFS Federation 水平扩展,支持多个NameNode,所有NameNode共享所有DataNode存储资源,每个NameNode分管一部分目录

posted @ 2021-03-16 22:39  Tenic  阅读(51)  评论(0)    收藏  举报