缓存的含义
物理层面:利用mmap、mlock这样的系统调用将块数据锁入内存,以此达到在DataNode上缓存数据的效果。
HDFS缓存块由普通的文件转换而来,因为缓存在DataNode内存中,因此HDFS缓存可以大大提高用户读取文件的速度缓存的使用场景
① 热点公共资源文件:可以是一些存放于HDFS中的依赖资源jar包,或是一些算法学习依赖的.so文件等。这种场景更好的做法是把它做成分布式缓存,否则在程序中将会发送大量的请求到NameNode中去获取这些资源文件的内容。
② 短期临时的热点数据文件:比如每天运行统计的报表数据,需要读取前一天的或是最近一周的数据做离线分析。那么这个时候就可以把符合这个时间段的数据做缓存处理。
缓存块的确定
①CacheBlock(需要缓存的目标数据块)动作,来自于NameNode心跳处理的方法。DataNode获取到心跳返回的缓存命令,进行缓存块的动作,目标缓存块列表也是从心跳回复中获得
② UnCacheBlock(不需要缓存的数据块)动作:
当块执行append写操作的时候
当把块处理为无效块的时候
上层NameNode发送uncache回复命令的时候(同①)③ 确定缓存块
任何少于标准副本块个数的副本应该被缓存到新的节点上
过量副本数的缓存块应该从节点上进行移除缓存的配置
<name>dfs.datanode.max.locked.memory</name> <value>0</value>
DataNode用来缓存块的最大内存空间大小,单位用字节表示。系统变量RLIMIT_MEMLOCK至少需要设置得比此配置值要大。默认情况下,此配置值为0,表示默认关闭内存缓存功能。
dfs.datanode.fsdatasetcache.max.threads.per.volume: 用于缓存块数据的最大线程数,这个线程数是针对每个存储目录而言,默认值为4
dfs.cachereport.IntervalMsec: 缓存块上报间隔,默认10秒缓存的命令
bin/hdfs cacheadmin [COMMAND]
以下为所有的[COMMAND]
[-addDirective -path -pool [-force] [-replication ] [-ttl ]] //添加缓存单元命令[-modifyDirective -id [-path ] [-force] [-replication ] [-pool ] [-ttl ]] //修改缓存单元命令
[-listDirectives [-stats] [-path ] [-pool ] [-id ]] //列出满足条件的缓存单元列表
[-removeDirective ] //删除指定id对应的缓存单元
[-removeDirectives -path ] //删除指定路径对应的缓存单元
[-addPool [-owner ] [-group ] [-mode ] [-limit ][-maxTtl ]] //添加新的缓存池
[-modifyPool [-owner ] [-group ] [-mode ] [-limit ] [-maxTtl ]] //修改缓存池
[-removePool ] //删除指定缓存池
[-listPools [-stats] []] //列出满足条件的缓存池
eg:
新建一个缓存池hdfs cacheadmin -addPool regan_test_pool
列出所有的缓存池
hdfs cacheadmin -listPools
调用addCacheDirective命令并带上必要的参数,然后加入刚刚建好的test_pool缓存池中:
hdfs cacheadmin -addDirective -path /tmp/regan_file -pool regan_test_pool
进行list查询
hdfs cacheadmin -listDirectives -pool regan_test_pool -stats
最后,需要开启DataNode的缓存功能:
<name>dfs.datanode.max.locked.memory</name>
HDFS_缓存
最新推荐文章于 2023-07-23 08:33:01 发布