分类 Hadoop 下的文章

Java和云计算的关系

Java是一种程序设计语言,云计算是一种新的商业计算模型和服务模式。他们实际上是没有直接关系的,但是由于Java 技术具有卓越的通用性、高效性、平台移植性和安全性,并且广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、智能手机、物联网和互联网,同时拥有全球最大的开发者专业社群。在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景,Java已经成为一个庞大而复杂的技术平台。
hadoop hadoop
Java与云计算的关系主要体现在以下几个方面:
Java在云计算中的优势:
Java使云计算更简单,Java具有简单性、兼容性、简易性、安全性、动态性、高性能、解释性、健壮性
Java与分布式计算:
基于JAVA的分布式程序设计:
基于Socket的编程
基于RMI的分布式编程
基于CORBA的分布式编程
Java与并行计算:
JDK 1.5引入java.util.cocurrent包
Java中的多线程技术实现并行计算( JET 平台)
Java SE 5 中的锁,原子量 并行容器,线程调度 以及线程执行
基于Java的分布并行计算环境Java PVM
云计算开源框架支持:
Hadoop是Java开发,很多其他的云计算相关开源软件也是由Java开发或者提供Java API
Java使得云计算的实现更为简单,而云计算让Java更有活力,找到一个新的结合点。Java在互联网应用有
着独特的优势,而云计算是基于互联网的新的商业计算模型和服务模式,两者相结合,势必创造更大价
值。

大数据热门职业薪酬榜

随着越来越多企业开始投身于大数据技术的革新洪流,对于IT专业人士的市场需求也水涨船高。时至今日,具备收集、整理、分析以及构建不同来源数据技能的人才正迎来自己职业生涯的上升期。
在当下的数字化时代,数据量的丰富程度远远超过历史上的任何时期,很多时候这种丰富程度甚至成为一种沉重的负担。企业开始将大量资源投入到云技术、移动技术以及社交媒体当中。结合这些新兴领域,再加上企业自身运营所必然产生的信息,我们发现目前需要收集的数据总量单单用“爆炸式”已经不足以形容其扩张速度。根据Kforce公司(一家总部位于佛罗里达州坦帕市的人力资源企业)的调查,伴随着数据量的节节攀升,市场对于有能力收集、整理并利用数据内容的人才显现出旺盛的需求态势。
需要强调的是,本文中所列举的所有薪酬都按照一位典型IT专业人士以每周四十小时的工作时长来计算。
一、Hadoop开发人员
Hadoop是一套基于Java的开源框架,旨在支持大规模数据集的处理流程。根据Kforce公司的调查结果,Hadoop框架中的数据及其它一系列相关技术——包括Hive、HBase、MapReduce、Pig等——都对使用者提出了很高的专业知识要求。由于受到当下数据规模的有力推动,而且事实上如果不借助规模化分布式处理机制的强大能力、企业根本无法承受由传统商务智能工具处理海量数据所带来的高昂成本及漫长的时间周期。
“纵观当前的大数据发展环境,拥有Hadoop框架使用经验的人才最受市场追捧。这些职位往往主要负责帮助企业完善其长期大数据战略并使其趋于成熟,”Kforce公司CTO Greg Jones表示。
平均年薪:15-17.5万美元
平均时薪:70美元
二、信息架构师
“大数据让整个世界对数据掌控权的重要性产生了新的认识。”Kforce公司大数据团队指出。
要充分利用企业数据优势并构建起具备可操作性的规划,相关人员必须拥有特殊的技能储备。信息架构师需要了解如何定义并记录关键性元素,同时确保以最具影响力的方式向企业解释数据内容。主数据管理、业务知识以及数据模型构成了这类从业人员必须掌握的三大关键性技能。
平均年薪:11.375-13.535万美元
平均时薪:65美元
三、ETL开发人员
企业用户的数据量以及数据类型出现爆炸式增长,因此市场也为有能力收集并整合大数据内容的专业人士提供了非常广阔的发展空间。ETL开发人员的主要工作内容在于从企业的各类不同数据源处收集数据,并创造出多种能够从中提取数据信息的途径。除此之外,他们还需要根据企业的实际需求对提取结果加以导入及修改,并最终将其添加到数据仓库当中。
“由于ETL软件行业目前已经相当成熟,这些岗位很可能会在大数据资源池当中获得最为稳定且持久的任期,包括雇员或者外包这两种方式,”Kforce公司CTO Greg Jones指出。
平均年薪:11-13万美元
平均时薪:63.02美元
四、预测分析开发人员
“预测分析如今被营销团队大量使用,旨在预测消费者的未来行为与产品的目标受众,”Kforce公司解释称。
这一角色有时候似乎与数据科学家在工作中的探索天性颇为相近,双方都需要利用企业数据研究多种“假设”场景的可能走向。这些技能高超的IT人员精于创建潜在业务场景,并懂得如何利用历史数据表现来假设并测试阈值以及未来的表现。
平均年薪:10.37-12.9万美元
平均时薪:60美元
五、可视化工具开发人员
数据规模的极度膨胀也给分析工作带来了诸多挑战。以Spotfire、Qlikview以及Tableau为代表的各类可视化工具集帮助我们直观快捷地完成数据探测工作。另外,与之相关的岗位也很可能最终趋近于通用型商务智能开发类别。根据Kforce公司的调查,Hadoop目前的人气相当高涨,同时也将成为一种全新的专业技能门类。
“这些技能在短期内将作为热门资源受到高度追捧。随着此类资源的供给与需求逐渐达到平衡,加之相关工具集的日益成熟,未来职位的薪酬水平有可能有所放缓,具备这些资源的人才也很可能转化为全职员工。”Kforce公司CTO Greg Jones表示。
平均年薪:15-17.5万美元
平均时薪:57.50美元
六、数据仓库设备专家
“这些专家专门打理数据仓库设备,例如来自Teradata、Neteeza以及Exadata公司的产品。”Kforce指出。与这类职业角色相关联的核心任务包括数据集成、管理以及利用高端设备实现性能优化等。这些专业设备用于为企业用户提供规模化并行处理(简称MPP)流程,并通过对内存、磁盘以及数据存储架构进行特殊优化来构建适合实际需求的分析处理环境。”
——Kforce公司大数据团队
平均年薪:9.795-12.36万美元
平均时薪:57.5美元
七、OLAP开发人员
在线分析处理(简称OLAP)开发人员是数据组织优化方面的专家,擅长所谓的“大卸八块”式分析。在这一流程中,数据取向关系类或者非结构化数据源,并需要根据数据内容创建三维模型——通常被称为“星状”或者“雪花状”架构,然后再打造出用户界面、保证使用者能够通过高性能预定义查询实现数据访问。
平均年薪:9.79-11.555万美元
平均时薪:55美元
八、数据科学家
作为IT业界中的组成部分,数据科学家过去曾经被称为“数据架构师”。数据科学家是另一种全新类型的技术专业人士,其主要能力在于将自身的数据组织技能融入到商业价值主张当中。这类从业者还必须具备良好的沟通技巧,从而顺利完成向IT领导者及企业高层解释数据结果的任务。这些数据科学家通常都拥有自己的一套沙箱环境,利用它实现组织数据的探索与研究,并帮助推动业务创新活动。
“一部分属于分析师、一部分属于艺术家,数据科学家这一角色需要始终保持着旺盛的好奇心、能够一直紧盯着数据及焦点趋势。这几乎像是在文艺复兴时期对发展走向加以梳理,并根据结果指导企业的经营变化,”IBM公司大数据产品副总裁Anjul Bhambhri解释道。
PS:个人认为,做数据处理的其实没什么,做数据分析的才是大数据的关键!

Hadoop权威博客

请关注Yahoo! Hadoop团队的博客(developer.yahoo.com/blogs/hadoop)。
Hadoop在eBay的应用内容是根据eBay研究人员的技术博客[2]整理而成的,其中参考了eBay分析平台开发部Anil Madan介绍的Hadoop在eBay的使用情况,大家如果想要了解Hadoop在eBay应用的更多信息,可以关注eBay研究人员的技术博客(www.ebaytechblog.com)。
百度使用Hadoop平台的情况则是根据近几届Hadoop中国云计算大会上百度研究人员的报告整理而成,大家如果想了解更详细的信息或Hadoop中国云计算大会的相关信息可登录Hadoop in China网站:http://www.hadooper.cn。
Facebook使用Hadoop的情况是根据Facebook相关技术人员在各个云计算大会上所做的报告整理而成的。
Hadoop平台上的海量数据排序的相关内容是根据Hadoop基准排序测试的报告[3],[4]撰写而成,如果大家想要了解排序基准测试的更多细节或排名情况,可以登录http://sortbenchmark.org查看。
[1] Alan Gates, Pig and Hive at Yahoo!, http://developer.yahoo.com/blog/hadoop/posts/2010/08/ pig_and_hive_at_yahoo/
[2] Anil Madan, Hadoop-The power of the Elephant, http://www.ebaytechblog.com/2010/10/29/ hadoop-the-power-of-the-elephant/
[3] Owen O扢allay, TeraByte Sort on Apache Hadoop, http://sortbenchmark.org/YahooHadoop.pdf
[4] Owen O扢allay & Arun C.Murthy, Winning a 60 Second Dash with a Yellow Elephant, http://sortbenchmark.org/Yahoo2009.pdf

HDFS在百度的使用

HDFS在百度的使用:
建议在火狐下查看
[crocodoc width=”700″ height=”500″]

mapreduce程序shell脚本运行跑多天数据

vprun.sh

sh vprun.sh 20130101 20130102

说明:参数为开始日期和结束日期,如果开始日期和结束日期是一样的话,那就是跑一天的数据

#!/bin/bash
#Filename: vprun.sh
ct=0
date=`date -d "${1} ${ct} days" +%Y%m%d`
while [[ ${2} > ${date} ]] || [[ ${2} == ${date} ]]
	do
		hadoop jar /home/yda/tianhailong/vp-0.0.1-SNAPSHOT.jar com.youku.vp.userindex.day.calculators.TDVUserVideoJoin -libjars /home/yda/tianhailong/json-lib-2.3-jdk15.jar,/home/yda/tianhailong/ezmorph-1.0.6.jar,/home/yda/tianhailong/kfs-0.3.jar,/home/yda/tianhailong/redis-0.0.1.jar,/home/yda/tianhailong/jedis-2.0.0.jar,/work/yda/video_profile/dataUtil.jar /commons/common_data/user/hive/tudou:/commons/common_data/t_dlord_info/hive:/commons/common_data/t_vuser/hive:/commons/common_data/video/hive/tudou /commons/web/vuser-video/$date/tudou $date
	let "ct += 1"
	date=`date -d "${1} ${ct} days" +%Y%m%d`
	done

Flume日志系统

           Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。
          Flume最早是Cloudera提供的日志收集系统,目前是Apache下的一个孵化项目,Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力 Flume提供了从console(控制台)、RPC(Thrift-RPC)、text(文件)、tail(UNIX tail)、syslog(syslog日志系统,支持TCP和UDP等2种模式),exec(命令执行)等数据源上收集数据的能力。
Flume采用了多Master的方式。为了保证配置数据的一致性,Flume[1]引入了ZooKeeper,用于保存配置数据,ZooKeeper本身可保证配置数据的一致性和高可用,另外,在配置数据发生变化时,ZooKeeper可以通知Flume Master节点。Flume Master间使用gossip协议同步数据。
这个和hadoop配合起来应该不错,后续研究下……

hadoop Task process exit with nonzero status of 126

通过分析hadoop 1.0.1代码,发现map/reduce task在执行的时候,hadoop系统会先把要执行的java 命令已经一些环境变量写到一个本地的sh文件taskjvm.sh中,然后使用bash -c file的方式执行这个sh脚本,如果出错当然后抛出异常,进而导致看到
Caused by: java.io.IOException: Task process exit with nonzero status of 126.
at org.apache.hadoop.mapred.TaskRunner.run(TaskRunner.java:258)
这样的错误
所以,这个exitcode实际就是bash执行时的推出代码,bash的exitcode是有特殊含义的,通过google可以知道126表明是permission的问题,具体为啥是这样的,不是很清楚了~~
上面的那个文件在创建的是权限是700(rwx——), 而这个文件在执行的过程中又被以setsid的方式exec,会不会这中间有些permission上的问题那~~~ 源码里说了,这样做是为了防止special character attacks
好吧水平有限,看不出来这里有什么竞争条件导致出现那样的错误
bash的退出码含义可以在下面的地方查到 http://tldp.org/LDP/abs/html/exitcodes.html
这个问题可以修改hadoop源码DefaultTaskControl加入重试机制,或者对task启用reuse=-1得到缓解(reuse和非reuse执行逻辑不一样),因为涉及到文件系统,不太容易根治。

hive日常积累优化技巧

一、join优化
Join查找操作的基本原则:应该将条目少的表/子查询放在 Join 操作符的左边。原因是在 Join 操作的 Reduce 阶段,位于 Join 操作符左边的表的内容会被加载进内存,将条目少的表放在左边,可以有效减少发生内存溢出错误的几率。
Join查找操作中如果存在多个join,且所有参与join的表中其参与join的key都相同,则会将所有的join合并到一个mapred程序中。
案例:
SELECT a.val, b.val, c.val FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key1) 在一个mapre程序中执行join
SELECT a.val, b.val, c.val FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key2) 在两个mapred程序中执行join
Map join的关键在于join操作中的某个表的数据量很小,案例:
SELECT /*+ MAPJOIN(b) */ a.key, a.value
FROM a join b on a.key = b.key
Mapjoin 的限制是无法执行a FULL/RIGHT OUTER JOIN b,和map join相关的hive参数:hive.join.emit.interval hive.mapjoin.size.key hive.mapjoin.cache.numrows
由于join操作是在where操作之前执行,所以当你在执行join时,where条件并不能起到减少join数据的作用;案例:
SELECT a.val, b.val FROM a LEFT OUTER JOIN b ON (a.key=b.key)
WHERE a.ds=’2009-07-07′ AND b.ds=’2009-07-07′
最好修改为:
SELECT a.val, b.val FROM a LEFT OUTER JOIN b
ON (a.key=b.key AND b.ds=’2009-07-07′ AND a.ds=’2009-07-07′)
在join操作的每一个mapred程序中,hive都会把出现在join语句中相对靠后的表的数据stream化,相对靠前的变的数据缓存在内存中。当然,也可以手动指定stream化的表:SELECT /*+ STREAMTABLE(a) */ a.val, b.val, c.val FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key1)
二、group by 优化
Map端聚合,首先在map端进行初步聚合,最后在reduce端得出最终结果,相关参数:
· hive.map.aggr = true是否在 Map 端进行聚合,默认为 True
· hive.groupby.mapaggr.checkinterval = 100000在 Map 端进行聚合操作的条目数目
数据倾斜聚合优化,设置参数hive.groupby.skewindata = true,当选项设定为 true,生成的查询计划会有两个 MR Job。第一个 MR Job 中,Map 的输出结果集合会随机分布到 Reduce 中,每个 Reduce 做部分聚合操作,并输出结果,这样处理的结果是相同的 Group By Key 有可能被分发到不同的 Reduce 中,从而达到负载均衡的目的;第二个 MR Job 再根据预处理的数据结果按照 Group By Key 分布到 Reduce 中(这个过程可以保证相同的 Group By Key 被分布到同一个 Reduce 中),最后完成最终的聚合操作。
三、合并小文件
文件数目过多,会给 HDFS 带来压力,并且会影响处理效率,可以通过合并 Map 和 Reduce 的结果文件来消除这样的影响:
· hive.merge.mapfiles = true是否和并 Map 输出文件,默认为 True
· hive.merge.mapredfiles = false是否合并 Reduce 输出文件,默认为 False
· hive.merge.size.per.task = 256*1000*1000合并文件的大小
四、Hive实现(not) in
通过left outer join进行查询,(假设B表中包含另外的一个字段 key1
select a.key from a left outer join b on a.key=b.key where b.key1 is null
通过left semi join 实现 in
SELECT a.key, a.val FROM a LEFT SEMI JOIN b on (a.key = b.key)
Left semi join 的限制:join条件中右边的表只能出现在join条件中。
五、排序优化
Order by 实现全局排序,一个reduce实现,效率低
Sort by 实现部分有序,单个reduce输出的结果是有序的,效率高,通常和DISTRIBUTE BY关键字一起使用(DISTRIBUTE BY关键字 可以指定map 到 reduce端的分发key)
CLUSTER BY col1 等价于DISTRIBUTE BY col1 SORT BY col1
六、使用分区
Hive中的每个分区都对应hdfs上的一个目录,分区列也不是表中的一个实际的字段,而是一个或者多个伪列,在表的数据文件中实际上并不保存分区列的信息与数据。Partition关键字中排在前面的为主分区(只有一个),后面的为副分区
静态分区:静态分区在加载数据和使用时都需要在sql语句中指定
案例:(stat_date=’20120625′,province=’hunan’)
动态分区:使用动态分区需要设置hive.exec.dynamic.partition参数值为true,默认值为false,在默认情况下,hive会假设主分区时静态分区,副分区使用动态分区;如果想都使用动态分区,需要设置set hive.exec.dynamic.partition.mode=nostrick,默认为strick
案例:(stat_date=’20120625′,province)
七、Distinct 使用
Hive支持在group by时对同一列进行多次distinct操作,却不支持在同一个语句中对多个列进行distinct操作。
八、Hql使用自定义的mapred脚本
注意事项:在使用自定义的mapred脚本时,关键字MAP REDUCE 是语句SELECT TRANSFORM ( … )的语法转换,并不意味着使用MAP关键字时会强制产生一个新的map过程,使用REDUCE关键字时会产生一个red过程。
自定义的mapred脚本可以是hql语句完成更为复杂的功能,但是性能比hql语句差了一些,应该尽量避免使用,如有可能,使用UDTF函数来替换自定义的mapred脚本
九、UDTF
UDTF将单一输入行转化为多个输出行,并且在使用UDTF时,select语句中不能包含其他的列,UDTF不支持嵌套,也不支持group by 、sort by等语句。如果想避免上述限制,需要使用lateral view语法,案例:
select a.timestamp, get_json_object(a.appevents, ‘$.eventid’), get_json_object(a.appenvets, ‘$.eventname’) from log a;
select a.timestamp, b.*
from log a lateral view json_tuple(a.appevent, ‘eventid’, ‘eventname’) b as f1, f2;
其中,get_json_object为UDF函数,json_tuple为UDTF函数。
UDTF函数在某些应用场景下可以大大提高hql语句的性能,如需要多次解析json或者xml数据的应用场景。
十、聚合函数count和sum
Count和sum函数可能是在hql语句中使用的最为频繁的两个聚合函数了,但是在hive中count函数在计算distinct value时支持加入条件过滤。
转自:http://in.sdo.com/?p=809

Hadoop的分块与分片

HDFS存储系统中,引入了文件系统的分块概念(block),块是存储的最小单位,HDFS定义其大小为64MB。与单磁盘文件系统相似,存储在HDFS上的文件均存储为多个块,不同的是,如果某文件大小没有到达64MB,该文件也不会占据整个块空间。在分布式的HDFS集群上,Hadoop系统保证一个块存储在一个datanode上。
当我们执行hadoop fs -put aa.txt /bb.txt,则aa.txt会被复制为集群的/bb.txt。查看系统的log日志hadoop-$username-namenode-*.log,可以看到类似于
2011-09-07 08:39:12,506 INFO org.apache.hadoop.hdfs.StateChange: BLOCK* NameSystem.addStoredBlock: blockMap updated: 127.     0.0.1:50010 is added to blk_5715489406767973176_1455 size 32
这样的信息,里面记录有分配block的元数据信息和block号(blk_5715489406767973176)。
在另一个日志中hadoop-$username-datanode-*.log可以看到对应的datanode打印出相应的log:
2011-09-07 08:39:12,495 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: Receiving block blk_5715489406767973176_145     5 src: /127.0.0.1:48492 dest: /127.0.0.1:50010
HDFS的namenode只存储整个文件系统的元数据镜像,这个镜像由配置dfs.name.dir指定,datanode则存有文件的metainfo和具体的分块,存储路径由dfs.data.dir指定。
分析完毕分块,下面讨论一下分片:
hadoop的作业在提交过程中,需要把具体的输入进行分片。具体的分片细节由InputSplitFormat指定。分片的规则为  FileInputFormat.class中的getSplits()方法指定:
long splitSize = computeSplitSize(goalSize, minSize, blockSize);
computeSplitSize:
Math.max(minSize, Math.min(goalSize, blockSize));
其中goalSize为“InputFile大小”/“我们在配置文件中定义的mapred.map.tasks”值,minsize为mapred.min.split.size,blockSize为64,所以,这个算式为取分片大小不大于block,并且不小于在mapred.min.split.size配置中定义的最小Size。
当某个分块分成均等的若干分片时,会有最后一个分片大小小于定义的分片大小,则该分片独立成为一个分片。
http://hi.baidu.com/chemical_liang/item/bd2d0163eb54d3177ddecceb

Hadoop map和reduce的个数

一般情况下,在输入源是文件的时候,一个task的map数量由splitSize来决定的,那么splitSize是由以下几个来决定的
goalSize = totalSize / mapred.map.tasks
inSize = max {mapred.min.split.size, minSplitSize}
splitSize = max (minSize, min(goalSize, dfs.block.size))
一个task的reduce数量,由partition决定。
在输入源是数据库的情况下,比如mysql,对于map的数量需要用户自己指定,比如
jobconf.set(“mapred.map.tasks.nums”,20);
如果数据源是HBase的话,map的数量就是该表对应的region数量。
map和reduce是hadoop的核心功能,hadoop正是通过多个map和reduce的并行运行来实现任务的分布式并行计算,从这个观点来看,如果将map和reduce的数量设置为1,那么用户的任务就没有并行执行,但是map和reduce的数量也不能过多,数量过多虽然可以提高任务并行度,但是太多的map和reduce也会导致整个hadoop框架因为过度的系统资源开销而使任务失败。所以用户在提交map/reduce作业时应该在一个合理的范围内,这样既可以增强系统负载匀衡,也可以降低任务失败的开销。
1 map的数量
map的数量通常是由hadoop集群的DFS块大小确定的,也就是输入文件的总块数,正常的map数量的并行规模大致是每一个Node是10~100个,对于CPU消耗较小的作业可以设置Map数量为300个左右,但是由于hadoop的没一个任务在初始化时需要一定的时间,因此比较合理的情况是每个map执行的时间至少超过1分钟。具体的数据分片是这样的,InputFormat在默认情况下会根据hadoop集群的DFS块大小进行分片,每一个分片会由一个map任务来进行处理,当然用户还是可以通过参数mapred.min.split.size参数在作业提交客户端进行自定义设置。还有一个重要参数就是mapred.map.tasks,这个参数设置的map数量仅仅是一个提示,只有当InputFormat 决定了map任务的个数比mapred.map.tasks值小时才起作用。同样,Map任务的个数也能通过使用JobConf 的conf.setNumMapTasks(int num)方法来手动地设置。这个方法能够用来增加map任务的个数,但是不能设定任务的个数小于Hadoop系统通过分割输入数据得到的值。当然为了提高集群的并发效率,可以设置一个默认的map数量,当用户的map数量较小或者比本身自动分割的值还小时可以使用一个相对交大的默认值,从而提高整体hadoop集群的效率。
2 reduece的数量
reduce在运行时往往需要从相关map端复制数据到reduce节点来处理,因此相比于map任务。reduce节点资源是相对比较缺少的,同时相对运行较慢,正确的reduce任务的个数应该是0.95或者1.75 *(节点数 ×mapred.tasktracker.tasks.maximum参数值)。如果任务数是节点个数的0.95倍,那么所有的reduce任务能够在 map任务的输出传输结束后同时开始运行。如果任务数是节点个数的1.75倍,那么高速的节点会在完成他们第一批reduce任务计算之后开始计算第二批 reduce任务,这样的情况更有利于负载均衡。同时需要注意增加reduce的数量虽然会增加系统的资源开销,但是可以改善负载匀衡,降低任务失败带来的负面影响。同样,Reduce任务也能够与 map任务一样,通过设定JobConf 的conf.setNumReduceTasks(int num)方法来增加任务个数。
3 reduce数量为0
有些作业不需要进行归约进行处理,那么就可以设置reduce的数量为0来进行处理,这种情况下用户的作业运行速度相对较高,map的输出会直接写入到 SetOutputPath(path)设置的输出目录,而不是作为中间结果写到本地。同时Hadoop框架在写入文件系统前并不对之进行排序。
http://blog.sina.com.cn/s/blog_4439f9310101bxss.html