HDFSRPC通信框架参数详解

news/2024/5/20 5:30:27 标签: hdfs

写在前面

请先阅读HDFSRPC通信框架详解,对整体框架先有一定的了解。

参数列表

参数默认值描述
ipc.server.read.connection-queue.size100reader
ipc.server.read.threadpool.size1reader
ipc.server.listen.queue.size128Listener:backlog
ipc.server.tcpnodelaytrueListener
ipc.maximum.data.length64 * 1024 * 1024Connection:rpc data len
dfs.namenode.handler.count10handler nn requests from clients
dfs.namenode.service.handler.count10handler nn requests from DataNodes
dfs.namenode.lifeline.handler.count10handler nn lifeline requests
dfs.datanode.handler.count10handler dn

ipc.server.read.connection-queue.size

reader的处理连接数,默认是100。使用BlockingQueue实现。

final private BlockingQueue<Connection> pendingConnections;

public void addConnection(Connection conn) throws InterruptedException {
    pendingConnections.put(conn);
    readSelector.wakeup();
  }

使用addConnection加入队列,队列满了此方法会阻塞。

ipc.server.read.threadpool.size

reader的线程数,默认为1。reader主要用于连接头,连接上下文的处理,还是要花费一定的时间的,特别在使用Kerberos的时候。reader多线程处理会比较合理,所以笔者认为这个默认值不太合理,设置为不小于1会比较合理。

ipc.server.listen.queue.size

默认值为128,属于listener。本参数虽然叫queuesize,单实际上不是listenr的数量或者listener的队列长度,而是来源于ServerSocket的bind(SocketAddress endpoint, int backlog) 方法中的backlog。listener源码为

private int backlogLength = Config.getInt(
      CommonConfigurationKeysPublic.IPC_SERVER_LISTEN_QUEUE_SIZE_KEY,
      CommonConfigurationKeysPublic.IPC_SERVER_LISTEN_QUEUE_SIZE_DEFAULT);

public Listener(String bindAddress, int port, int readThreads) throws IOException {
    ...
    acceptChannel.socket().bind(address, backlogLength);
    ...
}

backlog参数为如果server.accept()没有及时接收,系统会把socket缓存起来,代表这个缓存队列的大小。如果队列已满,新连接会被拒接。

void doAccept(SelectionKey key) throws InterruptedException, IOException,  OutOfMemoryError {
    ServerSocketChannel server = (ServerSocketChannel) key.channel();
    SocketChannel channel;
    while ((channel = server.accept()) != null) {

      channel.configureBlocking(false);
      channel.socket().setTcpNoDelay(tcpNoDelay);
      channel.socket().setKeepAlive(true);
      
      Reader reader = getReader();
      Connection c = Server.connectionManager.register(channel);
      // If the connectionManager can't take it, close the connection.
      if (c == null) {
        if (channel.isOpen()) {
          IOUtils.cleanup(null, channel);
        }
        Server.connectionManager.droppedConnections.getAndIncrement();
        continue;
      }
      key.attach(c);  // so closeCurrentConnection can get the object
      reader.addConnection(c);
    }
  }

看doAccept方法,Connection接收到了以后会放入connectionManager,如果connectionManager的队列满了(ipc.server.max.connections)会直接关闭连接,ipc.server.max.connections默认值为0,代表没有上限。reader.addConnection代表连接会放入reader的pendingConnections,pendingConnections为BlockingQueue,满了会阻塞,默认值为100。所以默认值情况下,可以处理100+128个连接,超过了以后会被拒绝。如果ipc.server.max.connections设置为50,此值会直接失效,因为连接超过50以后,会直接关闭连接。

ipc.server.tcpnodelay

连接的TcpNoDelay属性,默认为true。

channel.configureBlocking(false);
channel.socket().setTcpNoDelay(tcpNoDelay);
channel.socket().setKeepAlive(true);

对应的就是TCP_NODELAY,本质上设置是否使用Nagle 算法,缓存数据合并发送。建议使用默认值true,关闭Nagle 算法。

ipc.maximum.data.length

请求的数据最大长度,默认是64MB。

this.maxDataLength = Config.getInt(CommonConfigurationKeys.IPC_MAXIMUM_DATA_LENGTH,
        CommonConfigurationKeys.IPC_MAXIMUM_DATA_LENGTH_DEFAULT);

private void checkDataLength(int dataLength) throws IOException {
    if (dataLength < 0) {
      String error = "Unexpected data length " + dataLength +
                     "!! from " + getHostAddress();
      LOG.warn(error);
      throw new IOException(error);
    } else if (dataLength > maxDataLength) {
      String error = "Requested data length " + dataLength +
            " is longer than maximum configured RPC length " + 
          maxDataLength + ".  RPC came from " + getHostAddress();
      LOG.warn(error);
      throw new IOException(error);
    }
  }

如果长度超过最大长度,server不会返回任何数据,会直接关闭连接。

handler.count

handler的数量,默认为10。有4个参数,分别为dfs.namenode.handler.count,dfs.namenode.service.handler.count,dfs.namenode.lifeline.handler.count,dfs.datanode.handler.count 。handler是用于实际处理rpc请求的,比如createfile,mkdir等。这些操作都是要花费一定的时间,而且随着存储文件数,存储集群的变大,理论上会变慢。所以handler.count可以设置的大一点。当然建议dfs.namenode.handler.count设置大一点就行,dfs.namenode.handler.count主要用于处理客户端请求,网上建议设置为20logN,N为集群服务器数量。其他都是集群内部的请求处理,没有特殊情况,使用默认值即可。


http://www.niftyadmin.cn/n/5476900.html

相关文章

聚道云连接器打通红圈CRM和金蝶云星辰,赋能环境科技公司数字化转型

一、客户介绍 某环境科技有限公司是一家专注于环保科技领域的领先企业&#xff0c;致力于为客户提供全方位的环境解决方案。公司拥有一支经验丰富、技术精湛的团队&#xff0c;不断推动环保技术的创新与应用。作为业内的佼佼者&#xff0c;该公司在环境治理、资源回收和节能减…

Stable Diffusion模型基于 TensorFlow 或 PyTorch 训练

安装必要的软件和库&#xff1a; 安装 Python&#xff08;建议使用 Python 3.x 版本&#xff09;。安装 TensorFlow 或 PyTorch&#xff0c;具体版本取决于你的模型是基于哪个框架训练的。安装其他可能需要的依赖&#xff0c;如 NumPy、Matplotlib 等。 获取模型代码和权重&…

考虑预同步的虚拟同步机T型三电平逆变器并离网MATLAB仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 模型简介 三相 T 型三电平逆变器电路如图所示&#xff0c;逆变器主回路由三个单相 T 型逆变器组成。 直流侧输入电压为 UPV&#xff0c;直流侧中点电位 O 设为零电位&#xff0c;交流侧输出侧是三相三线制连…

TCP 三次握手与四次挥手面试题(计算机网络)

TCP 基本认识 TCP 头格式有哪些&#xff1f; 序列号&#xff1a;在建立连接时由计算机生成的随机数作为其初始值&#xff0c;通过 SYN 包传给接收端主机&#xff0c;每发送一次数据&#xff0c;就「累加」一次该「数据字节数」的大小。用来解决网络包乱序问题。 确认应答号&a…

软考118-上午题-【软件工程】-能力成熟度模型

一、考试题型 选择题&#xff08;13题&#xff09; 二、能力成熟度模型CMM 能力成熟度模型CMM的研究目的是&#xff1a;提供一种评价软件承接方能力的方法&#xff0c;同时它可帮助软件组织改进其软件过程。 CMM 将软件过程改进分为以下5个成熟度级别&#xff1a; 1、初始级…

大恒相机-程序异常退出后显示被占用

心跳时间代表多久向相机发送一次心跳包&#xff0c;如果超时则设备会认为断开了&#xff0c;停止工作并主动释放占用资源。 在相机打开后添加代码&#xff1a; #ifdef _DEBUG//设置心跳超时时间 3sObjFeatureControlPtr->GetIntFeature("GevHeartbeatTimeout")-&…

备考ICA----Istio实验19---跨网络Multi-Primary多主架构部署

备考ICA----Istio实验19—跨网络Multi-Primary多主架构部署 按照本实验&#xff0c;在 cluster1 和 cluster2 两个集群上&#xff0c;安装 Istio 控制平面&#xff0c; 且将两者均设置为主集群&#xff08;primary cluster&#xff09;。 集群 cluster1 在 network1 网络上&am…

简介:基于Web的产品3D

基于 Web 的产品 3D 通过可视化界面获得各种选项来个性化他们的产品&#xff0c;例如颜色、材料、尺寸、文字、徽标、零件等。 在过去几年中&#xff0c;随着 3D 建模和渲染软件的出现&#xff0c;3D 渲染现在更常用于营销和促销目的。设计师、制造商和营销人员使用 3D 产品渲…