一、基本概念
2.3添加了集中式缓存管理,由Datanode堆外内存组成,Namenode统一管理
- 阻止频繁使用的数据从内存中删除
- 由于是Namenode统一管理,因此在读可以根据情况调度,提高读性能
- 客户端可以通过零拷贝技术直接读取缓存数据
- 提高集群内存利用率,读某个文件的时候会将这个文件对应的副本N都加载到操作系统的buffer中,如果指定缓存M个,可节约N-M的内存
1.背景
- 第一阶段:未区分本地读和远程读
DFSClient—socket—>Datanode(直接读取文件内容)
问题:性能低 -
第二阶段:
Datanode把文件存放位置告诉DFSClient)DFSClient—socket—>Datanode (拿到文件存放地址) DFSClient直接去读取本地文件 问题:虽然避免一次中转,但存在权限问题(安全漏洞)
短路读
DFSClient通过Unix Domain Socket机制向Datanode获取文件描述符 解决了安全的问题 问题 ① Namenode并不知道这些Cache,在分配读的时候会重复创建Cache ② Cache对任务调度透明,可能会出现低优先级Cache淘汰高优先级Cache
-
第三阶段:集中式缓存
- 用户可以指定常用数据常驻内存,避免淘汰到磁盘
- 更合理的调度任务,尽可能实现读取本地内存,减少磁盘浪费
- 提高读性能 ,目标数据也在当前节点时可通过zero-copy直接从内存读取
- 由于是Namenode同一管理,因此不受Datanode下线、集群重启等影响
二、使用
1. 配置
- hdfs-site.xml
第一个值默认是0,表示集中式缓存特性关闭,应该设置为适当的值打开该特性
需要注意:系统memlock至少与配置值相同(该值依赖于系统memlock)
## 单位是byte
<property>
<name>dfs.datanode.max.locked.memory</name>
<value>0</value>
</property>
##################以下配置不是必须################################
<property>
<name>dfs.namenode.path.based.cache.refresh.interval.ms</name>
<value>30000</value>
</property>
<property>
<name>
dfs.namenode.path.based.cache.block.map.allocation.percent
</name>
<value>0.25</value>
</property>
<property>
<name>dfs.cachereport.intervalMsec</name>
<value>10000</value>
</property>
property>
<name>dfs.datanode.fsdatasetcache.max.threads.per.volume</name>
<value>4</value>
</property>
2. 操作指令
$HADOOP_HOME/bin/hdfs cacheadmin -addPool factPool -owner hadoop-user -group hadoop-user -mod 777 -limit 1024000000 -ttl 2d
$HADOOP_HOME/bin/hdfs cacheadmin -addDirective -path /user/hive/warehouse/dw.db/user -pool factPool -force -replication 3 -ttl 1d
- 首先新建名称为factPool的缓存池,并赋予相关的用户组及权限等信息
另外限制该缓存池可以缓存的最大空间及缓存数据的最大TTL等; - 将user表数据加入到缓存池factPool进行缓存,并指定缓存时间为1天,缓存3个副本;之后当有读user表数据的请求过来后即可调度到缓存节点上从内存直接读取,从而提升读性能。其它CLI的用法可类比这里不再一一罗列。
三、源码剖析
1. 流程
2. 使用场景
内存资源一般比较有限,应更合理的去使用
- 存储访问频繁的表
数仓中存在一部分表被频繁访问/联表查询,将访问频率较高的部分表进行缓存,可以提高数据生产的效率 - 存储近期的数据
从数据仓库应用来看,每天有大量报表统计任务,需要读取前一天数据做分析,事实上大量表都是按天进行分区,可以把符合要求的热点分区数据做缓存处理,过期后清理缓存,也能大幅提升生产和统计效率;
四、问题
- 操作系统层面而言,这三种查询的方式数据的流动是怎样的(详细)
- 比较读取磁盘跟cache中10G的数据速度比例
- 尝试把常用的小表放到缓存中,看是否能显著提升联表查询速度
五、小结
通过前述分析,可以看到HDFS集中式缓存优势非常明显:
1、显著提升数据读性能;
2、提升集群内存利用率;
虽然优势明显,但是HDFS集中式缓存目前还有一些不足:
1、内存置换策略尚不支持,如果内存资源不足,缓存会失败;(查询最新官网看看并且做测试)
2、集中式缓存与Balancer之间还不能很好的兼容,大量的Block迁移会造成频繁内存数据交换;
3、缓存能力仅对读有效,对写来说其实存在副作用,尤其是append;
4、与Federation的兼容非常不友好;
总之,从集中式缓存来看,收益非常明显,但是还存在一些小问题,在实际应用过程中还需要优化和改进
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。