【成为博客专家】大数据面试题

本文详细介绍了Hadoop的运行原理,包括HDFS和MapReduce的运作方式,以及如何进行优化。重点讨论了Combiner的作用、Hadoop进程管理、数据倾斜的解决策略和Hadoop集群健康检查。同时,涵盖了Hive的使用场景,如内外部表的区别、优化方法,以及数据导入与管理。此外,文章还提到了其他相关技术如Hbase、Storm、Kafka和Spark的特点和使用场景。
摘要由CSDN通过智能技术生成

面试题

文章目录

My Name is YangYang

Hadoop运行原理

hdfs运行原理

HDFS自动保存多个副本,移动计算。缺点是小文件存取占用namenode内存,写入只支持追加,不能随机修改。
它存储的逻辑空间称为block,文件的权限类似linux。整体架构分三种节点,NN,SNN,DN
NN 负责读写操作保存metadata(Ownership Permission blockinfo)
SNN 负责辅助NN合并fsimage和edits,减少nn启动时间
DN 负责存数据,每个数据(文件)分割成若干block,每个block默认3个副本。启动后像NN发送心跳保持联系
NN保存的metadata在hdfs启动后加载到计算机内存,除block位置信息的metadata保存在OS文件系统中的fsimage文件中,对metadata的操作日志保存在OS文件系统中的edits文件中。block位置信息是hdfs启动后由DN上报NN再加载到内存的。
HDFS的安全模式:直到NN完全加载完metadata之前的这段时间。期间不能写入文件,DN检查各个block完整性,并修复

MapReduce运行原理

离线计算框架,过程分为split map shuffle reduce四个过程

架构节点有:Jobtracker TaskTracker

Split将文件分割,传输到mapper,mapper接收KV形式的数据,经过处理,再传到shuffle过程。

Shuffle先进行HashPartition或者自定义的partition,会有数据倾斜和reduce的负载均衡问题;再进行排序,默认按字典排序;为减少mapper输出数据,再根据key进行合并,相同key的数据value会被合并;最后分组形成(key,value{})形式的数据,输出到下一阶段

Reduce输入的数据就变成了,key+迭代器形式的数据,再进行处理。
------------------------------------------------------------
Hadoop中的MapReduce是一个使用简易的软件框架,基于它写出来的应用程序能够运行在由上千个商用机器组成的大型集群上,并以一种可靠容错的式并 行处理上T级别的数据集。

  一个MapReduce作业(job)通常会把输入的数据集切分为若干独立的数据块,由map任务(task)以完全并行的方式处理它们。框架会对map的输出先进行排序,然后把结果输入给reduce任务。通常作业的输入和输出都会被存储在文件系统中。整个框架负责任务的调度和监控,以及重新执行已经失败的任务。

通常,MapReduce框架和分布式文件系统是运行在一组相同的节点上的,也就是说,计算节点和存储节点通常在一起。这种配置允许框架在那些已经存好数据的节点上高效地调度任务,这可以使整个集群的网络带宽被非常高效地利用。

 MapReduce框架由一个单独的master JobTracker和每个集群节点一个slave TaskTracker共同组成。master负责调度构成一个作业的所有任务,这些任务分布在不同的slave上,master监控它们的执行,重新执行已经失败的任务。而slave仅负责执行由master指派的任务

MapReduce如何优化

(1)Combiner优化 

在之前的shuffle过程中的map端生成最终溢写文件时,例如:aaa 1, aaa 1 这样的数据会被合并为{aaa [1,1]} ,而我们可以通过给每个map显示的设定combiner,来将这个节点的输出优化,即如前面的例如,如果他们是同一节点的数据,他们会合并为{aaa,2},combiner相当于小型的reduce,不过他们这要求reduce的输入数据格式和输出数据格式一致,并且value的值是满足结合律的
(2)压缩
通过在对数据压缩,来减少网络IO,减少磁盘占用,可以用在三个地方:输入数据压缩、map输出压缩、reduce输出压缩。当然压缩也会增加CPU计算
(3)map的数量
Map task的数量使用split的数量决定的,split的数据越少,每个map task的执行时间就越短,但是相应的job的执行时间也会被拉长,因为内部调度的时间更长了。
(4)reduce的数量
可以在client设置,增加reduce的数量
(5)大量小文件的优化
Mapreduce不怕大文件,就怕小文件,默认情况下,TextInputFormat对任务的切片机制是按照文件规划切片,不管有多少个小文件,都会是单独的切片,都会交给一个maptask,这样,如果有大量的小文件,就会产生大量的maptask,处理效率极端底下
最好的方法:在数据处理的最前端(预处理、采集),就将小文件合并成大文件,
在上传到HDFS做后续的分析,如果已经是大量的小文件在HDFS中了,可以使用另一种inputformat来做切片(CombineFileInputformat),它的切片逻辑跟FIleinputformat不同:它可以将多个小文件从逻辑上规划到一个切片中,这样,多个小文件就可以交给一个maptask了

hadoop中combiner的作用

1、combiner最基本是实现本地key的聚合,对map输出的key排序,value进行迭代
2、combiner还具有类似本地的reduce功能.
3、如果不用combiner,那么,所有的结果都是reduce完成,效率会相对低下。使用combiner,先完成的map会在本地聚合,提升速度。

 4、对于hadoop自带的wordcount的例子,value就是一个叠加的数字,所以map一结束就可以进行reduce的value叠加,而不必要等到所有的map结束再去进行reduce的value叠加。

 combiner使用的合适,可以在满足业务的情况下提升job的速度,如果不合适,则将导致输出的结果不正确。

hadoop进程名

Datanode
负责存储文件
a.DataNode的需要完成的首要任务是K-V存储

  b.完成和namenode 通信 ,这个通过IPC 心跳连接实现。
     此外还有和客户端 其它datanode之前的信息交换

  c.完成和客户端还有其它节点的大规模通信,这个需要直接
     通过socket 协议实现。

SecondaryNamenode
合并快照
namenode
相当于一个领导者,负责调度
NodeManager
是YARN中每个节点上的代理,它管理Hadoop集群中单个计算节点
包括与ResourceManger保持通信,监督Container的生命周期管理,
监控每个Container的资源使用(内存、CPU等)情况,追踪节点健
康状况,管理日志和不同应用程序用到的附属服务(auxiliary service)
ResourceManager
在YARN中,ResourceManager负责集群中所有资源的统一管理和分配,它接收来自各个节点(NodeManager)的资源汇报信息,并把这些信息按照一定的策略分配给各个应用程序(实际上是ApplicationManager)
RM与每个节点的NodeManagers (NMs)和每个应用的ApplicationMasters (AMs)一起工作。
a.NodeManagers 遵循来自ResourceManager的指令来管理单一节点上的可用资源。
b.ApplicationMasters负责与ResourceManager协商资源与NodeManagers合作启动容器

我们开发Job是否能去掉reduce阶段

可以去掉。设置reduce数为0即可

datanode在什么情况下不会备份

强制关闭或非正常断电时

3个datanode中有一个datanode出现错误会怎样?

这个datanode的数据会在其他的datanode上重新做备份。 

Hive生产环境中为什么建议使用外部表?

1、因为外部表不会加载数据到hive,减少数据传输、数据还能共享。
2、hive不会修改数据,所以无需担心数据的损坏
3、删除表时,只删除表结构、不删除数据。

MapReduce的map数量和reduce数量怎么确定,怎么配置

map的数量有数据块决定,reduce数量由配置文件配置

combiner出现在哪个过程

出现在map阶段的map方法后,shuffle过程

请列出你在工作中使用过的开发mapreduce的语言

java,hive,(python,c++)hadoop streaming

请简述mapreduce中的combine和partition的作用

答:combiner是发生在map的最后一个阶段,其原理也是一个小型的reducer,主要作用是减少输出到reduce的数据量,缓解网络传输瓶颈,提高reducer的执行效率。

partition的主要作用将map阶段产生的所有kv对分配给不同的reducer task处理,可以将reduce阶段的处理负载进行分摊

hive内部表和外部表的区别

Hive 向内部表导入数据时,会将数据移动到数据仓库指向的路径;若是外部表,数据的具体存放目录由用户建表时指定

在删除表的时候,内部表的元数据和数据会被一起删除,

而外部表只删除元数据,不删除数据。

这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。

Hbase的rowKey怎么创建比较好?列簇怎么创建比较好?

rowKey最好要创建有规则的rowKey,即最好是有序的。

经常需要批量读取的数据应该让他们的rowkey连续;

将经常需要作为条件查询的关键词组织到rowkey中;

列族的创建:

按照业务特点,把数据归类,不同类别的放在不同列族

用mapreduce怎么处理数据倾斜问题

本质:让各分区的数据分布均匀

可以根据业务特点,设置合适的partition策略

如果事先根本不知道数据的分布规律,利用随机抽样器抽样后生成partition策略再处理

17. hbase内部机制是什么

hbase是一个能适应联机业务的数据库系统

物理存储:hbase的持久化数据是存放在hdfs上

存储管理:一个表是划分为很多region的,这些region分布式地存放在很多regionserver上

Region内部还可以划分为store,store内部有memstore和storefile

版本管理:hbase中的数据更新本质上是不断追加新的版本,通过compact操作来做版本间的文件合并

Region的split

hadoop中,有哪些地方使用到了缓存机制,作用分别是什么?

答:缓存机制就是DistributedCash,就是在job任务执行前,将需要Task机器上进行缓存,提高mapreduce的执行效率

如何确定hadoop集群的健康状态

UI监控 shell监控

shuffle阶段你怎么理解

shuffle过程包括在Map和Reduce两端中。
在Map端的shuffle过程是对Map的结果进行分区(partition)、排序(sort)和分割(spill),然后将属于同一个划分的输出合并在一起
(merge)并写在硬盘上,同时按照不同的划分将结果发送给对应的Reduce(Map输出的划分与Reduce的对应关系由JobTracker确定)。
Reduce端又会将各个Map送来的属于同一个划分的输出进行合并(merge),然后对merge的结果进行排序,最后交给Reduce处理。通俗的讲,就是对Map输出结果先进行分区(partition),如“aaa”经过Partitioner后返回0,也就是这对值应当交由第一个reducer来处理。接下来,
需要将数据写入内存缓冲区中,缓冲区的作用是批量收集map结果,减少磁盘IO的影响。我们的key/value对以及Partition的结果都会被写
入缓冲区。当然写入之前,key与value值都会被序列化成字节数组。这个内存缓冲区是有大小限制的,默认是100MB。当map task的输出结果
很多时,需要在一定条件下将缓冲区中的数据临时写入磁盘,然后重新利用这块缓冲区。这个从内存往磁盘写数据的过程被称为Spill。
Spill可以认为是一个包括Sort和Combiner(Combiner是可选的,用户如果定义就有)的过程。先进行sort可以把缓冲区中一段范围key的数据排在一起,(如果数据多的时候,多次刷新往内存缓冲区中写入的数据可能会有属于相同范围的key,也就是说,多个spill文件中可能会
有统一范围的key,这就是需要下面Map端merge的原因),这里有点绕,具体的介绍可以看下面的详细过程,执行过sort之后,如果用户定义了combiner就会执行combine,然后执行merge操作,接着就是Reduce端。

请列出正常工作的hadoop集群中hadoop都需要启动哪些进程,他们的作用分别是什么?

  1. NameNode: HDFS的守护进程,负责记录文件是如何分割成数据块,以及这些数据块分别被存储到那些数据节点上,它的主要功能是对内存及IO进行集中管理

  2. Secondary NameNode:辅助后台程序,与NameNode进行通信,以便定期保存HDFS元数据的快照。

  3. DataNode:负责把HDFS数据块读写到本地的文件系统。

  4. JobTracker:负责分配task,并监控所有运行的task。

  5. TaskTracker:负责执行具体的task,并与JobTracker进行交互。

.请列出你所知道的hadoop调度器,并简要说明其工作方法?

比较流行的三种调度器有:默认调度器FIFO,计算能力调度器CapacityScheduler,公平调度器Fair Scheduler

  1. 默认调度器FIFO

hadoop中默认的调度器,采用先进先出的原则

  1. 计算能力调度器CapacityScheduler

选择占用资源小,优先级高的先执行

  1. 公平调度器FairScheduler

同一队列中的作业公平共享队列中所有资源

简答说一下hadoop的map-reduce编程模型

首先map task会从本地文件系统读取数据,转换成key-value形式的键值对集合

使用的是hadoop内置的数据类型,比如longwritable、text等

将键值对集合输入mapper进行业务处理过程,将其转换成需要的key-value在输出

之后会进行一个partition分区操作,默认使用的是hashpartitioner,可以通过重写hashpartitioner的getpartition方法来自定义分区规则

之后会对key进行进行sort排序,grouping分组操作将相同key的value合并分组输出,在这里可以使用自定义的数据类型,重写WritableComparator的Comparator方法来自定义排序规则,重写RawComparator的compara方法来自定义分组规则

之后进行一个combiner归约操作,其实就是一个本地段的reduce预处理,以减小后面shufle和reducer的工作量

reduce task会通过网络将各个数据收集进行reduce处理,最后将数据保存或者显示,结束整个job

为什么要用flume导入hdfs,hdfs的构架是怎样的

flume可以实时的导入数据到hdfs中,当hdfs上的文件达到一个指定大小的时候会形成一个文件,或者超过指定时间的话也形成一个文件

文件都是存储在datanode上面的,namenode记录着datanode的元数据信息,而namenode的元数据信息是存在内存中的,所以当文件切片很小或者很多的时候会卡死

6、map-reduce程序运行的时候会有什么比较常见的问题

比如说作业中大部分都完成了,但是总有几个reduce一直在运行

这是因为这几个reduce中的处理的数据要远远大于其他的reduce,可能是因为对键值对任务划分的不均匀造成的数据倾斜

解决的方法可以在分区的时候重新定义分区规则对于value数据很多的key可以进行拆分、均匀打散等处理,或者是在map端的combiner中进行数据预处理的操作

7、Hive中存放是什么?

表。
存的是和hdfs的映射关系,hive是逻辑上的数据仓库,实际操作的都是hdfs上的文件,HQL就是用sql语法来写的mr程序。

Hive与关系型数据库的关系?

没有关系,hive是数据仓库,不能和数据库一样进行实时的CURD操作。
是一次写入多次读取的操作,可以看成是ETL工具。

Sqoop工作原理是什么?

hadoop生态圈上的数据传输工具。
可以将关系型数据库的数据导入非结构化的hdfs、hive或者bbase中,也可以将hdfs中的数据导出到关系型数据库或者文本文件中。
使用的是mr程序来执行任务,使用jdbc和关系型数据库进行交互。
import原理:通过指定的分隔符进行数据切分,将分片传入各个map中,在map任务中在每行数据进行写入处理没有reduce。
export原理:根据要操作的表名生成一个java类,并读取其元数据信息和分隔符对非结构化的数据进行匹配,多个map作业同时执行写入关系型数据库

Hadoop性能调优?

调优可以通过系统配置、程序编写和作业调度算法来进行。
hdfs的block.size可以调到128/256(网络很好的情况下,默认为64)
调优的大头:mapred.map.tasks、mapred.reduce.tasks设置mr任务数(默认都是1)
mapred.tasktracker.map.tasks.maximum每台机器上的最大map任务数
mapred.tasktracker.reduce.tasks.maximum每台机器上的最大reduce任务数
mapred.reduce.slowstart.completed.maps配置reduce任务在map任务完成到百分之几的时候开始进入
这个几个参数要看实际节点的情况进行配置,reduce任务是在33%的时候完成copy,要在这之前完成map任务,(map可以提前完成)
mapred.compress.map.output,mapred.output.compress配置压缩项,消耗cpu提升网络和磁盘io
合理利用combiner
注意重用writable对象

hadoop数据倾斜及解决办法

1.增加jvm内存,这适用于第一种情况(唯一值非常少,极少数值有非常多的记录值(唯一值少于几千)),这种情况下,往往只能通过硬件的手段来进行调优,增加jvm内存可以显著的提高运

  • 11
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值