HDFS中的集中缓存(Centralized Cache Management in HDFS)

来源:互联网 发布:正版游戏 知乎 编辑:程序博客网 时间:2024/06/05 16:10
集中缓存有两层概念:
  1. 第一层是缓存,即为存储在HDFS中文件提供缓存的机制,从而可以加速DFSClient对文件的读操作;
  2. 第二层概念是集中式的管理,传统的HDFS缓存依赖了OS本身的缓存机制,但是这种缓存机制不能被管理员或中央节点进行管理,不能自由的控制哪些文件缓存,哪些文件不进行缓存;集中式的管理可以提高了对缓存内存的可控性;
HDFS中集中缓存架构如下所示:

  1. User通过api入口与NN进行交互,告诉NN缓存哪些文件,或者取消对那些文件的缓存;
  2. NN中维护了缓存path列表;在每次接受到User的缓存请求时候,把请求的Path转化为一系列的Blocks,并把这些Blocks加入到一个待cache的队列中
  3. 在DN中缓存的真实内容是Blocks,在DN每次心跳协议与NN进行交互时候,NN会把属于该DN的缓存的Blocks放在心跳协议的返回值中返回给DN,DN进行缓存中
  4. 同时DN维持一个NN之间类似心跳协议的定时协议,定时同步DN中缓存Block的状态;
  5. DFSClient在读取缓存中的文件Blocks时,可以直接从Cache中读取;
HDFS集中缓存两个主要概念:Cache Directive和Cahce Pool
  1. Cache Directive:一个directive是一个缓存的path,它可以是目录,也可以是文件;注意:目录的缓存是非递归的,只缓存目录内第一层的文件,不会缓存目录中目录;一个Directive有一个参数replication,表示该path的缓存的副本数;注意,可以对一个文件进行多次缓存;一个Directive有一个参数expiration,可以控制缓存的TTL(time-to-live),目前该时间为绝对时间,可以表示为分钟,小时和天数,比如 -ttl 30m, 4h, 2d。 测试显示一个cache过期了,NN不会自动将它从缓存列表中删除,只是在不再反馈给DFSClient进行读操作,cache的内存是否会自动释放,待测试; 测试结果表示不会释放内存,所以过期的cache,还是需要手动的去删除它;
  2. Cache Pool:是Cache的管理单元,每个Pool拥有与Unix相似的权限,同时Pool也有quota limit限制
cacheadmin 命令行控制
  1. Directive控制:集中缓存中一个文件是否会被缓存,完全用管理员来控制,管理员可以通过" hdfs cacheadmin -addDirective"来添加缓存,该命令会返回一个缓存id;“hdfs cacheadmin -removeDirective”通过该命令来删除指定缓存id的缓存;“ hdfs cacheadmin -removeDirectives”通过该命令来删除指定缓存path的缓存,该命令可以一次删除多个缓存;“hdfs cacheadmin -listDirectives”显示当前所有的缓存;详细的参数,在命令行中输入 hdfs cacheadmin可以看得到;或者参考:http://hadoop.apache.org/docs/r2.3.0/hadoop-project-dist/hadoop-hdfs/CentralizedCacheManagement.html 官方文档
  2. Pool控制:可以通过"hdfs cacheadmin -addPool"创建一个pool,“hdfs cacheadmin -modifyPool”删除一个pool,"hdfs cacheadmin -removePool"删除一个pool,“ hdfs cacheadmin -removePool”删除一个pool
HDFS相关配置信息:
  1. dfs.datanode.max.locked.memory:集中cache的[必须配置]官方描述如下"The amount of memory in bytes to use for caching of block replicas in memory on the datanode. The datanode's maximum locked memory soft ulimit (RLIMIT_MEMLOCK) must be set to at least this value, else the datanode will abort on startup. By default, this parameter is set to 0, which disables in-memory caching. If the native libraries are not available to the DataNode, this configuration has no effect." ;单位为byte,默认该值为0,从描述中可以看到。如果该值为0,相当于关闭了集中缓存的功能;同时该值不能大于ulimit的限制;从描述中还可以看到,集中缓存对native lib有依赖,描述如下:"In order to lock block files into memory, the DataNode relies on native JNI code found in libhadoop.so. Be sure to enable JNI if you are using HDFS centralized cache management."
  2. dfs.cachereport.intervalMsec:单位为毫秒,用于控制DN向NN汇报DN上缓存的状态,,默认为10秒;
  3. dfs.namenode.path.based.cache.refresh.interval.ms:NN维持的cahce会可以自动更新,如果文件被追加写,目录下面新增了文件,NN会扫描path所有的block进行更新;该参数就是用来控制这个扫描的间隔,单位为毫秒,默认为5分钟;
  4. dfs.datanode.fsdatasetcache.max.threads.per.volume:DN中维护缓存的状态或者IO读写的线程数,默认为4
Jira:https://issues.apache.org/jira/browse/HDFS-4949

0 0
原创粉丝点击