本专栏博文会整理日常工作与面试中最常用到的大数据相关组件与Java语言的架构、概念、知识点,方便大家进行查阅。
涉及到的面试题以及答案均为博主搜罗整理,并加上自己的理解编写而成。同时博主会在部分题目的下方添加管遇此题深入理解的博文连接,方便读者的深入理解。
希望大家可以通过此篇博文对于大数据相关概念有一个更深入的理解
还有哪些想看的面试题,读者可以在评论区补充,博主会在一天内进行更新!!!
最后预祝大家新的一年升职加薪,工资涨涨涨!
1)跟NN通信查询元数据(block所在的DN的节点),找到文件块所在的DN的服务器。
2)挑选一台DN(就近原则,然后随机)服务器,请求建立socket流。
3)DN开始发送数据(从磁盘里读取数据放入流,一packet为单位做校验)
4)客户端以packet为单位接收,现在本地缓存,然后写入目标文件中,后面的block块就相当于append到前面的block块,最后合成最终需要的文件。
深入阅读: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读写流程
假设有一份数据,三副本
深入阅读:hadoop详细了解5个进程的作用
hdfs fs -help rm
hdfs fs -ls /
hdfs fs -mkdir -p /user/ysir
hdfs fs -get /aaa/a.txt
hdfs fs -put ~/a.txt /
hdfs fs -cat /user/ysir/a.txt
hdfs fs -chmod 777 /a.txt
hdfs fs -chown hdfs:hdfs /a.txt
hdfs fs -cp /aaa/a.txt /bbb/
hdfs fs -mv /aaa/a.txt /bbb/
hdfs fs -rm /user/ysir/a.txt
shuffle是MapReduce的核心,是map和reduce的中间过程。
Map->keyby->sort->combine->partition->reduce
map阶段:从磁盘读入数据 --> map函数 --> combine结果(非必需的过程)–> 结果写回磁盘。
map阶段中,当输出数据达到一定的值(阈值)时,会从内存写到磁盘;若小于阈值,则会缓存起来,可以减小磁盘IO开销。所以,可以通过设置适当的阈值大小,来优化性能。
reduce阶段:从map的输出中读入数据 --> sort(根据key值) --> reduce函数–> 结果到HDFS。
reduce阶段中,会从map端拉数据过来,可能会跨节点,应该尽量减少这种网络开销,使数据“本地化”。
partition:将map的结果发送到相应的reduce。
这就对partition有两个要求:
1)负载均衡。尽量将工作分配给不同的reduce。
2)效率。分配速度要快。
combiner:相当于本地化的reduce。
特点:map端的输出作为其输入;其输出作为reduce的输入。这就要求combiner要保持输入和输出类型的一致性,也就不适用求平均数、权益这样的运算。
深入阅读:MapReduce:详解Shuffle过程
hdfs 文件存储格式分为两大类 行存储和列存储
行存储:将一整行存储在一起,是一种连续的存储方式,例如SequenceFile,MapFile,缺点是如果只需要行中的某一列也必须把整行都读入内存当中
列存储:列存储会把文件切割成若干列,每一列存储在一起,是需要那一列读取那一列,不需要的不用读取,例如parquet ORCfile,RCfile,列存储不适合流式写入,写入失败当前文件无法恢复因此flume采用行存储,列存储由于每一列中的数据类型相同所以可以根据数据类型选择适合的编码和压缩格式
textfile
textfile为默认格式,存储方式为行式存储,在检索时磁盘开销大 数据解析开销大,而对压缩的text文件 hive无法进行合并和拆分。
SequenceFile
Hadoop提供的一个行存储结构,Hadoop适合处理大文件而不适合处理小文件,所以sequencefile是为小文件提供的一种容器,将小文件包装起来形成一个SequenceFile类, 它用一种
RCFile
存储方式为数据按行分块,每块按照列存储的行列混合模式,具有压缩快,列存取快的特点。
在使用时,读记录尽量涉及到的block最少,这样读取需要的列只需要读取每个row group 的头部定义,具有明显速度优势。
读取全量数据的操作 性能可能比sequencefile没有明显的优势。
ORCfile
是RCfile的升级版,将数据划分为默认大小为250MB的stripe(条带),每个stripe包含索引,数据和footer,ORCfile包换索引比RCfile更加高效
Parquet
parquet基于Google的dremel,擅长处理深度嵌套的数据(有点类似于嵌套多层的json格式),parquet会将嵌套结构整合为平面列存储,
深入阅读:HDFS中的常用压缩算法及区别
深入阅读:HDFS中的常用压缩算法及区别
小文件过多导致的问题
小文件是指文件size小于HDFS上block大小的文件。这样的文件会给hadoop的扩展性和性能带来严重问题。
优化方案
Mapreduce 程序效率的瓶颈在于两点:
计算机性能
CPU、内存、磁盘健康、网络
I/O 操作优化
(1)数据倾斜
(2)map和reduce数设置不合理
(3)reduce等待过久
(4)小文件过多
(5)大量的不可分块的超大文件
(6)spill次数过多
(7)merge次数过多等。
深入阅读:Hadoop(三)mapreduce 跑的慢的原因及其优化方法
数据输入
(1)合并小文件:在执行mr任务前将小文件进行合并,大量的小文件会产生大量的map任务,增大map任务装载次数,而任务的装载比较耗时,从而导致 mr 运行较慢。
(2)采用ConbinFileInputFormat来作为输入,解决输入端大量小文件场景。
map阶段
(1)减少spill次数:通过调整io.sort.mb及sort.spill.percent参数值,增大触发spill的内存上限,减少spill次数,从而减少磁盘 IO。
(2)减少merge次数:通过调整io.sort.factor参数,增大merge的文件数目,减少merge的次数,从而缩短mr处理时间。
(3)在 map 之后先进行combine处理,减少 I/O。
reduce阶段
(1)合理设置map和reduce数:两个都不能设置太少,也不能设置太多。太少,会导致task等待,延长处理时间;太多,会导致 map、reduce任务间竞争资源,造成处理超时等错误。
(2)设置map、reduce共存:调整slowstart.completedmaps参数,使map运行到一定程度后,reduce也开始运行,减少reduce的等待时间。
(3)规避使用reduce,因为Reduce在用于连接数据集的时候将会产生大量的网络消耗。
(4)合理设置reduce端的buffer,默认情况下,数据达到一个阈值的时候,buffer中的数据就会写入磁盘,然后reduce会从磁盘中获得所有的数据。也就是说,buffer和reduce是没有直接关联的,中间多个一个写磁盘->读磁盘的过程,既然有这个弊端,那么就可以通过参数来配置,使得buffer中的一部分数据可以直接输送到reduce,从而减少IO开销:mapred.job.reduce.input.buffer.percent,默认为0.0。当值大于0的时候,会保留指定比例的内存读buffer中的数据直接拿给reduce使用。这样一来,设置buffer需要内存,读取数据需要内存,reduce计算也要内存,所以要根据作业的运行情况进行调整。
IO传输
(1)采用数据压缩的方式,减少网络IO的的时间。安装Snappy和LZOP压缩编码器。
(2)使用SequenceFile二进制文件
描述:
简单来说数据倾斜就是Map阶段数据的key分化严重不均,在进行shuffle之后,一部分reduce节点数据过多,一部分节点数据过少,最终导致整个程序运行时间很长才结束。
一般会有两种情况:
举个 word count 的入门例子,它的map 阶段就是形成 (“aaa”,1)的形式,然后在reduce 阶段进行 value 相加,得出 “aaa” 出现的次数。若进行 word count 的文本有100G,其中 80G 全部是 “aaa” 剩下 20G 是其余单词,那就会形成 80G 的数据量交给一个 reduce 进行相加,其余 20G 根据 key 不同分散到不同 reduce 进行相加的情况。如此就造成了数据倾斜,最后就是很多reduce节点跑到 99%然后一直在原地等着那80G的reduce节点跑完。
解决方案:
深入阅读:Hadoop数据倾斜及解决办法
深入阅读:HDFS集群优化篇