背景
显式的缓存机制,允许用户指定HDFS缓存路径。NameNode和块对应的datanode交互,要求缓存到off-heap上。
具有许多优点:
- 防止缓存抖动,热数据频繁换入换出
- NameNode掌握缓存信息
- 客户端可以通过高效的读API(零拷贝读)从内存中读取,Datanode只校验一下即可。
- 集中式管理防止多次缓存。(依赖单个DN的OS缓存时,可能导致重复。)
- 可以采用一些非易失性存储,例如SCM缓存。
架构
NN定期从DN获取缓存块的报告。NN可以像操作文件一样操作缓存。
NN定时扫描,决定哪些块可以缓存或者不缓存,将具体的缓存工作给DN。
也可以用户触发扫描,比如说移除缓存指令集。
坏块不会进行缓存。
定义
缓存指令
表示的是哪些文件需要被缓存,目录的话是非递归的,值缓存一级。
其他的参数,比如说复制因子,过期时间。多个缓存指令在同一个文件的话,以多的复制因子为准。
缓存指令过期时,NN不会考虑该缓存。
缓存池
管理缓存指令组的实体,规定了用户访问缓存组的权限等。
缓存池可以设置最大容量限制,通常设置为HDFS缓存保留的聚合缓存量。缓存池中还跟踪了统计信息。
cacheAdmin
用户用来和缓存池交互的指令,缓存指令和缓存池都有唯一id
- addPool
pool名称需要自定义唯一字符串,可以设置权限和容量,ttl等···
hdfs cacheadmin -addPool <name> [-owner <owner>] [-group <group>] [-mode <mode>] [-limit <limit>] [-maxTtl <maxTtl>]
- modifyPool
hdfs cacheadmin -modifyPool <name> [-owner <owner>] [-group <group>] [-mode <mode>] [-limit <limit>] [-maxTtl <maxTtl>]
- removePool
hdfs cacheadmin -removePool <name>
- listPool
stats 显示统计信息
hdfs cacheadmin -listPools [-stats] [<name>]
[root@cdp hadoop-3.3.1]# hdfs cacheadmin -listPools -stats
Found 1 result.
NAME OWNER GROUP MODE LIMIT MAXTTL DEFAULT_REPLICATION BYTES_NEEDED BYTES_CACHED BYTES_OVERLIMIT FILES_NEEDED FILES_CACHED
test_pool root root rwxr-xr-x 1000 never 1 31124 0 30124 4 0
- addDirective
如果超过cachepool设置的策略,可以报错。使用-force强制
hdfs cacheadmin -addDirective -path <path> -pool <pool-name> [-force] [-replication <replication>] [-ttl <time-to-live>]
- listDirectives
hdfs cacheadmin -listDirectives [-stats] [-path <path>] [-pool <pool>]
- removeDirective
hdfs cacheadmin -removeDirective <id>
- listDirectives
只能显示当前路径的缓存
hdfs cacheadmin -listDirectives [-stats] [-path <path>] [-pool <pool>]
配置要求
Native Libraries配置
为了将文件锁到内存中,需要JNI支持。
NativeLibraries就支持三个事情
- compression
- native io
- crc32
通过hadoop checknative -a
检查
可以安装配置PMDK
DRAM配置文件配置(持久内存缓存)
- dfs.datanode.max.locked.memory
设置可用内存大小,默认是0 - dfs.datanode.pmem.cache.dirs
设置持久缓存容量
可选配置项
- dfs.namenode.path.based.cache.refresh.interval.ms
namenode多久扫描一次缓存,默认30s - dfs.datanode.fsdatasetcache.max.threads.per.volume
缓存新数据线程数,默认4 - dfs.cachereport.intervalMsec
datanode汇报缓存时间,默认10s - dfs.namenode.path.based.cache.block.map.allocation.percent
namenode缓存映射内存百分比 - dfs.namenode.caching.enabled
是否开启集中缓存,其实也缓存了,但是namenode不使用这些信息 - dfs.datanode.pmem.cache.recovery
持久化内存上是否恢复缓存
注意项
ulimit -l 的值(KB)要比dfs.datanode.max.locked.memory(字节byte) 大,否则datanode启动不了。