公平性
什么是 FairCallQueue?
公平调用队列(Fair Call Queue,FCQ)是一种多级优先级队列,它根据用户身份来调度 RPC 请求。FCQ 配合调度器(通常是 DecayRpcScheduler)工作,由调度器跟踪每个用户的调用量随时间的变化情况,根据使用模式分配优先级级别,并使用加权轮询复用器在所有用户之间公平分配处理能力。
本文档介绍了在 Ozone 中配置 FairCallQueue 功能的相关信息。要启用并使用 FairCallQueue,OM - S3G 之间的通信必须使用 Hadoop RPC 作为传输协议,目前尚无 gRPC 的实现。
Ozone 有一个自定义的 IdentityProvider 实现,必须在配置中指定,否则将无法进行 S3G 身份模拟(impersonation),这会导致 FairCallQueue 失效,因为它只能读取到一个用户,即 S3G 特殊用户,而不是 S3G 客户端用户。
为什么公平性很重要?
在多租户环境中,多个用户或应用通过 S3 Gateway 访问 Ozone,公平性至关重要。如果没有公平调度:
- 单个高流量用户或应用可能淹没请求队列,导致其他用户的请求无限期等待或超时
- 具有合理但较低流量负载的用户可能会遇到难以接受的延迟,因为他们的请求被排在一个主导用户的大量请求之后
- 系统资源可能被激进的客户端独占
- 服务质量(QoS)保证无法得到维持
通过实现公平调用队列,Ozone 确保所有用户都能公平地访问 OM 资源,从而获得更可预测的性能和更好的多租户支持。
FCQ 应该应用在哪里?
FCQ 应应用于 Ozone Manager(OM) 层级的 S3 Gateway(S3G)→ Ozone Manager 通信路径。当 S3 Gateway 将来自多个 S3 客户端的请求转发给 Ozone Manager 时,FCQ 使用每个请求的 S3 访问 ID 来识别用户,并根据其最近的调用量对请求确定优先级,从而在所有用户之间公平分配资源。
Hadoop FCQ 框架
Ozone 借助 Hadoop 的 FairCallQueue 框架来实现公平性。有关 FairCallQueue 的工作原理、架构以及高级配置选项的详细信息,请参阅 Hadoop FairCallQueue 文档。
配置
必须指定一个端口,OM 将把所有活动转发到该端口,FairCallQueue 和 DecayRpcScheduler 也将监听该端口。此外,该端口必须出现在每一个配置项的名称中。
以下示例中使用的端口:9862
<property>
<name>ozone.om.address</name>
<value>OMDomain:9862</value>
</property>
<property>
<name>ozone.om.s3.grpc.server_enabled</name>
<value>false</value>
</property>
<property>
<name>ozone.om.transport.class</name>
<value>org.apache.hadoop.ozone.om.protocolPB.Hadoop3OmTransportFactory</value>
</property>
<property>
<name>ipc.9862.callqueue.impl</name>
<value>org.apache.hadoop.ipc_.FairCallQueue</value>
</property>
<property>
<name>ipc.9862.scheduler.impl</name>
<value>org.apache.hadoop.ipc_.DecayRpcScheduler</value>
</property>
<property>
<name>ipc.9862.identity-provider.impl</name>
<value>org.apache.hadoop.ozone.om.helpers.OzoneIdentityProvider</value>
</property>
<property>
<name>ipc.9862.scheduler.priority.levels</name>
<value>2</value>
</property>
<property>
<name>ipc.9862.backoff.enable</name>
<value>true</value>
</property>
<property>
<name>ipc.9862.faircallqueue.multiplexer.weights</name>
<value>2,1</value>
</property>
<property>
<name>ipc.9862.decay-scheduler.thresholds</name>
<value>50</value>
</property>验证步骤
检查日志:启动 OM 后,在日志中确认 FCQ 已初始化:
FairCallQueue is in use with <N> queues with total capacity of <capacity>验证指标:检查 FCQ 指标是否正在采集(通过 JMX 或 metrics 端点):
- 每个优先级的
FairCallQueueSize_p<N> - 溢出统计的
FairCallQueueOverflowedCalls_p<N>
- 每个优先级的
故障排查
- FCQ 未生效:确认已配置
OzoneIdentityProvider,gRPC 已禁用(ozone.om.s3.grpc.server_enabled=false),并且所有ipc.<port>.*属性中的端口号一致。 - 延迟过高:增大队列容量(
ipc.server.max.callqueue.length),或调整调度器阈值(ipc.<port>.decay-scheduler.thresholds)。 - 配置错误:确保
ozone.om.address与ipc.<port>.*属性之间的端口一致,并核实所有类名拼写正确。 - 监控指标:通过 JMX 查看
FairCallQueueSize_p<N>和FairCallQueueOverflowedCalls_p<N>,以诊断队列行为。
评论
登录后参与评论
KnowForge