HDFS—>Namenode缓存篇

1、基本概念

2.3添加了集中式缓存管理,由Datanode堆外内存组成,Namenode统一管理node

  • 阻止频繁使用的数据从内存中删除
  • 因为是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
  • 第三阶段:集中式缓存app

    • 用户能够指定经常使用数据常驻内存,避免淘汰到磁盘
    • 更合理的调度任务,尽量实现读取本地内存,减小磁盘浪费
    • 提升读性能 ,目标数据也在当前节点时可经过zero-copy直接从内存读取
    • 因为是Namenode同一管理,所以不受Datanode下线、集群重启等影响

2、使用

1. 配置

  1. hdfs-site.xml

第一个值默认是0,表示集中式缓存特性关闭,应该设置为适当的值打开该特性
须要注意:系统memlock至少与配置值相同(该值依赖于系统memlock)socket

## 单位是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的用法可类比这里再也不一一罗列。

3、源码剖析

1. 流程

image.png

2. 使用场景

内存资源通常比较有限,应更合理的去使用oop

  • 存储访问频繁的表
    数仓中存在一部分表被频繁访问/联表查询,将访问频率较高的部分表进行缓存,能够提升数据生产的效率
  • 存储近期的数据
    从数据仓库应用来看,天天有大量报表统计任务,须要读取前一天数据作分析,事实上大量表都是按天进行分区,能够把符合要求的热点分区数据作缓存处理,过时后清理缓存,也能大幅提高生产和统计效率;

4、问题

  1. 操做系统层面而言,这三种查询的方式数据的流动是怎样的(详细)
  2. 比较读取磁盘跟cache中10G的数据速度比例
  3. 尝试把经常使用的小表放到缓存中,看是否能显著提高联表查询速度

5、小结

经过前述分析,能够看到HDFS集中式缓存优点很是明显:
一、显著提高数据读性能;
二、提高集群内存利用率;性能

虽然优点明显,可是HDFS集中式缓存目前还有一些不足:
一、内存置换策略尚不支持,若是内存资源不足,缓存会失败;(查询最新官网看看而且作测试)
二、集中式缓存与Balancer之间还不能很好的兼容,大量的Block迁移会形成频繁内存数据交换;
三、缓存能力仅对读有效,对写来讲其实存在反作用,尤为是append;
四、与Federation的兼容很是不友好;测试

总之,从集中式缓存来看,收益很是明显,可是还存在一些小问题,在实际应用过程当中还须要优化和改进优化

相关文章
相关标签/搜索