hadoop 这些面试题你会了吗?

怎么理解分布式?

分散 拆分
一个业务分拆多个子业务,部署在不同的服务器上(不同的服务器,运行不同的代码,为了同一个目的)

hadoop 的组成部分

			HDFS 分布式文件存储系统
				管理者:NameNode
				工作者:DataNode
				辅助者:SecondayNameNode
				
			MapReduce 分布式离线计算框架
			
			Yarn Hadoop资源调度器
				管理者:ResourceManager
				工作者:NodeManager

HDFS副本存放机制

		第1个副本存放在客户端,如果客户端不在集群内,就在集群内随机挑选一个合适的节点进行存放;
		第2个副本存放在与第1个副本同机架且不同节点,按照一定的规则挑选一个合适的节点进行存放;
		第3个副本存放在与第1、2个副本不同机架且距第1个副本逻辑距离最短的机架,按照一定的规则挑选一个合适的节点进行存放;

Namenode作用

	一:管理,维护文件系统的元数据/名字空间/目录树  管理数据与节点之间的映射关系()管理文件系统中每个文件/目录的block块信息)
	二:管理DataNode汇报的心跳日志/报告
	三:客户端和DataNode之间的桥梁(元数据信息共享)

DataNode作用

一:负责数据的读写操作
二:周期性的向NameNode汇报心跳日志/报告
三:执行数据流水线的复制

什么是机架感知?

通俗的来说就是nameNode通过读取我们的配置来配置各个节点所在的机架信息

什么时候会用到机架感知?

NameNode分配节点的时候   (数据的流水线复制和HDFS复制副本时)

HDFS数据写入流程?

1:Client 发起文件写入请求,通过 RPC 与 NameNode 建立通讯,NameNode检查目标文件,返回是否可以上传;
2:Client 请求第一个 block 该传输到哪些 DataNode 服务器上;
3:NameNode 根据副本数量和副本放置策略进行节点分配,返回DataNode节点,如:A,B,C
4:Client 请求A节点建立pipeline管道,A收到请求会继续调用B,然后B调用C,将整个pipeline管道建立完成,后逐级返回消息到Client;
5:Client收到A返回的消息之后开始往A上传第一个block块,block块被切分成64K的packet包不断的在pepiline管道里传递,从A到B,B到C进行复制存储
6:当一个 block块 传输完成之后,Client 再次请求 NameNode 上传第二个block块的存储节点,不断往复存储
7.当所有block块传输完成之后,Client调用FSDataOutputSteam的close方法关闭输出流,最后调用FileSystem的complete方法告知NameNode数据写入成功

HDFS数据读取流程?

1:Client 发起文件读取请求,通过 RPC 与 NameNode 建立通讯,NameNode检查目标文件,来确定请求文件 block块的位置信息
2:NameNode会视情况返回文件的部分或者全部block块列表,对于每个block块,NameNode 都会返回含有该 block副本的 DataNode 地址
3:这些返回的 DataNode 地址,会按照集群拓扑结构得出 DataNode 与客户端的距离,然后进行排序,排序两个规则:网络拓扑结构中距离 Client 近的排靠前;心跳机制中超时汇报的 DN 状态为 STALE,这样的排靠后;
4:Client 选取排序靠前的 DataNode 调用FSDataInputSteam的read方法来读取 block块数据,如果客户端本身就是DataNode,那么将从本地直接获取block块数据
5:当读完一批的 block块后,若文件读取还没有结束,客户端会继续向NameNode 获取下一批的 block 列表,继续读取
6.所有block块读取完成后,Client调用FSDataInputStream.close()方法,关闭输入流,并将读取来所有的 block块合并成一个完整的最终文件

HDFS数据完整性如何保证?

数据写入完毕以后进行校验
数据读取之前进行校验
	对比判断是否有数据丢失

NameNode会周期性的通过DataNode汇报的心跳信息中获取block块的校验和进行检查数据完整性,如果发现校验和不一致,会从其他副本节点复制数据进行恢复,     从而保证数据的完整性

HDFS 特性?(适用场景:一次写入,多次读取)

1、海量数据存储

2、大文件存储

3.高容错性
	a.数据自动保存多个副本;通过增加副本的形式,提高容错性
	b.某一个副本丢失以后,可以自动恢复,这是由 HDFS 内部机制实现的

HDFS缺点?

1.不擅长低延时数据访问
	由于hadoop针对高数据吞吐量做了优化,牺牲了获取数据的延迟,所以对于低延迟访问数据的业务需求不适合HDFS。
2.不擅长大量小文件存储
	存储大量小文件的话,它会占用 NameNode大量的内存来存储文件、目录和块信息。这样是不可取的,因为NameNode的内存总是有限的。
3.不支持多用户并发写入一个文本
	同一时间内,只能有一个用户执行写操作
4.不支持文件随机修改(多次写入,一次读取)
	仅支持数据末尾 append(追加),不支持文件的随机修改。

什么时候进入安全模式?

			在集群重启(二次启动)的时候
			人为进入

安全模式有什么特点?

			安全模式中只能读取数据,不能修改数据(增、删、改)

在安全模式下集群在做什么?

		在安全模式下集群在进行恢复元数据,即在合并fsimage和edits log,并且接受datanode的心跳信息,
		恢复block的位置信息,将集群恢复到上次关机前的状态

如何进入/退出安全模式?

			进入:hdfs dfsadmin -safemode enter
			退出:hdfs dfsadmin -safemode leave

Fsimage 和 Edits 的作用是什么?

		fsimage存储的是系统最近一次关机前的集群镜像,
		edits是客户端对HDFS文件系统的所有操作日志
		恢复集群到上次关机前的状态

什么时候会使用Fsimage Edits?

			1.在集群二次启动时,会使用fsimage和edits合并进行恢复元数据
			2.SecondayNameNode周期性的拉取fsimage和edits进行合并生成新的fsimage

SecondaryNamenode 的工作机制是什么?

			NameNode创建一个Edits.new 
			SNN从NameNode节点拷贝Fsimage和Edits文件到SNN---->SNN将两个文件导入内存进行合并操作生成一个新的Fsimage.ckpt文件----->
			SNN将新的Fsimage.ckpt发送到NameNode节点----->重命名为Fsimage替换原先的Fsimage---------->原先的Edits生成Edits.new文件--->
			将Edits替换为新的Edits.new

SecondaryNamenode存在的意义是什么?

		一:进行Fsimage和Edits的合并操作,减少edits日志大小,加快集群的启动速度
		二:将Fsimage与Edits进行备份,防止丢失

SecondaryNamenode工作的触发因素有哪些?

		1.时间维度,默认一小时触发一次  	dfs.namenode.checkpoint.period :3600
		2.次数维度,默认100万次触发一次		dfs.namenode.checkpoint.txns : 1000000
		3、六十秒判断一次是否达到100W

使用SNN的FSimage和Edits还原Namenode流程是什么?

		进入到SNN的数据存储文件夹----->将最新版本的Fsimage以及Edits拷贝至nameNode节点,放在NN节点相应的配置目录下----->重启集群

集群扩容 新节点需要做哪些准备?

		1.配置JDK
		2.配置SSH免密钥
		3.关闭防火墙
		4.关闭selinux
		5.修改主机名
		6.修改hosts

集群扩容 集群添加一个节点的流程?

		*   在配置文件目录添加dfs.hosts白名单文件,文件中加入包括新增节点在内的所有节点
		*  在hdfs.site.xml中配置白名单文件生效
				<property>
						<name>dfs.hosts</name>
						<value>/export/install/hadoop-2.6.0-cdh5.14.0/etc/hadoop/dfs.hosts</value>
				</property>

		*  配置slaves文件,将新增节点加入
		*  刷新hdfs和yarn
		hdfs dfsadmin -refreshNodes
		yarn rmadmin -refreshNodes
		
		*  新节点开启相应服务

		浏览WEB界面

如何合并小文件?

	HDFS -> local    :hadoop fs -getmerge  小文件目录   下载的目录	
	local -> HDFS   :  遍历所有的已有小文件追加到一个文件中,再上传(文件不在HDFS)

设置 开启权限控制的key是什么?

		dfs.permissions

使用java API 在hdfs创建一个全新的目录的过程是?

		//实例Configuration 
		Configuration configuration = new Configuration();
		//实例文件系统
		FileSystem fileSystem = FileSystem.get(new URI("hdfs://192.168.100.88:8082"),configuration);
		//使用文件系统对象调用mkdirs(相应的API )
		boolean mkdirs = fileSystem.mkdirs(new Path("目录路径"));

HDFS web界面

Permission:表示该文件或者目录的权限,和Linux的文件权限规则是一样的
Owner:表示该文件或者目录的所有者
Group:表示该文件或者目录的所有者属于的组
Size:表示该文件或者目录的大小,如果是目录的话则一直显示0B
Last Modified:表示该文件或者目录的最后修改时间
Replication:表示该文件或者目录的备份数,如果是目录的话则一直显示0
Block Size:表示该文件的数据块的大小,如果是目录的话则一直显示0B
Name:表示文件或者目录的名字

In Service,表示这个DataNode正常
Decommission In Progress,表示这个DataNode正在下线
Decommissioned,表示这个DataNode已经下线
Entering Maintenance,表示这个DataNode正进入维护状态
In Maintenance,表示这个DataNode已经在维护状态

Startup Progress     启动进程
Snapshot                快照/镜像
Datanodes              节点
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值