错题

1.简单描述Shuffle过程环形缓冲区的作用?

key,value从map()方法输出,被outputcollector收集通过getpartitioner()方法获取分区号,在进入环形缓冲区。默认情况下,环形缓冲区大小值为100MB。当map输入的数据进入环形缓冲区的量达到80MB以上时,那么开始执行溢写过程,溢写过程中如果有其他数据进入,那么由剩余的百分之20反向写入。溢写过程会根据key,value先进行分区,后进行排序,最终maptask溢写文件经过归并排序后落入本地磁盘,reduceTask将多个mapTask下相同分区的数据copy到不同的reduceTask中进行归并排序后一次读取一组数据给reduce()函数。

2.HDFS默认的Block块大小是多少?为什么块的大小不能设置太小,也不能设置太大?

(1)默认的块大小是128M,(2)因为HDFS的块设置太小,会增加寻址时间,程序一直在找块的开始位置;如果块设置的太大,从磁盘传输数据的时间会明显大于定位这个块开始位置所需的时间。导致程序在处理这块数据时,会非常慢。其实HDFS块的大小设置主要取决于磁盘传输速率。

3.简述Hdfs的默认副本策略?这样做有什么好处?

(1)第一个副本在客户端所处的节点上。如果客户端在集群外(意思就是执行上传的服务器不属于集群的节点),则随机再机架上选一个; (2)第二个副本和第一个副本位于相同机架随机节点上; (3)第三个副本位于不同机架,随机节点。 优点:该策略减少了机架间的写流量,通常可以提高写性能。机架故障的机会远小于节点故障的机会。所以此策略不会影响数据的可靠性和可用性保证。

4.简单描述你对Hadoop集群SafeMode模式的理解?

集群处于安全模式,不能执行重要操作(写操作),集群属于只读状态。但是严格来说,只是保证HDFS元数据信息的访问,而不保证文件的访问。集群启动完成后,自动退出安全模式, 如果集群处于安全模式,想要完成写操作,需要离开安全模式。

(1)bin/hdfs dfsadmin -safemode get (功能描述:查看安全模式状态)

(2)bin/hdfs dfsadmin -safemode enter (功能描述:进入安全模式状态)

(3)bin/hdfs dfsadmin -safemode leave (功能描述:离开安全模式状态)

(4)bin/hdfs dfsadmin -safemode wait (功能描述:等待安全模式状态)。

对于全新创建的HDFS集群,NameNode启动后不会进入安全模式,因为没有Block信息。 

5.用一句话总结Combiner的作用和意义,使用它有什么前提?

Combiner的意义就是对每一个MapTask的输出进行局部汇总,以减小网络传输量。

6.简述HDFS的文件上传流程?

1)客户端通过Distributed FileSystem模块向NameNode请求上传文件,NameNode检查目标文件是否已存在,父目录是否存在。

2)NameNode返回是否可以上传。

3)客户端请求第一个 Block上传到哪几个DataNode服务器上。

4)NameNode返回3个DataNode节点,分别为dn1、dn2、dn3。

5)客户端通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成。 6)dn1、dn2、dn3逐级应答客户端。

7)客户端开始往dn1上传第一个Block(先从磁盘读取数据放到一个本地内存缓存),以Packet为单位,dn1收到一个Packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个应答队列等待应答。

8)当一个Block传输完成之后,客户端再次请求NameNode上传第二个Block的服务器。

8[判断题]Hadoop 2.x版本中的数据块副本数可以设置为1024( b )

A. 对

B. 错

9[判断题]NodeManager主动向ResourceManager发送心跳,namenode也是主动向datanode发送心跳(b  )

A. 对

B. 错

解析:datanode向namenode发送心跳

18.下列哪些是对reduceTask阶段任务正确理解(  )

A. 对多个mapTask任务输出key,value,按照不同的分区通过网络copy到不同的reduceTask节点处理。

B. 对多个mapTask任务的输出进行合并、排序。再reduce函数中实现自己的逻辑,对输入的key、value处理,转换成新的key、value输出。

C. outputformat把reducer输出的key,value保存到文件中。

D. reduceTask阶段不会根据key进行分组和排序

[答案]A,B,C

解析:d是会

21[多选题]下面对Combiner描述正确的是(  )

A. 合理利用Combiner可以提高程序执行效率

B. Combiner的作用可以减少对本地磁盘的访问次数。

C. Combiner过程设置则执行,否则不执行,默认过程中没有执行Combiner

D. 任何情况下我们都能够使用Combiner,不会对业务又任何影响

[答案]A,B,C

解析:d用combiner的前提是不影响最终的业务逻辑

 

24[多选题]下列说法正确的是()

A. mapreduce总体上分为maptask阶段和reducetask阶段

B. shfflue阶段由maptask的后半部分和reducetask的前半部分组成

C. shfflue阶段可能会造成数据倾斜

D. shfflue阶段不会对数据进行排序和分区

[答案]A,B,C

解析:d是shfflue会对数据进行排序和分区

25[多选题]下列说法正确的是 ( )

A. inputformat阶段会对文件进行切片,切片过程是物理上的切片

B. inputformat阶段会对文件进行切片切片规则,单个文件切一片,当单个文件的大小超过128M的1.1倍时,默认按照128M进行切片

C. 切片的数量决定了maptask的数量,maptask任务并行执行

D. inputformat会将文件转换为key value输出到mapper类的map()方法

[答案]B,C,D

26[多选题]关于hadoop的序列化,下列描述正确的是()

A. 序列化就是把内存中的对象,转换成字节序列(或其他数据传输协议)以便于存储到磁盘(持久化)和网络传输。

B. 使用hadoop的序列化时我们必须实现Writable接口

C. hadoop序列化的优点紧凑、快速、支持多语言操作,只对必要的数据进行序列化

D. hadoop序列化是一个重量级的序列化框架,会附带很多额外的信息

[答案]A,B,C   

解析:D是java的序列化,Hadoop的序列化是把内存中的对象,转换成字节序列,以便于存储到磁盘和网络传输。

27[多选题]下列描述正确的是( )

A. ReduceTask默认值就是1,所以输出文件个数为一个

B. 如果数据分布不均匀,就有可能在Reduce阶段产生数据倾斜

C. 具体多少个ReduceTask,需要根据集群性能而定。

D. ReduceTask的数量越多越好,这样处理数据执行的效率越高

[答案]A,B,C

解析:d中reducerTask的数量越多,处理数据执行效率会降低

29[单选题]下面描述正确的是(  )

A. NameNode是一个中心服务器(master端),负责管理文件系统的名字空间、元数据的存储、以及客户端对文件的访问

B. DataNode负责元数据操作,文件内容相关的数据流经过会DataNode.

C. 副本存放在那些DataNode上由NameNode和DataNode协商控制分配

D. DataNode全权管理数块的存储,接受心跳信号和块状态报告

[答案]A

 

38[单选题]Hadoop项目主要包括四个模块,下面那个是描述错误(  )

A. Hadoop Common :为其他Hadoop模块提供基础设施,是其他模块的公共部分。

B. Hadoop DFS:高可靠、高吞吐量的分布式文件系统,解决海量数据的存储问题

C. Hadoop MapReduce:分布式的离线并行计算框架,解决海量数据的分析和计算问题

D. Hadoop YARN:新的MapReduce框架,监控DFS

[答案]D

44[单选题]下面对fsimage和edits描述错误的是(  )

A. FsImage文件:HDFS文件系统元数据的一个永久性的检查点,其中包含HDFS文件系统的所有目录和文件inode的序列化信息。

B. Edits文件:存放HDFS文件系统的所有更新操作的路径,文件系统客户端执行的所有写操作首先会被记录到Edits文件中。

C. DataNode启动时会加载fsimage和edits文件到内存.

D. SecondaryNode实时的辅助备份fsimage和edits,辅助NameNode,协助其完成元数据和编辑文件的合并工作

[答案]C

周总结

1.mapreduce定义和优缺点?
MapReduce是一个分布式运算程序的编程框架,是用户开发“基于Hadoop的数据分析应用”的核心框架
MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发行在一个Hadoop集群上。
优点:
1).MapReduce易于编程
它简单的实现一些接口,就可以完成一个分布式程序,这个分布式程序可以分布到大量廉价的PC机器上运行。
2).良好的扩展性
当你的计算资源不能得到满足的时候,你可以通过简单的增加机器来扩展它的计算能力。
3).高容错性
其中一台机器挂了,它可以把上面的计算任务转移到另一个节点上运行,不至于这个任务运行失败,而且这个过程不需要人工参与,而完全是由Hadoop内部完成的。
4).适合PB级以上海量数据的离线处理
可以实现上千台服务器集群并发工作,提供数据处理能力。
缺点
1)不擅长实时计算
MapReduce无法像Mysql一样,在毫秒或秒级返回结果。
2)不擅长流式计算
流式计算的输入数据是动态的,而MapReduce的输入数据是静态的,不能动态变化。这是因为MapReduce自身的设计特点决定了数据源必须是静态的。
3)不擅长DAG计算
多个应用程序存在依赖关系,后一个应用程序的输入为前一个的输出。在这种情况下,MapReduce并不是不能做,而是使用后,每一个MapReduce作业的输出结果都会写入磁盘,会造成大量的磁盘IO,导致性能非常低下。
2.mapreduce的数据类型
Java类型    Hadoop Writable类型
Boolean        BooleanWritable
Byte        ByteWritable
Int            IntWritable
Float        FloatWritable
Long        LongWritable
Double        DoubleWritable
String        Text
Map            MapWritable
Array        ArrayWritable

mapreducer工作流程:

 

 

 

 

 

 

 

1MapTask收集我们的map()方法输出的kv对,放到内存缓冲区中

2)从内存缓冲区不断溢出本地磁盘文件,可能会溢出多个文件

3)多个溢出文件会被合并成大的溢出文件

4)在溢出过程及合并的过程中,都要调用Partitioner进行分区和针对key进行排序

5ReduceTask根据自己的分区号,去各个MapTask机器上取相应的结果分区数据

6ReduceTask会取到同一个分区的来自不同MapTask的结果文件,ReduceTask会将这些文件再进行合并(归并排序)

7)合并成大文件后,Shuffle的过程也就结束了,后面进入ReduceTask的逻辑运算过程(从文件中取出一个一个的键值对Group,调用用户自定义的reduce()方法)

Shuffle机制

 

combiner合并

combiner意义:对每一个MapTask的输出进行局部汇总,以减少网络传输量。

combiner前提:不能影响最终的业务逻辑。

 

MapTask工作机制

 

 

 

 

 

1Read阶段:MapTask通过用户编写的RecordReader从输入InputSplit解析出一个个key/value

2Map阶段:该节点主要是将解析出的key/value交给用户编写map()函数处理,并产生一系列新的key/value

3Collect收集阶段:在用户编写map()函数中,当数据处理完成后,一般会调用OutputCollector.collect()输出结果。在函数内部,它会生成的key/value分区调用Partitioner并写入一个环形内存缓冲区中。

4Spill阶段:即当环形缓冲区满后,MapReduce将数据写到本地磁盘上,生成一个临时文件。需要注意的是,将数据写入本地磁盘之前,先要对数据进行一次本地排序,并在必要对数据进行合并压缩等操作

ReduceTask工作机制

 

 

1Copy阶段:ReduceTask各个MapTask上远程拷贝一片数据,并针对某一片数据,如果其大小超过一定阈值,则写到磁盘上,否则直接放到内存中。

2Merge阶段:在远程拷贝数据的同时,ReduceTask启动了两个后台线程对内存和磁盘上的文件进行合并,以防止内存使用过多或磁盘上文件过多。

3Sort阶段:按照MapReduce语义,用户编写reduce()函数输入数据是按key进行聚集的一组数据。为了key相同的数据聚在一起,Hadoop采用了基于排序的策略。由于各个MapTask已经实现对自己的处理结果进行了局部排序,因此,ReduceTask只需对所有数据进行一次归并排序即可。

4Reduce阶段:reduce()函数将计算结果写到HDFS上。

自定义OutputFormat

1)自定义一个类继承FileOutputFormat.

2)改写RecordWriter,具体改写输出数据的方法writer();

 

自定义InputFormat

1)自定义一个类继承FileInputFormat.

2)改写RecordReducer,实现一次读取一个完整文件封装为kv

3)在输出时使用SequenceFileOutPutFormat输出合并文件。

posted @ 2019-12-28 15:47  Queenie攀  阅读(575)  评论(0编辑  收藏  举报