2024大数据面试题汇总(更新中。。。)

技术一、JAVA

技术二、hadoop
1.hadoop及其组件
Hadoop是一个开源分布式计算平台架构,基于apache协议发布,由java语言开发。主要包括
HDFS(分布式文件管理系统)
MapReduce(分布式计算框架)
Yarn(资源管理器)
2.NameNode与SecondaryNameNode的区别与联系
区别
1)NameNode存储了文件系统下所有目录和文件的访问,修改,执行时间,块大小,执行权限等
2)SecondaryNameNode并非NameNode的热备(≠ StandBy NameNode)。定期触发CheckPoint(服务),代替NameNode合并EditLog和fsimage文件。
联系
1)SecondaryNameNode中保存了一份和NameNode一致的fsimage和edits文件。但是,NameNode还有一份正在使用的编辑日志edit_inporgress,这是SecondaryNameNode没有的。
2)在主namenode发生故障时(假设没有及时备份数据),可以从SecondaryNameNode恢复历史的数据。
3.SecondaryNameNode的目的是什么
SecondaryNameNode定期触发CheckPoint,代表NameNode合并编辑日志EditLog和镜像文件Fsimage,从而减小EditLog的大小,减少NN启动时间。
同时在合并期间,NameNode也可以对外提供写操作。
4.Block大小
如果一个文件小于128M,它只占用文件本身大小的空间,其它空间别的文件也能用。
Block大小设置主要取决于磁盘传输速率。
(把文件分为N块,读取文件时就要寻址N次)
5.请列出正常工作的Hadoop集群中Hadoop都分别需要启动哪些进程,它们的作用分别是什么?
1)NameNode:它是hadoop中的主服务器,管理文件系统名称空间和对集群中存储的文件的访问,保存有metadate。
2)SecondaryNameNode:它不是namenode的冗余守护进程,而是提供周期检查点和清理任务。帮助NN合并editslog,减少NN启动时间。
3)DataNode:它负责管理连接到节点的存储(一个集群中可以有多个节点)。每个存储数据的节点运行一个datanode守护进程。
4)ResourceManager(JobTracker):JobTracker负责调度DataNode上的工作。每个DataNode有一个TaskTracker,它们执行实际工作。
5)NodeManager:(TaskTracker)执行任务。
6)DFSZKFailoverController:高可用时它负责监控NN的状态,并及时的把状态信息写入ZK。它通过一个独立线程周期性的调用NN上的一个特定接口来获取NN的健康状态。FC也有选择谁作为Active NN的权利,因为最多只有两个节点,目前选择策略还比较简单(先到先得,轮换)。
7)JournalNode:高可用情况下存放namenode的editlog文件。
6.NameNode与SecondaryNameNode的区别与联系
区别
1)NameNode存储了文件系统下所有目录和文件的访问,修改,执行时间,块大小,执行权限等
2)SecondaryNameNode并非NameNode的热备(≠ StandBy NameNode)。定期触发CheckPoint(服务),代替NameNode合并EditLog和fsimage文件。
联系
1)SecondaryNameNode中保存了一份和NameNode一致的fsimage和edits文件。但是,NameNode还有一份正在使用的编辑日志edit_inporgress,这是SecondaryNameNode没有的。
2)在主namenode发生故障时(假设没有及时备份数据),可以从SecondaryNameNode恢复历史的数据。
7.SecondaryNameNode的目的是什么
SecondaryNameNode定期触发CheckPoint,代表NameNode合并编辑日志EditLog和镜像文件Fsimage,从而减小EditLog的大小,减少NN启动时间。
同时在合并期间,NameNode也可以对外提供写操作。
8.如果数据误删,如何抢救?
1.立即关闭Hadoop服务
2.打开edit_log文件,删除未发送的心跳包的命令
9.如何理解Hadoop中的数据倾斜现象?
A.可能因为HDFS的存储不均衡:可能的原因是后扩展了集群的几台机器
B.使用默认的HashPartitoner
C.输入数据中不均匀的键分布
解决方法:执行 /opt/software/hadoop-3.1.3/sbin/start-balancer.sh
10.HDFS的读/写数据流程
HDFS的写(上传)数据流程

1)HDFS client创建DFS对象,通过该对象向NameNode请求上传文件,NameNode检查权限,并判断该目标文件是否已存在。
2)如果权限许可,目标文件也存在,NameNode响应请求。
3)客户端请求第一个Block上传到哪几台DataNode服务器上。
4)NameNode返回3个DataNode结点
5)HDFS client创建FS DataOutputStream数据流对象,请求dn1建立传输通道,dn1接收到请求之后会继续调用dn2建立通道…
6)传输通道建立完成之后,dn1,dn2,dn3逐级应答客户端。
7)客户端开始往dn1上传第一个Block,dn1利用通道传向dn2,dn2利用通道传向dn3…(直到传到Block副本应在的位置停止)
8)当一个Block传输完成之后,客户端再次请求NameNode上传第二个Block到服务器。(重复3-7步)

HDFS的读数据流程

1)HDFS client创建DFS对象,该对象向NameNode请求下载文件,NameNode通过查询元数据,找到文件块所在的DataNode地址。
2)挑选一台DataNode(要考虑结点距离最近选择原则,DataNode负载均衡)服务器,请求读取数据。
3)数据从DataNode传到客户端,如果在传输过程中出现宕机,才会考虑向含有该副本的其他节点获取数据。
4)客户端接收,写在本地缓存,然后写入目标文件。
11.请简述DataNode的工作机制
1)一个数据块在DataNode上以文件的形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据的校验信息。
2)DataNode 启动后向 NameNode 注册,之后周期性(默认 6 小时)的向 NameNode 上报所有的块信息。同时,DN 扫描自己节点块信息列表的时间,检查DN中的块是否完好,如果某块磁盘损坏,就将该块磁盘上存储的所有 BlockID报告给NameNode。
3)心跳是每 3 秒一次,心跳返回结果带有 NameNode 给该 DataNode 的命令如复制块数据到另一台机器,或删除某个数据块。 如果超过 10 分钟 + 30s 没有收到某个 DataNode 的心跳,则认为该节点不可用。
12.Namenode和Datanode的心跳机制
心跳是datanode向namenode发送的小数据包,表明它是活跃的。默认情况下,每3秒datanode就会向namenode发送一次心跳信号。如果namenode在10分钟内没有收到任何datanode的心跳,它会将该datanode标记为“死亡”,并开始数据的复制过程,将其复制到其他datanode,以保持数据的冗余和可靠性。
13.Safe Mode
Safe Mode是HDFS的一种状态,在此状态下,系统处于只读模式,不会进行数据块的复制或删除。
这通常用于系统维护或故障恢复。
管理员可以使用命令"hdfs dfsadmin -safemode enter"进入安全模式,"hdfs dfsadmin -safemode leave"退出安全模式,而"hdfs dfsadmin -safemode get"则用来查询系统是否处于安全模式。
14.Hadoop启动流程
首先,启动HDFS,通常包括启动namenodes,datanodes和secondary namenodes。
其次,启动YARN的资源管理器和节点管理器。
最后,如果在集群中运行MapReduce作业,则还需要启动MapReduce的历史服务器。
15.如何检查?
检查服务:jps
检查路径:
cd /opt/software/hadoop-3.1.3/logs/hadoop-root-namenode-single.log
检查端口:netstat -anutp | grep 9870
检查安全模式:hdfs dfsadmin -safemode get
重启服务
17.YARN的工作原理

18、hadoop的块大小,从哪个版本开始是128M
Hadoop1.x都是64M,hadoop2.x开始都是128M。
19、HDFS的存储机制
HDFS存储机制,包括HDFS的写入数据过程和读取数据过程两部分
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的服务器。(重复执行3-7步)。
HDFS读数据过程  
1)客户端通过Distributed FileSystem向NameNode请求下载文件,NameNode通过查询元数据,找到文件块所在的DataNode地址。  
2)挑选一台DataNode(就近原则,然后随机)服务器,请求读取数据。  
3)DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以packet为单位来做校验)。  
4)客户端以packet为单位接收,先在本地缓存,然后写入目标文件。
20、secondary namenode工作机制
1)第一阶段:NameNode启动  
(1)第一次启动NameNode格式化后,创建fsimage和edits文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。  
(2)客户端对元数据进行增删改的请求。  
(3)NameNode记录操作日志,更新滚动日志。  
(4)NameNode在内存中对数据进行增删改查。
2)第二阶段:Secondary NameNode工作  
(1)Secondary NameNode询问NameNode是否需要checkpoint。直接带回NameNode是否检查结果。  
(2)Secondary NameNode请求执行checkpoint。  
(3)NameNode滚动正在写的edits日志。  
(4)将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode。  
(5)Secondary NameNode加载编辑日志和镜像文件到内存,并合并。  
(6)生成新的镜像文件fsimage.chkpoint。  
(7)拷贝fsimage.chkpoint到NameNode。  
(8)NameNode将fsimage.chkpoint重新命名成fsimage。
21、HDFS组成架构
架构主要由四个部分组成,分别为HDFS Client、NameNode、DataNode和Secondary NameNode。下面我们分别介绍这四个组成部分。
1)Client:就是客户端。  
(1)文件切分。文件上传HDFS的时候,Client将文件切分成一个一个的Block,然后进行存储;  
(2)与NameNode交互,获取文件的位置信息;  
(3)与DataNode交互,读取或者写入数据;  
(4)Client提供一些命令来管理HDFS,比如启动或者关闭HDFS;  
(5)Client可以通过一些命令来访问HDFS;
2)NameNode:就是Master,它是一个主管、管理者。  
(1)管理HDFS的名称空间;  
(2)管理数据块(Block)映射信息;  
(3)配置副本策略;  
(4)处理客户端读写请求。
3)DataNode:就是Slave。NameNode下达命令,DataNode执行实际的操作。  
(1)存储实际的数据块;  
(2)执行数据块的读/写操作。
4)Secondary NameNode:并非NameNode的热备。当NameNode挂掉的时候,它并不能马上替换NameNode并提供服务。  
(1)辅助NameNode,分担其工作量;  
(2)定期合并Fsimage和Edits,并推送给NameNode;  
(3)在紧急情况下,可辅助恢复NameNode。
22、HAnamenode 是如何工作的?
ZKFailoverController主要职责  
1)健康监测:周期性的向它监控的NN发送健康探测命令,从而来确定某个NameNode是否处于健康状态,如果机器宕机,心跳失败,那么zkfc就会标记它处于一个不健康的状态。  
2)会话管理:如果NN是健康的,zkfc就会在zookeeper中保持一个打开的会话,如果NameNode同时还是Active状态的,那么zkfc还会在Zookeeper中占有一个类型为短暂类型的znode,当这个NN挂掉时,这个znode将会被删除,然后备用的NN,将会得到这把锁,升级为主NN,同时标记状态为Active。  
3)当宕机的NN新启动时,它会再次注册zookeper,发现已经有znode锁了,便会自动变为Standby状态,如此往复循环,保证高可靠,需要注意,目前仅仅支持最多配置2个NN。  
4)master选举:如上所述,通过在zookeeper中维持一个短暂类型的znode,来实现抢占式的锁机制,从而判断那个NameNode为Active状态
23、谈谈Hadoop序列化和反序列化及自定义bean对象实现序列化?
1)序列化和反序列化  
(1)序列化就是把内存中的对象,转换成字节序列(或其他数据传输协议)以便于存储(持久化)和网络传输。  
(2)反序列化就是将收到字节序列(或其他数据传输协议)或者是硬盘的持久化数据,转换成内存中的对象。  
(3)Java的序列化是一个重量级序列化框架(Serializable),一个对象被序列化后,会附带很多额外的信息(各种校验信息,header,继承体系等),不便于在网络中高效传输。所以,hadoop自己开发了一套序列化机制(Writable),精简、高效。
2)自定义bean对象要想序列化传输步骤及注意事项:  
(1)必须实现Writable接口  
(2)反序列化时,需要反射调用空参构造函数,所以必须有空参构造  
(3)重写序列化方法  
(4)重写反序列化方法  
(5)注意反序列化的顺序和序列化的顺序完全一致  
(6)要想把结果显示在文件中,需要重写toString(),且用"\t"分开,方便后续用  
(7)如果需要将自定义的bean放在key中传输,则还需要实现comparable接口,因为mapreduce框中的shuffle过程一定会对key进行排序
24、FileInputFormat切片机制
job提交流程源码详解  
waitForCompletion()   submit();   // 1、建立连接  
connect();       // 1)创建提交job的代理      
new Cluster(getConfiguration());         // (1)判断是本地yarn还是远程         initialize(jobTrackAddr, conf);   // 2、提交job  
submitter.submitJobInternal(Job.this, cluster)     // 1)创建给集群提交数据的Stag路径
Path jobStagingArea = JobSubmissionFiles.getStagingDir(cluster, conf);     // 2)获取jobid ,并创建job路径    
JobID jobId = submitClient.getNewJobID();     // 3)拷贝jar包到集群    
copyAndConfigureFiles(job, submitJobDir);     rUploader.uploadFiles(job, jobSubmitDir);     // 4)计算切片,生成切片规划文件    
writeSplits(job, submitJobDir);     maps = writeNewSplits(job, jobSubmitDir);     input.getSplits(job);     // 5)向Stag路径写xml配置文件    
writeConf(conf, submitJobFile);     conf.writeXml(out);     // 6)提交job,返回提交状态    
status = submitClient.submitJob(jobId, submitJobDir.toString(), job.getCredentials());

25、在一个运行的Hadoop 任务中,什么是InputSplit?
FileInputFormat源码解析(input.getSplits(job))
(1)找到你数据存储的目录。
(2)开始遍历处理(规划切片)目录下的每一个文件。
(3)遍历第一个文件ss.txt。  
a)获取文件大小fs.sizeOf(ss.txt);。  
b)计算切片大小:computeSliteSize(Math.max(minSize,Math.min(maxSize,blocksize)))=blocksize=128M。  
c)默认情况下,切片大小=blocksize。  
d)开始切,形成第1个切片:ss.txt—0:128M 第2个切片ss.txt—128:256M 第3个切片ss.txt—256M:300M(每次切片时,都要判断切完剩下的部分是否大于块的1.1倍,不大于1.1倍就划分一块切片)。
e)将切片信息写到一个切片规划文件中。  
f)整个切片的核心过程在getSplit()方法中完成。  
g)数据切片只是在逻辑上对输入数据进行分片,并不会再磁盘上将其切分成分片进行存储。InputSplit只记录了分片的元数据信息,比如起始位置、长度以及所在的节点列表等。  
h)注意:block是HDFS上物理上存储的存储的数据,切片是对数据逻辑上的划分。
(4)提交切片规划文件到yarn上,yarn上的MrAppMaster就可以根据切片规划文件计算开启maptask个数。
26、如何判定一个job的map和reduce的数量?
1)map数量   splitSize=max{minSize,min{maxSize,blockSize}}   map数量由处理的数据分成的block数量决定default_num = total_size / split_size; 2)reduce数量   reduce的数量job.setNumReduceTasks(x);x 为reduce的数量。不设置的话默认为 1。
27、 Maptask的个数由什么决定?
  一个job的map阶段MapTask并行度(个数),由客户端提交job时的切片个数决定。
28、MapTask和ReduceTask工作机制
MapTask工作机制
(1)Read阶段:Map Task通过用户编写的RecordReader,从输入InputSplit中解析出一个个key/value。
(2)Map阶段:该节点主要是将解析出的key/value交给用户编写map()函数处理,并产生一系列新的key/value。
(3)Collect收集阶段:在用户编写map()函数中,当数据处理完成后,一般会调用OutputCollector.collect()输出结果。在该函数内部,它会将生成的key/value分区(调用Partitioner),并写入一个环形内存缓冲区中。
(4)Spill阶段:即“溢写”,当环形缓冲区满后,MapReduce会将数据写到本地磁盘上,生成一个临时文件。需要注意的是,将数据写入本地磁盘之前,先要对数据进行一次本地排序,并在必要时对数据进行合并、压缩等操作。
(5)Combine阶段:当所有数据处理完成后,MapTask对所有临时文件进行一次合并,以确保最终只会生成一个数据文件。
ReduceTask工作机制
(1)Copy阶段:ReduceTask从各个MapTask上远程拷贝一片数据,并针对某一片数据,如果其大小超过一定阈值,则写到磁盘上,否则直接放到内存中。
(2)Merge阶段:在远程拷贝数据的同时,ReduceTask启动了两个后台线程对内存和磁盘上的文件进行合并,以防止内存使用过多或磁盘上文件过多。
(3)Sort阶段:按照MapReduce语义,用户编写reduce()函数输入数据是按key进行聚集的一组数据。为了将key相同的数据聚在一起,Hadoop采用了基于排序的策略。 由于各个MapTask已经实现对自己的处理结果进行了局部排序,因此,ReduceTask只需对所有数据进行一次归并排序即可。
(4)Reduce阶段:reduce()函数将计算结果写到HDFS上。
29、描述mapReduce有几种排序及排序发生的阶段
1)排序的分类:  
(1)部分排序:MapReduce根据输入记录的键对数据集排序。保证输出的每个文件内部排序。  
(2)全排序: 如何用Hadoop产生一个全局排序的文件?最简单的方法是使用一个分区。但该方法在处理大型文件时效率极低,因为一台机器必须处理所有输出文件,从而完全丧失了MapReduce所提供的并行架构。     替代方案:首先创建一系列排好序的文件;其次,串联这些文件;最后,生成一个全局排序的文件。主要思路是使用一个分区来描述输出的全局排序。例如:可以为待分析文件创建3个分区,在第一分区中,记录的单词首字母a-g,第二分区记录单词首字母h-n, 第三分区记录单词首字母o-z。  
(3)辅助排序:(GroupingComparator分组)Mapreduce框架在记录到达reducer之前按键对记录排序,但键所对应的值并没有被排序。甚至在不同的执行轮次中,这些值的排序也不固定,因为它们来自不同的map任务且这些map任务在不同轮次中完成时间各不相同。一般来说,大多数MapReduce程序会避免让reduce函数依赖于值的排序。但是,有时也需要通过特定的方法对键进行排序和分组等以实现对值的排序。  
(4)二次排序:     在自定义排序过程中,如果compareTo中的判断条件为两个即为二次排序。
2)自定义排序
WritableComparable   bean对象实现WritableComparable接口重写compareTo方法,就可以实现排序    
@Override    
public int compareTo(FlowBean o) {       // 倒序排列,从大到小      
return this.sumFlow > o.getSumFlow() ? -1 : 1;     }
3)排序发生的阶段:  
(1)一个是在map side发生在spill后partition前。  
(2)一个是在reduce side发生在copy后 reduce前。
30、描述mapReduce中shuffle阶段的工作流程,如何优化shuffle阶段
分区,排序,溢写,拷贝到对应reduce机器上,增加combiner,压缩溢写的文件。
31、描述mapReduce中combiner的作用是什么,一般使用情景,哪些情况不需要,及和reduce的区别?
1)Combiner的意义就是对每一个maptask的输出进行局部汇总,以减小网络传输量。 2)Combiner能够应用的前提是不能影响最终的业务逻辑,而且,Combiner的输出kv应该跟reducer的输入kv类型要对应起来。 3)Combiner和reducer的区别在于运行的位置。   Combiner是在每一个maptask所在的节点运行;   Reducer是接收全局所有Mapper的输出结果。
32、如果没有定义partitioner,那数据在被送达reducer前是如何被分区的?
  如果没有自定义的 partitioning,则默认的 partition 算法,即根据每一条数据的 key 的 hashcode 值摸运算(%)reduce 的数量,得到的数字就是“分区号“。
33、MapReduce 出现单点负载多大,怎么负载平衡?
  通过Partitioner实现
34、MapReduce 怎么实现 TopN?
  可以自定义groupingcomparator,对结果进行最大值排序,然后再reduce输出时,控制只输出前n个数。就达到了topn输出的目的。
35、Hadoop的缓存机制(Distributedcache)
  分布式缓存一个最重要的应用就是在进行join操作的时候,如果一个表很大,另一个表很小,我们就可以将这个小表进行广播处理,即每个计算节点上都存一份,然后进行map端的连接操作,经过我的实验验证,这种情况下处理效率大大高于一般的reduce端join,广播处理就运用到了分布式缓存的技术。   DistributedCache将拷贝缓存的文件到Slave节点在任何Job在节点上执行之前,文件在每个Job中只会被拷贝一次,缓存的归档文件会被在Slave节点中解压缩。将本地文件复制到HDFS中去,接着Client会通过addCacheFile() 和addCacheArchive()方法告诉DistributedCache在HDFS中的位置。当文件存放到文地时,JobClient同样获得DistributedCache来创建符号

相关推荐

  1. 2024数据面试汇总(更新。。。)

    2024-06-18 18:12:02       25 阅读
  2. 2023.12面试汇总小结

    2024-06-18 18:12:02       50 阅读
  3. 2024前端面试题汇总(持续更新

    2024-06-18 18:12:02       35 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-18 18:12:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-18 18:12:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-18 18:12:02       82 阅读
  4. Python语言-面向对象

    2024-06-18 18:12:02       91 阅读

热门阅读

  1. mysql中社区版如何杀死锁

    2024-06-18 18:12:02       24 阅读
  2. TypeScript中的枚举

    2024-06-18 18:12:02       29 阅读
  3. Python网络安全项目开发实战,如何看清Web攻击

    2024-06-18 18:12:02       29 阅读
  4. Ubuntu 22.04 一键安装 Oracle 11GR2 单机

    2024-06-18 18:12:02       26 阅读
  5. Spring Boot框架的原理及应用详解(一)

    2024-06-18 18:12:02       23 阅读
  6. 事件传播机制 与 责任链模式

    2024-06-18 18:12:02       26 阅读
  7. 有哪些技术可代替docker?

    2024-06-18 18:12:02       29 阅读
  8. 鸿蒙开发 一 (四)、ArkTS开发 --UI篇

    2024-06-18 18:12:02       32 阅读
  9. Collections.sort()方法总结

    2024-06-18 18:12:02       28 阅读
  10. C# 循环

    2024-06-18 18:12:02       29 阅读
  11. **args和**kwargs是什么?

    2024-06-18 18:12:02       28 阅读
  12. 聚合分析是Elasticsearch中非常强大的工具

    2024-06-18 18:12:02       34 阅读