欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

数据存储-面试题

时间:2023-04-30
一 HDFS 1、请说下 HDFS 读写流程

HDFS 写流程:

client 客户端发送上传请求,通过 RPC 与 namenode 建立通信,namenode 检查该用户是否有上传权限,以及上传的文件是否在 hdfs 对应的目录下重名,如果这两者有任意一个不满足,则直接报错,如果两者都满足,则返回给客户端一个可以上传的信息client 根据文件的大小进行切分,默认 128M 一块,切分完成之后给namenode 发送请求第一个 block 块上传到哪些服务器上namenode 收到请求之后,根据网络拓扑和机架感知以及副本机制进行文件分配,返回可用的 DataNode 的地址客户端收到地址之后与服务器地址列表中的一个节点如 A 进行通信,本质上就是 RPC 调用,建立 pipeline,A 收到请求后会继续调用 B,B 在调用 C,将整个 pipeline 建立完成,逐级返回 clientclient 开始向 A 上发送第一个 block(先从磁盘读取数据然后放到本地内存缓存),以 packet(数据包,64kb)为单位,A 收到一个 packet 就会发送给B,然后 B 发送给 C,A 每传完一个 packet 就会放入一个应答队列等待应答数据被分割成一个个的 packet 数据包在 pipeline 上依次传输,在pipeline 反向传输中,逐个发送 ack(命令正确应答),最终由 pipeline 中第一个 DataNode 节点 A 将 pipelineack 发送给 Client当一个 block 传输完成之后, Client 再次请求 NameNode 上传第二个block ,namenode 重新选择三台 DataNode 给 client

HDFS 读流程:

client 向 namenode 发送 RPC 请求。请求文件 block 的位置namenode 收到请求之后会检查用户权限以及是否有这个文件,如果都符合,则会视情况返回部分或全部的 block 列表,对于每个 block,NameNode 都会返回含有该 block 副本的 DataNode 地址; 这些返回的 DN 地址,会按照集群拓扑结构得出 DataNode 与客户端的距离,然后进行排序,排序两个规则:网络拓扑结构中距离 Client 近的排靠前;心跳机制中超时汇报的 DN 状态为 STALE,这样的排靠后Client 选取排序靠前的 DataNode 来读取 block,如果客户端本身就是DataNode,那么将从本地直接获取数据(短路读取特性)底层上本质是建立 Socket Stream(FSDataInputStream),重复的调用父类 DataInputStream 的 read 方法,直到这个块上的数据读取完毕当读完列表的 block 后,若文件读取还没有结束,客户端会继续向NameNode 获取下一批的 block 列表读取完一个 block 都会进行 checksum 验证,如果读取 DataNode 时出现错误,客户端会通知 NameNode,然后再从下一个拥有该 block 副本的DataNode 继续读read 方法是并行的读取 block 信息,不是一块一块的读取;NameNode 只是返回 Client 请求包含块的 DataNode 地址,并不是返回请求块的数据最终读取来所有的 block 会合并成一个完整的最终文件 2.HDFS 在读取文件的时候,如果其中一个块突然损坏了怎么办

客户端读取完 DataNode 上的块之后会进行 checksum 验证,也就是把客户端读取到本地的块与 HDFS 上的原始块进行校验,如果发现校验结果不一致,客户端会通知NameNode,然后再从下一个拥有该 block 副本的 DataNode 继续读。

3、HDFS 在上传文件的时候,如果其中一个 DataNode 突然挂掉了怎么办

客户端上传文件时与 DataNode 建立 pipeline 管道,管道正向是客户端向DataNode 发送的数据包,管道反向是 DataNode 向客户端发送 ack 确认,也就是正确接收到数据包之后发送一个已确认接收到的应答,当 DataNode 突然挂掉了,客户端接收不到这个 DataNode 发送的 ack 确认,客户端会通知 NameNode,NameNode 检查该块的副本与规定的不符,
NameNode 会通知 DataNode 去复制副本,并将挂掉的 DataNode 作下线处理,不再让它参与文件上传与下载。

4、请说下 HDFS 的组织架构 Client:客户端
(1)切分文件。文件上传 HDFS 的时候,Client 将文件切分成一个一个的 Block,然后进行存储
(2)与 NameNode 交互,获取文件的位置信息
(3)与 DataNode 交互,读取或者写入数据
(4)Client 提供一些命令来管理 HDFS,比如启动关闭 HDFS、访问 HDFS 目录及内容等NameNode:名称节点,也称主节点,存储数据的元数据信息,不存储具体的数据
(1)管理 HDFS 的名称空间
(2)管理数据块(Block)映射信息
(3)配置副本策略
(4)处理客户端读写请求DataNode:数据节点,也称从节点。NameNode 下达命令,DataNode 执行实际的操作
(1)存储实际的数据块
(2)执行数据块的读/写操作Secondary NameNode:并非 NameNode 的热备。当 NameNode 挂掉的时候,它并不能马上替换 NameNode 并提供服务
(1)辅助 NameNode,分担其工作量
(2)定期合并 Fsimage 和 Edits,并推送给 NameNode
(3)在紧急情况下,可辅助恢复 NameNode 二 Kafka 1.为什么要使用 kafka?

缓冲和削峰:上游数据时有突发流量,下游可能扛不住,或者下游没有足够多的机器来保证冗余,kafka 在中间可以起到一个缓冲的作用,把消息暂存在 kafka 中,下游服务就可以按照自己的节奏进行慢慢处理。解耦和扩展性:项目开始的时候,并不能确定具体需求。消息队列可以作为一个接口层,解耦重要的业务流程。只需要遵守约定,针对数据编程即可获取扩展能力。冗余:可以采用一对多的方式,一个生产者发布消息,可以被多个订阅 topic 的服务消费到,供多个毫无关联的业务使用。健壮性:消息队列可以堆积请求,所以消费端业务即使短时间死掉,也不会影响主要业务的正常进行。异步通信:很多时候,用户不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。 2、Kafka 消费过的消息如何再消费?

kafka 消费消息的 offset 是定义在 zookeeper 中的, 如果想重复消费 kafka 的消息,可以在 redis 中自己记录 offset 的 checkpoint 点(n 个),当想重复消费消息时,通过读取 redis 中的 checkpoint 点进行 zookeeper 的 offset 重设,这样就可以达到重复消费消息的目的了

3.kafka 的数据是放在磁盘上还是内存上,为什么速度会快?

kafka 使用的是磁盘存储。
速度快是因为:顺序写入:因为硬盘是机械结构,每次读写都会寻址->写入,其中寻址是一个“机械动作”,它是耗时的。所以硬盘 “讨厌”随机 I/O, 喜欢顺序 I/O。为了提高读写硬盘的速度,Kafka 就是使用顺序 I/O。Memory Mapped Files(内存映射文件):64位操作系统中一般可以表示 20G 的数据文件,它的工作原理是直接利用操作系统的Page 来实现文件到物理内存的直接映射。完成映射之后你对物理内存的操作会被同步到硬盘上。Kafka 高效文件存储设计: Kafka 把 topic 中一个 parition 大文件分成多个小文件段,通过多个小文件段,就容易定期清除或删除已经消费完文件,减少磁盘占用。通过索引信息可以快速定位message 和确定 response 的 大 小。通过 index 元数据全部映射到 memory(内存映射文件),可以避免 segment file 的 IO 磁盘操作。通过索引文件稀疏存储,可以大幅降低index 文件元数据占用空间大小。

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。