Hadoop-组件-HDFS-源码学习-数据读写-读文件-零拷贝读
一、概述
二、理论笔记
三、实现
DFSInputStream.read() 首先调用 tryReadZeroCopy() 方法尝试以零拷贝模式读取数据块,如果当前配置或者数据块的状态不支持零拷贝,则调用 ByteBufferUtil.fallbackRead() 退化为一个普通的读取操作。
在传统的文件 I/O 操作中,都是调用操作系统提供的系统调用函数 read() 或 write() 来执行读写操作的,此时调用此函数的进程会由用户态切换到内核态,然后操作系统的内核代码负责将相应的文件数据读取到内核的 I/O 缓冲区,最后再把数据从内核 IO 缓冲区拷贝到进程的私有地址空间中,完成一次 IO 操作。
3.1. 校验
3.1.1. 同一个数据块
首先确保读取是在同一个数据块之内
3.1.2. 映射数据 <= 2GB
确保读取映射数据没有超过 2GB
3.2. 获取数据块文件在内存中的映射对象
tryReadZeroCopy() 会通过调用 blockReader.getclientMmap()将文件映射到内存中,并返回 ClientMmap对象。这个对象当中
包含了 MappedByteBuffer 对象
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Joker!
评论
ValineTwikoo