reduce的个数和集群的个数和每个kafka 多机器集群的cpu个数有什么关系

当前位置: &&>> 阅读正文
View: 14,714
Author: Dong
- 359,967 阅 - 273,614 阅 - 261,862 阅 - 247,109 阅 - 245,229 阅 - 243,154 阅 - 223,098 阅 - 214,592 阅 - 211,833 阅 - 204,386 阅
collapsItems['collapsArch-'] = '
collapsItems['collapsArch-'] = '
collapsItems['collapsArch-'] = '
collapsItems['collapsArch-'] = '
collapsItems['collapsArch-'] = '
collapsItems['collapsArch-'] = '
collapsItems['collapsArch-'] = '
collapsItems['collapsArch-'] = '
collapsItems['collapsArch-'] = '
collapsItems['collapsArch-'] = '
collapsItems['collapsArch-'] = '
collapsItems['collapsArch-'] = '
collapsItems['collapsArch-'] = '
collapsItems['collapsArch-'] = '
collapsItems['collapsArch-'] = '
collapsItems['collapsArch-'] = '
collapsItems['collapsArch-'] = '
collapsItems['collapsArch-'] = '
collapsItems['collapsArch-'] = '
collapsItems['collapsArch-'] = '
collapsItems['collapsArch-'] = '
collapsItems['collapsArch-'] = '
collapsItems['collapsArch-'] = '
collapsItems['collapsArch-'] = '
collapsItems['collapsArch-'] = '
collapsItems['collapsArch-'] = '
collapsItems['collapsArch-'] = '
collapsItems['collapsArch-'] = '
collapsItems['collapsArch-'] = '
collapsItems['collapsArch-'] = '
collapsItems['collapsArch-'] = '
collapsItems['collapsArch-'] = '
collapsItems['collapsArch-'] = '
collapsItems['collapsArch-'] = '
collapsItems['collapsArch-'] = '
collapsItems['collapsArch-'] = '
collapsItems['collapsArch-'] = '
collapsItems['collapsArch-'] = '大数据(16)
作者:Mr Rex
链接:/question//answer/
来源:知乎
著作权归作者所有,转载请联系作者获得授权。
图来自官方
Spark集群的节点个数为集群的机器的数量。一个机器上有几个worker,一个woker可以申请多少core是可配置的。一个常用的配置是:
一台机器一个worker,一个woker可拥有的最大core数是机器逻辑cpu的数量。
在这种情况下,一个core就可以理解为一台机器的一个逻辑核。
而RDD的分区个数决定了这个RDD被分为多少片(partition)来执行,一个片给一个Core。
假设有一个10台机器的集群,每台机器有8个逻辑核,并按照如上的配置,那么这个spark集群的可用资源是 80个core(这里只考虑cpu,实际上还有内存)。如果一个任务申请到了集群的所有资源(所有80个core)。现在有一个被分为100个partition的RDD被map执行,那么会同时启动80个Task也就是占用了所有80个core计算(实际是启动了80个线程),剩余20个partition等待某些task完成后继续执行。
当然理论上可以给一台机器配置更多的worker和core,即使实际上机器只有80个逻辑核,但是你总共配置100个core,就可以同时跑起来100个partition了( no zuo no die )
名词和某些解释不严格的严谨,题主能明白就成。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:674次
排名:千里之外
原创:16篇
转载:12篇23073人阅读
JobConf.setNumMapTasks(n)是有意义的,结合block size会具体影响到map任务的个数,详见FileInputFormat.getSplits源码。假设没有设置mapred.min.split.size,缺省为1的情况下,针对每个文件会按照min (totalsize[所有文件总大小]/mapnum[jobconf设置的mapnum],
blocksize)为大小来拆分,并不是说文件小于block size就不去拆分。&
不知道你是要提高整个集群的map/reduce任务数,还是单个节点可并行运行的map/reduce任务数?对于前者是一般只设置reduce任务数,而map任务数是由Splits个数决定的; 对于后者,是可以在配置中设置的,分别为:mapred.tasktracker.map.tasks.maximum&
mapred.tasktracker.reduce.tasks.maximum&
另外,还有个参数mapred.jobtracker.taskScheduler.maxRunningTasksPerJob,用来控制一个job最大并行tasks数,这个是指在集群最大并行数。&
3.我的理解:具体看FileInputFormat.java的代码&
map tasks的个数只要是看splitSize,一个文件根据splitSize分成多少份就有多少个map tasks。而splitSize的计算(看FileInputFormat的源码):splitSize =&Math.max(minSize, Math.min(maxSize, blockSize));而&
minSize = Math.max(getFormatMinSplitSize(), getMinSplitSize(job));即是某种格式的文件的最小分割size(如看源码sequenceFile是2000)和整个job配置的最小分割size(即mapred-default.xml中mapred.min.split.size的值)之间的较大的那个&
maxSize是mapred.max.split.size(mapred-default.xml中竟然没有,我试了一下,在mapred-site.xml中配置覆盖也没有用,具体用法参照用参数配置:
hadoop jar /root/mahout-core-0.2.job org.apache.mahout.clustering.lda.LDADriver&-Dmapred.max.split.size=900...),如果不配置,默认值是long类型的最大值。(mapred.max.split.size不推荐配置(试))&
blockSize是即hdfs-default.xml中dfs.block.size的值,可在hdf-site.xml中覆盖.这个值必须是512的倍数,如果想要数量更多的map的tasks的个数,可以把dfs.block.size设得小一点,512,1024等等,反正上面的公式保证了即使你这个blocksize设得比某种格式的文件的最小分割size要小,最后还是选者这种格式的最小分割size,如果blocksize比它大,则选用blocksize作为splitSize的大小.&
总结:如果想要多一点的map tasks,(1)可以设置dfs.block.size小一点,sequenceFile推荐2048。。。(试)在eclipse运行时,dfs.block.size是由eclipse中mapreduce的设置(dfs.block.size)生效的,而不是hadoop的conf中的配置文件,但是如果用终端hadoop jar命令跑的话,应该是由hadoop的conf中的配置文件决定生效的&
(2)推荐: 可以分成多个sequenceFile来作为输入(把上层目录作为输入路径即可,上层目录下包括的必为清一色的sequenceFile),输入路径 &./&或指定上层目录文件名&
reduce task的个数:&
可通过job.setNumReduceTasks(n);设定。多个reduce task的话就会有多个reduce结果,part-r-00000, part-r-00001, ...part-r-0000n&
增加task的数量,一方面增加了系统的开销,另一方面增加了负载平衡和减小了任务失败的代价;map task的数量即mapred.map.tasks的参数值,用户不能直接设置这个参数。Input Split的大小,决定了一个Job拥有多少个map。默认input split的大小是64M(与dfs.block.size的默认值相同)。然而,如果输入的数据量巨大,那么默认的64M的block会有几万甚至几十万的Map Task,集群的网络传输会很大,最严重的是给Job&Tracker的调度、队列、内存都会带来很大压力。mapred.min.split.size这个配置项决定了每个
Input Split的最小值,用户可以修改这个参数,从而改变map task的数量。一个恰当的map并行度是大约每个节点10-100个map,且最好每个map的执行时间至少一分钟。&reduce task的数量由mapred.reduce.tasks这个参数设定,默认值是1。合适的reduce task数量是0.95或者0.75*(&nodes * mapred.tasktracker.reduce.tasks.maximum),&其中,mapred.tasktracker.tasks.reduce.maximum的数量一般设置为各节点cpu
core数量,即能同时计算的slot数量。对于0.95,当map结束时,所有的reduce能够立即启动;对于1.75,较快的节点结束第一轮reduce后,可以开始第二轮的reduce任务,从而提高负载均衡
由Hive来执行相关的查询
hadoop中默认的mapred.tasktracker.map.tasks.maximum设置是2
也即:每一个tasktracker同时运行的map任务数为2
照此默认设置,查询80天某用户的操作日志,耗时5mins, 45sec
经过测试,发现将mapred.tasktracker.map.tasks.maximum设置为节点的cpu cores数目或者数目减1比较合适
此时的运行效率最高,大概花费3mins, 25sec
我们现在的机器都是8核的,所以最终配置如下:
&property&
&&& &name&mapred.tasktracker.map.tasks.maximum&/name&
&&& &value&8&/value&
&&& &description&The maximum number of map tasks that will be run
&&& simultaneously by a task tracker.
&&& &/description&
&/property&
而对于mapred.map.tasks(每个job的map任务数)值,hadoop默认值也为2
可以在执行hive前,通过set mapred.map.tasks=24来设定
但由于使用hive,会操作多个input文件,所以hive默认会把map的任务数设置成输入的文件数目
即使你通过set设置了数目,也不起作用…
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:515854次
积分:5651
积分:5651
排名:第3673名
原创:72篇
转载:63篇
评论:109条
(1)(1)(1)(1)(2)(1)(1)(1)(1)(2)(5)(3)(2)(2)(5)(10)(10)(5)(5)(2)(6)(31)(6)(2)(4)(11)(6)(10)Google Chrome 32.0.1653.0
Windows 7 x64 Edition谢谢,说得这么详细,写一篇这样的内容出来要查很多的资料才行。
电子邮件 *
博文浏览排名
- 243,445 views - 220,845 views - 107,645 views - 105,661 views - 90,457 views - 66,516 views - 61,807 views - 60,248 views - 59,850 views - 56,626 views
2017年一月
9101112131415
16171819202122
23242526272829}

我要回帖

更多关于 hadoop 两台机器集群 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信