我对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可能需要增加。
2条答案
按热度按时间piztneat1#
正如chrylis所提到的,jvm有一些gc线程,可能还有其他线程在运行。
对于用户应用程序,多线程可能非常有用。
例如,打开一个文件,读取每一行,然后进行一些处理。当线程从文件中读取数据时,cpu通常不怎么工作,因为它将花费大部分时间等待速度较慢的硬盘返回数据。通过使用多线程,可以更好地利用cpu。如果您的程序使用线程,则某些线程可能正在执行一些有用的操作,而其他线程则在等待io操作完成。
我没有使用hadoop,但是我假设在分割工作时,一个节点可能因为这个原因正在运行多个作业。它们可能还包含一些线程,用于与集群的其他部分进行协调。
lx0bsm1f2#
我见过的所有hadoop实现都是多线程的。基本上,大多数将工作从Map任务转移到缩减器的任务是并行的,Map任务和缩减任务本身也是并行的。
在查看“hadoop-权威指南”时,作者提到了许多多线程进程。其中包括
reducer有一个小的“copier”线程池来并行获取map输出。
Map器本身可以是多线程的(multithreadedmapper)
datanodes有线程在hdfs上和hdfs外复制数据。
根据集群的配置方式,您可以在同一台机器上拥有datanodes和tasktracker,这可能会增加很多线程。
我猜大量使用并发性会带来显著的性能好处,这就是实现者走这条路的原因。