本文固定链接:https://www.askmac.cn/archives/hdfs-cache-management.html
原文地址:http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/CentralizedCacheManagement.html
1介绍
在HDFS中的集中内存管理是一种显式的内存机制,允许用户指定HDFS的内存路径。
NameNode将于DataNode通信来获得磁盘上所需的块,并引导它们在堆缓存中缓存这些块。
集中缓存管理有许多明显的优点(www.askmac.cn)
1.显式的防止那些常用的块从内存中清除。这个对于当工作集的大小超过内存的时候非常重要,HDFS的工作量超过内存的情况很常见。
2.因为DataNode的内存被NameNode管理,应用程序在确定任务目标位置时可以查询到内存块位置。通过缓存块联合定位任务可以提高读性能。
3.当块已经被DataNode缓存时,客户端可以使用一个新的,更有效的零拷贝读API。一旦DataNode上的缓存数据校验完成,客户端在使用这个新API的时候基本上是零开销。
4.集中内存管理可以提高集群整体内存利用率,在每个DataNode当依赖OS 缓存时,重复读取一个块将导致所有的块副本被拉进缓存。在集中缓存管理中,用户可以显式的pin住n个副本,节约内存。(www.askmac.cn)
2 使用场景
内存集中管理对于重复访问非常有用。例如,在hive中有一个很小的fact表,经常被内存连接使用。换句话说,缓存一年的查询报告输入是不太可能的,因为这些历史数据只被读取一次。
内存集中管理也对混合工作负载SLAs的性能有帮助。缓存一个有高优先级的工作组的工作量,报纸它不于低优先级的工作负载竞争磁盘I/O
3. 结构
在这个结构中,NameNode的职责是协调集群中所有DataNode的堆内存。NameNode定期从每个DataNode中接受一个缓存报告,这个报告描述了在一个给定的DN上的所有块缓存。NameNode通过与DataNode之间的心跳来承载缓存或不缓存的命令,从而管理DataNode。(www.askmac.cn)
NameNode查询其设置的缓存指令来决定哪些路径将被缓存。缓存指令被永久的存储到fsimage和edit log中,并且通过JAVA和命令API来增加,移除和修改。NameNode也存储一组缓存池,这是用于组缓存指令和资管管理和执行权限的管理实体。
NameNdoe定期的扫描命名空间和活动缓存指令,来决定哪些块需要缓存或者不缓存,并且为DataNode分配缓存任务。重新扫描也可以通过用户动作,例如增加或删除缓存指令,或者移除一个缓存池来触发。
我们不会缓存那些当前正在构造,损坏或者不完整的块。如果一个缓存指令是一个链接,那么链接的目标不会被缓存。(www.askmac.cn)
缓存时在当期文件或目录级别上进行的。块和子块的缓存时以后工作的项目。
4.概念
4.1 缓存指令
一个缓存指令定义了一个应该被缓存的路径。路径可以是目录或文件。目录缓存是非递归的,也就意味着是那些在目录的第一层列出的文件。
指令也可以指定额外的参数,例如缓存副本因子和过期时间。副本因子是指定缓存块副本的数目。如果多个缓存指令关联相同的文件,那么最大的缓存副本因子会被应用。
过期时间可以用命令来指定生存时间(TTL),在未来相对的时间内过期。在一个缓存指令到期后,它不再是由NameNode考虑的缓存路径。(www.askmac.cn)
4.2 缓存池
缓存池是一个用户管理缓存指令组的管理实体。缓存池有UNIX类似的权限,可以拒绝用户和组访问这个池。写权限运行用户增加和移除缓存指令到池。读权限允许用户列出一个池中的缓存指令以及元数据。执行权限是没用的。
缓存池也有利于资管管理。池可以强制一个最大数目限制,可以限制在池中指令缓存聚合起来的字节数。通常请下,池的总限制约等于机器中HDFS预留的缓存总量。缓存池也跟着一些统计信息,来帮助集群用户决定哪些应该被缓存。
Chcheadmin 命令行接口
在命令行中,管理员和用户可以通过 hdfs cacheadmin 命令来和缓存池交互。
缓存指令被一个唯一的,不可重复的64位整数ID确定。ID不会被重复使用,即使缓存指令被移除。
缓存池被一个唯一字符串确定(www.askmac.cn)
4.2 缓存指令命令
addDirective
用法:hdfs cacheadmin -addDirective -path <path> -pool <pool-name> [-force] [-replication <replication>] [-ttl <time-to-live>]
增加一个新的缓存指令
<path> | 缓存的路径。这个路径可以是目录或文件 |
<pool-name> | 指令将增加到哪个池中。你必须要有缓存池的写权限来新增指令 |
-force | 跳过缓存池资源限制检查 |
<replication> | 使用的缓存副本因子。默认是1 |
<time-to-live> | 指令的有效期。可以按分,小时或天来指定,例如30m,4h,2d。有效单位值[SMHD].”never”指定一个命令永不过期。如果不指定,指令默认永不过期 |
removeDirective
用法:hdfs cacheadmin -removeDirective <id>
移除一个缓存指令
<id> | 缓存指令的标识。你必须在池上有写的权限来进行移除。可以使用-listDirectives命令查询缓存命令的IDs |
removeDirectives
用法:hdfs cacheadmin -removeDirectives <path>
移除指定路径上的所有缓存指令(www.askmac.cn)
<path> | 移除路径上的缓存指令。你必须在池上有写的权限来进行移除。可以使用-listDirectives命令查询缓存指令列表 |
listDirectives
用法:hdfs cacheadmin -listDirectives [-stats] [-path <path>] [-pool <pool>]
列出缓存指令(www.askmac.cn)
<path> | 列出此路径的缓存指令。注意,如果缓存池中有缓存指定,但是无读权限,也不会列出。 |
<pool> | 列出某池中的这个路径的缓存指令 |
-stats | 列出基于路径的缓存指令的统计信息 |
4.3 缓存池命令
addPool
用法:hdfs cacheadmin -addPool <name> [-owner <owner>] [-group <group>] [-mode <mode>] [-limit <limit>] [-maxTtl <maxTtl>
增加一个新的缓存池
<name> | 新池的名称 |
<owner> | 池所有者的用户名。默认是当前用户 |
<group> | 池的组。默认是当期用户的主组 |
<mode> | Unix风格的权限。例如0755,默认是0755 |
<limit> | 池中能缓存的最大字节数。默认是无限制 |
<maxTtl> | 池中增加的指令的最大允许的生命周期。有效单位是[smhd],例如 120s,30m,4h,2d。默认是”never”,无限制 |
modifyPool
用法:hdfs cacheadmin -modifyPool <name> [-owner <owner>] [-group <group>] [-mode <mode>] [-limit <limit>] [-maxTtl <maxTtl>]
修改现存缓存池的元数据(www.askmac.cn)
<name> | 要修复的池的名称 |
<owner> | 池的所有者名称 |
<group> | 池的用户组名称 |
<mode> | 池的权限 |
<limit> | 池的最大能缓存的字节数 |
<maxTtl> | 池中增加指令的最大允许生命周期 |
removePool
用法:hdfs cacheadmin -removePool <name>
移除一个缓存池。这个也清理池中缓存的路径
<name> | 要移除的缓存池名称 |
listPools
用法:hdfs cacheadmin -listPools [-stats] [<name>]
显示一个或多个缓存池的信息,例如名称,所有者,组和权限等等
-stats | 限制额外的缓存池统计信息 |
<name> | 如果指定了,那么只会列出指定名称的缓存池 |
help
用法:hdfs cacheadmin -help <command-name>
获得命令相关的详细信息
<command-name> | 列出相关命令的详细信息。如果命令没找到,会打印所有命令的信息 |
4 .配置
4.1 本地库
为了将块文件锁到内存中,DataNode依赖于本地的libhadoop.so或hadoop.dll中的JNI代码。如果你使用集中缓存管理,请确保启用了JNI。
(www.askmac.cn)
4.2 配置属性
必须的
需要确认一下配置:
dfs.datanode.max.locked.memory
这个确定了DataNode将使用的最大内存。在类unix系统中。‘锁进内存大小’限制(ulimit -l)也是DataNode用户需要考虑去匹配的参数(可参看新的OS限制)。当设置这个值得时候,注意考虑其他应用所需的内存空间,例如DataNode和JVM堆和操作系统页缓存。(www.askmac.cn)
这个设置和懒惰写特性共享。DataNode将确保懒惰写试用的内存和集中内存管理的不会超过dfs.datanode.max.locked.memory配置得总数。
可选的
下列属性不是必须的,但是可以调整:
dfs.namenode.path.based.cache.refresh.interval.ms :
NameNode将在扫描子路径缓存之间使用这个毫秒。它会甲酸块缓存和每个DataNode应该缓存的副本块。这个值默认是300000,也即是5分钟
dfs.datanode.fsdatasetcache.max.threads.per.volume:
DataNode缓存新数据的时候每一卷使用的最大线程数。默认这个参数是4
dfs.cachereport.intervalMsec:
DataNode 发送完全的缓存状态报告给NameNode的间隔时间ms。默认是1000,10秒(www.askmac.cn)
dfs.namenode.path.based.cache.block.map.allocation.percent:
java堆的百分比,将分配给缓存块map。缓存块映射是一个哈希因素,使用的链式哈希。如果缓存块比较多,较小的映射会使得访问很慢;大量的map会消耗更多的内存。默认是25%。
4.3 OS 限制
如果你得到了一个报错“Cannot start datanode because the configured max locked memory size… is more than the datanode’s available RLIMIT_MEMLOCK ulimit,”这意味着操作系统强加了一个比你锁配置得值更低的内存限制。为了修复这个错误,你必须使用ulimit –l 来调整DataNode运行的值。通常情况下,这个值配置在/etc/security/limits.conf中,这个依赖于使用的操作系统。(www.askmac.cn)
当你使用ulimit -l时,可以得到当前配置的值,用来和你配置dfs.datanode.max.locked.memory的值对比,如果限制的是ulimited,表示无限制。注意ulimit –l显示的值的单位是KB,但是dfs.datanode.max.locked.memory的单位是字节。
这里的信息不适用Windows,Windows没直接等效unlimt –l
Comment