java - Hadoop 中的线程

标签 java multithreading hadoop cpu

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

dfs.namenode.handler.count - 名称节点的服务器线程数。 dfs.datanode.handler.count - 数据节点的服务器线程数。 dfs.datanode.max.transfer.threads - 指定用于将数据传入和传出 DN 的最大线程数。

我已将“默认数据节点处理程序”设置为“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'?

大多数时候,这些线程会阻塞( hibernate )等待IO操作。假设平均 1 个线程在 99.9% 的时间内处于 sleep 状态,那么它仅消耗 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 的处理程序线程,用于客户端/DN RPC 通信有关 block 恢复元信息的信息。消息体积小,传输速度快,处理程序大部分时间都是空闲的,所以我们不需要太多的处理程序。我们可以很容易地重用空闲的那个。所以默认值是 10,比 transfer.threads 小得多。

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

实际上DataXceiver 线程会被阻塞等待从磁盘读取或等待通过接口(interface)发送数据。因此,除了数据校验和计算外,它不会消耗太多 CPU。

关于java - Hadoop 中的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38801888/

相关文章:

variables - 如何对HIVE中的变量执行算术运算?

java - @ExceptionHandler 没有被调用测试

java - 对于类 : Set Overview and Description to my classes

c - 如何从任何线程安全地使用 exit()

C# 简单的后台线程

hadoop - “Apache Oozie actions are asynchronous”的意思?

java - 如何实现Spring Jdbc来处理所有关系数据库?

java - 指定的 key 太长 - 最大 key 长度为 767 字节

multithreading - Perl 线程 - 捕获退出

java - Hadoop获取文件未找到异常