2024年大数据面试题试卷_第1页
2024年大数据面试题试卷_第2页
2024年大数据面试题试卷_第3页
2024年大数据面试题试卷_第4页
2024年大数据面试题试卷_第5页
已阅读5页,还剩95页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

大数据面试題及答案汇總版

第1部分选择題1.1Hadoop选择題HDFS1.下面哪個程序负责HDFS数据存储?A.NameNode

B.Jobtracker

C.DatanodeD.secondaryNameNode

E.tasktracker2.HDFS中的block默认保留几份?A.3份B.2份C.1份D.4份3.下列哪個程序一般与NameNode在一种节點启動?A.SecondaryNameNodeB.DataNodeC.TaskTrackerD.Jobtracker4.HDFS默认BlockSize(新版本)A.32MB

B.64MBC.128MBD.256MB5.Client端上传文献的時候下列哪项對的A.数据通過NameNode传递給DataNodeB.Client

端将文献切分為

Block,依次上传C.Client只上传数据到一台DataNode,然後由NameNode负责Block复制工作6.下面与HDFS类似的框架是?A.NTFSB.FAT32C.GFSD.EXT37.的8.的集群管理1.下列哪项一般是集群的最重要瓶颈A.CPU

B.网络

C.磁盘IO

D.内存2.有关SecondaryNameNode哪项是對的的?A.它是NameNode的热备B.它對内存没有规定C.它的目的是协助

NameNode

合并编辑曰志,減少

NameNode

启動時间D.SecondaryNameNode应与NameNode布署到一种节點3.下列哪项不可以作為集群的管理?A.Puppet

B.Pdsh

C.ClouderaManager

D.Zookeeper4.配置机架感知的下面哪项對的A.假如一种机架出問題,不會影响数据讀写B.写入数据的時候會写到不一样机架的DataNode中C.MapReduce會根据机架获取离自已比较近的网络数据5.下列哪個是Hadoop运行的模式A.單机版

B.伪分布式

C.分布式6.Cloudera提供哪几种安装CDH的措施A.Clouderamanager

B.Tarball

C.Yum

D.Rpm7.1.2Hbase选择題Hbase基础1.HBase来源于哪篇博文?CATheGoogleFileSystemBMapReduceCBigTableDChubby2.下面對HBase的描述是錯误的?AA不是開源的B是面向列的C是分布式的D是一种NoSQL数据库3.HBase依托()存储底层数据AAHDFSBHadoopCMemoryDMapReduce4.HBase依赖()提供消息通信机制AAZookeeperBChubbyCRPCDSocket5.HBase依赖()提供强大的计算能力DAZookeeperBChubbyCRPCDMapReduce6.MapReduce与HBase的关系,哪些描述是對的的?B、CA两者不可或缺,MapReduce是HBase可以正常运行的保证B两者不是强关联关系,没有MapReduce,HBase可以正常运行CMapReduce可以直接访問HBaseD它們之间没有任何关系7.下面哪些选项對的描述了HBase的特性?A、B、C、DA高可靠性B高性能C面向列D可伸缩8.下面哪些概念是HBase框架中使用的?A、CAHDFSBGridFSCZookeeperDEXT39.

D1.2.2

Hbase关键1.LSM含义是?AA曰志构造合并树B二叉树C平衡二叉树D長平衡二叉树2.下面對LSM构造描述對的的是?A、CA次序存储B直接写硬盘C需要将数据Flush到磁盘D是一种搜索平衡树3.LSM更能保证哪种操作的性能?BA讀B写C随机讀D合并4.LSM的讀操作和写操作是独立的?AA是。B否。CLSM并不辨别讀和写DLSM中讀写是同一种操作5.LSM构造的数据首先存储在()。BA硬盘上B内存中C磁盘阵列中D闪存中6.HFile数据格式中的Data字段用于()。AA存储实际的KeyValue数据B存储数据的起點C指定字段的長度D存储数据块的起點7.HFile数据格式中的MetaIndex字段用于()。DAMeta块的長度BMeta块的結束點CMeta块数据内容DMeta块的起始點8.HFile数据格式中的Magic字段用于()。AA存储随机数,防止数据损壞B存储数据的起點C存储数据块的起點D指定字段的長度9.HFile数据格式中的KeyValue数据格式,下列选项描述對的的是()。A、DA是byte[]数组B没有固定的构造C数据的大小是定長的D有固定的构造10.

HFile数据格式中的KeyValue数据格式中Value部分是()。CA拥有复杂构造的字符串B字符串C二進制数据D压缩数据11.

D1.2.3

HBase高级应用简介1.HBase中的批量加载底层使用()实現。AAMapReduceBHiveCCoprocessorDBloomFilter2.HBase性能优化包括下面的哪些选项?A、B、C、DA讀优化B写优化C配置优化DJVM优化3.Rowkey设计的原则,下列哪些选项的描述是對的的?A、B、CA尽量保证越短越好B可以使用中文C可以使用字符串D自身是無序的4.HBase

构建二级索引的实現方式有哪些?

A、BAMapReduceBCoprocessorCBloomFilterDFilter5.有关HBase二级索引的描述,哪些是對的的?A、BA关键是倒排表B二级索引概念是對应Rowkey這個“一级”索引C二级索引使用平衡二叉树D二级索引使用LSM构造6.下列有关

BloomFilter

的描述對的的是?A、CA是一种很長的二進制向量和一系列随机映射函数B没有误算率C有一定的误算率D可以在BloomFilter中删除元素7.D1.2.4

HBase安装、布署、启動1.HBase官方版本可以安装在什么操作系统上?A、B、CACentOSBUbuntuCRedHatDWindows2.HBase虚拟分布式模式需要()個节點?AA1B2C3D至少3個3.HBase分布式模式最佳需要()個节點?CA1B2C3D至少4.下列哪些选项是安装HBase前所必须安装的?A、BA操作系统BJDKCShellScriptDJavaCode5.解压.tar.gz結尾的HBase压缩包使用的Linux命令是?AAtar-zxvfBtar-zxCtar-sDtar-nf6.D7.D1.3Zookeeper选择題1.3.1

Zookeeper基础1.下面与Zookeeper类似的框架是?DAProtobufBJavaCKafkaDChubby2.的3.D4.D5.D6.D7.D8.D9.d

第2部分

判断題第2部分2.1Hadoop判断題2.1.1

集群管理1.Ganglia不仅可以進行监控,也可以進行告警。(對的)解析:ganglia作為一款最常用的Linux环境中的监控软件,它擅長的的是從节點中按照顾客的需求以较低的代价采集数据。不過ganglia在预警以及发生事件後告知顾客上并不擅長。最新的ganglia已經有了部分這方面的功能。不過更擅長做警告的尚有Nagios。Nagios,就是一款精于预警、告知的软件。通過将Ganglia和Nagios组合起来,把Ganglia采集的数据作為Nagios的数据源,然後运用Nagios来发送预警告知,可以完美的实現一整套监控管理的系统。2.Nagios不可以监控Hadoop集群,由于它不提供Hadoop支持。(錯误)分析:Nagios是集群监控工具,并且是雲计算三大利器之一3.假如NameNode意外终止,SecondaryNameNode會接替它使集群继续工作。(錯误)分析:SecondaryNameNode是协助恢复,而不是替代4.ClouderaCDH是需要付费使用的。(錯误)分析:第一套付费产品是ClouderaEnterpris,ClouderaEnterprise在美国加州举行的Hadoop大會(HadoopSummit)上公開,以若干私有管理、监控、运作工具加强Hadoop的功能。收费采用合约订购方式,价格随用的Hadoop叢集大小变動。5.NameNode负责管理metadata,client端每次讀写祈求,它都會從磁盘中讀取或则會写入metadata信息并反馈client端。(錯误)分析:NameNode不需要從磁盘讀取metadata,所有数据都在内存中,硬盘上的只是序列化的成果,只有每次namenode启動的時候才會讀取。1)文献写入Client向NameNode发起文献写入的祈求。NameNode根据文献大小和文献块配置状况,返回給Client它所管理部分DataNode的信息。Client将文献划分為多种Block,根据DataNode的地址信息,按次序写入到每一种DataNode块中。2)文献讀取Client向NameNode发起文献讀取的祈求。NameNode返回文献存储的DataNode的信息。Client讀取文献信息。6.NameNode當地磁盘保留了Block的位置信息。(個人认為對的,欢迎提出其他意見)分析:DataNode是文献存储的基本單元,它将Block存储在當地文献系统中,保留了Block的Meta-data,同步周期性地将所有存在的Block信息发送給NameNode。7.DataNode通過長连接与NameNode保持通信。錯误分析:通過心跳机制。(1).長连接Client方与Server方先建立通讯连接,连接建立後不停開,然後再進行报文发送和接受。這种方式下由于通讯连接一直存在,此种方式常用于點對點通讯。(2).短连接Client方与Server每進行一次报文收发交易時才進行通讯连接,交易完毕後立即断開连接。此种方式常用于一點對多點通讯,例如多种Client连接一种Server.8.Hadoop自身具有严格的权限管理和安全措施保障集群正常运行。(錯误)9.Slave节點要存储数据,因此它的磁盘越大越好。(錯误)分析:一旦Slave节點宕机,数据恢复是一种难題10.

hadoopdfsadmin–report命令用于检测HDFS损壞块。(錯误)分析:hadoopdfsadmin-report用這個命令可以迅速定位出哪些节點down掉了,HDFS的容量以及使用了多少,以及每個节點的硬盘使用状况。當然NameNode有個http页面也可以查询,不過這個命令的输出更适合我們的脚本监控dfs的使用状况11.

Hadoop默认调度器方略為FIFO(對的)12.

集群内每個节點都应當配RAID,這样防止單磁盘损壞,影响整個节點运行。(錯误)分析:首先明白什么是RAID:磁盘阵列(RedundantArraysofIndependentDisks,RAID.,有“独立磁盘构成的具有冗余能力的阵列”之意。這句话錯误的地方在于太绝對,详细状况详细分析。題目不是重點,知识才是最重要的。由于hadoop自身就具有冗余能力,因此假如不是很严格不需要都配置RAID。13.

Hadoop环境变量中的HADOOP_HEAPSIZE用于设置所有Hadoop守护线程的内存。它默认是200GB。(錯误)分析:hadoop為各個守护進程(namenode,secondarynamenode,jobtracker,datanode,tasktracker)统一分派的内存在hadoop-env.sh中设置,参数為HADOOP_HEAPSIZE,默认為1000M。14.

DataNode初次加入cluster的時候,假如log中汇报不兼容文献版本,那需要NameNode执行―Hadoopnamenode-format‖操作格式化磁盘。(錯误)分析:這個报錯是阐明DataNode所装的Hadoop版本和其他节點不一致,应當检查DataNode的Hadoop版本

15.

D16.

D17.

的18.

D19.

的20.

D的21.

D的22.

D23.

d2.1.2

Hdfs1.BlockSize是不可以修改的。(錯误)解析:Hadoop的基础配置文献是hadoop-default.xml,默认建立一种Job的時候會建立Job的Config,Config首先讀入hadoop-default.xml的配置,然後再讀入hadoop-site.xml的配置(這個文献初始的時候配置為空),hadoop-site.xml中重要配置需要覆盖的hadoop-default.xml的系统级配置。详细配置可以参照下:<property>

<name>dfs.block.size</name>//block的大小,單位字节,背面會提到用处,必须是512的倍数,因為采用crc作文献完整性校验,默认配置512是checksum的最小單元。

<value>510</value>

<description>Thedefaultblocksizefornewfiles.</description></property>2.Hadoop支持数据的随机讀写。(錯)分析:lucene是支持随机讀写的,而hdfs只支持随机讀。不過HBase可以来补救。HBase提供随机讀写,来处理Hadoop不能处理的問題。HBase自底层设计開始即聚焦于多种可伸缩性問題:表可以很―高‖,有数拾亿個数据行;也可以很―宽‖,有数百萬個列;水平分区并在上仟個一般商用机节點上自動复制。表的模式是物理存储的直接反应,使系统有也許提高高效的数据构造的序列化、存储和检索。3.由于HDFS有多种副本,因此NameNode是不存在單點問題的。(錯误)分析:副本针對DataName而讲的

4.的5.的6.的2.1.3

MapReduce1.Hadoop是Java開发的,因此MapReduce只支持Java語言编写。(錯误)分析:支持c++等語言,需要通過接口。2.每個map槽就是一种线程。(錯误)分析:一种task對应一种线程分析:首先我們懂得什么是map槽,map槽->mapslot,mapslot只是一种逻辑值(org.apache.hadoop.mapred.TaskTracker.TaskLauncher.numFreeSlots),而不是對应著一种线程或者進程3.Mapreduce的inputsplit就是一种block。(錯误)分析:

应當是一种block数组1、运行mapred程序;

2、本次运行将生成一种Job,于是JobClient向JobTracker申請一种JobID以標识這個Job;

3、JobClient将Job所需要的资源提交到HDFS中一种以JobID命名的目录中。這些资源包括JAR包、配置文献、InputSplit、等;

4、JobClient向JobTracker提交這個Job;

5、JobTracker初始化這個Job;

6、JobTracker從HDFS获取這個Job的Split等信息;

7、JobTracker向TaskTracker分派任务;

8、TaskTracker從HDFS获取這個Job的有关资源;

9、TaskTracker启動一种新的JVM;

10、TaskTracker用新的JVM来执行Map或Reduce;

InputSplit也是一种interface,详细返回什么样的implement,這是由详细的InputFormat来决定的。InputSplit也只有两個接口函数:

longgetLength()throwsIOException;

String[]getLocations()throwsIOException;

這個interface仅仅描述了Split有多長,以及寄存這個Split的Location信息(也就是這個Split在HDFS上寄存的机器。它也許有多种replication,存在于多台机器上)。除此之外,就再没有任何直接描述Split的信息了。例如:Split對应于哪個文献?在文献中的起始和結束位置是什么?等等重要的特性都没有描述到。

為何會這样呢?由于有关Split的那些描述信息,對于MapReduce框架来說是不需要关怀的。框架只关怀Split的長度(重要用于某些记录信息)和Split的Location(重要用于Split的调度,背面會细說)。

而Split中真正重要的描述信息還是只有InputFormat會关怀。在需要讀取一种Split的時候,其對应的InputSplit會被传递到InputFormat的第二個接口函数getRecordReader,然後被用于初始化一种RecordReader,以解析输入数据。也就是說,描述Split的重要信息都被隐藏了,只有详细的InputFormat自已懂得。它只需要保证getSplits返回的InputSplit和getRecordReader所关怀的InputSplit是同样的implement就行了。這就給InputFormat的实現提供了巨大的灵活性。4.的5.的6.的7.D8.的第3部分

论述題第3部分3.1Hadoop论述題3.1.1

Hadoop布署1.hdfs的体系构造解答:hdfs有namenode、secondraynamenode、datanode构成。為n+1模式namenode负责管理datanode和记录元数据secondraynamenode负责合并曰志datanode负责存储数据

2.简要描述怎样安装配置一种apache開原本hadoop,只描述即可,無需列出完整环节,能列出环节更好。流程:1.创立hadoop顾客2.修改IP3.安装JDK,并配置环境变量4.修改host文献映射5.安装SSH,配置無秘钥通信6.上传解压hadoop安装包7.配置conf文献夹下的hadoop-env.sh、core-site.xlmapre-site.xml、hdfs-site.xml8.配置hadoop的环境变量9.Hadoopnamenode-format10.start-all3.启動hadoop集群時报下图錯误,分析什么原因:解答:1、权限問題,也許曾經用root启動過集群。(例如hadoop搭建的集群,是tmp/hadoop-hadoop/.....)2、也許是文献夹不存在3、处理:删掉tmp下的那個文献,或改成目前顾客

4.請列出hadoop的進程名称解答:1.namenode:管理集群,并记录datanode文献信息。2.Secondname:可以做冷备,對一定范围内的数据做快照性备份。3.Datanode:存储数据。4.Jobtracker:管理任务,并将任务分派給tasktracker。5.Tasktracker:任务执行者

5.Hadoop的关键配置是什么?解答:Hadoop的关键配置通過两個xml文献来完毕:1.hadoop-default.xml;2.hadoop-site.xml。這些文献都使用xml格式,因此每個xml中均有某些属性,包括名称和值,不過當下這些文献都已不复存在。6.那當下又该怎样配置?解答:Hadoop目前拥有3個配置文献:1,core-site.xml;2,hdfs-site.xml;3,mapred-site.xml。這些文献都保留在conf/子目录下。7.“jps”命令的用处?解答:這個命令可以检查Namenode、Datanode、TaskTracker、JobTracker与否正常工作。

8.简要描述怎样安装配置一种apache開源版hadoop,描述即可,列出环节更好解答:9.請列出正常工作的hadoop集群中hadoop都需要启動哪些進程,他們的作用分别是什么?解答:10.

启動hadoop报如下錯误,该怎样处理?errororg.apacheorg.apachenDirectory/tmp/hadoop-root/dfs/nameisinaninconsistentstatestoragedirectiondoesnotexistorisnotaccessible?11.

請写出如下执行命令1)杀死一种job?2)删除hdfs上的/tmp/aaa目录3)加入一种新的存储节點和删除一种计算节點需要刷新集群状态命令?解答:hadoopjob-list记录job-id、hadoopjob-killjob-id

hadoopfs-rmr/tmp/aaa

添加新节點:hadoop-daemon.shstartdatanodehadoop-daemon.shstarttasktracker

移除一种节點:hadoopmradmin-refreshnodeshadoopdfsadmin-refreshnodes12.

請列出你所懂得的hadoop调度器,并简要阐明其工作措施?解答:1.FIFOschedular:默认,先進先出的原则2.Capacityschedular:计算能力调度器,选择占用最小,优先级高的先执行,以此类推。3.Fairschedular:公平调度,所有的job具有相似的资源。13.

請列出在你此前工作中所使用過的開发mapreduce的語言?解答:14.

你认為用Java,Streaming,pipe方式開发mapreduce,各有哪些优缺陷?解答:15.

hadoop框架中怎么来优化解答:(1)

從应用程序角度進行优化。由于mapreduce是迭代逐行解析数据文献的,怎样在迭代的状况下,编写高效率的应用程序,是一种优化思绪。(2)

對Hadoop参数進行调优。目前hadoop系统有190多种配置参数,怎样调整這些参数,使hadoop作业运行尽量的快,也是一种优化思绪。(3)從系统实現角度進行优化。這种优化难度是最大的,它是從hadoop实現机制角度,发現目前Hadoop设计和实現上的缺陷,然後進行源码级地修改。该措施虽难度大,但往往效果明显。(4)linux内核参数调整1.使用自定义Writable自带的Text很好用,不過字符串转换開销较大,故根据实际需要自定义Writable,注意作為Key時要实現WritableCompareable接口防止output.collect(newText(),newText())倡导key.set()value.set()output.collect(key,value)前者會产生大量的Text對象,使用完後Java垃圾回收器會花费大量的時间去搜集這些對象

2.使用StringBuilder不要使用FormatterStringBuffer(

线程安全)StringBuffer尽量少使用多种append措施,合适使用+

3.使用DistributedCache加载文献例如配置文献,詞典,共享文献,防止使用static变量

4.充足使用CombinerParttitionerComparator。Combiner:對map任务進行當地聚合Parttitioner:合适的Parttitioner防止reduce端负载不均Comparator:二次排序例如求每天的最大气温,map成果為曰期:气温,若气温是降序的,直接取列表首元素即可

5.使用自定义InputFormat和OutputFormat

6.MR应防止

静态变量:不能用于计数,应使用Counter

大對象:MapList

递归:防止递归深度過大

超長正则体現式:消耗性能,要在map或reduce函数外编译正则体現式

不要创立當地文献:变向的把HDFS裏面的数据转移到TaskTracker,占用网络带宽

不要大量创立目录和文献

不要大量使用System.out.println,而使用Logger

不要自定义過多的Counter,最佳不要超過100個

不要配置過大内存,mapred.-Xmxm是用来设置mapreduce任务使用的最大heap量

7.有关map的数目map数目過大[创立和初始化map的開销],一般是由大量小文献导致的,或者dfs.block.size设置的太小,對于小文献可以archive文献或者Hadoopfs-merge合并成一种大文献.map数目過少,导致單個map任务执行時间過長,频繁推测执行,且轻易内存溢出,并行性优势不能体現出来。dfs.block.size一般為256M-512M压缩的Text文献是不能被分割的,因此尽量使用SequenceFile,可以切分

8.有关reduce的数目reduce数目過大,产生大量的小文献,消耗大量不必要的资源,reduce数目過低呢,导致数据倾斜問題,且一般不能通過修改参数变化。可选方案:mapred.reduce.tasks设為-1变成AutoReduce。Key的分布,也在某种程度上决定了Reduce数目,因此要根据Key的特點设计相對应的Parttitioner防止数据倾斜

9.Map-side有关参数优化io.sort.mb(100MB.:一般k個maptasks會對应一种buffer,buffer重要用来缓存map部分计算成果,并做某些预排序提高map性能,若map输出成果较大,可以调高這個参数,減少map任务進行spill任务個数,減少I/O的操作次数。若map任务的瓶颈在I/O的话,那么将會大大提高map性能。怎样判断map任务的瓶颈?io.sort.spill.percent(0.8):spill操作就是當内存buffer超過一定阈值(這裏一般是比例)的時候,會将buffer中得数据写到Disk中。而不是等buffer满後在spill,否则會导致map的计算任务等待buffer的释放。一般来說,调整io.sort.mb而不是這個参数。io.sort.factor(10):map任务會产生诸多的spill文献,而map任务在正常退出之前會将這些spill文献合并成一种文献,即merger過程,缺省是一次合并10個参数,调大io.sort.factor,減少merge的次数,減少DiskI/O操作,提高map性能。:一般為了減少map和reduce数据传播量,我們會制定一种combiner,将map成果進行當地汇集。這裏combiner也許在merger之前,也也許在其之後。那么什么時候在其之前呢?當spill個数至少為bine指定的数目時同步程序指定了Combiner,Combiner會在其之前运行,減少写入到Disk的数据量,減少I/O次数。

10.压缩(時间换空间)MR中的数据無论是中间数据還是输入输出成果都是巨大的,若不使用压缩不仅挥霍磁盘空间且會消耗大量网络带宽。同样在spill,merge(reduce也對有一种merge)亦可以使用压缩。若想在cpu時间和压缩比之间寻找一种平衡,LzoCodec比较适合。一般MR任务的瓶颈不在CPU而在于I/O,因此大部分的MR任务都适合使用压缩。

11.reduce-side有关参数优化reduce:copy->sort->reduce,也称shufflemapred.reduce.parellel.copies(5):任一种map任务也許包括一种或者多种reduce所需要数据,故一种map任务完毕後,對应的reduce就會立即启動线程下载自已所需要的数据。调大這個参数比较适合map任务比较多且完毕時间比较短的Job。mapred.reduce.copy.backoff:reduce端從map端下载数据也有也許由于网络故障,map端机器故障而失败。那么reduce下载线程肯定不會無限等待,當等待時间超過mapred.reduce.copy.backoff時,便放弃,尝试從其他地方下载。需注意:在网络状况比较差的环境,我們需要调大這個参数,防止reduce下载线程被误判為失败。io.sort.factor:recude将map成果下载到當地時,亦需要merge,假如reduce的瓶颈在于I/O,可尝试调高增長merge的并发吞吐,提高reduce性能、.input.buffer.percent(0.7):reduce從map下载的数据不會立即就写到Disk中,而是先缓存在内存中,mapred.job.shuffle.input.buffer.percent指定内存的多少比例用于缓存数据,内存大小可通過mapred.child.java.opts来设置。和map类似,buffer不是等到写满才往磁盘中写,也是抵达阈值就写,阈值由mapred.job,shuffle.merge.percent来指定。若Reduce下载速度很快,轻易内存溢出,合适增大這個参数對增長reduce性能有些协助。.input.buffer.percent(0):當Reduce下载map数据完毕之後,就會開始真正的reduce的计算,reduce的计算必然也是要消耗内存的,那么在讀物reduce所需要的数据時,同样需要内存作為buffer,這個参数是决定多少的内存比例作為buffer。默认為0,也就是說reduce所有從磁盘讀数据。若redcue计算任务消耗内存很小,那么可以设置這個参数不小于0,使一部分内存用来缓存数据。

16.

從应用程序角度進行优化解答:(1)防止不必要的reduce任务假如mapreduce程序中reduce是不必要的,那么我們可以在map中处理数据,Reducer设置為0。這样防止了多出的reduce任务。(2)為job添加一种Combiner為job添加一种combiner可以大大減少shuffle阶段從maptask拷贝給遠程reducetask的数据量。一般而言,combiner与reducer相似。(3)根据处理数据特性使用最适合和简洁的Writable类型Text對象使用起来很以便,但它在由数值转换到文本或是由UTF8字符串转换到文本時都是低效的,且會消耗大量的CPU時间。當处理那些非文本的数据時,可以使用二進制的Writable类型,如IntWritable,FloatWritable等。二進制writable好处:防止文献转换的消耗;使maptask中间成果占用更少的空间。(4)重用Writable类型诸多MapReduce顾客常犯的一种錯误是,在一种map/reduce措施中為每個输出都创立Writable對象。例如,你的Wordcoutmapper措施也許這样写:

publicvoidmap(...){

for(Stringword:words){

output.collect(newText(worD.,newIntWritable(1));

}}這样會导致程序分派出成仟上萬個短周期的對象。Java垃圾搜集器就要為此做诸多的工作。更有效的写法是:classMyMapper…{

TextwordText=newText();

IntWritableone=newIntWritable(1);

publicvoidmap(...){

for(Stringword:words){wordText.set(worD.;output.collect(wordText,one);

}

}}(5)使用StringBuffer而不是String當需要對字符串進行操作時,使用StringBuffer而不是String,String是read-only的,假如對它進行修改,會产生临時對象,而StringBuffer是可修改的,不會产生临時對象。17.

datanode在什么状况下不會备份解答:當分备份数為1時。18.

combiner出目前那個過程解答:出目前map阶段的map措施後。19.

3個datanode中有一种datanode出現錯误會怎样?解答:這個datanode的数据會在其他的datanode上重新做备份。20.

描述一下hadoop中,有哪些地方使用了缓存机制,作用分别是什么?解答:

21.

怎样确定hadoop集群的健康状态解答:

22.

hadoop的namenode宕机,怎么处理解答:先分析宕机後的损失,宕机後直接导致client無法访問,内存中的元数据丢失,不過硬盘中的元数据应當還存在,假如只是节點挂了,重启即可,假如是机器挂了,重启机器後看节點与否能重启,不能重启就要找到原因修复了。不過最终的处理方案应當是在设计集群的初期就考虑到這個問題,做namenode的HA。

23.

一种datanode宕机,怎么一种流程恢复解答:Datanode宕机了後,假如是短暂的宕机,可以实現写好脚本监控,将它启動起来。假如是長時间宕机了,那么datanode上的数据应當已經被备份到其他机器了,那這台datanode就是一台新的datanode了,删除他的所有数据文献和状态文献,重新启動。24.

的25.

D26.

的27.

的28.

的29.

的30.

d3.1.2

Hadoop原理1.請简述hadoop怎么样实現二级排序?解答:在Reduce阶段,先對Key排序,再對Value排序最常用的措施是将Value放到Key中,实現一种组合Key,然後自定义Key排序规则(為Key实現一种WritableComparable)。2.怎样使用MapReduce实現两個表join,可以考虑一下几种状况:(1)一种表大,一种表小(可放到内存中);(2)两個表都是大表?解答:第一种状况比较简朴,只需将小表放到DistributedCache中即可;第二种状况常用的措施有:map-sidejoin(规定输入数据有序,一般顾客Hbase中的数据表连接),reduce-sidejoin,semijoin(半连接)3.MapReduce中排序发生在哪几种阶段?這些排序与否可以防止?為何?解答:一种MapReduce作业由Map阶段和Reduce阶段两部分构成,這两阶段會對数据排序,從這個意义上說,MapReduce框架本质就是一种DistributedSort。在Map阶段,在Map阶段,MapTask會在當地磁盘输出一种按照key排序(采用的是迅速排序)的文献(中间也許产生多种文献,但最终會合并成一种),在Reduce阶段,每個ReduceTask會對收到的数据排序,這样,数据便按照Key提成了若干组,之後以组為單位交給reduce()处理。诸多人的误解在Map阶段,假如不使用Combiner便不會排序,這是錯误的,不管你用不用Combiner,MapTask均會對产生的数据排序(假如没有ReduceTask,则不會排序,实际上Map阶段的排序就是為了減轻Reduce端排序负载)。由于這些排序是MapReduce自動完毕的,顾客無法控制,因此,在hadoop1.x中無法防止,也不可以关闭,但hadoop2.x是可以关闭的。

4.請简述mapreduce中,combiner,partition作用?解答:combiner是reduce的实現,在map端运行计算任务,減少map端的输出数据。作用就是优化。不過combiner的使用場景是mapreduce的map输出成果和reduce输入输出同样。

partition的默认实現是hashpartition,是map端将数据按照reduce個数取余,進行分区,不一样的reduce来copy自已的数据。partition的作用是将数据分到不一样的reduce進行计算,加紧计算效果。

1、combiner最基本是实現當地key的聚合,對map输出的key排序,value進行迭代。如下所示:map:(K1,V1)→list(K2,V2)combine:(K2,list(V2))→list(K2,V2)reduce:(K2,list(V2))→list(K3,V3)2、combiner還具有类似當地的reduce功能.例如hadoop自带的wordcount的例子和找出value的最大值的程序,combiner和reduce完全一致。如下所示:map:(K1,V1)→list(K2,V2)combine:(K2,list(V2))→list(K3,V3)reduce:(K3,list(V3))→list(K4,V4)3、假如不用combiner,那么,所有的成果都是reduce完毕,效率會相對低下。使用combiner,先完毕的map會在當地聚合,提高速度。4、對于hadoop自带的wordcount的例子,value就是一种叠加的数字,因此map一結束就可以進行reduce的value叠加,而不必要等到所有的map結束再去進行reduce的value叠加。combiner使用的合适,可以在满足业务的状况下提高job的速度,假如不合适,则将导致输出的成果不對的。

5.解释―hadoop‖和―hadoop生态系统‖两個概念解答:6.阐明Hadoop2.0的基本构成解答:分别阐明hdfs,yarn,mapreduce7.相比于HDFS1.0,HDFS2.0最重要的改善在哪几方面?解答:8.试使用―环节1,环节2,环节3…..‖阐明YARN中运行应用程序的基本流程解答:9.―MapReduce2.0‖与―YARN‖与否等同,尝试解释阐明解答:10.

MapReduce2.0中,MRAppMaster重要作用是什么,MRAppMaster怎样实現任务容錯的?解答:11.

hdfs原理,以及各個模块的职责解答:12.

mr的工作原理解答:Map—combiner—partition—sort—copy—sort—grouping—reduce13.

map措施是怎样调用reduce措施的解答:14.

shell怎样判断文献与否存在,假如不存在该怎样处理?解答:15.

fsimage和edit的区别?解答:16.

hadoop1和hadoop2的区别?解答:17.

hdfs中的block默认报錯几份?解答:18.

哪個程序一般与nn在一种节點启動?并做分析解答:19.

列举几种配置文献优化?解答:20.

datanode初次加入cluster的時候,假如log汇报不兼容文献版本,那需要namenode执行格式化操作,這样处理的原因是?解答:21.

用mapreduce怎么处理数据倾斜問題?解答:数据倾斜:map/reduce程序执行時,reduce节點大部分执行完毕,不過有一种或者几种reduce节點运行很慢,导致整個程序的处理時间很長,這是由于某一种key的条数比其他key多诸多(有時是百倍或者仟倍之多),這条key所在的reduce节點所处理的数据量比其他节點就大诸多,從而导致某几种节點迟迟运行不完,此称之為数据倾斜。

用hadoop程序進行数据关联時,常碰到数据倾斜的状况,這裏提供一种处理措施。自已实現partition类,用key和value相加取hash值:方式1:源代码:public

int

getPartition(K

key,V

value,

int

numReduceTasks){

return

(key.hashCode()&Integer.MAX_VALUE)%

numReduceTasks;

}修改後public

int

getPartition(K

key,V

value,

int

numReduceTasks){

return

(((key).hashCode()+value.hashCode())

&Integer.MAX_VALUE)%

numReduceTasks;

}

方式2:public

class

HashPartitioner<K,V>

extends

Partitioner<K,V>{private

int

aa=0;

/**Use

{@linkObject#hashCode()}

topartition.*/

public

int

getPartition(K

key,V

value,

int

numReduceTasks){

return

(key.hashCode()+(aa++)&Integer.MAX_VALUE)%

numReduceTasks;

}

22.

談談数据倾斜,怎样发生的,并給出优化方案解答:23.

mapreduce基本执行過程解答:24.

談談hadoop1和hadoop2的区别解答:25.

hadoop中Combiner的作用?解答:combiner是reduce的实現,在map端运行计算任务,減少map端的输出数据。作用就是优化。不過combiner的使用場景是mapreduce的map和reduce输入输出同样。26.

Mapreduce的map数量和reduce数量怎么确定,怎么配置解答:map的数量有数据块决定,reduce数量随便配置。27.

在hadoop中文献的压缩带来了两大好处:解答:(1)它減少了存储文献所需的空间;(2)加紧了数据在网络上或者從磁盘上或到磁盘上的传播速度;28.

mapreduce的调度模式解答:一种MapReduce作业的生命周期大体分為5個阶段

【1】

:1.

作业提交与初始化2.

任务调度与监控3.任务运行环境准备4.任务执行5.作业完毕我們假设JobTracker已經启動,那么调度器是怎么启動的?JobTracker在启動時有如下代码:JobTrackertracker=startTracker(newJobConf());tracker.offerService();其中offerService措施负责启動JobTracker提供的各個服务,有這样一行代码:taskScheduler.start();taskScheduler即為任务调度器。start措施是抽象类TaskScheduler提供的接口,用于启動调度器。每個调度器类都要继承TaskScheduler类。回忆一下,调度器启動時會将各個监听器對象注册到JobTracker,以FIFO调度器JobQueueTaskScheduler為例:@Override

publicsynchronizedvoidstart()throwsIOException{

super.start();

taskTrackerManager.addJobInProgressListener(jobQueueJobInProgressListener);

eagerTaskInitializationListener.setTaskTrackerManager(taskTrackerManager);

eagerTaskInitializationListener.start();

taskTrackerManager.addJobInProgressListener(

eagerTaskInitializationListener);

}這裏注册了两個监听器,其中eagerTaskInitializationListener负责作业初始化,而jobQueueJobInProgressListener则负责作业的执行和监控。當有作业提交到JobTracker時,JobTracker會执行所有订阅它消息的监听器的jobAdded措施。對于eagerTaskInitializationListener来說:

@Override

publicvoidjobAdded(JobInProgressjoB.{

synchronized(jobInitQueue){jobInitQueue.add(joB.;resortInitQueue();jobInitQueue.notifyAll();

}

}提交的作业的JobInProgress對象被添加到作业初始化队列jobInitQueue中,并唤醒初始化线程(若本来没有作业可以初始化):classJobInitManagerimplementsRunnable{

publicvoidrun(){JobInProgressjob=null;while(true){

try{synchronized(jobInitQueue){while(jobInitQueue.isEmpty()){

jobInitQueue.wait();}job=jobInitQueue.remove(0);}threadPool.execute(newInitJob(joB.);

}catch(InterruptedExceptiont){LOG.info("JobInitManagerThreadinterrupted.");break;

}}threadPool.shutdownNow();

}

}這种工作方式是一种“生产者-消费者”模式:作业初始化线程是消费者,而监听器eagerTaskInitializationListener是生产者。這裏可以有多种消费者线程,放到一种固定资源的线程池中,线程個数通過mapred.jobinit.threads参数配置,默认為4個。下面我們重點来看调度器中的另一种监听器。

jobQueueJobInProgressListener對象在调度器中初始化時持续执行了两個构造器完毕初始化:publicJobQueueJobInProgressListener(){

this(newTreeMap<JobSchedulingInfo,JobInProgress>(FIFO_JOB_QUEUE_COMPARATOR));

}

/**

*Forclientsthatwanttoprovidetheirownjobpriorities.

*@paramjobQueueAcollectionwhoseiteratorreturnsjobsinpriorityorder.

*/

protectedJobQueueJobInProgressListener(Map<JobSchedulingInfo,JobInProgress>jobQueue){

this.jobQueue=Collections.synchronizedMap(jobQueue);

}其中,第一种构造器调用重载的第二個构造器。可以看到,调度器使用一种队列jobQueue来保留提交的作业。這個队列使用一种TreeMap對象实現,TreeMap的特點是底层使用紅黑树实現,可以按照键来排序,并且由于是平衡树,效率较高。作為键的是一种JobSchedulingInfo對象,作為值就是提交的作业對应的JobInProgress對象。此外,由于TreeMap自身不是线程安全的,這裏使用了集合类的同步措施构造了一种线程安全的Map。使用带有排序功能的数据构造的目的是使作业在队列中按照优先级的大小排列,這样每次调度器只需從队列頭部获得作业即可。作业的次序由优先级决定,而优先级信息包括在JobSchedulingInfo對象中:staticclassJobSchedulingInfo{

privateJobPrioritypriority;

privatelongstartTime;

privateJobIDid;...}该對象包括了作业的优先级、ID和開始時间等信息。在Hadoop中,作业的优先级有如下五种:VERY_HIGH、HIGH、NORMAL、LOW、VERY_LOW。這些字段是通過作业的JobStatus對象初始化的。由于该對象作為TreeMap的键,因此要实現自已的equals措施和hashCode措施:@Override

publicbooleanequals(Objectobj){if(obj==null||obj.getClass()!=JobSchedulingInfo.class){

returnfalse;}elseif(obj==this){

returntrue;}elseif(objinstanceofJobSchedulingInfo){

JobSchedulingInfothat=(JobSchedulingInfo)obj;

return((that.iD.&&this.startTime==that.startTime&&this.priority==that.priority);}returnfalse;

}我們看到,两個JobSchedulingInfo對象相等的条件是类型一致,并且作业ID、開始時间和优先级都相等。hashCode的计算比较简朴:@Override

publicinthashCode(){return(int)(id.hashCode()*priority.hashCode()+startTime);

}注意,监听器的第一种构造器有一种比较器参数,用于定义

JobSchedulingInfo的比较方式:staticfinalComparator<JobSchedulingInfo>FIFO_JOB_QUEUE_COMPARATOR

=newComparator<JobSchedulingInfo>(){

publicintcompare(JobSchedulingInfoo1,JobSchedulingInfoo2){intres=o1.getPriority().compareTo(o2.getPriority());if(res==0){

if(o1.getStartTime()<o2.getStartTime()){res=-1;

}else{res=(o1.getStartTime()==o2.getStartTime()?0:1);}}if(res==0){

res=o1.getJobID().compareTo(o2.getJobID());}returnres;

}

};從上面看出,首先比较作业的优先级,若优先级相等则比较開始時间(FIFO),若再相等则比较作业ID。

我們在实現自已的调度器時也許要定义自已的作业队列,那么作业在队列中的次序(即

JobSchedulingInfo的比较器

)就要仔细定义,這是调度器可以正常运行基础。Hadoop中的作业调度采用pull方式,即TaskTracker定期向JobTracker发送心跳信息索取一种新的任务,這些信息包括数据結點上作业和任务的运行状况,以及该TaskTracker上的资源使用状况。JobTracker會根据以上信息更新作业队列的状态,并调用调度器选择一种或多种任务以心跳响应的形式返回給TaskTracker。從上面描述可以看出,JobTracker和taskScheduler之间的互相运用关系:前者运用後者為TaskTracker分派任务;後者运用前者更新队列和作业信息。接下来,我們一步步详述该過程。首先,當一种心跳抵达JobTracker時(实际上這是一种来自TaskTracker的遠程過程调用

heartbeat措施

,协议接口是InterTrackerProtocol),會执行两种動作:更新状态和下达命令

【1】

。下达命令稍後关注。有关更新状态的某些代码片段如下:if(!processHeartbeat(status,initialContact,now)){if(prevHeartbeatResponse!=null){

trackerToHeartbeatResponseMap.remove(trackerName);}returnnewHeartbeatResponse(newResponseId,newTaskTrackerAction[]{newReinitTrackerAction()});

}详细的心跳处理,由私有函数processHeartbeat完毕。该函数中有如下两個措施调用:updateTaskStatuses(trackerStatus);

updateNodeHealthStatus(trackerStatus,timeStamp);分别用来更新任务的状态和結點的健康状态。在第一种措施中有下面代码片段:TaskInProgresstip=taskidToTIPMap.get(taskID.;//Checkifthetipisknowntothejobtracker.Incaseofarestarted//jt,sometasksmightjoininlaterif(tip!=null||hasRestarted()){

if(tip==null){tip=job.getTaskInProgress(taskId.getTaskID());job.addRunningTaskToTIP(tip,taskId,status,false);

}

//Updatethejobandinformthelistenersifnecessary

JobStatusprevStatus=(JobStatus)job.getStatus().clone();

//CloneTaskStatusobjecthere,becauseJobInProgress

//orTaskInProgresscanmodifythisobjectand

//thechangesshouldnotgetreflectedinTaskTrackerStatus.

//AnoldTaskTrackerStatusisusedlaterincountMapTasks,etc.

job.updateTaskStatus(tip,(TaskStatus)report.clone());

JobStatusnewStatus=(JobStatus)job.getStatus().clone();

//Updatethelistenersifanincompletejobcompletes

if(prevStatus.getRunState()!=newStatus.getRunState()){JobStatusChangeEventevent=newJobStatusChangeEvent(job,EventType.RUN_STATE_CHANGED,prevStatus,newStatus);updateJobInProgressListeners(event);

}}else{

LOG.info("Seriousproblem.

Whileupdatingstatus,cannotfindtaskid"

+report.getTaskID());}這裏的job對象通過從TaskTracker那裏得到的task状态信息中抽取出来。注意,這裏拷贝了原有作业状态的一种副本,然後修改這個副本的有关信息,调用的是updateJobStatus措施,更新任务的状态信息和JobInProgress的有关信息,如map和reduce任务的進度等,這裏不展開了。這些信息的更新可认為调度器的工作提供根据。作业状态的更新是通過updateJobInProgressListeners措施实現,该措施的参数是一种JobStatusChangeEvent對象,表达作业状态变化的事件。這种事件的类型可以是运行状态变化、開始時间变化、优先级变化等等。顾客也可以根据需要自定义事件类型。事件對象维护了两個JobStatus對象,分别表达事件发生前後作业的状态。

進入该措施後,我們又看到了熟悉的观测者模式://Updatethelistenersaboutthejob

//AssumingJobTrackerislockedonentry.

privatevoidupdateJobInProgressListeners(JobChangeEventevent){

for(JobInProgressListenerlistener:jobInProgressListeners){listener.jobUpdated(event);

}

}這次每個监听器要回调jobUpdated措施,表达作业有更新。對于jobQueueJobInProgressListener来說是這样做的:@Override

publicsynchronizedvoidjobUpdated(JobChangeEventevent){

JobInProgressjob=event.getJobInProgress();

if(eventinstanceofJobStatusChangeEvent){//Checkiftheorderingofthejobhaschanged//Fornowpriorityandstart-timecanchangethejoborderingJobStatusChangeEventstatusEvent=(JobStatusChangeEvent)event;JobSchedulingInfooldInfo=

newJobSchedulingInfo(statusEvent.getOldStatus());if(statusEvent.getEventType()==EventType.PRIORITY_CHANGED||statusEvent.getEventType()==EventType.START_TIME_CHANGED.{

//Makeaprioritychange

reorderJobs(job,oldInfo);}elseif(statusEvent.getEventType()==EventType.RUN_STATE_CHANGED.{

//Checkifthejobiscomplete

intrunState=statusEvent.getNewStatus().getRunState();

if(runState==JobStatus.SUCCEEDED||runState==JobStatus.FAILED||runState==JobStatus.KILLED.{jobCompleted(oldInfo);

}}

}

}首先,获取作业更新

的状态。然後根据事件的类型,進行對应的处理。例如,假如优先级变化了,则要重新排列队列中作业的次序。這裏直接取出原有作业,重新插入队列。插入後,作业會自動重新排序,体現了TreeMap的优越性。再例如,假如作业状态变為完毕,那么就從队列中删除该作业。privatevoidreorderJobs(JobInProgressjob,JobSchedulingInfooldInfo){

synchronized(jobQueue){jobQueue.remove(oldInfo);jobQueue.put(newJobSchedulingInfo(joB.,joB.;

}

}下面就是调度器中最关键的一步了:任务选择。此時,作业队列中信息已經更新完毕,可以选择某些任务返回給TaskTracker执行了。heartbeat措施接下来會有這样的代码:List<Task>tasks=getSetupAndCleanupTasks(taskTrackerStatus);

if(tasks==null){

tasks=taskScheduler.assignTasks(taskTrackers.get(trackerName));

}假如不需要setup和cleanup,就阐明需要选择map或reduce任务。调用TaskScheduler的assignTasks措施完毕任务选择。由于篇幅限制,我打算将這部分内容放到下一篇文章中,并关注heartbeat中JobTracker下达的命令過程以及JobInProgress和TaskInProgress對调度有影响的某些字段。

29.

是30.

3.1.3

Hadoop使用1.hdfs写流程流程:1.client链接namenode存数据2.namenode记录一条数据位置信息(元数据),告诉client存哪。3.client用hdfs的api将数据块(默认是64M)存储到datanode上。4.datanode将数据水平备份。并且备份完将反馈client。5.client告知namenode存储块完毕。6.namenode将元数据同步到内存中。7.另一块循环上面的過程。

2.hdfs讀流程流程:1.client链接namenode,查看元数据,找到数据的存储位置。2.client通過hdfs的api并发讀取数据。3.关闭连接。

3.举一种简朴的例子阐明mapreduce是怎么来运行的?解答:

Wordcount例子接口============================一种MapReduce作业(joB.一般會把输入的数据集切分為若干独立的数据块,由map任务(task)以完全并行的方式处理它們。框架會對map的输出先進行排序,然後把成果输入給reduce任务。一般作业的输入和输出都會被存储在文献系统中。整個框架负责任务的调度和监控,以及重新执行已經失败的任务。一般,MapReduce框架和分布式文献系统是运行在一组相似的节點上的,也就是說,计算节點和存储节點一般在一起。這种配置容許框架在那些已經存好数据的节點上高效地调度任务,這可以使整個集群的网络带宽被非常高效地运用。MapReduce框架由一种單独的masterJobTr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论