Hadoop Fair Call Queue 机制
1. 背景
HDFS NameNode 是 Hadoop 最重要的模块,负责文件系统命名空间管理的同时,还需要处理来自所有客户端的 RPC 读写请求,通常负载严重,为了防止单用户批量请求导致其他用户服务质量下降,NameNode 通过 Fair Call Queue 机制来保证不同用户请求被处理的公平性,该机制基于请求耗时的成本分析。
2. 请求耗时成本分析
请求耗时如果细分会有以下类型:
ENQUEUE:进入 Call Queue 之前耗时。
QUEUE:在 Call Queue 驻留时间。
HANDLER:非处理请求和响应耗时。
PROCESSING:实际用于处理请求耗时,恒等于 lock_free + lock_wait + lock_shared + lock_exclusive
LOCKFREE:无锁耗时。
LOCKWAIT:等待锁耗时。
LOCKSHARED:读锁耗时。
LOCKEXCLUSIVE:写锁耗时。
RESPONSE:结果压缩和发送耗时。
不同类型的耗时对应不同的成本权重:
低权重(分值 1):LOCKFREE、RESPONSE 和 RESPONSE
中权重(分值 10):LOCKSHARED
高权重(分值 100):LOCKEXCLUSIVE
其他耗时类型不计入成本例如 ENQUEUE 和 QUEUE
计算时间成本公式(时间单位:纳秒):
3. 时间成本与用户的关联
请求中会携带着用户信息,用户有两种成本:
原始时间成本(rawCost):所有请求时间成本累加值。
衰减时间成本(decayedCost):衰减因子 0.5,每个周期(默认 5s)进行衰减,decayedCost=decayedCost*0.5
4. 优先级与优先级阀值的对应关系
优先级 scheduler.priority.levels 默认 4。
5. 优先级的影响
每个优先级对应一个 Fair Call Queue,优先级越高的 Queue 吞吐量越高,WeightedRoundRobinMultiplexer 从 Fair Call Queue 提取请求的数量依据该 Queue 的优先级。
6. 流程图
有了上面介绍的内容,再来看官网的流程图就没那么难了。
模块说明:
Listen Queue:用于缓冲用户的请求。
RpcScheduler:默认是不开启公平队列的,需要配置 scheduler.impl=org.apache.hadoop.ipc.DecayRpcScheduler,DecayRpcScheduler 时间成本计算和优先级的逻辑都在这里面。
Fair Call Queue:阻塞队列,每个优先级对应一个 Fair Call Queue。
WeightedRoundRobinMultiplexer:提取请求的数量与优先级别成正比。
Handler Threads:真正处理请求的线程。
版权声明: 本文为 InfoQ 作者【冰心的小屋】的原创文章。
原文链接:【http://xie.infoq.cn/article/47dcb734dc54c5fe91ac15d43】。文章转载请联系作者。
评论