前一段时间,小菌陆续分享了HDFS系列1-12的博客,总算是要完结了。于是小菌打算再出一期关于HDFS的经典面试题,其中的内容大多都出自于在前面分享的博客中,感兴趣的小伙伴们可以自行浏览,链接小菌放到文末了哦~
分布式需要从
计算
和存储
两个方面来讨论: 分布式计算:是一种计算方法,是将该应用分解成许多小的部分,分配给多台计算机进行处理。这样可以节约整体计算时间,大大提高计算效率。 分布式存储,是一种数据存储技术,通过网络使用企业中的每台机器上的磁盘空间,将这些分散的存储资源构成一个虚拟的存储设备,数据分散存储在企业的各个角落,多台服务器。
a) HDFS i. 管理者:NameNode ii. 工作者:DataNode iii. 辅助管理者:SecondaryNameNode b) MapReduce c) Yarn i. 管理者:ResourceManager ii. 工作者:NodeManager
i. 第一副本来源于客户端 ii. 第二副本按照一定规则存放在与第一副本相同机架上的不同节点 iii. 第三副本按照一定规则存放在与第一二副本逻辑距离最近的不同机架上的随机节点上
a) 维护管理文件系统的名字空间(元数据) b) 确定用户的文件块指向具体的DataNode结点的映射关系 c) 维护管理DataNode周期性上报的心跳信息
a) 执行数据的读写 b) 周期性地向NameNode上报心跳信息(包括数据的信息、校验和)若DataNode超过10分钟没有向NameNode上传心跳信息,则视为该DataNode所在节点已宕机 c) 执行流水线式复制数据
通俗的来说就是nameNode通过读取我们的配置来配置各个节点所在的机架信息
NameNode分配节点的时候 (数据的流水线复制和HDFS复制副本时)
1、 client发起文件上传请求,通过RPC与NameNode建立通讯,NameNode检查目标文件是否已存在,父目录是否 存在,返回是否可以上传; 2、 client请求第一个block该传输到哪些DataNode服务器上; 3、 NameNode根据配置文件中指定的备份数量及机架感知原理进行文件分配,返回可用的DataNode的地址如: A,B,C; 4、 client请求3台DataNode中的一台A上传数据(本质上是一个RPC调用,建立pipeline),A收到请求会继续调用 B,然后B调用C,将整个pipeline建立完成,后逐级返回client; 5、 client开始往A上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以packet为单位(默认64K),A 收到一个packet就会传给B,B传给C;A每传一个packet会放入一个应答队列等待应答。 6、 数据被分割成一个个packet数据包在pipeline上依次传输,在pipeline反方向上,逐个发送ack(命令正确应 答),最终由pipeline中第一个DataNode节点A将pipelineack发送给client;。 7、关闭写入流。 8、 当一个block传输完成之后,client再次请求NameNode上传第二个block到服务器。
1、客户端通过调用FileSystem对象的open()来读取希望打开的文件。 2、 Client向NameNode发起RPC请求,来确定请求文件block所在的位置; 3、 NameNode会视情况返回文件的部分或者全部block列表,对于每个block,NameNode 都会返回含有该 block 副本的 DataNode 地址; 这些返回的 DN 地址,会按照集群拓扑结构得出 DataNode 与客户端的距离,然后进行排序,排序两个规则:网络拓扑结构中距离 Client 近的排靠前;心跳机制中超时汇报的 DN 状态为 STALE,这样的排 靠后。 4、Client 选取排序靠前的 DataNode 来读取 block,如果客户端本身就是DataNode,那么将从本地直接获取数据(短 路读取特性)。 5、 底层上本质是建立 Socket Stream(FSDataInputStream),重复的调用父类 DataInputStream 的 read 方法, 直到这个块上的数据读取完毕。 6、并行读取,若失败重新读取。 7、 当读完列表的 block 后,若文件读取还没有结束,客户端会继续向NameNode 获取下一批的 block 列表。并返回后续block列表。 8、 最终关闭读取流,并将读取来所有的 block 合并成一个完整的最终文件。
数据在写入之后进行校验和的计算,DataNode周期性进行校验和计算,将计算结果与第一次的结果进行对比。 若相同表示无数据丢失,若不相同表示数据有丢失,丢失进行数据恢复。 数据读取之前对数据进行校验,与第一次的结果进行对比。若相同表示数据没有丢失,可以读取。若不相同表示数据 有所丢失。到其他副本读取。
1、海量数据存储: HDFS可横向扩展,其存储的文件可以支持PB级别数据。 2、高容错性:节点丢失,系统依然可用,数据保存多个副本,副本丢失后自动恢复。可构建在廉价(与小型机大型机比)的机器上,实现线性扩展(随着节点数量的增加,集群的存储能力,计算能力随之增加)。 3、大文件存储:DFS采用数据块的方式存储数据,将一个大文件切分成多个小文件,分布存储。
1.不能做到低延迟数据访问: HDFS 针对一次性读取大量数据继续了优化,牺牲了延迟性。 2. 不适合大量的小文件存储 : A:由于NameNode将文件系统的元数据存储在内存中,因此该文件系统所能存储的文件总数受限于NameNode的内存容量。 B:每个文件、目录和数据块的存储信息大约占150字节。 由于以上两个原因,所以导致HDFS不适合大量的小文件存储。 3.文件的修改; 不适合多次写入,一次读取(少量读取)。 4.不支持多用户的并行写入同一个文本。
当集群启动时,首先进入安全模式 或者使用 hdfs dfsadmin -safemode enter 命令手动进入安全模式
a) 不允许客户端进行任何修改文件的操作,包括上传文件、删除文件、重命名、创建文件夹等操作。 b) 只允许客户端进行读取数据的操作
a) 会检查数据块的完整性 b) 合并fsimge,editslog恢复上一次关机前的状态
a) hdfs dfsadmin -safemode enter 命令手动进入 b) hdfs dfsadmin -safemode leave 命令手动退出
a) fsimage文件其实是Hadoop文件系统元数据的一个永久性的检查点。 b) edits文件存放的是客户端对集群的操作 用这两个文件可以恢复集群在关机前的状态!
a) 在NameNode启动的时候,它会将fsimage文件中的内容加载到内存中,之后再执行edits文件中的各项操作,使得内存中的元数据和实际的同步。 b).SecondayNameNode周期性的拉取fsimage和edits进行合并生成新的fsimage
a) NameNode创建一个Edits.new b)SNN从NameNode节点拷贝Fsimage和Edits文件到SNN,SNN将两个文件导入内存进行合并操作生成一个新的Fsimage.ckpt文件。 c)SNN将新的Fsimage.ckpt发送到NameNode节点,重命名为Fsimage替换原先的Fsimage,原先的Edits生成Edits.new文件,将Edits替换为新的Edits.new
a):进行Fsimage和Edits的合并操作,减少edits日志大小,加快集群的启动速度 b):将Fsimage与Edits进行备份,防止丢失
1.时间维度,默认一小时触发一次 dfs.namenode.checkpoint.period :3600 2.次数维度,默认HDFS操作达到100万次触发一次 dfs.namenode.checkpoint.txns : 1000000 3、六十秒判断一次是否达到100W
进入到SNN的数据存储文件夹----->将最新版本的Fsimage以及Edits拷贝至nameNode节点,放在NN节点相应的配置目录下----->重启集群
a) 关闭防护墙、关闭SELinux、配置ssh免密登录、配置IP与主机名对应、更改主机名、安装jdk、
b) 创建白名单dfs.hosts,将所有节点添加进该文件,编辑hdfs-site.xml文件配置dfs.hosts映射信息 c) 使用 hdfs dfsadmin -refreshNodes 刷新NameNode d) 使用 yarn dfsadmin -refreshNodes 更新resourceManager e) 修改slaves文件增加新服务节点的主机名称 f) 启动新增节点 g) 浏览器查看新增节点信息 h) 执行 start-balancer.sh 负载均衡
a) 使用HDFS提供的 -getmerge 命令 【HDFS–>本地】 b) 遍历每个小文件追加到一个文件再进行上传 【本地–>HDFS】
a) dfs.permissions
a)实例化configuration b) 实例化文件系统对象hdfs c) 调用hdfs的mkdirs()方法即可
各目录下常用英文对应的中文意思