HDFS写数据详解

版权声明:原创作品转载必须标明出处,谢谢配合! https://blog.csdn.net/qq_38704184/article/details/84402820

HDFS写数据详解

hadoop模块每一部分都是分布式的,所以他们之间的通信都是建立在RPC基础上的,这点要明白

HDFS写数据(上传数据时,DataNode的选择策略:1.第一个副本先考虑跟client最近的(同机架)2.第二个副本在考虑跨机架选择一个DataNode,3.第三个副本就在第一个副本同机架例外挑选一个DataNode存放)

怎样知道呢个机器在呢个机架上呢?可以配置机架感知

  1. client向namenode请求上传文件(想要上传到呢个路径下)
  2. namenode慎重考虑后(主要是查看是否具有请求中的合理路径存在),哎呀妈路径合理,那么就向client响应你可以上传了
  3. hadoop2x一个block默认为128M,文件超过后就需要分割文件。client通过RPC请求上传第一个block(0~128M),请求返回DataNode信息,意思是我现在想要上传一部分,我总该知道我要上传到呢个子节点下吧,这是合理请求;
  4. namonode查看元数据给出client合理的回应,所谓合理起始namenode内部是有相应的处理机制的,主要是考虑DataNode空间问题,和路由间的距离问题
  5. client收到回应之后,请求与呢个DataNode下的呢个block建立连接,同时建立起传输管道channel,为什么要建立管道呢,以为我们这是分布式系统,考虑的主要问题是当机器宕机时,我们还想要完成任务,所以我们就将数据进行多个副本的存储,即使当前机器宕机,我们也能给用户响应完整的数据。为什么我们不这样做呢,当第一个block上传完毕后,其他的副本block我们复制粘贴过去呢,因为我们的大数据文件一般都最少是以G为单位的,正常都是以T为单位的,这样操作的话,很容易存在IO阻塞现象,所以避免出现IO阻塞,我们采用通过管道,里面主要的是PIPE LINE,分配的数据节点放在pipeline里。datastream将数据块写入pipeline中的第一个数据节点,第一个数据节点将数据第二个数据节点,第二个数据节点将数据发送给第三个数据节点。根据路由距离远近建立理想的通道传输。
  6. client开始传输数据,理论上是管道内的block都可以通过管道进行读取数据,但是我们建立管道是根据路由距离建立的,所以势必存在读取时间长短的问题,block其中一个只要有一个上传成功,默认就是当前请求的block(0~128M)传输完毕。需要注意的是在这里传输数据是以packet为单位进行传输的,以packet里的chunk为单位进行校验的。
  7. 第一个block上传完毕之后,client开始请求上传第二个block...(每上传一个block都会向namenode请求)。

猜你喜欢

转载自blog.csdn.net/qq_38704184/article/details/84402820