我对在hdfs-site.xml中使用几个参数感到困惑,
dfs.namenode.handler.count—namenode的服务器线程数。dfs.datanode.handler.count—数据节点的服务器线程数。dfs.datanode.max.transfer.threads-指定用于将数据传入和传出dn的最大线程数。
我已经定好了 default datanode handler
'算作'10',其中' dfs.datanode.max.transfer.threads
'设置为'4096'。
lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 2
On-line CPU(s) list: 0,1
Thread(s) per core: 1
Core(s) per socket: 2
Socket(s): 1
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 62
Model name: Intel(R) Xeon(R) CPU E5-2640 v2 @ 2.00GHz
Stepping: 4
CPU MHz: 2000.000
BogoMIPS: 4000.00
Hypervisor vendor: VMware
Virtualization type: full
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 20480K
NUMA node0 CPU(s): 0,1
我的困惑是 1)
我有2个cpu,据我所知,我的系统一次可以服务2个线程,将datanode/namenode处理程序设置为更高的值(如“10”)有什么用?
2) 两者有什么区别 handler count
以及 maximum transfer thread
两者都用于处理?
谢谢,哈利
1条答案
按热度按时间pvabu6sv1#
1) 我有2个cpu,据我所知,我的系统一次可以服务2个线程,将datanode/namenode处理程序设置为更高的值(如“10”)有什么用?
大多数情况下,这些线程将被阻塞(休眠)等待io操作。假设平均有一个线程在99.9%的时间内处于休眠状态,那么它只消耗0.1%的cpu。您可以轻松地同时运行1000个线程。在生产中
threads
配置应该基于集群设置(每个节点的pysical核心数、磁盘吞吐量、网络吞吐量、工作负载等)如果您不确定,请使用默认值。2) 处理程序计数和用于处理的最大传输线程之间有什么区别?
dfs.datanode.handler.count
是的处理程序线程ClientDatanodeProtocol
,用于client/dn rpc传递有关块恢复元信息的信息。消息大小很小,传输速度很快,处理程序大部分时间都是空闲的,所以我们不需要太多处理程序。我们可以很容易地重复使用闲置的那个。所以默认值是10
它比transfer.threads
.dfs.datanode.max.transfer.threads
是数字DataXceiver
线程,用于通过dtp(数据传输协议)传输块。块数据很大,传输需要一些时间。1个线程将用于一个块读取。只有在整个块被转移之前,螺纹才能被重用。如果同时有许多客户机请求块,我们需要更多的线程。对于每个写连接,将有2个线程。因此,对于写绑定应用程序,这个数字应该更大。事实上
DataXceiver
线程将被阻塞,等待从磁盘读取数据或等待通过接口发送数据。因此,除了数据校验和计算之外,它不会消耗太多cpu。