@Hadoop 试题一
单选题
1、Hadoop 的作者(C)
A:Martin Fowler #敏捷开发方法论-软件开发教父
B:Kent Beck #极限编程,测试驱动开发,实现模式
C:Doug Cutting
D:James Gosling #java之父
2、YARNWebUI 默认端口是(B)
A:50070 #50070是namenode主节点的端口号
B:8088 #hadoop的端口号
C:19888 #mapreduce程序的主机名和端口号
D:8020 #8020是namenode节点active状态下的端口号
HDFS部分常见端口号:
9000是fileSystem默认的端口号;
50090是namenode的secondarynamenode的端口号;
9083是hive数据仓库元数据metastore的端口号;
2181是zookeeper的端口号;
6379是Redis的端口号;
60010是HBASE的端口号;
8485是journalnode默认的端口号;
9092是kafka的端口号;
41414是flume监控的端口。
3、HDFS 主节点进程名称是(A)
A:NameNode 老大
B:DataNode 小弟:数据节点:存储数据块和块的校验和;定期给老大发送块报告
C:ResourceManager 负责整个集群资源的管理与调度
D:NodeManager 负责单个节点的资源管理与任务启动
4、Hadoop2.x 中HDFS 默认Block Size 的值是(C)
A:32M
B:64M 1.x的默认blocksize
C:128M
D:256M
6、YARN 上的MapReduce 实体不包括(D)
A:NodeManager
B:client
C:ResourceManager
D:JobTracker
一、经典MapReduce作业运行过程包含的实体:
①Client:客户端,提交MapReduce作业。
②JobTracker,协调作业的运行。JobTracker是一个Java应用程序,它的主类是JobTracker。
③TaskTracker,运行作业划分后的任务。TaskTracker是Java应用程序,它的主类是TaskTracker。
④分布式文件系统(一般为HDFS),用来在其他实体间共享作业文件。
二、Yarn上的MapReduce作业包含的实体:
①Client提交MapReduce作业的客户端
②ResourceManager,Yarn资源管理器,负责协调集群上计算资源的分配
③NodeManager,Yarn节点管理器,负责启动和监视集群中机器上的计算容器(container)
④MRAPPMaster,MapReduce应用程序MRAppMaster负责协调运行MapReduce作业的任务。它和MapReduce任务在容器中运行,这些容器由资源管理器分配并由节点管理器进行管理
⑤分布式文件系统,一般为HDFS,用来与其他实体间共享作业文件
5、Hadoop 目前支持很多压缩格式,(B)默认就支持切分
A:GZIP
B:BZIP2
C:SNAPPY
D:LZO
7、下列哪个属性是hdfs-site.xml 中的配置?(A)
A:dfs.replication
B:fs.defaultFS #core-site.xml
C:mapreduce.framework.name #mapred-site.xml
D:yarn.resourcemanager.address #yarn-site.xml
8、如果我们现有一个安装CDH的hadoop集群,在不修改默认配置的情况下存储200 个每个200M 的文本文件,请问最终会在集群中产生多少个数据块(包括副本)?(D)
A:200 计算:200M/128M,需要两个数据块
B:40000 默认副本数3,产生2*3=6个块
C:400 200个共200*6=1200个
D:1200
9、配置Hadoop 时,JAVA_HOME 包含在哪一个配置文件中(B)
A:hadoop-default.xml
[if !supportLists](1) [endif].core-default.xml:(在core-site.xml中配置)
①hadoop.tmp.dir,可以更改tmp目录之类的;
②fs.defaultFS,定义hdfs文件系统的主机和端口号;
③io.file.buffer.size,设置集群在进行读写操作时,缓冲区的大小。默认4K。
[if !supportLists](2) [endif].hdfs-default.xml:(在hdfs-site.xml中配置)
①dfs.namenode.name.dir,确定DFS名称节点应该在本地文件系统的何处存储名称表(fsimage)
②dfs.datanode.data.dir,用于定义DFS数据节点应将其块存储在本地文件系统的何处
③dfs.replication,DFS上的数据库的副本数,缺省值是3
④dfs.blocksize,文件系统中的块大小,以字节为单位,如134217728表示128 MB。
⑤dfs.namenode.http-address,dfs namenode web ui使用的监听地址和端口
⑥dfs.webhdfs.enabled,在namenode和datanode中启用WebHDFS (REST API)。false表示不启用。
(3).mapred-default.xml:(在mapred-default.xml中配置)
①mapreduce.framework.name,用于指定执行MapReduce作业的运行时框架。属性值可以是local,classic或yarn
②mapreduce.jobhistory.address,指定了查看运行完mapreduce程序的服务器的IPC协议的主机名和端口号
③mapreduce.jobhistory.webapp.address,指定了使用webui查看mapreduce程序的主机名和端口号
(4).yarn-default.xml:(在yarn-site.xml中配置)
①yarn.resourcemanager.hostname,用于指定resourcemanager的主机名
②yarn.resourcemanager.address,用于指定在RM中的应用程序管理器接口的地址
③yarn.resourcemanager.scheduler.address,用于指定调度程序接口的地址。
④yarn.resourcemanager.resource-tracker.address,用于指定rm下的resource-tracker的地址
⑤yarn.resourcemanager.admin.address,用于指定RM管理界面的地址。
⑥yarn.resourcemanager.webapp.address,用于指定RM的web访问的地址
B:hadoop-env.sh #配置hadoop-env.sh,显性java家目录
C:hadoop-site.xml #hadoop-site.xml已经被分离成了mapred-site.xml、core-site.xml、 hdfs-site.xml
D:configuration.xsl #Spring的@Configuration配置类???
10、在map 和reduce 函数的输入和输出类型中,必须一致的是(D)
A:map 的输入和输出
B:reduce 的输入和输出
C:map 的输入和reduce 的输出
D:map 的输出和reduce 的输入
11、关于SecondaryNameNode 哪项(C)是正确的?
A:它是NameNode 的热备
B:它是内存没有要求
C:他的目的是帮助NameNode 合并编辑日志,减少NameNode 启动时间
D:SecondaryNameNode 应与NameNode 部署到一个节点
SecondaryNameNode早期主要就是解决namenode的单点故障的,它是为了给namenode减轻压力的角色,工作职责就是定期合并磁盘元数据文件为序列化的镜像文件,以减少namenode冷启动时需要加载元数据的时间。在合并的时候也需要把之前的元数据都加载到内存,所以对内存也有一定的依赖,所以肯定不能和namenode启动在同一个节点。否则就起不到任何减轻压力的作用了。
12、MapReduce 编程模型中以下组件哪个是最后执行的?(C)
A:Mapper
B:Partitioner
C:Reducer
D:RecordReader
这四个MapReduce编程模型中的执行顺序是:recordReader --> mapper --> partitioner --> reducer
13、MapReduce 框架提供了一种序列化机制,支持这种序列化的类能够在Map
和Reduce 过程中充当键或值,以下说法错误的是?(A)
A:实现Writable 接口的类是值
B:实现WritableComparable<T>接口的类可以是值或键
C:Hadoop 的基本类型Text 并不实现WritableComparable<T>接口
D:键和值的数据类型可以超出Hadoop 自身支持的基本类型
Hadoop中的基本类型和包装类型都有可能作为MapReduce编程中的key和value,所以都必须要进行序列化,都要事先Writable,如果作为key,那就必须实现WritableComparable接口。Text类也是实现了WritableComparable接口的。
14、HDFS 的是基于流数据模式访问和处理超大文件的需求而开发的,默认的最
基本的存储单位是128M,具有高容错、高可靠性、高可扩展性、高吞吐率等特
征,适合的读写任务是?(C)
A:一次写入,少次读写
B:多次写入,少次读写
C:一次写入,多次读写
D:多次写入,多次读写
HDFS的设计初衷就是为将来的海量数据的分布式计算做铺垫的,所以HDFS是一次写入,多次读出的场景
15、与HDFS 类似的框架是(A)
A:GFS GFS是一个可扩展的分布式文件系统,用于大型的、分布式的、对大量数据进行访问的应用。
B:Spark Spark是专为大规模数据处理而设计的快速通用的计算引擎
C:Flink Flink是开源流处理框架,其核心是用Java和Scala编写的分布式流数据流引擎。
D:Hive hive是基于Hadoop的一个数据仓库工具,用来进行数据提取、转化、加载,这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。
多选题
1、下列(ACD)属于NameNode 的功能
A:提供名称查询服务
B:保存Block,汇报Block 信息
C:保存metadata 信息
D:metadata 信息在启动后会加载到内存
NN的主要功能:
①NN提供名称查询功能,它是一个Jetty服务器;
②NN保存metadata信息。包括:文件owership和permissions;文件包含哪些块;Block保存在哪个DN(由DN启动时上报);NN的metadata信息在启动后加载到内存。
DN的主要功能:
①保存Block,每个块对应一个元数据的数据信息文件。这个文件主要描述这个块属于哪个文件、第几个块等信息。
②启动DN线程时会向NN汇报Block信息。
③通过向NN发送心跳保持与其联系(3秒一次),如果NN10分钟没有收到DN的心跳,则认为其已经lost,并将其上的Block复制到其他DataNode上。
2、以下描述正确的是(ABC)?
A:SequenceFile 可以用来作为小文件的合并存储容器
B:TextInputFormat 的key 是LongWritable 类型的
TextInputFormat是默认的InputFormat。每条记录是一行输入。Key是LongWritable类型,存储该行在整个文件中的字节偏移量(不是行数),值是这行的内容,为一个Text对象。
C:CombineFileInputFormat 是抽象类
CombineFileInputFormat类继承自FileInputFormat,主要重写了List getSplits(JobContext job)方法
D:TextInputFormat 的key 是指该记录在文件中的行号
TextInputFormat它的key的值是行的偏移量,value值是行文本内容.后边的KeyValueInputFormat是根据这一行中第一个制表符划分出来的.
3、下列哪种业务场景中,可以直接使用Reducer充当Combiner使用?(ABC)
A:sum 求和
B:max 求最大值
C:count 求计数
D:avg 求平均
对combiner的理解:
combiner其实属于优化方案,由于带宽限制,应该尽量map和reduce之间的数据传输数量。它在Map端把同一个key的键值对合并在一起并计算,计算规则与reduce一致,所以combiner也可以看作特殊的Reducer。
执行combiner操作要求开发者必须在程序中设置了combiner(程序中通过job.setCombinerClass(myCombine.class)自定义combiner操作)。
Combiner组件是用来做局部汇总的,就在mapTask中进行汇总;Reducer组件是用来做全局汇总的,最终的,最后一次汇总。
哪里使用combiner?
1,map输出数据根据分区排序完成后,在写入文件之前会执行一次combine操作(前提是作业中设置了这个操作);
2,如果map输出比较大,溢出文件个数大于3(此值可以通过属性min.num.spills.for.combine配置)时,在merge的过程(多个spill文件合并为一个大文件)中前还会执行combiner操作。
【注意】不是每种作业都可以做combiner操作的,只有满足以下条件才可以:
1、Combiner 只能对 一个mapTask的中间结果进行汇总
2、如果想使用Reducer直接充当Combiner,那么必须满足: Reducer的输入和输出key-value类型是一致的。
1)处于两个不同节点的mapTask的结果不能combiner到一起
2)处于同一个节点的两个MapTask的结果不能否combiner到一起
3)求最大值、求最小值、求和、去重时可直接使用Reducer充当Combiner,但是求平均值时不能直接使用Reducer充当Combiner。
4、Namenode 在启动时自动进入安全模式,在安全模式阶段,说法正确的是(ABC)
A:安全模式目的是在系统启动时检查各个DataNode 上数据块的有效性
B:根据策略对数据块进行必要的复制或删除
C:当数据块最小百分比数满足的最小副本数条件时,会自动退出安全模式
#开启前30s从安全模式自动退出安全模式
D:文件系统允许有修改
5、以下描述正确的是(ABC)
A:输入分片InputSplit 其实是对数据的引用
在进行map计算之前,mapreduce会依据输入文件计算输入分片(input split),每一个输入分片(input split)针对一个map任务。输入分片(input split)存储的并不是数据本身,而是一个分片长度和一个记录数据的位置的数组。一个分片不是数据本身,而是可分片数据的引用(你要用它的时候,根据他的应用地址,就找到了原始文件数据);一个InputSplit 有一个以字节为单位的长度以及一组存储位置(即一组主机名).存储位置是为了让 MapReduce 系统将map 操作放在离存储位置最近的机上,而长度是为了将单元 排序以使得最大的单元能够最先得到处理,以提高效率(这也是一种贪心近似算法) 。
B:MultipleInputs 可以设置多个数据源以及它们对应的输入格式
MultipleInputs允许为每条输入路径指定InputFprmat和Mapper MultipleInputs需要不同的InputFormat, 一种InputFormat使用一种RecordReader来读取文件并返回一种Record格式的值,这就是这三个类型的关系,也是map过程中涉及的几个步骤的工具和产物。
C:可以通过重载isSplitable()方法来避免文件分片
D:ReduceTask 需要等到所有的map 输出都复制完才进行Merge ???
map和reduce task是同时启动的,很长一段时间是并存的
判断题
[if !supportLists]1、[endif]blocksize 只要配置文件中配置了,就不可以修改
错误。它可以被修改,在~/app/hadoop/etc/hadoop目录里面去配置hadoop-site.xml,它可以把系统级默认配置的hadoop-default.xml覆盖掉。
[if !supportLists]2、[endif]Hadoop 支持数据的随机读写
错误。lucene是支持随机读写的,而hdfs只支持随机读。但是HBase可以来补救。HBase提供随机读写,来解决Hadoop不能处理的问题。HBase自底层设计开始即聚焦于各种可伸缩性问题:表可以很“高”,有数十亿个数据行;也可以很“宽”,有数百万个列;水平分区并在上千个普通商用机节点上自动复制。表的模式是物理存储的直接反映,使系统有可能提高高效的数据结构的序列化、存储和检索。
3、每个MapTask 是一个线程
错误。Map Task是一个进程模型。Hadoop的MapReduce的Map Task和Reduce Task都是进程级别的;而Spark Task则是基于线程模型的。
4、HDFS 的NameNode 中保存了文件包含哪些block,以及分布在哪些节点上
错误。文件被切割哪些块?这些块(块本身+2副本=3个块)分布在哪些DN节点上?这种关系叫blockmap块映射。老大NN不会持久化存储这种映射关系(因为数据文件一直在变化),而是通过集群启动和运行时候,小弟DN定期给老大NN汇报blockreport,然后老大NN在内存中动态维护这种映射关系。
5、MapReduce 适用于PB 级别以上的海量数据的离线处理
正确。MapReduce 适用于PB 级别以上的海量数据的离线处理,而不是在线处理哟!!!
6、MapReduce计算过程中,相同的key默认情况会被发送到同一个reduce处理
正确。
mapReduce编程模型的总结:MapReduce的开发一共有八个步骤其中map阶段分为2个步骤,shuffle阶段4个步骤,reduce阶段分为2个步骤
1. Map阶段2个步骤
第一步:设置inputFormat类,将我们的数据切分成key,value对,输入到第二步
第二步:自定义map逻辑,处理我们第一步的输入数据,然后转换成新的key,value对进行输出
2. shuffle阶段4个步骤
第三步:对输出的key,value对进行分区。(相同key的数据属于同一分区)
第四步:对不同分区的数据按照相同的key进行排序
第五步:对分组后的数据进行规约(combine操作),降低数据的网络拷贝(可选步骤)
第六步:对排序后的数据进行分组,分组的过程中,将相同key的value放到一个集合当中(每组数据调用一次reduce方法)
3. reduce阶段2个步骤
第七步:对多个map的任务进行合并,排序,写reduce函数自己的逻辑,对输入的key,value对进行处理,转换成新的key,value对进行输出
第八步:设置outputformat将输出的key,value对数据进行保存到文件中。
7、HDFS 默认有三副本,所以集群上的NameNode 是不存在单节点问题的
错误,如果其中一个Namenode挂了数据不能够写入。
8、MapJoin 会产生Shuffle
错误。reducejoin才产生,正常join是在reduce端join 会经过shuffle 数据重新分区以后会产生数据倾斜。如果map join把小表缓存在内存中,直接在map端进行计算出结果,不会产生shuffle过程,可以解决数据倾斜问题。
[if !supportLists]9、 [endif]LZO 默认支持分片
错误。DEFLATE、GZIP、LZO、LZ4、Snappy都不支持默认分片;BZIP2默认支持分片。
10、MapReduce 支持读取Oracle 的数据进行处理???
正确。Oracle Table函数是稳定并可扩展的方法,在Oracle数据库内实现Map-Reduce,并且能够利用Oracle并行执行框架的扩展性。
问答题
[if !supportLists]1、 [endif]为什么Hadoop 不适合处理小文件
答:因为元数据是存储在namenode进程的内存里,内存是一定的。
(1)HDFS不适合大量小文件的存储,因namenode将文件系统的元数据存放在内存中,因此存储的文件数目受限于 namenode的内存大小。HDFS中每个文件、目录、数据块占用150Bytes。如果存放的文件数目过多的话会占用很大的内存
(2)HDFS适用于高吞吐量,而不适合低时间延迟的访问。如果同时存入大量的小文件会花费很长的时间
(3) 流式读取的方式,不适合多用户写入,以及任意位置写入。如果访问小文件,则必须从一个datanode跳转到另外一个datanode,这样大大降低了读取性能。
2、1. HDFS 文件读流程
答:hdfs 读流程对用户也是无感知的
一个块有三个副本,写的时候三个副本都需要,但是读的时候只读一个。
①Client调用FileSystem的open(filePath),与NN进行【RPC】通信。
返回这个文件的部分或者全部的block列表,也就是返回【FSDataInputStram】对象。
② Client调用【FSDataInputStram】对象的read方法,去与第一个块的最近的DN的进行读取。(块也可以看成一个副本)
读取完成后会check校验,假如ok就关闭与DN通信;假如不ok,就记录块和DN的信息,下次就不从这个节点读取,那么从第二个节点读取。然后与第二个块的最近的DN进行读取,以此类推。
假如当block的列表全部读取完成,文件还没结束,再去NN请求下一个批次的block列表。
比如:block1-1放在 dn1;block1-2放在 dn2;block1-3 放在dn3。读的时候,dn3离的最近,就先被读取:block2-1 dn3;block2-2 dn1;block2-3 dn2。
③ Client调用【FSDataInputStram】对象的close方法,关闭输入流。
2、2. HDFS 文件写流程
答:
hdfs写流程:
(1)hdfs client调用FileSystem.create(filePath)方法,去和老大NN进行【RPC】通信。
①校验:老大NN会去check检查这个文件是否已经存在、是否有权限创建这个文件等一系列校验操作。假如都校验通过,就创建一个新的文件(但这时文件是没有数据的、是不关联任何的block的)。
②计算:NN会根据文件的大小、需要的块大小、副本数等参数(当前集群的块大小128、副本数3)和当前的DN节点情况,计算出这个文件要上传多少个块(包含副本)和这些块上传到哪些DN节点。
③最终把这个信息返回给客户端【FsDataOutputStream】对象。
(2)Client调用【FsDataOutputStream】对象的write方法。
根据【副本放置策略】,将第一个块的本身写到DN1,写完复制到DN2,再写完复制到DN3.
当三个副本写完的时候,就返回一个ack package确认包给DN2,DN2接收到确认包并加上自己也写完了,发送ack package确认包给DN1,DN1接收到ack package确认包后加上DN1自己写完了,就给【FsDataOutputStream】发送ack package确认包,告诉它第一个块 三个副本都写完了。
以此类推。
(3)当所有的块全部写完,Client调用【FsDataOutputStream】对象的close方法,关闭输出流。再次调用FileSystem.complete方法,告诉NN文件写成功。
3、YARN 的执行流程
答:
①client向rm提交应用程序(作业),其中包含application master和启动命令等。
②applications manager会给这个作业,分配第一个container容器,来运行applicationmaster。
③application master就向applications manager注册,就可以在web界面查看作业的运行状态。
④application master采取轮询的方式通过【RPC】协议向resource scheduler去申请和领取资源(哪台DN机器,领取多少内存 CPU)
⑤一旦application master拿到资源列表,就和对应的DN机器进行通信,要求启动container来运行task任务。
⑥nm为task任务设置好运行的环境(container容器),将任务启动命令写在脚本里,通过脚本启动task。
⑦然后各个task任务,通过【rpc】协议向application master主程序汇报进度和状态,以此可以随时掌握task的运行状态。
当task任务运行失败,也会重启container任务。
⑧当所有的任务完成,application master向applications manager申请注销和关闭作业。
这个时候在web可以看任务是否完成,成功还是失败。
总结:
启动主程序,领取资源:①-④
运行任务,直到完成:⑤-⑧
4、请描述使用MapReduce 完成ReduceJoin 的思路
答:分别编写两个Mapper:
StudentMapper 用来读取和处理student.txt中的内容。
ScoreMapper 用来读取和处理student_scor.txt中的内容。
这两个mapper的输入都要进行到JoinReducer的reduce函数中处理。
两个mapper中输出的相同的学生信息进入到同一次reduce调用中,在其中进行关联,同时又要能标记每一条记录是来自学生信息,还是成绩信息。
还有有可能同一个学号的数据量有很大,不能在reduce中先存下来再处理,所以把学生信息的value放到前面,成绩信息放到后面。
就可以在一开始遍历values时就可以取到学生姓名,然后把姓名保存起来,后面遍历成绩信息时直接使用姓名值。
综上分析以如下方法完成此任务:
1、定义一个自定义KEY,StuentCustomKey, 属性有学生ID,和信息来源(标记此记录来源于学生信息表,还是成绩表),实现comparaTo方法,确保按学号排升序,按source排降序 (student要排在score前面)
2、StudentMapper 用来读取和处理student.txt中的内容,输出StuentCustomKey、Text。其中设置StuentCustomKey的source值为“student”
3、ScoreMapper 用来读取和处理student_scor.txt中的内容,输出StuentCustomKey、Text。其中设置StuentCustomKey的source值为“score”
4、为了保证相同学号的信息进入同一次reduce调用,要实现一个自定义GroupingComparator,实现中使用sid进行比较。(注意自定义GroupingComparator的构造)
5、MapReduce 中Combiner 的作用是什么?不适用于什么场景
答:实现combine函数,该类的主要功能是合并相同的key键,通过job.setCombinerClass()方法设置,默认为null,不合并中间结果。实现map函数
①每一个map可能会产生大量的输出,Combiner的作用就是在map端对输出先做一次合并,以减少传输到reducer的数据量。
②Combiner最基本是实现本地key的归并,Combiner具有类似本地的reduce功能。
如果不用Combiner,那么,所有的结果都是reduce完成,效率会相对低下。
使用Combiner,先完成的map会在本地聚合,提升速度。
注意:Combiner的输出是Reducer的输入,如果Combiner是可插拔的,添加Combiner绝不能改变最终的计算结果。所以Combiner只应该用于那种Reduce的输入key/value与输出key/value类型完全一致,且不影响最终结果的场景。比如累加,最大值等。
(mapreduce中的Combiner就是为了避免map任务和reduce任务之间的数据传输而设置的,Hadoop允许用户针对map task的输出指定一个合并函数。即为了减少传输到Reduce中的数据量。它主要是为了削减Mapper的输出从而减少网络带宽和Reducer之上的负载)
附一:MapReduce 算法的执行过程
(1) MapReduce框架使用InpuFormat模块做Map前的预处理,比如验证输人的格式是否符合前人定义,然后,将输入文件切分为逻料上的多个InputSplit,InputSplit是MapReduce对文件进行处理和运靠的输人单位,只是一个逻料概念,每个InputSplit并没有对文件进行实际切割,只是记录了要处理的数据的位置和长度。
(2)因为InputSplit是逻辑切分而非物理切分,所以还需要通过RecordReader (RR)根据InputSplit中的信息来处理InputSplit中的具体记录,加载数据并转换为适合Map任务读取的键值对,输入给Map任务。
(3) Map任务会根据用户自定义的映射规则,输出一系列的<key,value>作为中间结果。
(4)为了让Reduce可以并行处理Map的结果,需要对Map的输出进行一定的分区( Portition)、排序(Sort)、合并(Combine)归并(Merge)等操作,得到<key,value-list>形式的中间结果,再交给对应的Reduce 进行处理,这个过程称为Shufle。从无序的<key,value>到有序的<key,value-list>,这个过程用Shuffle (洗牌)来称呼是非常形象的。
(5) Reduce以一系列<key,value -list>中间结果作为输入,执行用户定义的逻辑,输出结果给OutputFormat模块。
(6) OutputFormat模块会验证输出目录是否已经存在以及输出结果类型是否符合配置文件中的配置类型,如果都满足,就输出Reduce 的结果到分布式文件系统。
shuffle的过程 区分合并及归并。
附二:mapreduce的流程(shuffle的sort,partitions,group)
首先是Mapreduce经过SplitInput 输入分片决定map的个数在用Record记录 key value。
然后分为以下三个流程:
Map:输入key(long类型偏移量) value(Text一行字符串)输出 key value
Shuffle:
(1)合并(merge)map输出时先输出到环形内存,当内存使用率达到60%时开始溢出写入到文件,溢出文件都是小文件,所以就要合并他们,在这个构成中就会排序,根据key值比较排序
(2) 排序(sort)如果你自定义了key的数据类型要求你的类一定是WriteableCompartor的子类,不想继承WriteableCompartor,至少实现Writeable,这时你就必须在job上设置排序比较器job.setSortCmpartorClass(MyCompartor.class);而MyCompartor.class必须继承RawCompartor的类或子类
(3) 分区(partition)会根据map输出的结果分成几个文件为reduce准备,有几个reducetask就分成几个文件,在job上设置分区器job.setPartitionerClass(MyPartition.class)Myrtition.class要继承Partitioner这个类
(4) 分组(group)分区时会调用分组器,把同一分区中的相同key的数据对应的value制作成一个iterable,并且会在sort。在job上设置分组器。Job.setGroupCompartorClass(MyGroup.class)MyGroup.class必须继承RawCompartor的类跟子类。
(上面的结果储存到本地文件中,而不是hdfs上;上面只要有完成结果,reduce就开始复制上面的结果,通过http方式。)
Reduce:
(1)输入key时map输出时的key value是分组器分的iterable
(2)输出 key value
(3)输出结果保存在hdfs上而不是本地文件中