HDFS中的集中缓存管理
Posted 程序猿码码
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDFS中的集中缓存管理相关的知识,希望对你有一定的参考价值。
Apache Hadoop 2.9.0
请查看原文:http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/CentralizedCacheManagement.html
(如果转发,请标明出处)
概述
HDFS中的集中缓存管理(Centralized cache management)是一种显式缓存机制,允许用户指定HDFS需要缓存的路径。NameNode将与磁盘上具有所需要的块的DataNodes进行通信,指示这些DataNodes将这些块缓存到 off-heap caches中。
HDFS集中缓存管理具有许多显著优势:
1. 显示锁定可防止频繁使用的数据从内存中逐出,当工作集的大小超过HDFS工作负荷常见的主内存大小时,这一点就显得尤为重要。
2. 因为DataNode caches是由NameNode来管理的,应用程序可以在做出任务放置决策时查询缓存块位置的集合。将任务与缓存的块副本放在一起可以提高读写性能。
3. 当块被一个DataNode缓存时,客户端可以使用一个新的,更有效的,零拷贝的读取API。由于缓存数据的校验和验证已经由DataNode完成一次,因此当使用此新API时,客户端的开销基本为零。
4. 集中缓存可以提高集群整体的内存利用率。在每个DataNode依赖OS缓冲区缓存时,重复读取块将导致块的所有n个副本被拉入缓冲区缓存。而使用集中缓存管理,用户可以显示的锁定n个副本中的m个副本,从而节省n-m 的内存。
使用举例
中心缓存管理对频繁访问的文件非常有用。例如,在Hive中经常用于join的小fact table,就是一个很好的缓存候选项。另一方面,缓存一年报告查询的输入可能用处不大,因为历史数据可能只读取一次。
集中缓存管理对于具有性能SLAs的混合工作负载也很有用。缓存高优先级工作负载的工作集可确保它不会与低优先级工作负载争用磁盘I / O。
架构
在这个架构中,NameNode 负责协调集群中所有DataNode off-heap caches。NameNode 周期性的从每个DataNode 接收一个cache report,cache report描述了给定DN的所有缓存块。NameNode 通过在 DataNode 心跳上搭载缓存 和取消缓存命令来管理DataNode 上的缓存。
NameNode 查询自身的 cache directives集合来决定paths是否需要被缓存。Cache directives 被持久化存储在fsimage和edit 日志中,可以通过java或者命令行APIs来添加、修改、删除。NameNode 同时还存储一组缓存池,这些缓存池用来将cache directives分组以进行资源管理和强化权限。
NameNode 周期性的扫描命名空间和 active cache directives ,以确定需要缓存和取消缓存哪些块,并将缓存工作分发给DataNodes。用户操作例如添加或者删除一个cache directive或者删除一个缓冲池也能触发NameNode的扫描。
我们目前不缓存正在构建、损坏或不完整的块。如果一个cache directive覆盖符号链接,则不会缓存符号链接目标。
缓存目前只是在文件或者目录级别。块和子块的缓存是未来工作的一项内容。
概念
Cache directive
一个 cache directive 定义了一个需要缓存的path。Path可以是目录或者文件。目录以非递归方式缓存,这意味着只缓存目录的第一级列表中的文件。
Directives 也能指定附加的参数,例如缓存副本因子(cache replication factor)以及到期时间(expiration time)。缓存副本因子指定了块副本缓存的数量,如果多个cache directives 指向同一个文件,那么最大的缓存副本因子将会被使用。
到期时间,是通过命令行 time-to-live (TTL)来指定的,一个将来的相对到期时间。一个 cache directive到期后,NameNode在作出缓存决策时不再考虑它。
缓存池(Cache pool)
缓存池用来管理cache directives组。缓存池有类似于UNIX的权限,用来限制用户和组有访问缓存池的权限。写权限允许用户向缓存池增加或者删除 cache directives 。读取权限允许用户列出缓存池中的 cache directives以及附加的元数据。Execute 权限没有使用。
缓存池也能用来做资源管理。缓存池可以强制执行最大限制,该限制限制了缓存池中directives 聚合缓存的字节数。通常,缓存池的总和大约等于集群上为HDFS缓存保留的聚合内存量。缓存池还会跟踪大量统计信息,以帮助集群用户确定缓存的内容和应该缓存的内容。
缓冲池还可以强制执行最长生存期,这将限制添加到缓存池中的directives 的最长到期时间。
cacheadmin 命令行接口
在命令行中,管理员和用户可以通过hdfs cacheadmin子命令来与缓冲池和directives 进行交互。
Cache directives由唯一的、不重复的64位整数ID标识。即使稍后 cache directive被移除,IDs也不会重复使用。
Cache pools 用一个唯一的字符串名字标识。
Cache directive 命令
addDirective
使用: hdfs cacheadmin -addDirective -path <path> -pool <pool-name> [-force] [-replication <replication>] [-ttl <time-to-live>]
增加一个cache directive
<path> |
需要被缓存的path。Path可以是一个目录或者一个文件。 |
<pool-name> |
需要添加到的缓存池。必须拥有缓存池的写权限,这样才能添加。 |
-force |
跳过缓存池资源限制的检查。 |
<replication> |
缓存副本因子。默认是1. |
<time-to-live> |
有效时间。可以指定为分钟,小时,天等。例如30m, 4h, 2d。有效的单位是 [smhd]。 “never”标明一个directive 永远不会过期。如果没有指定,那么directive 就永远不会过期。 |
removeDirective
使用: hdfs cacheadmin -removeDirective <id>
删除一个cache directive。
<id> |
要删除的cache directive id. 必须有缓存池的写权限,查看cachedirective IDs, 可以使用 -listDirectives 命令. |
removeDirectives
使用: hdfs cacheadmin -removeDirectives <path>
删除指定目录上的每个cache directive。
<path> |
需要删除cache directives 的目录. 必须拥有缓存池上的写权限。查看 cache directives列表,可以使用 -listDirectives 命令. |
listDirectives
使用: hdfs cacheadmin -listDirectives [-stats] [-path <path>] [-pool <pool>]
列出cache directives。
<path> |
列出目录相关的cache directives 。如果缓存池中有Path的一个 cache directive,但是没有读权限,那么这条cache directive将不会列出 |
<pool> |
列出缓存池中的 path cache directives。 |
-stats |
列出path-based cache directive 静态统计信息. |
Cache pool commands
addPool
使用: hdfs cacheadmin -addPool <name> [-owner <owner>] [-group <group>] [-mode <mode>] [-limit <limit>] [-maxTtl <maxTtl>]
增加一个缓存池
<name> |
新缓存池名字 |
<owner> |
缓存池的所有者,默认是当前用户。 |
<group> |
缓存池的组。默认是当前用户的主要group name 。 |
<mode> |
UNIX模式的权限 。默认权限是八进制 ,例如 0755。默认设置成0755。 |
<limit> |
存储池中directives 合计缓存的最大字节数,默认是没有限制。 |
<maxTtl> |
添加到池中的directives 的最大允许生存时间。可以指定秒,分钟,小时,天等等。例如120s, 30m, 4h, 2d。有效的单位是[smhd],默认,没有最大限制。“never ” 标明没有限制。 |
modifyPool
使用:hdfs cacheadmin -modifyPool <name> [-owner <owner>] [-group <group>] [-mode <mode>] [-limit <limit>] [-maxTtl <maxTtl>]
修改已经存在的缓存池的元数据。
<name> |
缓存池名字 |
<owner> |
缓存池的所有者 |
<group> |
缓存池的组名 |
<mode> |
八进制的Unix类似格式的权限 |
<limit> |
缓存池能缓存的最大字节数 |
<maxTtl> |
添加到池中的directives 的最大允许生存时间 |
removePool
使用:hdfs cacheadmin -removePool <name>
删除一个缓存池。同时也将不再缓存缓存池中对应的路径。
<name> |
缓存池名字 |
listPools
使用:hdfs cacheadmin -listPools [-stats] [<name>]
查看一个或者多个缓存池信息,例如:名字,所有者,组名,权限等。
stats |
显示缓存池附加的统计信息 |
<name> |
如果指定,只列出此缓存池的信息 |
help
使用:hdfs cacheadmin -help <command-name>
得到命令的详细帮助信息
<command-name> |
得到命令的详细帮助信息。如果没有指定,累出所有命令的帮助信息 |
配置
Native Libraries
为了将块文件锁定到内存,DataNode依赖libhadoop.so 或windows上的 hadoop.dll中的JNI代码。如果使用HDFS中心缓存管理,需要 enable JNI。
配置属性
必须的
需要配置如下:
① dfs.datanode.max.locked.memory
这个参数决定了一个DataNode 将用于缓存的最大内存量。在类似Unix系统上,DataNode 用户的“locked-in-memory size” ulimit (ulimit -l),也需要增加以匹配此参数(请查看下面关于操作系统限制的部分)。设置此值时,请记住您还需要内存中的空间来处理其他事情,例如DataNode和应用程序JVM堆以及操作系统页缓存。
此设置与 Lazy Persist Writes功能共享。DataNode 将确保 Lazy Persist Writes和集中缓存管理所使用的的组合内存不会超过dfs.datanode.max.locked.memory中配置的内存大小。
可选项
下面参数不是必须的,但调优时需要使用:
① dfs.namenode.path.based.cache.refresh.interval.ms
NameNode 路径缓存扫描间隔,单位是毫秒。这将计算需要缓存的块,以及包含这些块的副本的每个DataNode 应该缓存对应的块。(这个地方其实不是很明确,并一定每个副本都缓存,大致的意思就是计算缓存的块,让DataNode 来缓存)
默认参数设置为300000,也就是5分钟。
② dfs.datanode.fsdatasetcache.max.threads.per.volume
DataNode每个卷用于缓存新数据的最大线程数。默认,是4。
③ dfs.cachereport.intervalMsec
DataNode 向NameNode发送它的缓存状态的report的时间间隔。毫秒级。
默认设置成10000,也就是10秒。
④ dfs.namenode.path.based.cache.block.map.allocation.percent
分配给缓存块映射的Java堆的百分比。cached blocks map是一个 hash map,使用的是 chained hashing。如果缓存的块数量较大,则访问较小的map会很慢。大的map会占用更多内存。默认值为0.25 %。
操作系统限制
如果得到错误“Cannot start datanode because the configured max locked memory size… is more than the datanode’s available RLIMIT_MEMLOCK ulimit”,这意味着您配置的内存量超过了操作系统对您可以锁定的内存量的限制,这种情况,必须调整DataNode运行时使用的ulimit -l值,通常,这个值是在 /etc/security/limits.conf配置的,但是,它会因您使用的操作系统和发行版本而不同。
当已经正确配置此值后,可以从shell中运行ulimit -l 来查看,如果比在 dfs.datanode.max.locked.memory配置的参数要高,或者为“unlimited,”(表明没限制),那么就证明配置正确了。需要注意的是,ulimit -l通常是以KB为单位,但是 dfs.datanode.max.locked.memory必须用字节来指定。
此部分不适用于Windows。因为Windows没有ulimit -l等价的配置。
--------------------- 全文完 ----------------------------
备注:
集中存储管理:Centralized cache management
DN: DataNode
以上是关于HDFS中的集中缓存管理的主要内容,如果未能解决你的问题,请参考以下文章