第一时间获取好内容
作者丨斌迪 HappyMint
编辑丨Zandy
祝读者们中秋节快乐!
导语
为什么考察HDFS?
作为大数据生态的基石,HDFS支撑着所有上层的组件,其重要性不言而喻。HDFS作为分布式存储的基础解决方案,为所有的其他组件提供高可用、稳定而高效的数据存储服务。我们必须要了解其基本原理和概念,一方面可以对工作中排查问题有比较大的帮助,另一方面方便我们与他人沟通交流。
精选题型
基本概念
1
什么是HDFS?
HDFS-Hadoop Distributed File System的缩写,源自于Google的GFS,论文发表于2003年10月,HDFS是GFS克隆版,是一种易于扩展的分布式文件系统,它可以运行在大量普通廉价机器上,提供容错机制并为大量用户提供性能不错的文件存取服务。
2
HDFS的优缺点
优点:
(1) 高容错性
1) 数据自动保存多个副本。它通过增加副本的形式,提高容错性。
2) 某个副本丢失后,可以自动恢复。
(2) 适合批处理
1) 移动计算而不是移动数据。
2) 它会把数据位置暴露给计算框架。
(3) 适合大数据处理
1) 数据规模:能够处理数据规模达到 GB、TB、甚至PB级别的数据。
2) 文件规模:能够处理百万规模以上的文件数量,数量相当之大。
3) 节点规模:能够处理10K节点的规模。
(4) 流式数据访问
1) 一次写入,多次读取,不能修改,只能追加。
2) 保证数据的一致性。
(5) 可构建在廉价机器上
1) 它通过多副本机制,提高可靠性。
2) 它提供了容错和恢复机制。
缺点:
(1) 不适合低延时数据访问;
1) 毫秒级内的读写数据,做不到。
2) 它适合高吞吐率的场景,就是在某一时间内写入大量的数据。
(2) 无法高效的对大量小文件进行存储
1) 存储大量小文件的话,它会占用 NameNode大量的内存来存储文件、目录和块信息。这样是不可取的,因为NameNode的内存总是有限的。
2) 小文件存储的寻道时间会超过读取时间,它违反了HDFS的设计目标。
(3) 单个文件不支持并发写入、文件随机修改
1) 一个文件只能有一个写,不允许多个线程同时写。
3
HDFS有哪些组件进程,它们有什么作用?
1)NameNode:HDFS的主节点,负责维护文件系统树,管理文件、目录、块等信息以及HDFS命名空间,协调并管理所有从节点,负责处理和调度客户端的读写请求。
2)DataNode:HDFS的从节点,负责具体数据的存储,处理与客户端的交互,进行具体数据的读写操作。
3)JournalNode:主要作用是负责两个NameNode之间的状态同步。
4)ZKFC(ZKFailoverController):主要作用是监控NameNode的健康状况,并实现Active状态的自动转移。
4
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状态。
5
HDFS回收站机制,有什么作用?
Trash是HDFS的回收站,HDFS会为每一个用户创建一个回收站目录:/user/用户名/.Trash/。当用户删除文件或目录时,并不是直接删除而是移动到了对应用户的回收站目录下。该目录下的文件会保留一段时间,之后自动删除。保留时间长短可以配置,单位是分钟,如果设置为0,表示不开启回收站功能,具体配置内容如下所示:
//修改core-site.xml
<property>
<name>fs.trash.interval</name>
<value>1440</value>
</property>
这个功能务必要打开,因为它可以有效避免误删数据,避免错误操作带来的严重后果。我们在删除数据时,也最好不要跳过回收站,这样即使出现失误,也还有挽救的可能,不然数据是无法找回的。
6
HDFS数据块(block)是什么?主要作用和影响
数据块是HDFS中的文件在物理上的最小存储单元,块的大小可以通过配置参数( dfs.blocksize)来规定,默认大小在hadoop2.x版本中是128M,老版本中是64M。
HDFS的块比磁盘的块大(磁盘的块一般为512字节),其目的是为了最小化寻址开销。如果块设置得足够大,从磁盘传输数据的时间会明显大于定位这个块开始位置所需的时间。
一个HDFS文件的数据块数量影响程序在读入这个文件时候的分区数量,文件在写入到HDFS上的时候数据块大小也会对最终的分区数有影响。
数据读写
7
HDFS存小文件的影响和解决方案?
影响: 小文件占用了太多的块信息,消耗namenode的内存,寻道时间增加。
解决方案:
方案一:归档(多个小文件合成一个)。缺点:无法更好的修改单个文件。
方案二:转为序列文件。缺点:不方便查看。
方案三:使用Combine函数合并,合并后,每一行都包含文件路径信息。缺点:可能会产生过多额外信息。
方案四:基于业务进行小文件的合并,转变成大文件。例如:同一业务下,每小时产生的小文件按天进行合并,每天的小文件按月进行合并。
8
并发写同一个HDFS文件可行吗?
不行, 因为客户端通过namenode接收到在数据块上写入的许可后, 那个块会锁定直到写入操作完成, 所以不能在同一个块上写入。
9
HDFS写程序?
1)客户端向NameNode发出写文件请求。
2)检查是否已存在文件、检查权限。若通过检查,直接先将操作写入EditLog,并返回输出流对象。
3)client端按块大小切分文件。
4)client将NameNode返回的分配的可写的DataNode列表和Data数据一同发送给最近的第一个DataNode节点,此后client端和NameNode分配的多个DataNode构成pipeline管道,client端向输出流对象中写数据。
5)每个DataNode写完一个块后,会返回确认信息。
6)写完数据,关闭输出流。
7)发送完成信号给NameNode,记录文件名,大小,副本数量等信息。
10
HDFS读程序?
1)client访问NameNode,查询元数据信息,获得这个文件的数据块位置列表,返回输入流对象。
2)就近挑选一台datanode服务器,请求建立输入流 。
3)DataNode向输入流中写数据,以packet为单位来校验。
4)读取完成后,client关闭输入流。
工作实操
11
写出你在工作中用过的hdfs的命令?(参考文章)
(1):文件路径增删改查系列:
hdfs dfs -mkdir dir 创建文件夹
hdfs dfs -rm -r dir 删除文件夹dir
hdfs dfs -ls 查看目录文件信息
hdfs dfs -ls -R 递归查看文件目录信息
hdfs dfs -stat path 返回指定路径的信息
(2):空间大小查看系列命令:
hdfs dfs -du -h dir 按照适合阅读的形式人性化显示文件大小
hdfs dfs -du -s uri 显示目标目录的总大小
(3):权限管理类:
hdfs dfs -chgrp group path 改变文件所属组
hdfs dfs -chgrp -R /dir 递归更改dir目录的所属组
hdfs dfs -chmod [-R] 权限 -path 改变文件的权限
hdfs dfs -chown owner[:group] /dir 改变文件的所有者
hdfs dfs -chown -R owner[:group] /dir 递归更改dir目录的所属用户
(4):文件操作(上传下载复制)系列:
hdfs dfs -touchz a.txt 创建长度为0的空文件a.txt
hdfs dfs -rm file 删除文件file
hdfs dfs -put file dir 向dir文件上传file文件
hdfs dfs -put filea dir/fileb 向dir上传文件filea并且把filea改名为fileb
hdfs dfs -get file dir 下载file到本地文件夹
hdfs dfs -getmerge hdfs://Master:9000/data/SogouResult.txt CombinedResult 把hdfs里面的多个文件合并成一个文件,合并后文件位于本地系统
hdfs dfs -cat file 查看文件file
hdfs fs -text /dir/a.txt 如果文件是文本格式,相当于cat,如果文件是压缩格式,则会先解压,再查看
hdfs fs -tail /dir/a.txt 查看dir目录下面a.txt文件的最后1000字节
hdfs dfs -copyFromLocal localsrc path 从本地复制文件
hdfs dfs -copyToLocal /hdfs/a.txt /local/a.txt 从hdfs拷贝到本地
hdfs dfs -copyFromLocal /dir/source /dir/target 把文件从原路径拷贝到目标路径
hdfs dfs -mv /path/a.txt /path/b.txt 把文件从a目录移动到b目录,可用于回收站恢复文件
(5):判断系列:
hdfs fs -test -e /dir/a.txt 判断文件是否存在,正0负1
hdfs fs -test -d /dir 判断dir是否为目录,正0负1
hdfs fs -test -z /dir/a.txt 判断文件是否为空,正0负1
12
HDFS的数据压缩算法?
优点 | 缺点 | 应用场景 | |
Gzip 压缩 | 压缩率比较高,而且压缩/解压速度也比较快;hadoop 本身支持,在应用中处理gzip 格式的文件就和直接处理文本一样;大部分 linux 系统都自带 gzip 命令,使用方便。 | 不支持 split。 | 当每个文件压缩之后在 130M 以内的(1 个块大小内),都可以考虑用 gzip压缩格式。 |
Bzip2 压缩 | 支持 split;具有很高的压缩率,比 gzip 压缩率高;hadoop 本身支持,但不支持 native;在 linux 系统下自带 bzip2 命令,使用方便。 | 压缩/解压速度慢;不支持 native。 | 适合对速度要求不高,但需要较高的压缩率的时候,可以作为 mapreduce 作业的输出格式;或者输出之后的数据比较大,处理之后的数据需要压缩存档减少磁盘空间并且以后数据用得比较少的情况;或者对单个很大的文本文件想压缩减少存储空间,同时又需要支持 split,而且兼容之前的应用程序(即应用程序不需要修改)的情况。 |
Lzo 压缩 | 压缩/解压速度也比较快,合理的压缩率;支持 split,是 hadoop 中最流行的压缩格式;可以在 linux 系统下安装 lzop 命令,使用方便。 | 压缩率比 Gzip 要低一些; | 一个很大的文本文件,压缩之后还大于 200M 以上的可以考虑,而且单个文件越大, lzo 优点越明显。 |
Snappy 压缩 | 高速压缩速度和合理的压缩率。 | 不支持 split;压缩率比 gzip 要低;hadoop 本身不支持,需要安装; | 当 Mapreduce 作业的 Map 输出的数据比较大的时候,作为 Map 到 Reduce的中间数据的压缩格式;或者作为一个 Mapreduce 作业的输出和另外一个 Mapreduce 作业的输入。 |
13
三个datanode当有一个datanode出现错误会怎样?
出现错误的时候无法和namenode进行通信,namenode要去确认datenode是不是宕掉了,这段时间称作超时时长,hdfs默认时间是10分钟30秒,确认该datanode宕机后,存储在这个datanode上的相应文件的副本数会减1,然后namenode会启动自动平衡机制,补全缺失的副本到其他机器上。
14
HDFS副本放置策略
系统默认有3个副本。其中:
第一个block副本放在client节点所在机架的datanode里(如果client不在集群范围内,则随机选取);
第二个block副本放置在与第一个datanode节点相同的机架中的另一个datanode中(随机选择);
第三个block副本放置于另一个随机远端机架的一个随机datanode中;
如果还有更多的副本就随机放在集群的node里。
15
HDFS可靠性策略
常见的三种错误是:文件损坏、网络或者机器失联、NameNode节点宕机。
对应的策略分别是:
1)CRC校验、用其他副本取代损坏文件;
2)心跳,DataNode定时向NameNode发送心跳信息;
3)HA,文件系统镜像多分存储、主备NameNode实时切换。
小结
本篇HDFS面试指南,结合网络上的经典考题和工作中总结改编的题目一共15道,基本涉及了数据分析工作中常用的知识点,有概念类的也有实操类的,希望读者可以查漏补缺,完善HDFS面试知识点。
-end-