HDFS经典题目整理
1、Hdfs的block和spark的partition有什么区别吗?
在hdfs中的block是分布式存储的最小单元,等分,并且可以设置冗余,这样设计会出现一部分磁盘空间的浪费,但是整齐的block大小,便于快速找到,读取对应的内容,例如快手利用hdfs来进行存储视频。
Spark中的parition是弹性分布式数据集中rdd的最小单元,rdd是由分布在各个节点上的partition组成的。partition是指在spark计算过程中,生成的数据在计算空间内的最小单元,同一份数据,parition 大小不一,数量不定,是根据app的算子和最初读取的数据分块数量来决定的,例如spark读取hdfs的数据,这个时候调用的是hadoop底层的inputformat所以,一个快就是一个partition。
block位于存储,partition位于计算,block大小是固定的,parition的大小是不固定的。
2、Mapreduce和spark都是并行计算,他们之间有什么区别吗?
mapreduce只有一个map和reduce方法,但是spark有很多多种多样的算子,表达性好
spark可以进行迭代计算,mapreduce需要进行手动操作
hadoop的一个作业叫做job,job分为maptask和reducetask,每个task都是在自己的进程中执行,当task结束的时候,进程也会结束
spark的作业叫做application,一个app对应了一个sparkcontext,一个app中对应了多个job,每个action算子都会产生一个job,一个job中有多个stage,这些stage是根据划分shufflfle的stagescheduler来进行划分的,依据的是血缘关系,每个stage中有多个task然后把这些task组成taskset然后通过taskscheduler来发送到各个executor中进行执行,exector中生命周期是和app一样的,计算没有job执行,这些exector也是存在。
spark的迭代计算的。可以通过dag来进行容错,但是mapreduce的迭代计算是需要手动的。
3、Spark比Mapreduce快?为什么快呢?快在哪里呢?
基于内存计算,减少低效的磁盘交互
高效的调度算法,基于DAG
容错机制Lingage,主要是DAG和Lianage,即使spark不适用内存技术,也大大快于mapreduce
4、HDFS写数据流程
往hdfs目录树中添加INodeFile
添加契约,也就是当前仅有一个客户端可以操作这个文件(后台会有一个线程来实时监控契约队列,会有一个续约操作)
启动DataStreamer来进行写数据的操作,启动续约线程。
然后将我们的文件是一个个的shunk的写入到packet里面,然后将packet放入到dataqueue里面等待发送
向namenode去申请block,也就是返回可用的datanode节点(数据的负载均衡,也就是机架感知和其他的一些策略)
建立datanode之间的数据管道
先把要写出的数据添加到ackqueue上,然后写数据,移除dataqueue中的packet,假如这个时候写数据失败了,就把ack中的数据添加到dataqueue上重新写
然后datanode会初始化一个packetResponder的线程,进行将我们的数据写入到ack队列,这个是datanode中的队列,同事会获取到其他datanode的处理结果,将数据写入磁盘,然后依次层层上报给我们的客户端,写失败了,还是有ack机制,重新发送。
如果数据管道建立失败了。就删除向namnode申请的block,然后重新建立block和建立数据管道
假如在datanode写数据流程中出问题,那么这个时候会分为两个流程,先判断是几个副本写失败了,如果是3个副本的情况下,》=2的时候这个时候就会删除block,然后重新建立管道,如果是一个的话,那么这个时候没事,重新建立管道,这个时候抛弃那一台坏的,好的留下。
5、有一个很大的文件,内存装不下,如何实现去重?
1、首先对每一行数据进行hash
2、将每行数据hash出来之后然后%1000。
3、针对每个文件进行去重这个时候应该就可以了。
6、HDFS的压缩算法
1、SNAPPY
优点:高速压缩速度和合理的压缩率
缺点:不支持split;压缩率比gzip要低;hadoop本身不支持,需要安装;当mapreduce作业的map输出的数据比较大的时候,作为map到reduce中间的数据的压缩格式,或者作为mareduce作业的输出和另外一个mapreduce作业的输入
2、LZO
优点:压缩/解压速度也比较快,合理的压缩率。支持split,是hadoop中最流行的压缩格式。可以再linux系统下安装lzop命令,使用方便
缺点:压缩率比gzip要低一些;hadoop本身不支持,需要安装;在应用中对lazo格式的文件需要做一些特殊处理(为了支持split需要建索引,还需要指定inputformat为lzo格式)。
应用场景:一个很大的文本文件,压缩之后还大于200M以上的可以考虑,而且单个文件越大的有点也越明显
7、datanode在什么情况下不会备份
如果设置副本数为1,则不会进行备份。
8、三个datanode当有一个datanode出现错误会怎么样?
出现错误的时候无法和namenode进行通信,namenode要去确认namenode是不是宕机了,这段时间称为超时时长,hdfs默认时间是10分钟30秒,确认该datanode宕机后,hdfs的副本数会减1,然后namenode会将宕机的datanode的数据复制到其他机器上
9、有一个200M的文件写入hdfs是先写128M复制完之后再写72M还是全部写完再复制?
HDFS上在写入数据的时候,首先会对数据切块,然后从客户端到datanode形成一个管道,在至少将一个文件写入hdfs上后,表示文件写入成功,然后进行复制备份操作,所以是全部写完再复制
10、HDFS里面的edits和fsimage作用?
fsimage文件其实是hadoop文件系统元数据的一个永久性的检查点,其中包含hadoop文件系统所有目录和inode的序列化信息,也就是目录树
edits文件存放的是hadoop文件系统的所有更新操作的路径,文件系统客户端执行的所以写操作会被记录到edits文件中。
fsimage和edits文件都是经过序列化的,在namenode启动的时候,它会将fsimage文件中的内容加载到内存中,之后再执行edits文件中的各项操作,使得内存中的元数据和实际的同步,存在内存中的元数据支持客户端的读操作。
namenode起来之后,hdfs中的更新操作会重新写到edits文件中,因为fsimage文件一般都很大(GB级别的很常见),如果所有的更新操作都会往fsimage文件中添加,这样会导致系统运行的十分缓慢,但是如果往edits文件里面写就不会这样,每次执行写操作之后,且在向客户端发送成功代码之前,edits文件都需要同步更新。如果一个文件比较大,使得写操作需要向多台机器进行操作,只有当所有的写数据都执行完毕之后,写操作才会返回成功,这样的好处是任何的操作都不会因为机器的故障而导致元数据的不同步。
11、当小文件数量过多时,如何解决小文件问题
当每个小文件数据量比较小的时候,可以通过命令的方式进行小文件的合并如:hadoop fs -cat
hdfs://cdh5/tmp/lxw1234/*.txt | hadoop fs -appendToFile - hdfs://cdh5/tmp/hdfs_largefile.txt,当数据量比较大的时候建议使用MR进行小文件的合并
12、介绍一下hadoop中的rpc协议,以及底层采用什么来进行封装的
用户将用户请求中的参数或者应答转换成字节流以便跨机传输。
函数调用层:函数调用层主要功能是定位要调用的函数,并执行该函数,hadoop采用了java的反射机制和动态代理实现了函数的调用。
网络传输层:网络传输层描述了client和server之间消息的传输方式,hadoop采用了基于tcp/ip的socket机制。