HDFS—>Namenode缓存篇

一、基本概念

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. 配置

  1. hdfs-site.xml

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

## 单位是byte

  dfs.datanode.max.locked.memory
  0 

##################以下配置不是必须################################

dfs.namenode.path.based.cache.refresh.interval.ms
30000



dfs.namenode.path.based.cache.block.map.allocation.percent

0.25


dfs.cachereport.intervalMsec
10000

property>
dfs.datanode.fsdatasetcache.max.threads.per.volume
4

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. 流程

image.png

2. 使用场景

内存资源一般比较有限,应更合理的去使用

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

四、问题

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

五、小结

通过前述分析,可以看到HDFS集中式缓存优势非常明显:
1、显著提升数据读性能;
2、提升集群内存利用率;

虽然优势明显,但是HDFS集中式缓存目前还有一些不足:
1、内存置换策略尚不支持,如果内存资源不足,缓存会失败;(查询最新官网看看并且做测试)
2、集中式缓存与Balancer之间还不能很好的兼容,大量的Block迁移会造成频繁内存数据交换;
3、缓存能力仅对读有效,对写来说其实存在副作用,尤其是append;
4、与Federation的兼容非常不友好;

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

你可能感兴趣的:(hadoop,分布式文件系统,大数据)