Hadoop试题一

若泽数据@Hadoop 试题一

单选题

1Hadoop 的作者(C

AMartin Fowler   #敏捷开发方法论-软件开发教父

BKent Beck      #极限编程,测试驱动开发,实现模式

CDoug Cutting   

DJames Gosling  #java之父

2YARNWebUI 默认端口是(B

A50070  # 50070是2.x版本namenode主节点的端口号(3.x版本的端口号是9870)

B8088   #8088是yarn的RM默认端口号,很容易被挖矿,因此一般情况下我们会修改端口号,在yarn.site.xml配置文件中修改。

C19888  #mapreduce程序的主机名和端口号

D8020   #8020是namenode节点active状态下的端口号,hdfs客户端访问hdfs集群的RPC通信端口,在hadoop 2.x新版本里访问hdfs filesystem的端口改为9000了。

HDFS部分常见端口号:

9000是fileSystem默认的端口号

50090namenode的secondarynamenode的端口号

9083hive数据仓库元数据metastore的端口号

2181zookeeper的端口号

6379Redis的端口号

60010HBASE的端口号

8485journalnode默认的端口号

9092kafka的端口号

41414flume监控的端口

3HDFS 主节点进程名称是(A

ANameNode 老大NameNode 是HDFS主节点名称,是老大,简称NN

NN的作用是:a.文件的名称。b.文件的目录结构、权限、大小、所属用户用户组、时。c.文件被切割哪些块----》块(块本身+2副本=3个块)分布在哪些DN节点上  blockmap 块映射nn不会持久化存储这种映射关系,是通过集群启动和运行时候,DN定期给NN汇报blockreport,然后NN在内存中动态维护这种映射关系;

BDataNode 小弟:数据节点:存储数据块和块的校验和;定期给老大发送块报告DataNode 是HDFS的数据节点,是小弟,简称DN

DN作用:a.存储数据块和块的校验和(块的校验和对比,看数据块有没有问题,有没有损坏)b.定期给NN发送块报告(块报告 blockreport)

CResourceManager yarn的管理节点,负责接收client的请求,调度DataNode,分配Container资源。

DNodeManager  yarn的从节点,负责单个节点的资源管理与任务启动

4Hadoop2.x HDFS 默认 Block Size 的值是(C

A32M 本地开发的Block大小默认值为32M

B64M   1.x的默认blocksize

C128M  现在网络带宽普遍在100M/s左右,这个值刚好能达到网络IO最佳传输比例

D256M

6YARN 上的 MapReduce 实体不包括(D

ANodeManager

Bclient

CResourceManager

DJobTracker

一、经典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,用来与其他实体间共享作业文件

5Hadoop 目前支持很多压缩格式,(B)默认就支持切分

A:GZIP  -- 压缩率比较高,而且压缩/解压速度也比较快;hadoop本身支持;有hadoop native库;linux系统都自带gzip命令;但不支持split。

B:BZIP2  -- 支持split;具有很高的压缩率,比gzip压缩率都高;hadoop本身支持。linux系统自带bzip2命令。但不支持native;压缩/解压速度慢;

C:SNAPPY  -- 高速压缩速度和合理的压缩率;支持hadoop native库。但不支持split;压缩率比gzip要低;hadoop本身不支持,需要安装;

D:LZO  -- 压缩/解压速度也比较快;支持split,是hadoop中最流行的压缩格式;支持hadoop native库;但压缩率比gzip要低一些;hadoop本身不支持,需要安装;在应用中对lzo格式的文件需要做一些特殊处理(为了支持split需要建索引,还需要指定inputformat为lzo格式)。

 hadoop包不是所有都会支持压缩的,在生产上,你一定要注意压缩的版本也就是hadoop软件包是否支持压缩。如果不支持压缩是需要自己编译压缩的。但是CDH系列是都支持的。

7、下列哪个属性是 hdfs-site.xml 中的配置?(A

A:dfs.replication  // 设置副本数

B:fs.defaultFS  // core-site.xml中配置HDFS文件系统相关的参数

C:mapreduce.framework.name   // mapred-site.xml指定mapreduce的执行引擎

D:yarn.resourcemanager.address  // yarn-site.xml中指定ResourceManager 对客户端暴露的地址。客户端通过该地址向RM提交应用程序,杀死应用程序等。

8、如果我们现有一个安装CDHhadoop集群,在不修改默认配置的情况下存 储 200 个每个 200M 的文本文件,请问最终会在集群中产生多少个数据块(包括副本)? (D

A200          计算:200M/128M,需要两个数据块

B40000             默认副本数3,产生2*3=6个块

C400               200个共200*6=1200个

D1200   

9、配置 Hadoop 时,JAVA_HOME 包含在哪一个配置文件中 (B

Ahadoop-default.xml  

  1. .core-default.xml:(在core-site.xml中配置)

①hadoop.tmp.dir,可以更改tmp目录之类的;

②fs.defaultFS,定义hdfs文件系统的主机和端口号;

③io.file.buffer.size,设置集群在进行读写操作时,缓冲区的大小。默认4K。

  1. .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访问的地址

Bhadoop-env.sh  #配置hadoop-env.sh,显性java家目录

Chadoop-site.xml  #hadoop-site.xml已经被分离成了mapred-site.xml、core-site.xml、 hdfs-site.xml

Dconfiguration.xsl  #Spring的@Configuration配置类???

10、在 map reduce 函数的输入和输出类型中,必须一致的是(D 

A:map 的输入和输出  // 默认keyin是偏移量,指定了KeyValueInputFormat的话,key是对偶值得第一个。

B:reduce 的输入和输出  // reduce得keyin这里注意有排序,涉及排序、分组等功能,可以考虑设计到reduce得key中去

C:map 的输入和 reduce 的输出

D:map 的输出和 reduce 的输入

备注:

0.map:

map的keyin就是文本每行的偏移量,valuein是每行分隔出来的每个单词。

如果设置了job.setInputFormatClass(KeyValueTextInputFormat.class),

那么keyin就是每行分隔后的第一个单词,valuein是第二个单词。

1.reduce的keyout,valueout,如果都有值,那么结果是:keyout + 空格 + valueout,或者是只有keyout或valueout。

reduce的keyin不能为NullWritable

2.map的keyout,valueout的作用:

keyout:groupby + sort。

value到reduce那边会变成:Iterable<T>。

3.总结:

要对某个字段做group by + sort,就用keyout。

不做group by要全量数据的话,keyout的值必须不重复,可以用序列化类型,也可以用主键。

4.排序:(只能发生在reduce的keyin:自动排序或实现序列化类排序,和valuein:这个相当于分区内的排序,对多个value值排序,可用集合类排序或者用自定义序列化类) 

11、关于 SecondaryNameNode 哪项(C)是正确的?

A:它是 NameNode 的热备 NNactive和NNstandby是 NameNode 的热备

B:它是内存没有要求

C:他的目的是帮助 NameNode 合并编辑日志,减少 NameNode 启动时间

DSecondaryNameNode 应与 NameNode 部署到一个节点 SecondaryNameNode 应与 NameNode 部署到不同的节点 ,万一NN挂了,SNN还有NN的备份数据

SecondaryNameNode早期主要就是解决namenode的单点故障的,它是为了给namenode减轻压力的角色,工作职责就是定期合并磁盘元数据文件为序列化的镜像文件,以减少namenode冷启动时需要加载元数据的时间。在合并的时候也需要把之前的元数据都加载到内存,所以对内存也有一定的依赖,所以肯定不能和namenode启动在同一个节点。否则就起不到任何减轻压力的作用了。

备注:

SecondaryNameNode并非 NameNode 的热备,它有两个作用,一是镜像备份,二是日志与镜像的定期合并。

Hadoop2.0的HA 机制有两个NameNode,一个是Active状态,另一个是Standby状态。两者的状态可以切换,但同时最多只有1个是Active状态。

只有Active Namenode提供对外的服务。Active NameNode和Standby NameNode之间通过NFS或者JN(JournalNode,QJM方式)来同步数据。

12MapReduce 编程模型中以下组件哪个是最后执行的? (C

AMapper

BPartitioner

CReducer

DRecordReader

这四个MapReduce编程模型中的执行顺序是:recordReader -->  mapper --> partitioner --> reducer

MR编程执行流程:

InputFormat、RecodeReader、InputSplit 、 Mapper、Combiner、Partitioner、Reducer、OutputFormat

13MapReduce 框架提供了一种序列化机制,支持这种序列化的类能够在 Map

Reduce 过程中充当键或值,以下说法错误的是? (C)!!!

A:实现 Writable 接口的类是值

B:实现 WritableComparable<T>接口的类可以是值或键

CHadoop 的基本类型 Text 并不实现 WritableComparable<T>接口

 D:键和值的数据类型可以超出 Hadoop 自身支持的基本类型

Hadoop中的基本类型和包装类型都有可能作为MapReduce编程中的key和value,所以都必须要进行序列化,都要事先Writable,如果作为key,那就必须实现WritableComparable接口。Text类也是实现了WritableComparable接口的。

14HDFS 的是基于流数据模式访问和处理超大文件的需求而开发的,默认的最

基本的存储单位是 128M,具有高容错、高可靠性、高可扩展性、高吞吐率等特

征,适合的读写任务是? (C

A:一次写入,少次读写

B:多次写入,少次读写

C:一次写入,多次读写

D:多次写入,多次读写

HDFS的设计初衷就是为将来的海量数据的分布式计算做铺垫的,所以HDFS是一次写入,多次读出的场景。HDFS是设计成适应一次写入,多次读出的场景,且不支持文件的修改。正因为如此,HDFS适合用来做大数据分析的底层存储服务,并不适合用来做网盘等应用,因为,修改不方便,有一定延迟,网络开销大,成本太高。

15、与 HDFS 类似的框架是(A

AGFS  GFS是一个可扩展的分布式文件系统,用于大型的、分布式的、对大量数据进行访问的应用。 Hadoop分布式文件系统是根据GFS(Google文件系统)的原理开发的,是GFS的简化版。

BSpark  Spark是专为大规模数据处理而设计的快速通用的计算引擎

CFlink  Flink是开源流处理框架,其核心是用Java和Scala编写的分布式流数据流引擎。

DHive  hive是基于Hadoop的一个数据仓库工具,用来进行数据提取、转化、加载,这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。

多选题

1、下列(ACD)属于 NameNode 的功能

A:提供名称查询服务

B:保存 Block,汇报 Block 信息

C:保存 metadata 信息

Dmetadata 信息在启动后会加载到内存

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)?

ASequenceFile 可以用来作为小文件的合并存储容器

BTextInputFormat key LongWritable 类型的

TextInputFormat是默认的InputFormat。每条记录是一行输入。Key是LongWritable类型,存储该行在整个文件中的字节偏移量(不是行数),值是这行的内容,为一个Text对象。

CCombineFileInputFormat 是抽象类

CombineFileInputFormat类继承自FileInputFormat,主要重写了List getSplits(JobContext job)方法

 DTextInputFormat key 是指该记录在文件中的行号

TextInputFormat它的key的值是行的偏移量,value值是行文本内容.后边的KeyValueInputFormat是根据这一行中第一个制表符划分出来的.

3、下列哪种业务场景中,可以直接使用Reducer充当Combiner使用?(ABC

Asum 求和

Bmax 求最大值

Ccount 求计数

Davg 求平均

对combiner的理解:

Reducer充当Combiner适合先局部汇总在全局汇总得场景,平均数不适用,局部求平均再汇总求平均,做了2次平均值计算,结果值不准确。

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。

4Namenode 在启动时自动进入安全模式,在安全模式阶段,说法正确的是(ABC

A:安全模式目的是在系统启动时检查各个 DataNode 上数据块的有效性

B:根据策略对数据块进行必要的复制或删除

C:当数据块最小百分比数满足的最小副本数条件时,会自动退出安全模式

 #开启前30s从安全模式自动退出安全模式

D:文件系统允许有修改

备注:namenode处于安全模式的原因:

1、NameNode发现集群中DataNode丢失达到一定比例(0.01%)时会进入安全模式,此时只允许查看数据不允许对数据进行任何操作。

2、HDFS集群即使启动正常,启动只会依旧会进入安全模式一段时间,这时你不需要理会他,稍等片刻即可。

3、集群升级维护时手动进入安全模式吗,命令如下

hadoop dfsadmin -safemode enter

4、退出安全模式:

hadoop dfsadmin -safemode leave

5、以下描述正确的是(ABC

A:输入分片 InputSplit 其实是对数据的引用

在进行map计算之前,mapreduce会依据输入文件计算输入分片(input split),每一个输入分片(input split)针对一个map任务。输入分片(input split)存储的并不是数据本身,而是一个分片长度和一个记录数据的位置的数组。一个分片不是数据本身,而是可分片数据的引用(你要用它的时候,根据他的应用地址,就找到了原始文件数据);一个InputSplit 有一个以字节为单位的长度以及一组存储位置(即一组主机名).存储位置是为了让 MapReduce 系统将map 操作放在离存储位置最近的机上,而长度是为了将单元 排序以使得最大的单元能够最先得到处理,以提高效率(这也是一种贪心近似算法) 。

BMultipleInputs 可以设置多个数据源以及它们对应的输入格式

MultipleInputs允许为每条输入路径指定InputFprmat和Mapper MultipleInputs需要不同的InputFormat, 一种InputFormat使用一种RecordReader来读取文件并返回一种Record格式的值,这就是这三个类型的关系,也是map过程中涉及的几个步骤的工具和产物。

C:可以通过重载 isSplitable()方法来避免文件分片

DReduceTask 需要等到所有的 map 输出都复制完才进行 Merge  ???

map和reduce task是同时启动的,很长一段时间是并存的

判断题

  1. blocksize 只要配置文件中配置了,就不可以修改

错误。在hdfs-site.xml文件中修改dfs.block.size参数。 重启集群后,重新上传文件到hadoop集群上,新增的文件会按照新的块大小存储,旧的不会改变。

  1. Hadoop 支持数据的随机读写

错误。lucene是支持随机读写的,而hdfs只支持随机读。但是HBase可以来补救。HBase提供随机读写,来解决Hadoop不能处理的问题。HBase自底层设计开始即聚焦于各种可伸缩性问题:表可以很“高”,有数十亿个数据行;也可以很“宽”,有数百万个列;水平分区并在上千个普通商用机节点上自动复制。表的模式是物理存储的直接反映,使系统有可能提高高效的数据结构的序列化、存储和检索。

最主要原因是HDFS的目标应用场景就是一次写入,多次读取,所以从一开始设计就没打算支持随机写。HDFS对文件的设计是按照块来设计的,一个文件被分为多个块,对于nameNode而言,只记录了文件由多少个块组成,所以此时如果修改文件内容,HDFS无法清楚地知道是对哪个块进行修改,更有甚者修改的内容需要跨块修改。

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在内存中动态维护这种映射关系。

5MapReduce 适用于 PB 级别以上的海量数据的离线处理

正确。MapReduce 适用于 PB 级别以上的海量数据的离线处理,而不是在线处理哟!!! 

MapReduce不擅长什么

   实时计算像MySQL一样,在毫秒级或者秒级内返回结果

   流式计算MapReduce的输入数据集是静态的,不能动态变化

            MapReduce自身的设计特点决定了数据源必须是静态的

DAG计算多个应用程序存在依赖关系,后一个应用程序的输入为前一个的输出

6MapReduce计算过程中,相同的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对数据进行保存到文件中。

7HDFS 默认有三副本,所以集群上的 NameNode 是不存在单节点问题的

错误,副本是针对数据冗余性的,namenode节点保存了file的元数据信息,hadoop 1.x版本,或者没配置HA的hadoop 2.x版本的是存在单节点故障风险的。

8MapJoin 会产生 Shuffle

错误。reducejoin才产生,正常join是在reduce端join 会经过shuffle 数据重新分区以后会产生数据倾斜。如果map join把小表缓存在内存中,直接在map端进行计算出结果,不会产生shuffle过程,可以解决数据倾斜问题。

  1. LZO 默认支持分片

  错误。DEFLATE、GZIP、LZO、LZ4、Snappy都不支持默认分片;BZIP2默认支持分片。

10MapReduce 支持读取 Oracle 的数据进行处理   ???

正确。Oracle Table函数是稳定并可扩展的方法,在Oracle数据库内实现Map-Reduce,并且能够利用Oracle并行执行框架的扩展性。实现OracleDataDrivenDBInputFormat这个类就可以了。

问答题

  1. 为什么 Hadoop 不适合处理小文件

答:因为元数据是存储在namenode进程的内存里,内存是一定的。

(1)HDFS不适合大量小文件的存储,因namenode将文件系统的元数据存放在内存中,因此存储的文件数目受限于 namenode的内存大小。HDFS中每个文件、目录、数据块占用150Bytes。如果存放的文件数目过多的话会占用很大的内存

(2)HDFS适用于高吞吐量,而不适合低时间延迟的访问。如果同时存入大量的小文件会花费很长的时间

(3) 流式读取的方式,不适合多用户写入,以及任意位置写入。如果访问小文件,则必须从一个datanode跳转到另外一个datanode,这样大大降低了读取性能。

21. 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方法,关闭输入流。

22. 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文件写成功。

3YARN 的执行流程

答:

①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的构造)

5MapReduce 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上而不是本地文件中

更新自:Hadoop练习题 - 简书 (jianshu.com)

  • 2
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值