zoukankan      html  css  js  c++  java
  • MapReduce(十五): 从HDFS阅读本文的源代码分析

    以Map任务读取文本数据为例:


    1)   LineRecordReader负责对文件切割的定位,以及对读取每一行内容的封装供用户Map任务使用。每次在定位在文件里不为0的位置时,多读取一行,由于前一个处理该位置之前的数据时,会完整把该一行已经读取并处理。

     

    2)   LineReader负责对所要訪问文件输入流的数据进行每一行读取,仅仅实现对每一行读取的逻辑。


    3)   DFSDataInputStream封装了DFSInputStream的实现,直接调用DFSInputStream接口完毕。


    4)   DFSInputStream,负责对所訪问文件block的管理,提供定位block位置和提供block数据流读取的接口。

    定位到所读取的位置在哪个block中后,打开与该block的socket连接,然后从封装socket的RemoteBlockReader中读取数据:


        依据定位到的block在哪个主机,打开与该主机的socket连接:


    获取block信息后,開始获取数据流:


    5)   RemoteBlockReader,对打开socket获取DataNode输入流DataInputStream进行封装,開始读取文件数据,文件数据是DataNode依照每一个chunk封装一次传输给client,client给每一个chunk检查数据完整性。

    提供给上层读取socket中数据流接口:


    開始从一个个chunk中读取数据:

     

    每一个chunk的读取:

    6)   Block传输读协议

    先是client打开连接后,向DataNode输入block的信息:


    然后DataNode依照一个个chunk向DFSClient发送数据流供读,chunk的数据格式,依照数据读取先后顺序罗列:


  • 相关阅读:
    53. Maximum Subarray
    64. Minimum Path Sum
    28. Implement strStr()
    26. Remove Duplicates from Sorted Array
    21. Merge Two Sorted Lists
    14. Longest Common Prefix
    7. Reverse Integer
    412. Fizz Buzz
    linux_修改域名(centos)
    linux_redis常用数据类型操作
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4556303.html
Copyright © 2011-2022 走看看