为什么hadoop作业需要这么多线程?

dkqlctbz  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(357)

我对hadoop的理解是,每个计算节点上的并行性是通过为每个核心启动单独的jvm来实现的。
我观察到每个jvm拥有几十个线程,导致每个节点有数千个线程。我想不出任何理由产生这么多线程。发生什么事?
例如,下面是一个简单的pig脚本,它解析并过滤一些json:

/*
 * Get tweets with GPS
 */
REGISTER $JAR;

json_eb = LOAD '$IN_DIRS' USING com.twitter.elephantbird.pig.load.JsonLoader('-nestedLoad') as (json:map[]);

--parse json with twitter's library
parsed0 = FOREACH json_eb GENERATE  STRSPLIT(json#'id',':').$2 AS tweetId:chararray,
                                    STRSPLIT(json#'actor'#'id',':').$2 AS userId:chararray,
                                    json#'postedTime' AS postedTime:chararray,
                                    json#'geo'#'coordinates' AS gps:chararray;
parsed1 = FILTER parsed0 BY (gps IS NOT NULL);

STORE parsed1 INTO '$OUT_DIR' USING PigStorage();

我运行这个脚本,mapred用户在我的节点上启动33个进程(我有32个内核):

rfcompton@node19 ~> ps -u mapred | grep -v PID | wc -l
33

查看顶部:

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                                                    
  484 mapred    39  16 1576m 362m  18m S 130.8  0.3   0:09.48 java                                                                                                                                      
32427 mapred    34  16 1664m 369m  18m S 122.2  0.3   0:08.67 java                                                                                                                                      
32694 mapred    36  16 1502m 239m  18m S 115.6  0.2   0:07.94 java                                                                                                                                      
32218 mapred    33  16 1669m 401m  18m S 114.6  0.3   0:10.29 java  
...

JVM似乎每个都有大约40个线程:

rfcompton@node19 ~> cat /proc/484/status | grep Threads
Threads:    43

总之,mapred在32核节点上有超过1000个线程:

rfcompton@node19 ~> ps -u mapred | grep -v PID | awk '{system("cat /proc/"$1"/status")}' | grep Threads | awk '{ SUM += $2} END { print SUM }'
1655

编辑:在阅读了paul的答案所建议的hadoop-the-definal-guide中的相关部分之后,似乎40个线程是我应该期待的。它们的存在是为了通过http将Map的输出提供给作业的后期。
输出文件的分区通过http提供给reducer。用于为文件分区提供服务的工作线程数由task tracker.http.threads属性控制此设置是针对每个tasktracker的,而不是针对每个Map任务槽的。对于运行大型作业的大型集群,默认值40可能需要增加。

piztneat

piztneat1#

正如chrylis所提到的,jvm有一些gc线程,可能还有其他线程在运行。
对于用户应用程序,多线程可能非常有用。
例如,打开一个文件,读取每一行,然后进行一些处理。当线程从文件中读取数据时,cpu通常不怎么工作,因为它将花费大部分时间等待速度较慢的硬盘返回数据。通过使用多线程,可以更好地利用cpu。如果您的程序使用线程,则某些线程可能正在执行一些有用的操作,而其他线程则在等待io操作完成。
我没有使用hadoop,但是我假设在分割工作时,一个节点可能因为这个原因正在运行多个作业。它们可能还包含一些线程,用于与集群的其他部分进行协调。

lx0bsm1f

lx0bsm1f2#

我见过的所有hadoop实现都是多线程的。基本上,大多数将工作从Map任务转移到缩减器的任务是并行的,Map任务和缩减任务本身也是并行的。
在查看“hadoop-权威指南”时,作者提到了许多多线程进程。其中包括
reducer有一个小的“copier”线程池来并行获取map输出。
Map器本身可以是多线程的(multithreadedmapper)
datanodes有线程在hdfs上和hdfs外复制数据。
根据集群的配置方式,您可以在同一台机器上拥有datanodes和tasktracker,这可能会增加很多线程。
我猜大量使用并发性会带来显著的性能好处,这就是实现者走这条路的原因。

相关问题