HDFS缓存
hdfs缓存是为了减少对数据的重复访问请求,hdfs的缓存通过缓存块实现。
缓存块
缓存块由普通文件块转换得来。缓存指在要访问的dataNode的内存中,访问时命中缓存则无需读取磁盘,可以大大提高用户读取文件的速度。
缓存块的生命周期
在缓存块中,其内部枚举State代码如下:
private static enum State {
CACHING,
CACHING_CANCELLED,
CACHED,
UNCACHING;
private State() {
}
public boolean shouldAdvertise() {
return this == CACHED;
}
}
可看到由CACHING(正在缓存),CACHING_CHACHED(缓存取消),CACHED(已缓存),UNCACHING(缓存块正在取消缓存状态)
块缓存状态保存在 FSDatasetCache的内存类Value中
private static final class Value {
final FsDatasetCache.State state;
final MappableBlock mappableBlock;
Value(MappableBlock mappableBlock, FsDatasetCache.State state) {
this.mappableBlock = mappableBlock;
this.state = state;
}
}
其中块Id对象和Value对象组成缓存映射图,保存在变量mappableBlockMap中
private final HashMap<ExtendedBlockId, FsDatasetCache.Value> mappableBlockMap = new HashMap();
块缓存时,通过传入的块的各种参数信息,使用cacheBlock方法缓存,并将块ID–>Value数据加到mappableBlockMap中
synchronized void cacheBlock(long blockId,