NameNode:主节点
职责:
(1)管理HDFS
(2)接收客户端的请求:数据上传,数据下载
(3)维护HDFS:维护edits文件(客户端的操作日志)、维护fsimage文件(元信息文件)
所处路径:
$HADOOP_HOME/tmp/dfs
( /root/training/hadoop-2.7.3/tmp/dfs )
所处路径:
$HADOOP_HOME/tmp/dfs/name/current
( /root/training/hadoop-2.7.3/tmp/dfs/name/current )
edits_inprogress_0000000000000000105是当前正在操作的日志,所有的edits文件都是二进制文件,使用一般的编辑器查看不了,所以可以使用下面这个命令来进行查看:
hdfs oev -i edits_inprogress_0000000000000000105 -o ~/a.xml
# -i 后接输入文件(想查看的文件) -o后接输出文件
这里我们先对dfs进行一个创建目录的操作,然后这个操作也会被hdfs的日志记录下来
hdfs dfs -mkdir /tools
进行创建操作后,使用日志查看器进行查看(相当于转化成xml格式文件进行查看)
hdfs oev -i edits_inprogress_0000000000000000105 -o ~/a.xml
vi a.xml
如果hdfs的元信息文件损坏,我们则可以通过日志文件进行恢复。
记录的是数据块的位置信息,冗余信息
位置:$HADOOP_HOME/tmp/dfs/name/current
下面将jdk的压缩包进行上传,fsimage文件中则会记录数据块的位置信息和冗余度。
hdfs dfs -put jdk-8u181-linux-x64.tar.gz /tools
提供元信息查看器
hdfs oiv -i fsimage_0000000000000000104 -o ~/b.xml -p XML
DataNode:从节点
1、职责:按照数据块来保存数据:1.x:64M 2.x:128M
2、数据块的位置
$HADOOP_HOME/tmp/dfs/data/current/BP-90413187-192.168.157.111-1582475681214/current/finalized/subdir0/subdir0
Demo:上传数据 hdfs dfs -put jdk-8u181-linux-x64.tar.gz /tools,大概204M
数据块相加起来的大小就是之前上传jdk文件的大小。
设置数据块冗余度的一般原则:冗余度跟数据节点个数一致,最大不超过3
Secondary NameNode:第二名称节点,跟NameNode运行在一起
1、不是NameNode热备
2、职责:定期进行日志信息的合并:把edits----> fsimage文件
3、重点:掌握日志合并的过程(为什么Secondary NameNode要和NameNode运行在一起)
(1)将NameNode的edits日志和fsimage元信息文件下载至secondaryNameNode(copy)
(2)secondaryNameNode将edits日志和fsimage元信息合并成fsimage.check文件
(3)secondaryNameNode将fsimage.check文件上传到NameNode,NameNode对fsimage.check文件再进行维护。
这也解释了为什么Secondary NameNode要和NameNode运行在一起,因为在同一机台上,可以大幅度提高下载的速度和上传速度。
在下载和上传期间,会生产新的edits文件,这个时候会先暂存在edits_inprogress中,等到其他edits上传完成,又变成新的edits文件,继续进行下载操作。
合并发生的时机?
当HDFS发出 检查点( checkpoint ) 的时候,触发进行合并。
默认∶(1)每隔60分钟,参数: fs.check.peroid
(2)当edits文件达到64M,参数: fs.check.size
补充一点:检查点
(1)HDFS:触发日志的合并
(2)Oracle:会以最高优先级唤醒数据库的写进程,写脏数据
(3)Spark和Flink:容错机制
1、ResourceManager:主节点
职责:
(1)接收客户端的请求:执行MapReduce任务的请求
(2)资源的分配:CPU、内存、网络
(3)任务的分配:NodeManager
2、NodeManager:从节点
职责:
(1)从ResourceManager获取任务和资源
(2)执行任务
3、Yarn调度MapReduce任务的过程
(1)客户端发起任务 hadoop jar ***
(2)JobClient.java向ResourceManager请求创建任务ID
(3)JobClient.java将任务(jar文件)上传到HDFS
(4)JobClient.java向HDFS获取元信息(数据元信息、任务元信息)
(5)JobClient.java向ResourceManager提交任务:任务ID、数据元信息、任务元信息
(6)ResourceManager对任务进行初始化(谁来执行、资源怎么分配)
(7)ResourceManager将任务分配给NodeManager
(8)启动Application Container,任务都运行在 Container中。
(9)NodeManager根据第七步分配的数据和任务的元信息,向HDFS获取数据和任务。
为什么NodeManager和DataNode在同一机台?
因为NodeManager根据ResourceManager分配的数据和任务的元信息,向HDFS的DataNode获取数据和任务,如果在同一机台,获取的速度会很快,大大提高了性能。
4、Yarn的资源分配方式
(1)FIFO Scheduler 先来先得,问题:没有考虑任务的优先级
(2)Capacity Scheduler:容器管理的调度规则,允许多个组织共享集群的资源
(3)Fair Scheduler:公平调度原则,假设:任务具有相同的优先级,平均分配系统的资源。如果加入权重,那么会根据权重的占比来进行分配。
HBase:基于HDFS之上的NoSQL数据库
1、HMaster:主节点
2、RegionServer:从节点
3、ZooKeeper:当成“数据库”
主从架构的单点故障的问题,需要实现HA(High Availablity高可用性)
HA(高可用性)核心思想:多几个主节点,但只有一个主节点处于Active状态,其他的主节点处于StandBy,一旦处于Active的主节点损坏,那么可以借助ZooKeeper激活另外的主节点。