1.hdfs ha架构图梳理
HA使用active NN, standby NN两个节点解决单点问题。两个NN节点通过JN集群,
共享状态,通过ZKFC选举active,监控状态,自动备援。
DN会同时向两个NN节点发送心跳。
HDFS 集群介绍
hdfs采用master-slave架构。集群中主要由NameNode、DataNode、Secondary NameNode、fsimage、editslog等5个部分组成。
- NameNode:存储hdfs中的元数据信息(如:命名空间、副本数、Blok块分布、文件名,文件大小,文件位置等),接收DataNode的心跳包和块报告,管理所有的
- DataNode节点,处理客户端提交的操作请求,对请求做安全检查。
- DataNode:将文件内容存储内部的Blok块中,定期向NameNode发送心跳包和块报告,接受Client端的调度。
- fsimage:存储NameNode一定时间内元数据的镜像文件(默认1小时生成一份)。
- editslog:存储NameNode操作的日志。
- Secondary NameNode:在指定时间点上将editslog与fsimage合并成一个新的fsimage文件。
- JournalNode 用于主备NN之间同步元数据信息的共享存储系统
- ZKFC(zookeeperFailoverController)是用来监控NN状态,协助实现主备NN切换的
在NameNode进程崩溃并重启时,会读取fsimage和editslog文件中的内容,用以恢复崩溃钱一刻的数据,这样就保证了数据的完整性。但是如果在崩溃时造成editslog文件损坏,或者磁盘损毁,就会造成数据丢失。因此便需要引入HA的概念了。
HA介绍
在hadoop2.x版本中,hdsf最多只能存在两个NameNode。因此在HA中是存在两个NameNode的,并且一个NameNode处于active(活跃状态),一个NameNode处于standby状态。即同一时间只有一个NameNode是处于工作状态的。
当active的NameNode出现故障时,如何启用standby的NameNode呢
- 1.手动切换,通过hdfs haadmin -transitionToActive ,将给定NameNode的状态转换为Active
- 2.自动切换,要使用自动切换,则需要引入一个ZKFailoverController(ZKFC)的进程和ZooKeeper的一个组件。ZKFC定期执行健康检查命令,监控NameNode状态,并与zk建立长久回话,当active状态的NameNode发生故障时,zk进行选举,并通知对应ZKFC把NameNode由standby切换为active状态。
NameNode之间是如何保持数据同步的
- 接受到Client的请求时NameNode先将日志写入editslog中,并将日志写入JournalNodes集群,Standby
NameNode读取JournalNode集群中的日志,并进行操作重演。并且DataNode定期想两个NameNode发送心跳和块报告。以此保证了NameNode之间的数据同步。
standbyNN和secondaryNN有什么区别
- 在2.x版本中才引入StandbyNameNode,从journalNode上拷贝的。
StandbyNameNode是可以做namenode的备份。 - 在1.x版本中,SecondaryNameNode将fsimage跟edits进行合并,生成新的fsimage文件用http
post传回NameNode节点。 SecondaryNameNode不能做NameNode的备份。
2.yarn ha架构图梳理
ZKFC:
- zkfc在yarn中作为一个线程,处理RM的状态切换,并定期想zk发送心跳。
- 一直监控lock文件,当文件不存在时,尝试写入,成功则为Active状态,失败则是Standby状态。
RMStateStore:
- 存储NM中app的信息,在HA中默认存储在zk的 /rmstoer
(/rmstore为默认值可通过yran.resourcemanager.zk-state-store.parent-path配置)路径下。 - activeRM会向这个目录写APP信息
- 当activeRM挂了,另外一个standby RM通过ZKFC选举成功为active,会从/rmstore读取相应的作业信息。重新构建作业的内存信息,启动内部的服务,开始接收NM的心跳,构建集群的资源信息,并且接收客户端的作业提交请求。
ZooKeeper:
- 存储RMStateStore,接受ZKFC发送的心跳,存储lock文件。
- 对ResourceManager状态进行选举,并将通知ZKFC。
ResourceManager:
- 启动时候会向ZK的/rmstore目录写lock文件,写成功就为active,否则standby.
rm节点zkfc会一直监控这个lock文件是否存在,假如不存在,写一个lock文件,宣布自己是active,否则为standby. - 接收client的请求,接收和监控NM的资源状况的汇报,负载资源的分配和调度。
- 启动和监控APPMASTER on NM节点的container。
- ApplicationsManager 运行在RM节点
- ApplicationMaster 运行在NM节点 container容器里 作业的主程序
NodeManager:
- 管理当前节点上的资源,启动容器运行task计算,并向Active状态的RM上报资源情况。
3.总结hdfs yarn ha架构区别
- ZKFC HDFS中ZKFC作为单独的进程 Yarn中ZKFC是RM中的线程
- 从节点 HDFS中的DataNode 会向两个NameNode同时发送心跳。Yarn中NodeManager只会向activeRM上报资源
4.hdfs dfs -ls 结果是哪个目录
(TBD)
5.双写的理解
spark–>HBase+es
hbase提供存储
es 提供快速查询与统计
6.小文件的理解 什么的小文件,危害,如何避免(产生前,产生后)
小文件危害
先说对小文件的定义,一般来说小于等于30M的文件,都叫小文件。在HDFS中,通常NN维护一个文件的名称,目录结构等大约是250字节。现实中,HDFS的小文件如果不做任何操作增长会很快,现在假设NN节点的内存为4G,差不多42亿字节,现在在HDFS上有一亿个小文件,那么需要250乘一亿大约是250亿字节,这样会将NN撑爆。小文件到达一定数目,就会将NN节点撑爆。就算NN能够存储,对于hive,spark计算时,小文件意味着需要更多的task和资源,同样也会将节点弄挂掉。
解决方案
生产上首先需要设置小文件的阈值,到达这个值对小文件进行合并。对于这个合并,一种是在HDFS存储之前就进行合并,还有一种就是计算完之后根据业务周期来进行合并。后一种需要在计算时格外对小文件进行调整,具体的会额外出文章讲。
7.主从架构的hbase读写经过master进程吗?
HBase架构图理解
- HMaster链接Zookeeper的目的:HMaster需要知道哪些HRegionServere是活的HRegionServer所在的位置,然后管理HRegionServer。
- HBase内部是通过DFS client把数据写到HDFS上的
- 每一个HRegionServer有多个HRegion,每一个HRegion有多个Store,每一个Store对应一个列簇。
- HFile是HBase中KeyValue数据的存储格式,HFile是Hadoop的二进制格式文件,StoreFile就是对HFile进行了封装,然后进行数据的存储。
- HStore由MemStore和StoreFile组成。
- HLog记录数据的所有变更,可以用来做数据恢复。
- hdfs对应的目录结构为 namespace->table->列簇->列->单元格
Hbase中HMaster的作用
- 管理用户对Table表的增、删、改、查操作;
- 管理HRegion服务器的负载均衡,调整HRegion分布;
- 在HRegion分裂后,负责新HRegion的分配;
- 在HRegion服务器停机后,负责失效HRegion服务器上的HRegion迁移
写数据流程
- zookeeper中存储了meta表的region信息,从meta表获取相应region信息,然后找到meta表的数据
- 根据namespace、表名和rowkey根据meta表的数据找到写入数据对应的region信息
- 找到对应的regionserver
- 把数据分别写到HLog和MemStore上一份
- MemStore达到一个阈值后则把数据刷成一个StoreFile文件。若MemStore中的数据有丢失,则可以总HLog上恢复
- 当多个StoreFile文件达到一定的大小后,会触发Compact合并操作,合并为一个StoreFile,这里同时进行版本的合并和数据删除。
- 当Compact后,逐步形成越来越大的StoreFIle后,会触发Split操作,把当前的StoreFile分成两个,这里相当于把一个大的region分割成两个region。如下图:
读数据流程
-
zookeeper中存储了meta表的region信息,所以先从zookeeper中找到meta表region的位置,然后读取meta表中的数据。meta中又存储了用户表的region信息。
-
根据namespace、表名和rowkey在meta表中找到对应的region信息
-
找到这个region对应的regionserver
-
查找对应的region
-
先从MemStore找数据,如果没有,再到StoreFile上读(为了读取的效率)。
https://blog.csdn.net/qq_38976805/article/details/89062289
Hadoop YARN HA架构
https://blog.csdn.net/qq_38976805/article/details/89053784
HDFS HA(Quorum Journal Manager) 架构解析
https://blog.csdn.net/dabokele/article/details/51686257
Hadoop-2.X HA模式下的FSImage和EditsLog合并过程
https://blog.csdn.net/Androidlushangderen/article/details/53148213
HDFS ZKFC自动切换原理分析
https://www.jianshu.com/p/e2bbf23f1ba2
HBase架构详解和数据的读写流程