零、目录
- 数据存储
- 缓存管理
- 快照管理
- 副本放置策略
- 内部认证
- 磁盘目录服务
- WebHdfsFileSystem
- OAuth2认证机制
- 其他细节
一、 数据存储
1. 内存存储(3个主类)
【默认 LAZY_PERSIST 策略】
(1)RamDiskReplicationLurTracker 类
:负责维护多个关系的数据块信息
- discardReplica 清理多余副本
- touch 更新副本块
- getNextCandidateForEviction 根据模式移除文件块,默认 LRU
(2)LazyWriter 类
:发动机,不断从队列中取出待持久的数据块,提交到异步持久化服务中
(3)RamDiskAsynclazyPersistService 类
:异步持久化服务,一个服务对应一个线程池,一个线程池最多一个线程
2. 异步存储(过程)
- DataNode 心跳汇报自身数据存储目录的 StorageType
- NameNode 汇总,更新各节点的存储类型记录
- 根据已设定的存储策略,向 NameNode 请求寻找存储类型相同的 DataNode
- 将目标 DataNode 作为候选节点
二、 缓存管理
1. 生命周期(4状态)
CACHING
:正在缓冲
DataNode 获取到心跳返回的缓存命令(NameNode的回复)
CACHING_CANCELLED
:正在进行的缓冲正在被取消
- 执行 append 写操作时
- 把块处理为无效块时
- NameNode 发送 uncache 命令时
CACHED
:已被缓冲
UNCACHING
:正在被取消
上面两类由操作主类 CacheReplicatioinMonitor 管理,
类功能:扫描整个 HDFS 文件系统,根据情况调度块进行缓存。
3. 相关配置
dif.datanode.max.locked.memory
默认值为 0(单位:字节),表示关闭内存缓存功能。
4. 中心缓存
- CacheManger 缓存管理器
- CacheReplicationMonitor 缓存副本监控器【pendingCache, pengdUncache 方法】
缓存适用场景
- jar 等公共资源文件
- 短期临时的热点数据文件
缓存块
- CacheDirective 基本单位
- CachePool 缓存池
缓存管理
· CacheAdmin CLI 命令
【CacheManger 类维护了三大映射】
1. CacheDirective id => CacheDirective
TreeMap<Long, CacheDirective>
2. 缓存路径 => CacheDirective 列表
TreeMap<String, List<CacheDirective>>
3. 缓存池名称 => CachePool
TreeMap<String, CachePool>
· CacheReplicationMonitor 工作机制
- 获取缓存文件所拥有的的块组信息
- CachePool 的缓存大小检测
- 遍历块,并根据块构造缓存块
- 更新缓存块列表,新增旧改
三、 快照管理
【只做差异记录】
1. 结构单元
- 快照目录
- 快照文件
2. SnapshotManager 主类
- createSnapshot
- deleteSnapshot
- getSnapshottableDirs
- renamesnapshot
- setAllowNestedSnapshots
- diff
3. 主要用途
- 丢失数据的恢复
- 元数据的差异比较
四、 副本放置策略
【关注 BlockPlacementPolicy 类】
策略内容
- 请求方是其中一个 DataNode,则直接放在本地,否则随机选择另一集群内 DataNode
- 第二副本放在不同于第一副本所在的机架
- 第三副本存在于第二副本所在的机架,但是属于不同节点
- 更多的副本随机放置在另外的节点
多机架集群
需开启机架感知功能(hdfs-site.xml > property > name & value):
net.topology.srcipt.file.name
/path/to/rackAware.py
存储目标
【BlockPlacementPolicyDefault -> isGoodTarget 方法】
- 必须是请求的存储类型
- 不能是 READ_ONLY
- 可用
- 未下线
- 不是消息落后的节点(常更新的节点)
- 有足够剩余空间
- 考虑节点 IO 负载繁忙程度
- 小于同机架内最大的副本数
五、 内部认证
1. BlockToken
dfs.block.access.token.enable
2. Sasl
【SaslClinet 与 SaslServer 握手】
- 加密 key 不为空,则进行加密握手
- Sasl 相关配置不为空,进行普通握手
- 未开启安全配置模式,不握手
- 特权端口号,不握手
- 简单认证模式,不握手
- 其他情况,不握手
DoSaslHandshake
- 客户端发送初始请求
- 服务端收到请求,生成询问,发送给客户端
- 客户端收到询问,处理询问,生成回复给服务端
- 服务端收到询问回复,验证通过后,返回响应回复
- 双方确认完毕,握手结束
六、 磁盘目录服务
1. DiskChecker 坏盘检测
......(待更新)
2. DirectoryScanner 目录扫描
......(待更新)
3. VolumeScanner 块检查
......(待更新)
七、 WebHdfsFileSystem
1. API:按方法类型、处理目标分类
(1)GET
目录文件信息相关
- OPEN
- GET_FILE_STATUS
- LIST_STATUS
- GET_CONTENT_SUMMARY
- GET_FILE_CHECKSUM
- GET_HOME_DIRECTORY
- GET_BLOCK_LOCATIONS
属性、ACL访问相关
- GET_DELEGATION_TOKEN
- GET_XATTRS
- LIST_XATTRS
- GET_ACL_STATUS
- CHECK_ACCESS
(2)PUT
文件目录设置相关
- CREATE
- MKDIRS
- CREATE_SYMLINK
- RENAME
- SET_REPLICATION
- SET_OWNER
- SET_PERMISSION
- SET_TIMES
ACL 访问属性相关
- RENEW_DELEGATION_TOKEN
- CANCEL_DELEGATION_TOKEN
- MODIFY_ACL_ENTRIES
- REMOVE_ACL_ENTRIES
- REMOVE_DEFAULT_ACL
- SET_ACL
- SET_XATTR
- REMOVE_XATTR
快照
- CREATE_SNAPSHOT
- RENAME_SNAPSHOT
(3)POST
- APPEND
- CONCAT
- TRUNCATE
(4)DELETE
- DELETE
- DELETE_SNAPSHOT
2. 执行器调用过程
- 初始化 http 请求连接
- 连接 Server 端
- 获取执行回复内容
- 执行失败重试操作
3. 测试命令格式
curl -i -X GET "<HOST>:<PORT>/webhdfs/v1/<PATH>?user.name=<USER>op=LIST_STATUS"
八、 OAuth2 认证机制
三个角色
- 服务端:用户使用服务端提供的各种资源
- 用户:服务端资源的真实拥有者
- 客户端:要访问服务端资源的第三方应用
认证步骤
- 用户登录客户端向服务端请求一个 临时令牌
- 服务端通过客户端验证后,返回其临时令牌
- 客户端获取临时令牌后,引导 用户到服务端提供的 授权页面
- 用户输入账号、密码后,表明用户授权次客户端访问所请求的资源
- 授权过程完成后,客户端根据临时令牌从服务端 获取访问令牌
- 客户端获取访问令牌后向服务端访问 受保护的资源
九、 其他细节
六种块 - block
- HOT
- COLD
- WARM
- ALL_SSD
- ONE_SSD
- LAZY_PERSIST
流量处理
- 内部限流
- Balancer 数据平衡
- DiskBalancer 磁盘间数据平衡
(1)内部限流
- Balancer
- Fsimage
- VolumeScanner
DataTransferThrottler
- 线程安全
- 通过单位时间段内限制指定字节数的方式来控制平均传输速度
- 如果规定时间内的贷款限定字节数超过限制,则进入等待,等待下一个带宽传输周期的到来
(2)数据平衡
- Balancer 找目标
- Dispatcher 分发对象
(3)节点间数据平衡
关注 DiskBalaner 类
结束语:每次更新会补全一部分内容,欢迎提出意见。