HDFS 缓存与缓存块
HDFS缓存用的是缓存块,HDFS缓存块用的是普通的文件块转换而来,也可以转换回去。缓存使用的是DataNode内存作为缓存。
本节以疑问点的形式分析缓存块:
- 物理层面缓存块是怎样的?
- 缓存块的生命周期状态有哪几种?
- 哪些情况会触发缓存块、取消缓存块的操作?
- CacheBlock UnCacheBlock 缓存块如何确定?
- 系统所持有的缓存块列表如何更新?
- 缓存块如何被使用?
1.HDFS 物理层面缓存块
利用mmap、mlock系统调用将块数据锁入内存。
mmap是将一个文件或其他对象映射进内存。代码实现如下:
// 加载并映射块到内存,然后检查其checksum
public static MappableBlock load(long length,
FileInputStream blockIn, FileInputStream metaIn,
String blockFileName) throws IOException {
MappableBlock mappableBlock = null;
MappedByteBuffer mmap = null;
FileChannel blockChannel = null;
try {
//获取块数据的FileChannel对象
blockChannel = blockIn.getChannel();
if(blockChannel == null) {
throw new IOException("Block InputStream has no FileChannel.");
}
//这里开始进行内存的映射操作
mmap = blockChannel.map(MapMode.READ_ONLY, 0, length);
NativeIO.POSIX.getCacheManipul