hdfs面试资料结合学习笔记
1. 写数据读数据
- 写数据流程
- 读数据流程
2. 为什么HDFS不支持存储小文件?
原因
- 占用NameNode大量的内存和磁盘来存储文件目录和块信息
- 读取小文件的寻址时间大于读取小文件内容的时间
解决方案
- 从根源上解决小文件的产生,如从每小时抽取一次修改为每天抽取一次来积累数据量
- 合并。写一个MR任务将小文件合并
如果是下载:`hadoop fs -getmerge 小文件目录 下载的目录`
如果是追加一个文件到已经存在的文件末尾就是`hdfs dfs -appendToFile 文件 要追加末尾的文件`
3. HDFS三个核心组件是什么,分别有什么作用?
- HDFS三个核心组件是NameNode,DataNode,SecondaryNameNode
- NameNode
是什么:
是HDFS中的一个进程
干什么:
-- 当hdfs开始运行时,namenode存放的是文件信息,文件内容包括1.关于datanode与block块的映射信息2.存储时间
3.文件权限4.文件大小
怎么用:
-- 当系统启动时
---- datanode会向namenode反馈关于block与datanode的映射关系,namenode将此关系进行记录,
如果某个数据的副本数小于设置数,那么NN会将这个副本拷贝到其他结点集群中运行。
-- 当集群启动时
---- 1.namenode与datanode保持心跳机制,datanode向namenode三秒钟发送一次,在/opt/hadoop-3.1.2/etc/hadoop/hdfs-site.xml中修改
---- 2.如果客户端需要上传或下载数据时,namenode不会让数据存储到异常的datanode中,也不会让客户端从异常的datanode中下载数据
如果datanode超过3秒没有心跳,就认为datanode出现异常。
---- 3. 如果datanode超过10分钟+30秒钟没有心跳,那么namenode就回将datanode存储的数据转存到其他结点。
超时时长的计算公式为:timeout=2*heartbeat.recheck.interval+10*dfs.heartbeat.interval
而默认的heartbeat.recheck.interval大小为5分钟,dfs.heartbeat.interval默认为3秒
性能
namenode为了效率,将所有的操作都在内存中完成,namenode不会在磁盘进行任何交换。 - DataNode
是什么:
是HDFS中的一个进程
干什么:
-- 启动时
---- 汇报之前,先验证Block文件是否被损坏。
---- 向namenode汇报datanode上block的信息。
-- 运行中
---- 向namenode保持心跳机制
---- 客户可以向datanode读写数据
-- 怎么用
---- - SecondaryNameNode
-- 传统解决方案
---- 1. 日志机制
具体情况:做任何操作前前记录日志,当namenode下次启动前按照日志执行一遍即可。
缺点:日志文件大小不可控,随着时间的发展,集群启动的时间会越来越长,有可能日志中存在大量的无效日志。
优点:绝对不会丢失数据。
---- 2. 拍摄快照
具体情况:我们可以将内存中的数据写出到硬盘上,启动时还可以将硬盘上的数据写会到内存中。
缺点:关机时间过长,如果是异常关机,数据还在内存中,没法写入硬盘。如果写出频率过高,导致内存使用率低。
优点:启动时间较短
-- 现解决方案
---- 日志edits+快照fsimage
具体情况:让日志大小可控,让快照定时保存
namenode文件目录:
cd /var/bdp/hadoop/full/dfs/name/current
-- SNN数据恢复
---- 1. 强行杀死namenode结点kill -9 进程名称
---- 2. 清空namenode下name的fsimage和edits文件
---- 3. snn下name中的fsimage和edits复制到namenode对应文件夹中
---- 4. 启动namenodehadoop-daemon.sh start namenode
---- 5. 访问namenode结点页面,成功。
4. fsimage和edit是做什么用的?
- fsimage文件存储的是Hadoop的元数据文件,其中包括HDFS文件系统的所有目录和文件id及相关属性的序列化信息,
如果namenode发生故障,最近的fsimage文件会被载入到内存中,用来重构元数据的最近状态,
再从相关点开始向前执行edit、logs文件中记录的每个事务。 - edits:用户操作的编辑日志文件,存放HDFS文件系统的所有更新操作的动作。
文件所有写操作也会被记录到edits文件。
5. Linux中的块大小为4kb,为什么HDFS中块大小为64MB或128MB?
- 块是存储在文件系统中的数据的最小单元,如果采用4kb的块大小来存放存储在Hadoop中的数据,就会需要大量的块,
大大增加了寻找块的时间,降低了读写效率。 - 一个map或一个reduce都是以一个块为单位处理,如果块很小,mapreduce任务数就会很多,任务之间的切换开销很大,效率很低。
6. 并发写入HDFS文件可行吗?
不行,因为客户端通过namenode接收到在数据块上写入的许可后,那个块会锁定直到写入操作完成,所以不能在同一个块上写入。
7. HDFS 放置副本的策略?
- 1.x:
第一个副本存放的位置:
集群内部(优先考虑和客户端相同结点作为第一节点)
集群外部(选在资源最丰富且不繁忙的结点作为第一节点)
第二个副本存放的位置:
选择与第一个结点不同机架的结点
第三个副本存放的位置:
选择与第二个结点相同机架的结点
第N个结点:
与前面结点不重复的结点 - 2.x
第一个副本存放的位置:
集群内部(优先考虑和客户端相同结点作为第一节点)
集群外部(选在资源最丰富且不繁忙的结点作为第一节点)
第二个副本存放的位置:
选择与第一个结点相同机架的结点
第三个副本存放的位置:
选择与第一个结点不同机架的结点
第N个结点:
与前面结点不重复的结点
8. namenode的工作机制?
- 第一阶段:NameNode启动
(1) 第一次启动NN格式化后,创建Fsimage和Edits文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存
(2) 客户端对元数据进行增删改的请求
(3) NN记录操作日志,更新滚动日志
(4) NN在内存中对元数据进行增删改 - 第二阶段:SNN工作
(1) SNN询问NN是否需要CheckPoint。直接带回NN是否检查结果。
(2) SNN请求执行CheckPoint
(3) NN滚动正在写的Edits日志
(4) 将滚动前的编辑日志和镜像文件拷贝到SNN
(5) SNN加载编辑日志和镜像文件到内存,并合并
(6) 生成新的镜像文件fsimage.chkpoint
(7) 拷贝fsimage.chkpoint到NN
(8) NN将fsimage.chkpoint重写命名成fsimage
9. DataNode工作机制?
(1) 一个数据块在DN上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据的长度,块数据的校验和,以及时间戳。
(2) DN启动后向NN注册,通过后,周期性(1小时)的向NN上报所有块信息。
(3) 心跳是每3秒一次,心跳返回结果:带有NN给该DN的命令,如复制块数据到另一台机器,或删除某个数据块。
如果超过10分钟没有收到某个DN,则认为该节点不可用。
(4) 集群运行中可以安全加入和退出一些机器。
10. HDFS文件系统有什么特点?
- 优点:
(1) 默认保存3份副本,当副本丢失或宕机,数据自动恢复,提供容错机制。
(2) 节约成本,运行在廉价的机器上。
(3) 适合批处理,移动计算而非数据。
(4) 适合大量数据的处理,能处理PB级以上的数据,可处理百万规模以上的文件数量。
(5) 流式数据访问,一次写入,多次读取,高吞吐量。 - 缺点
(1) 不擅长低延迟数据的访问。
(2) 不擅长小文件分区,占用NN大量内存,磁盘寻道时间超过读取时间。
(3) 不擅长并发写入,文件随即修改,一个文件只能有一个写入者,仅支持对文件添加,不支持文件被修改,修改会影响偏移量。
(4) 块的大小一旦文件上传之后就不允许被修改。
11. 有一个200M的文件写入hdfs是先写128M复制完之后再写72M还是全部写完再复制?
HDFS上在写入数据的时候,首先会对数据切块,然后从客户端到datanode形成一个管道,在至少将一个文件写入hdfs上后,
表示文件写入成功,然后进行复制备份操作,所以是全部写完再复制。
12. 什么是机架感知?
NN通过读取我们的配置来配置各个结点所在的机架信息
13. 什么时候会用到机架感知?
数据的流水线复制和HDFS复制副本时
14. HDFS数据完整性如何保证?
NN与DN会定期通过文件的校验和检查文件的完整性,如果发现某节点上的某文件校验和不一致,就会从其他结点上恢复损失的文件,
从而保证数据的完整性。
15. 什么是HDFS文件系统?
HDFS是大数据开源框架Hadoop的组件之一,全称(Hadoop Distributed File System),他是一个分布式文件系统,
由多台服务器联合起来实现文件存储功能,通过目录树来定位文件,集群中的服务器有各自的角色。
16. 什么时候进入安全模式?安全模式下集群有什么限制?安全模式下集群在做什么?如何查看进入、退出、等待安全模式?
- 什么时候进入安全模式?
NameNode启动时,会将镜像文件(Fsimage)和日志(Edits)加载到内存。一旦在内存中成功建立文件系统元数据的镜像,则创建一个新的Fsimage文件和一个空的编辑日志。
此时NN开始监听DN请求。这个过程期间,NN处于安全模式,当数据块的副本数不满足最小副本数时,不会退出安全模式。(dfs.replication.min = 1) - 安全模式下集群,NN的文件系统对客户端是只读的。
- 安全模式下集群在做什么?
在安全模式下集群在进行恢复元数据,即在合并fsimage和edits.log,并且接收DN的心跳信息,恢复block的位置信息,将集群恢复到上次关机前的状态。 - 操作安全模式下的状态?
bin/hdfs dfsadmin -safemode get 查看
bin/hdfs dfsadmin -safemode enter 进入
bin/hdfs dfsadmin -safemode leave 离开
bin/hfds hdfsadmin -safemode wait 等待
- 注意:
集群正常启动后,自动退出安全模式,如果无法正常退出可使用hdfs dfsadmin -safemode leave
退出安全模式;
对于全新创建的HDFS集群,NN启动后不会进入安全模式,因为没有Block块信息。
17. 单机模式(standalone)中的注意点?
在单机模式中不会存在守护进程,所有东西都运行在一个JVM上。这里同样没有DFS,使用的是本地文件系统。单机模式适用于开发过程中运行MapReduce程序,
这也是最少使用的一个模式。
18. 伪分布式模式中的注意点?
伪分布式模式(Pseudo)适用于开发和测试环境,在这个模式中,所有守护进程都在同一台机器上运行。
19. 全分布模式又有什么注意点?
全分布模式通常被用于生产环境,这里我们使用N台主机组成一个Hadoop集群,Hadoop集群,Hadoop守护进程运行在每台主机之上。
这里会存在NameNode运行的主机,DN运行的主机,以及Task Tracker运行的主机。在分布式环境下,主节点和从节点会分开。
20. Hadoop有哪些发行版本?
Apache:最原始的版本。
Cloudera:在大型互联网企业中用的较多。
Hortonworks:文档较好。
21. 启动集群时,我们要对NN格式化操作,为什么只格式化操作一次?
因为格式化NN,就会产生新的集群id,导致NN和DN的集群id不一致,集群找不到以往数据,现象:DN无法正常启动。
所以重写格式化NN时,一定要先删除data数据和log日志,然后再格式化NN后再启动集群。
22. 启动集群的相关命令有哪些?
(1) 启动集群之前格式化
hdfs name -format
(2) 启动HDFS服务
- 启动namenode
sbin/hadoop-daemon.sh start/stop namenode
- 启动datanode
sbin/hadoop-daemon.sh start/stop datanode
检查namenode的web页面是否可以访问:http://192.168.200.132:9870
- 启动YARN服务
(1) 启动resourcemanager
sbin/hadoop-daemon.sh start/stop resourcemanager
(2) 启动nodemanager
sbin/yarn-daemon.sh start/stop nodemanager
检查yarn的web页面,http://192.168.132:8088
- 开启历史服务
sbin/ mr-history-daemon.sh start/stop historyserver
- 实现了集群的群停和群起
(1) HDFS服务进程
配置etc/hadoop/slaves
群起的命令:start-dfs.sh
群停的命令:stop-dfs.sh
(2) yarn服务进程
配置etc/hadoop/slaves
群起的命令:start-yarn.sh
群停的命令:stop-yarn.sh
(3) start/stop-all.sh
23. HDFS文件操作的命令有哪些?
hadoop fs/hdfs dfs 命令分类
本地文件 -> HDFS:
-put
-copyFromLocal
-moveFromLocal
-appendToFile
HDFS与HDFS之间:
-ls
-mkdir
-rm
-rmr
-rm -r
-cp
-mv
-chown
-chmod
-du -h
-df -h
-cat
HDFS -> 本地:
-get
-getmerge
-copyToLocal
其他:
-setrep
-help
23. 是否可以再Windows上运行Hadoop?
最好不要,因为会出现各种问题。
最佳操作系统:Red Hat Linux或Ubuntu
24. 是否可以在不同集群之间复制文件?如何做到?
用distcp命令
hadoop distcp hdfs://hadoop102:9000/user/hello.txt hdfs://hadoop103:9000/user/hello.txt
将集群hadoop102上的文件赋值到hadoop103上。
25. 简述hadoop的几个默认端口及含义?
dfs.namenode.http-address:50070
SecondaryNameNode辅助名称结点端口号:50090
fs.defaultFS:9000(datanode将发送心跳到namenode的端口)
yarn.resourcemanager.webapp.address:8088
historyserver:19888
26. datanode可以设置多目录存储数据吗?怎么实现?
可以,并且设置多目录存储数据不一样。
编辑hdfs-site.xml文件,添加如下配置项,这里块数据会分布存储再data1和data2目录中
<property>
<name>dfs.name.data.dir</name>
<value>file:///dfs/data1,file:///dfs/data2</value>
</property>
27. 公司用hadoop的哪个版本?运行hadoop需要什么平台和哪个JDK的版本?
hadoop2.x比较多,因为企业追求的时稳定性,也有历史兼容问题。越旧的软件,维护的成本越大
运行hadoop需要Linux操作平台,JDK1.8版本
28. 当两个用户尝试访问HDFS中的同一文件并修改时会发生什么?
HDFS上的文件只支持单用户操作,第二个用户会被拒绝。
29. 关于ssh的免密登录?
- 生成密钥 ssh-keygen -t rsa
- 发送私钥 ssh-copy-id localhost(本机)
- 采用非对称加密算法,采用rsa加密算法
30. 谈谈什么是hadoop?
Hadoop是一个开源软件框架,用于存储大量数据,并发计算/查询结点的集群上的数据
Hadoop包括以下内容:
- HDFS(Hadoop Distributed File System)
Hadoop分布式文件 - MapReduce
分布式计算框架,它以分布式和并行的方式处理大量的数据 - YARN(资源定位器)
用于管理和调度集群资源的框架
31. HDFS默认数据块大小是什么,为什么?
Hadoop1.x是64M, Hadoop2.x中是128M
因为目前磁盘的传输率约为100M/s,而HDFS读取文件时最佳的寻址时间为10ms,
寻址时间为传输时间的百分之1时最佳,所以定义块的大小为128M,1秒左右可以读取完毕,
本质上HDFS的块大小取决于磁盘的读取效率,真实情况下,会根据文件大小和集群结点的数量综合考虑块的大小。
32. 默认情况下,进行checkpoint(合并镜像及编辑日志)的触发条件是什么?
默认情况下,2NN每小时执行一次checkpoint
默认情况下,一分钟检查一次Edits文件的操作次数,当操作次数达到一百万时,2NN执行一次checkpoint
33. 工作中如果namenode发生故障,导致namenode中的元数据丢失,如何恢复数据?
- 方法一:
将2NN所在服务器元数据存储目录中数据拷贝到NN中存储,元数据的name目录下,重写开启服务即可。 - 方法二:
使用-importCheckpoint选项启动NameNode守护进程,将2NN所在服务器元数据存储目录拷贝到NN所在服务器的同级目录下,
导入检查点数据,重新开启服务即可。
修改hdfs-site.xml中的
dfs.namenode.checkpoint.period
120
dfs.namenode.name.dir
/opt/hadoop-3.1.2/data/tmp/dfs/name
导入检查点数据:hdfs namenode -importCheckpoint
注意: 恢复后会丢失最后一次Edits文件记录的用户操作
34. 配集群的过程中如果发现各台服务器的datanode启动后,过一段时间后自动消失了,查看原因发现datanode的集群id不同于namenode的集群id,
这时,如果让集群正常工作,如何处理?
- 原因
这是因为多次格式化nn后造成,dn和nn的集群id不一致导致的。 - 解决方案
(方案1) 如果集群没有任何数据,可以删除服务器的datalogs目录重新格式化,重新启动集群
(方案2) 如果集群中已经存在大量数据,则找到无法启动datanode的服务器进入到data/tmp/dfs/data目录下找到VERSION文件删除后,重新开启datanode服务。
35. 列出hadoop集群中hadoop需要启动哪些进程及作用?
(1) namenode
(2) datanode
(3) secondary namenode
(4) resourcemanager: 统一资源调度和管理器。处理客户端请求,监控NodeManager,启动或监控ApplicationMaster, 资源的分配与调度。
(5) nodemanager:提供计算资源管理单个结点上的资源处理来自ResourceManager的命令,处理来自ApplicationMaster的命令。
36. namenode是怎么确定datanode能够正常工作的?他们之间是怎么保持联系的?
dn会向nn注册,nn返回注册成功;
之后每小时dn向nn上传块信息,每3秒dn向nn发送一次心跳包,并携带nn给dn的命令,
默认情况下,如果超过10分30秒nn没有收到dn的心跳,则任务dn掉线。
37. 刷新nn的命令是什么?刷新resourcemanager的命令是什么?
hdfs dfsadmin -refreshNodes
yarn rmadmin -refreshNodes
38. 现要在原有hadoop集群的基础之上要求扩展两个结点,如果操作?
(1) 从现有集群的任意服务器克隆两台服务器,修改主机名和ip地址
(2) 删除集群hadoop3.1.2目录下的data,logs目录
(3) 修改/etc/hosts文件,增加本机的主机,ip映射关系
(4) 将/etc/hosts分发到其他服务器
(5) 配置ssh免密登录
(6) 登录dn和nn
39. 公司有100台服务器组成的集群,由于疫情期间业务骤减,现需要减少10台服务器,如何退役这些结点,有哪种方式退役?
- 退役的方式
(1) 在黑名单上面的主机都会被强制退出
(2) 添加到白名单的主机节点,都允许访问NN,不在白名单的主机节点,都会被强制退出。
注:黑名单、白名单不允许同时出现,如果同时出现,不允许白名单和黑名单同时出现同一个主机名称。
本业务场景适合使用黑名单
步骤:
1. 可以在hadoop-3.1.2/etc/hadoop目录下创建黑名单dfs.hosts.exclude文件
2. 在dfs.hosts.exclude文件中添加要退役的服务器名称
3. 在hdfs-site.xml文件中添加黑名单的配置
<property>
<name>dfs.hosts.exclude</name>
<value>黑名单文件绝对路径</value>
</property>
4. 刷新NN,刷新ResourceManager
hdfs dfsadmin -refreshNodes
yarn dfsadmin -refreshNodes
本文来自博客园,作者:jsqup,转载请注明原文链接:https://www.cnblogs.com/jsqup/p/15963368.html