你好,游客 登录 注册 搜索
背景:
阅读新闻

【dbdao Hadoop 大数据学习】hdfs 集中内存管理

[日期:2016-05-16] 来源:dbDao IT技术玩家博客  作者:郭, 兆伟 [字体: ]

在HDFS中的集中内存管理是一种显式的内存机制,允许用户指定HDFS的内存路径。

NameNode将于DataNode通信来获得磁盘上所需的块,并引导它们在堆缓存中缓存这些块。

Hadoop

集中缓存管理有许多明显的优点(t.dbdao.com)

1.显式的防止那些常用的块从内存中清除。这个对于当工作集的大小超过内存的时候非常重要,HDFS的工作量超过内存的情况很常见。

2.因为DataNode的内存被NameNode管理,应用程序在确定任务目标位置时可以查询到内存块位置。通过缓存块联合定位任务可以提高读性能。

3.当块已经被DataNode缓存时,客户端可以使用一个新的,更有效的零拷贝读API。一旦DataNode上的缓存数据校验完成,客户端在使用这个新API的时候基本上是零开销。

4.集中内存管理可以提高集群整体内存利用率,在每个DataNode当依赖OS 缓存时,重复读取一个块将导致所有的块副本被拉进缓存。在集中缓存管理中,用户可以显式的pin住n个副本,节约内存。(t.dbdao.com)

2 使用场景

内存集中管理对于重复访问非常有用。例如,在hive中有一个很小的fact表,经常被内存连接使用。换句话说,缓存一年的查询报告输入是不太可能的,因为这些历史数据只被读取一次。

内存集中管理也对混合工作负载SLAs的性能有帮助。缓存一个有高优先级的工作组的工作量,报纸它不于低优先级的工作负载竞争磁盘I/O

3. 结构

在这个结构中,NameNode的职责是协调集群中所有DataNode的堆内存。NameNode定期从每个DataNode中接受一个缓存报告,这个报告描述了在一个给定的DN上的所有块缓存。NameNode通过与DataNode之间的心跳来承载缓存或不缓存的命令,从而管理DataNode。(t.dbdao.com)

NameNode查询其设置的缓存指令来决定哪些路径将被缓存。缓存指令被永久的存储到fsimage和edit log中,并且通过JAVA和命令API来增加,移除和修改。NameNode也存储一组缓存池,这是用于组缓存指令和资管管理和执行权限的管理实体。

NameNdoe定期的扫描命名空间和活动缓存指令,来决定哪些块需要缓存或者不缓存,并且为DataNode分配缓存任务。重新扫描也可以通过用户动作,例如增加或删除缓存指令,或者移除一个缓存池来触发。

我们不会缓存那些当前正在构造,损坏或者不完整的块。如果一个缓存指令是一个链接,那么链接的目标不会被缓存。(t.dbdao.com)

缓存时在当期文件或目录级别上进行的。块和子块的缓存时以后工作的项目。

4.1 缓存指令

一个缓存指令定义了一个应该被缓存的路径。路径可以是目录或文件。目录缓存是非递归的,也就意味着是那些在目录的第一层列出的文件。

指令也可以指定额外的参数,例如缓存副本因子和过期时间。副本因子是指定缓存块副本的数目。如果多个缓存指令关联相同的文件,那么最大的缓存副本因子会被应用。

过期时间可以用命令来指定生存时间(TTL),在未来相对的时间内过期。在一个缓存指令到期后,它不再是由NameNode考虑的缓存路径。(t.dbdao.com)

4.2 缓存池

缓存池是一个用户管理缓存指令组的管理实体。缓存池有UNIX类似的权限,可以拒绝用户和组访问这个池。写权限运行用户增加和移除缓存指令到池。读权限允许用户列出一个池中的缓存指令以及元数据。执行权限是没用的。

缓存池也有利于资管管理。池可以强制一个最大数目限制,可以限制在池中指令缓存聚合起来的字节数。通常请下,池的总限制约等于机器中HDFS预留的缓存总量。缓存池也跟着一些统计信息,来帮助集群用户决定哪些应该被缓存。

Chcheadmin 命令行接口

在命令行中,管理员和用户可以通过 hdfs cacheadmin 命令来和缓存池交互。

缓存指令被一个唯一的,不可重复的64位整数ID确定。ID不会被重复使用,即使缓存指令被移除。

缓存池被一个唯一字符串确定(t.dbdao.com)

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>

移除指定路径上的所有缓存指令(t.dbdao.com)

<path> 移除路径上的缓存指令。你必须在池上有写的权限来进行移除。可以使用-listDirectives命令查询缓存指令列表

listDirectives

用法:hdfs cacheadmin -listDirectives [-stats] [-path <path>] [-pool <pool>]

列出缓存指令(t.dbdao.com)

<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>]

修改现存缓存池的元数据(t.dbdao.com)

<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。

(t.dbdao.com)

4.2 配置属性

必须的

需要确认一下配置:

dfs.datanode.max.locked.memory

这个确定了DataNode将使用的最大内存。在类unix系统中。‘锁进内存大小’限制(ulimit -l)也是DataNode用户需要考虑去匹配的参数(可参看新的OS限制)。当设置这个值得时候,注意考虑其他应用所需的内存空间,例如DataNode和JVM堆和操作系统页缓存。(t.dbdao.com)

这个设置和懒惰写特性共享。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秒(t.dbdao.com)

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中,这个依赖于使用的操作系统。(t.dbdao.com)

当你使用ulimit -l时,可以得到当前配置的值,用来和你配置dfs.datanode.max.locked.memory的值对比,如果限制的是ulimited,表示无限制。注意ulimit –l显示的值的单位是KB,但是dfs.datanode.max.locked.memory的单位是字节。

这里的信息不适用Windows,Windows没直接等效unlimt –l





收藏 推荐 打印 | 录入:elainebo | 阅读:
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数
点评:
       
评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款