hadoop面试题
HDFS阶段
单元练习5
1,HDFS是Hadoop Distribute File System 的简称,即:Hadoop分布式文件系统。
2,Hadoop分布式文件系统解决的是大数据存储问题,它们是横跨在多台计算机上的存储系统,为存储和处理超大规模数据提供所需的扩展能力。
-
硬件故障是常态, HDFS将有成百上千的服务器组成,每一个组成部分都有可能出现故障。因此故障的检测和自动快速恢复是HDFS的核心架构目标。
-
HDFS上的应用与一般的应用不同,它们主要是以流式读取数据。HDFS被设计成适合批量处理,而不是用户交互式的。相较于数据访问的反应时间,更注重数据访问的高吞吐量。
-
典型的HDFS文件大小是GB到TB的级别。所以,HDFS被调整成支持大文件。它应该提供很高的聚合数据带宽,一个集群中支持数百个节点,一个集群中还应该支持千万级别的文件。
-
大部分HDFS应用对文件要求的是write-one-read-many访问模型。一个文件一旦创建、写入、关闭之后就不需要修改了。这一假设简化了数据一致性问题,使高吞吐量的数据访问成为可能。
-
移动计算的代价比之移动数据的代价低。一个应用请求的计算,离它操作的数据越近就越高效,这在数据达到海量级别的时候更是如此。将计算移动到数据附近,比之将数据移动到应用所在显然更好。
-
在异构的硬件和软件平台上的可移植性。这将推动需要大数据集的应用更广泛地采用HDFS作为平台。
1,将本地itcast.txt文件上传至HDFS(node1节点8020端口)的itcast文件夹下
2,从HDFS的itcast文件夹,下载itcast.txt文件
1,将本地itcast.txt文件上传至HDFS(node1节点8020端口)的itcast文件夹下
hadoop fs -put file:///root/itcast.txt hdfs://node1:8020/itcast
2,从HDFS的itcast文件夹,下载itcast.txt文件
hadoop fs -get hdfs://node1:8020/itcast/itcast.txt file:///root/
1,HDFS创建small文件夹
2,centos本地上传itheima.txt,itcast.txt,boxuegu.txt三个文件至HDFS的small文件夹下。
3,将刚才上传的三个文件进行合并,合并的结果依然存储在small文件夹下,合并文件名称为merge.txt
# 创建3个小文件
echo itheima >> itheima.txt
echo itcast >> itcast.txt
echo boxuegu >> boxuegu.txt
# hdfs中创建/small目录
hadoop fs -mkdir /small
# 上传小文件的到samll目录
hadoop fs -put *.txt /small
# 合并并下载文件到本地目录
hadoop fs -getmerge /small merge.txt
# 上传合并的文件到/small
hadoop fs -put merge.txt /small
单元练习6
- DataNode负责将实际数据存储在HDFS中。(必答,不答扣分)
- DataNode也称为Slave。(必答,不答扣分)
- NameNode和DataNode会保持不断通信。(必答,不答扣分)
- DataNode启动时,它将自己发布到NameNode并汇报自己负责持有的块列表。(必答,不答扣分)
- 当某个DataNode关闭时,它不会影响数据或群集的可用性。NameNode将安排由其他DataNode管理的块进行副本复制。(必答,不答扣分)
- DataNode所在机器通常配置有大量的硬盘空间。因为实际数据存储在DataNode中。(必答,不答扣分)
- DataNode会定期(dfs.heartbeat.interval配置项配置,默认是3秒)向NameNode发送心跳,如果NameNode长时间没有接受到DataNode发送的心跳, NameNode就会认为该DataNode失效。
- block汇报时间间隔取参数dfs.blockreport.intervalMsec,参数未配置的话默认为6小时.
1、HDFS客户端创建FileSystem对象实例DistributedFileSystem, FileSystem封装了与文件系统操作的相关方法。调用DistributedFileSystem对象的open()方法来打开希望读取的文件。
2、DistributedFileSystem使用RPC调用namenode来确定文件中前几个块的块位置(分批次读取)信息。
对于每个块,namenode返回具有该块所有副本的datanode位置地址列表,并且该地址列表是排序好的,与客户端的网络拓扑距离近的排序靠前。
3、DistributedFileSystem将FSDataInputStream输入流返回到客户端以供其读取数据。
4、客户端在FSDataInputStream输入流上调用read()方法。然后,已存储DataNode地址的InputStream连接到文件中第一个块的最近的DataNode。数据从DataNode流回客户端,结果客户端可以在流上重复调用read()。
5、当该块结束时,InputStream将关闭与DataNode的连接,然后寻找下一个块的最佳datanode。这些操作对用户来说是透明的。所以用户感觉起来它一直在读取一个连续的流。客户端从流中读取数据时,也会根据需要询问NameNode来检索下一批数据块的DataNode位置信息。
6、一旦客户端完成读取,就对FSDataInputStream调用close()方法。
给的答案:
启动时,DataNode需要向NameNode注册自己并汇报自己持有的数据块信息;
工作时,主从之间有心跳机制,数据块汇报机制;
-
DataNode会定期(dfs.heartbeat.interval配置项配置,默认是3秒)向NameNode发送心跳,如果NameNode长时间没有接受到DataNode发送的心跳, NameNode就会认为该DataNode失效。
-
DataNode会定期向NameNode进行自己持有的数据块信息汇报,汇报时间间隔取参数dfs.blockreport.intervalMsec,参数未配置的话默认为6小时。
我自己写的:
namenode和datanode之间通过rpc协议进行通信
通信的内容包括:
- 心跳机制:datanode定期向namenode进行心跳,表明自己处于活跃状态
- 块报告:定期想namenode发送块报告,汇报自己存储的所有块信息,namenode根据块报告跟新元数据,确保文件系统的完整性。如果有块丢失了或不满足设置的备份数,namenode会准备进行块复制
- 数据块操作:namenode根据客户端或系统需求想datanode发送数据块操作指令
- 负载均衡
通信流程:
- datanode启动时向namenode注册,并发送自己的存储容量、已用空间、块信息等,namenode将datanode的信息记录到元数据中
- datanode运行是定期向namenode发送心跳和块报告,namenode更具心跳和块报告更新元数据,并向datanode发送数据块操作指令
- datanode失效时如果namenode检测到,将会标记为四节点,并将其上的数据块备份复制到其他的datanode
章测试2
我的回答:
-
基本单位:Bit(比特,二进制的0和1)、Byte(字节,数据存储的基本单位,1Byte=8Bit)
-
数据存储常用的单位从小到大有b、kb、mb、gb、tb、pb、eb。
其大小关系一般都是后者是前者的1024倍,在硬盘的容量统计中按照1000倍计算
参考答案
存储的单位: KB、MB、GB、TB、PB、EB、ZB、YB、BB 单位直由小到大。转换比例逐级都是1024。
您的答案
主从架构:
- 多个机器之间有主从关系,主机器和从机器可以理解成奴隶和奴隶主的关系,主机器控制管理从机器的行为
- 主:一般有一台机器作为主节点,负责从外界接受执行再控制下面的从节点完成相应的操作,但是主节点失效后会造成单点故障,也就是这个集群停止运行
- 从:从节点听命于主节点,完成主节点的指令,从节点的失效不影响整个集群的运行
主备架构:
- 主备架构是为了解决单点故障,对一台机器做一台或多台机器的备份,当主机器停止正常运行后,立刻由备用机器立即顶替上,保证服务不中断
参考答案
主从架构: 分为master角色以及slave角色,一般是1主多从,这里面主角色主要用于协调与控制,而slave角色主要是完成工作任务,主从角色各司其职,互相共同配合 对外提供完整的服务。
主备架构: 分为主角色与备份角色,主角色一般是active状态,表示活动状态 ,对外提供服务。备份角色一般是standy状态,备用角色。一般配置都是一主一备。主备架构主要用于解决单点故障问题。当主节点故障,备节点升级成主节点对外提供服务。保证集群的稳定性。
一般情况,我们会主备,主从一起使用。 例如我们可以把主从架构中,对主节点再做主备,防止主节点出现单点故障。
您的答案
- 分布式
- 可用低成本计算机构建集群
- 易扩容
- 使用简单
- 高效率、支持高并发
- 稳定可靠
- 通用
参考答案
规则如下:
① 分布式,扩容能力强
② 高效,并发能力强
③ 可靠性
④ 通用性
您的答案
- 单机:所有角色都在同一个机器的同一个java进程运行
- 伪分布:所有角色在同一个机器的不同进程中运行
- 分布式:有多台机器,每个角色在不同的机器中进行部署
- HA集群:具有主备架构的hadoop集群,具有对抗单点故障的能力
参考答案
- 单机模式 standalone 一台机器,所有的角色在一个java进程中运行。 适合体验
- 伪分布模式 一台机器 每个角色单独的java进程。 适合测试
- 分布式 cluster模式 多台机器 每个角色运行在不同的机器上 生产测试都可以
- 高可用HA模式 在分布式的模式下 给主角色设置备份角色 实现了容错的功能 解决了单点故障 保证集群持续可用性。
您的答案
hdfs namenode -format
多次格式数据会丢失,需要关闭hdfs,删除 DataNode 的存储目录,再重新启动
参考答案
再node1节点也就是namenode节点,执行格式化命令。 命令: hadoop namenode -format,注意,命令仅执行一次。如果出现多次格式,那么删除每台机器上hadoop.tmp.dir配置指定的文件夹/export/data/hadoop-3.3.0后,重新进行format格式化。
您的答案
- 采用主从架构
- 主节点为namenode,负责管理命名空间、存储元数据
- 文件分块存储,可以将任意大的文件拆分成默认128mb大小的文件块存储
- 多副本存储,将每个块默认存三份保障数据的安全不丢失
- 一次写入多次读取,不具备文件修改功能
参考答案
- master|slaves 主从架构
主角色:namenode 管理维护着元数据:目录树结构 文件 大小 副本 备份 位置信息
从角色:datanode 存储着最终的数据块
- 分块存储
物理上把文件分开了。
block size =128M 134217728 hadoop2.x (hadoop1.x 64M)
e.g:
1.txt 300M
blk-1 0--128
blk-2 128-256
blk-3 256-300
2.txt 100M
blk-4 0--100
- 副本机制
默认是3副本。
1+2=3 本身一份 额外两份 最终3副本。
- namespace 名字空间 命名空间
#namespace即“命名空间”,也称“名称空间”
层次感结构 兼顾传统对应文件系统的认知 目录树结构
用户可以针对目录树进行文件夹、文件的增删改查。
统一的抽象目录树。
- metadata 元数据
元数据:记录数据的数据 描述性数据、解释性数据
对于HDFS来说,目录结构及文件分块位置信息叫做元数据。
元数据是有namenode维护的。
- write one read many
hdfs的模式是一次写入多次读取
hdfs没有随机修改编辑的操作 只能对已有的数据进行追加。
设计目标是这么决定的。
侧重于数据吞吐量 不注重实时交互性 意味着hdfs操作延迟很高。
centos本地创建文件itheima.txt,itcast.txt,boxuegu.txt,分别写入itheima,itcast,boxuegu三段文本内容,将boxuegu.txt上传至HDFS,后将itheima.txt和itcast.txt中的内容,追加在boxuegu.txt文本内容后。
您的答案
[root@node1 ~]# echo 123 > itheima.txt
[root@node1 ~]# echo 123 > itcast.txt
[root@node1 ~]# echo 123 > boxuegu.txt
[root@node1 ~]# hadoop fs -put boxuegu.txt /
[root@node1 ~]# hadoop fs -appendToFile itheima.txt itcast.txt /boxuegu.txt
参考答案
[root@node3 ~]# echo itheima >> itheima.txt
[root@node3 ~]# echo itcast >> itcast.txt
[root@node3 ~]# echo boxuegu >> boxuegu.txt
[root@node3 ~]# hadoop fs -put boxuegu.txt /
[root@node3 ~]# hadoop fs -appendToFile itheima.txt itcast.txt /boxuegu.txt
您的答案
- namenode是hdfs的主角色,负责控制存储在datanode中的数据的读取写入备份等工作
- namenode负责和datanode保持通信,接受在datanode启动时汇报的持有块列表,某个datanode意外断开会自动安排其他datanode进行副本复制
- 定期接受datanode的心跳确保集群的datanode节点存活
参考答案
- NameNode是HDFS的核心。
- NameNode也称为Master。(必答,不答扣分)
- NameNode仅存储HDFS的元数据:文件系统中所有文件的目录树,并跟踪整个集群中的文件。(必答,不答扣分)
- NameNode不存储实际数据或数据集。(必答,不答扣分)
- NameNode知道HDFS中任何给定文件的块列表及其位置。使用此信息NameNode知道如何从块中构建文件。(必答,不答扣分)
- NameNode并不持久化存储每个文件中各个块所在的DataNode的位置信息,这些信息会在系统启动时从数据节点重建。(必答,不答扣分)
- NameNode对于HDFS至关重要,当NameNode关闭时,HDFS / Hadoop集群无法访问。
- NameNode是Hadoop集群中的单点故障。(必答,不答扣分)
- NameNode所在机器通常会配置有大量内存(RAM)。
- client提交上传文件请求,通过rpc协议与namenode建立通讯
- namenode根据配置文件进行block分配并发送给client,默认是所有块存三个副本
- 如果写请求所在机器有datanode,则在本地存一份
- 第二份存放于另一个机架
- 第三份存放于另一个机架的不同节点中
- 数据上传过程:文件拆分的每一个块都会完整执行以下的步骤上传
- 管道建立:client根据namenode给出的datanode的拓扑距离选择最近的datanode(A),通过rpc调用建立管道pipeline,A接收到请求继续建立管道A→B,B接着建立管道B→C
- 数据传输:将块数据拆分成packet(默认64k),一个一个packet向A传输,A收到后传给B,B收到后传给C,在A每传一个packet会放入一个应答队列等待应答
- 命令正确应答:在packet传输到C后,C沿管道反方向发送ack(命令正确应答),最终ack由A发送给client,代表这个块传输完毕
- 下一个块的传输:重复上述流程