Hadoop 中的线程

Threads in Hadoop

我对在 hdfs 中使用几个参数感到困惑-site.xml,

dfs.namenode.handler.count - 名称节点的服务器线程数。 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 个线程提供服务,将数据节点/名称节点处理程序设置为有什么用更高的值,例如“10”?

2) handler countmaximum transfer thread 都用于处理有什么区别?

谢谢, 哈利

1) I have 2 CPU's, As per my understanding my system will be able to serve 2 threads at a time, what is the use in setting the datanode / namenode handler to higher value like '10'?

大多数时候,这些线程会被阻塞(休眠)等待IO操作。假设平均 1 个线程在 99.9% 的时间内处于睡眠状态,那么它只消耗 0.1% cpu。您可以轻松地同时 运行 1000 个线程。在生产中,threads 配置应基于集群设置(每个节点的物理内核数、磁盘吞吐量、网络吞吐量、工作负载等)。如果不确定,请使用默认值。

2) What is the difference between handler count and maximum transfer thread both are used for processing?

dfs.datanode.handler.countClientDatanodeProtocol 的处理程序线程,用于 client/DN RPC 通信有关块恢复元信息的信息。消息体积小,传输速度快,处理程序大部分时间都是空闲的,所以我们不需要太多的处理程序。我们可以很容易地重用空闲的那个。所以默认值是 10transfer.threads.

小得多

dfs.datanode.max.transfer.threadsDataXceiver线程数,用于通过DTP(数据传输协议)传输块。块数据很大,传输需要一些时间。 1 个线程将用于读取一个块。只有在整个块被传输之前,线程才能被重用。如果同时有很多客户端请求块,我们需要更多的线程。对于每个写连接,将有 2 个线程。因此,对于写绑定应用程序,这个数字应该更大。

实际上DataXceiver 个线程将被阻塞等待从磁盘读取或等待通过接口发送数据。所以它不会消​​耗太多 cpu 除了数据校验和计算。