HDFS缓存助力hadoop、implala计算加速

HDFS缓存配置和使用
一、 概述
HDSF缓存是hadoop自带的一个数据缓存机制,可以将常用的数据缓存到内存中,这样查询数据不必从磁盘中获取数据,减少了IO传输时间,对查询性能有一定的提升,在实际测试中,impala空闲情况下,加缓存的查询速度是不加缓存查询速度的两倍左右,在IO繁忙的情况下,效果应该更好。
HDFS集中化缓存管理具有许多重大优势:
1.明确的锁定可以阻止频繁使用的数据被从内存中清除。当工作集的大小超过了主内存大小(这种情况对于许多HDFS负载都是司空见惯的)时,这一点尤为重要。
2.由于DataNode缓存是由NameNode管理的,所以,在确定任务放置位置时,应用程序可以查询一组缓存块位置。把任务和缓存块副本放在一个位置上可以提高读操作的性能。
3.当块已经被DataNode缓存时,客户端就可以使用一个新的更高效的零拷贝读操作API。因为缓存数据的checksum校验只需由DataNode执行一次,所以,使用这种新API时,客户端基本上不会有开销。
4.集中缓存可以提高整个集群的内存使用率。当依赖于每个DataNode上操作系统的buffer缓存时,重复读取一个块数据会导致该块的N个副本全部被送入buffer缓存。使用集中化缓存管理,用户就能明确地只锁定这N个副本中的M个了,从而节省了N-M的内存量。
二、 启用HDFS缓存
启用缓存一共需要配置两个地方:
1、 配置操作系统的memlock
memlock是操作系统控制长期驻留内存的文件大小,默认情况下是64kb,可以用root用户执行ulimit -l查看系统的驻留内存大小,64KB远远无法满足hdfs对驻留内存的大小,需要根据服务器内存大小来具体配置,例如:128G内存,可以配置驻留5G左右的缓存(实际情况以服务器内存大小和案件量大小确定),配置方法如下:
添加环境变量:

vi /etc/security/limits.conf

添加下面两条信息,单位是KB:
* soft memlock 5242880
* hard memlock 5242880
这里写图片描述
保存后,即可永久生效内存锁大小。
但是这样设置需要重启操作系统后才能生效,可以用命令让其临时生效避免重启:
ulimit -l 5242880
在其他节点重复以上操作,直到所有节点都完成配置。
2、 配置hadoop配置文件hdfs-site.xml

vi /etc/hadoop/conf/hdfs-site.xml

在最下面添加

dfs.datanode.max.locked.memory
5368700000

注意:value这个值得单位是byte,也就是上面5242880*1024=5368709120,减去了尾数9120,抹去尾数的原因是要给其他应用留出驻留内存的空间。
3、 执行完1、2步骤的操作,重启各节点的datanode服务,使配置生效

service hadoop-hdfs-datanode restart

4、 新建缓存池
Root用户或impala用户下执行:

hdfs cacheadmin -addPool 缓冲池名 -owner hive -group hadoop -limit 1048576000

注:缓存池名字任意,例如cache_pool
-owner -group 是用户和属组
-limit 是缓存池大小,单位是byte
5、 将待缓存表加入缓存池中

impala-shell -d db_np

alter table t_aj_all set cached in ‘缓存池名’;
6、 缓存加载

impala-shell -d db_np

compute stats t_aj_all;
7、检查是否加入了缓存

impala-shell -d db_np

show table stats t_aj_all;
这里写图片描述
如上图,如果显示Byte cached和size大小一样,说明已被缓存,如果显示0B,说明没有被缓存,一般情况是缓存池建的太小了,可以通过命令:
hdfs cacheadmin -modifyPool 缓存池名 -limit 池大小(byte)
修改缓存池大小。
三、 常见问题
1、如果启动datanode报错:“Cannot start datanode because the configured max locked memory size… is more than the datanode’s available RLIMIT_MEMLOCK ulimit
说明操作hdfs-site里dfs.datanode.max.locked.memory配置的值大于ulimit -l的配置,可以将ulimit -l调整的大一些。
四、HDFS缓存常用命令
(1). addDirective:添加指令
hdfs cacheadmin -addDirective -path path -pool pool-name [-force] [-replication replication] [-ttl time-to-live]
-path 添加的路径
-pool 加入的缓冲池名称
-force 不检查缓存池的资源限制
-replication 要使用的副本数,默认为1
-ttl 缓存指令可以保持多长时间。可以按照分钟,小时,天来指定,如30m,4h,2d。有效单位为[smhd]。“never”表示永不过期的指令。如果未指定该值,那么,缓存指令就不会过期。
(2). removeDirective:通过id删除指令
hdfs cacheadmin -removeDirective id
(3). removeDirectives:删除执行path下所有缓存命令
hdfs cacheadmin -removeDirective path
(4). listDirectives:显示某一路径下的缓存信息
hdfs cacheadmin -listDirectives [-stats] [-path path] [-pool pool]
-stats 显示 列出基于path的缓存指令统计信息。
2. 缓存池命令
(1). 添加/修改缓存池:addPool/modifyPool
hdfs cacheadmin -addPool name [-owner owner] [-group group] [-mode mode] [-limit limit] [-maxTtl maxTtl]
hdfs cacheadmin -modifyPool name [-owner owner] [-group group] [-mode mode] [-limit limit] [-maxTtl maxTtl]
其中,
-owner/group是该pool的属主/组,默认为当前用户
-mode是POSIX风格权限,默认为0755
-limit为该pool中可以缓存的最大字节数,默认没有限制
-maxTtl 最大的生存期,可以是120s, 30m, 4h, 2d等。
(2). 移除缓冲池:removePool
hdfs cacheadmin -removePool name
(3). 列出缓冲池:listPools
hdfs cacheadmin -listPools [-stats] [name]
-stats为显示统计信息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值