hadoop中的java线程

wbgh16ku  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(620)

我对在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 两者都用于处理?
谢谢,哈利

pvabu6sv

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。

相关问题