dra*_*nxo 1 java multithreading hadoop apache-pig
我对Hadoop的理解是,每个计算节点上的并行性是通过为每个核启动单独的jvms来实现的.
我观察到每个jvm拥有数十个线程,每个节点导致数千个线程.我想不出任何产生这么多线程的理由.这是怎么回事?
例如,这是一个简单的猪脚本,用于解析和过滤一些jsons:
/*
* 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();
Run Code Online (Sandbox Code Playgroud)
我运行这个脚本,mapred用户在我的节点上启动了33个进程(我有32个核心):
rfcompton@node19 ~> ps -u mapred | grep -v PID | wc -l
33
Run Code Online (Sandbox Code Playgroud)
看顶部:
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
...
Run Code Online (Sandbox Code Playgroud)
jvms似乎每个都有大约40个线程:
rfcompton@node19 ~> cat /proc/484/status | grep Threads
Threads: 43
Run Code Online (Sandbox Code Playgroud)
总而言之,mapred在32核节点上拥有超过一千个线程:
rfcompton@node19 ~> ps -u mapred | grep -v PID | awk '{system("cat /proc/"$1"/status")}' | grep Threads | awk '{ SUM += $2} END { print SUM }'
1655
Run Code Online (Sandbox Code Playgroud)
编辑:在阅读了保罗答案所建议的"Hadoop - The Definitive Guide"中的相关部分后,似乎有40个线程是我应该期待的.它们的存在是为了通过HTTP将映射的输出提供给作业的后期阶段.
输出文件的分区通过HTTP可用于Reducer.用于提供文件分区的工作线程数由task tracker.http.threads属性控制 - 此设置是每个tasktracker,而不是每个映射任务槽.对于运行大型作业的大型群集,可能需要增加默认值40.
所有hadoop实现我都看到了多线程.基本上,将工作从地图任务转移到减速器的大多数任务都是平行化的,地图任务和减少任务本身也是如此.
在检查"Hadoop - The Definitive Guide"时,作者提到了许多多线程的进程.这些包括
根据群集的配置方式,您可以在同一台计算机上安装DataNodes和TaskTrackers,这可以开始添加到很多线程中.
我猜大量使用并发性具有显着的性能优势,这就是实现者已经走这条路的原因.
归档时间: |
|
查看次数: |
846 次 |
最近记录: |