怎么理解分布式?
分散 拆分
一个业务分拆多个子业务,部署在不同的服务器上(不同的服务器,运行不同的代码,为了同一个目的)
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 节点