day01—————
零、复习
1. 大数据的概述
--概念和特征 (重点)
2. hadoop的概述
--hadoop的核心模块(重点):三个,HDFS,Mapreduce,Yarn
--google的三篇论文(重点):《GFS》《Mapreduce》《Bigtable》
--Hadoop的特点:
apache,开源,免费,JAVA语言,跨平台性,运行在廉价机器,具有高可靠高容错性,扩展性良好
3. Hadoop的安装
--本地模式
--伪分布式模式
--完全分布式模式(重点)
4. hdfs的块思想
-- 块大小的选择(重点)
(1)最小化寻址开销时间
(2)内存的使用率(块太小,集群存储能力差)
(3)网络带宽稀缺(是固定的,块越大,网络带宽相对越小)
-- hdfs的优缺点
(1)不适合低延迟的工作
(2)不适合小文件的存储
(3)只支持一个作者的写入,只能追加。
5. hdfs的体系结构(重点)
-- 主从架构,四个组成部分,以及每个组成部分的作用
6. hdfs的工作机制(重点)
-- 开机过程
-- 心跳反馈机制
-- 检查点机制
-- 机架感知
7. 客户端API接口的使用
-- 获取文件状态的逻辑代码(重点)
8. 数据流(重点)
--写流程
--读流程
一. Zookeeper的概述
1.1 zookeeper的概念和特点
--1. 是apache的开源框架
--2. 为分布式应用程序做协调服务,是hdfs和hbase的重要组成部分
--3. 本身就是一个分布式应用框架
--4. 提供了类似unix的文件系统树状图的数据存储模型
--5. 提供了监听和通知功能(重点)
--6. 提供了一组机器指令,提供了java和c语言的接口
还有的特点是:
--1. 是一个分布式集群框架,有一个leader和多个follower
--2. 集群节点只要存在半数以上就可以提供协调服务,因此适合安装在奇数台机器上
也就是只要存在(n+1)/2台就可以,换句话说允许最多(n-1)/2台宕机
--3. 全局数据具有一致性(也就是每个节点上的数据完全一样,因此zookeeper的客户端访问到哪一个follower都是可以的)
--4. 请求按照顺序执行
--5. 数据更新具有原子性,要么成功,要么回滚
--6. 数据更新时,由于数据量比较小,所以是实时的,几乎没有延迟
--7. 由于数据的一致性,所以具有高可靠性,高性能。
1.2 zookeeper的数据模型(重点)
--1. 是一个类似Unix文件系统的层次化树形结构
--2. 每一个节点都被称之为znode,而不是文件或目录
--3. znode可以存储1M以内的数据,类似文件系统的文件(zookeeper是用来协调服务的,而不是用来存储数据)
--4. znode可以存储子节点的名称,类似文件系统的目录
--5. znode使用绝对路径进行唯一标识
二. Zookeeper的安装与使用
2.1 安装
##1. 上传,解压,并更名
[root@qianfeng01 local]# tar -zxvf zookeeper-3.4.10.tar.gz -C /usr/local/
[root@qianfeng01 local]# mv zookeeper-3.4.10 zookeeper
##2. 配置环境变量
[root@qianfeng01 local]# vim /etc/profile
..........省略.............
export ZOOKEEPER_HOME=/usr/local/zookeeper
export PATH=$ZOOKEEPER_HOME/bin:$PATH
[root@qianfneg01 local]# source /etc/profile
##3. 修改配置文件zoo.cfg
[root@qianfeng01 local]# cd ./zookeeper/conf/
[root@qianfeng01 conf]# cp zoo_sample.cfg zoo.cfg #复制出zoo.cfg文件
[root@qianfeng01 conf]# vi zoo.cfg
tickTime=2000 # 定义的时间单元(单位毫秒),下面的两个值都是tickTime的倍数。
initLimit=10 #follower连接并同步leader的初始化连接时间。
syncLimit=5 #心跳机制的时间(正常情况下的请求和应答的时间)
dataDir=/usr/local/zookeeper/zkData #修改zookeeper的存储路径,zkData目录一会要创建出来
clientPort=2181 #客户端连接服务器的port
server.1=qianfeng01:2888:3888 # 添加三个服务器节点
server.2=qianfeng02:2888:3888
server.3=qianfeng03:2888:3888
-------下面是解析,不要复制------------------
解析Server.id=ip:port1:port2
id: 服务器的id号,对应zkData/myid文件内的数字
ip: 服务器的ip地址
port1: follower与leader交互的port
port2: 选举期间使用的port
注意:此配置文件中,不支持汉字注释
##4. 创建存储目录以及myid文件的编写
[root@qianfeng01 conf]# mkdir ${ZOOKEEPER_HOME}/zkData
[root@qianfeng01 conf]# echo "1" > ${ZOOKEEPER_HOME}/zkData/myid
##5. 同步到另外两台机器上,并修改myid为对应的server.x的值
[root@qianfeng01 local]# scp -r zookeeper/ mei02:/usr/local
[root@qianfeng01 local]# scp -r zookeeper/ mei03:/usr/local
[root@qianfeng01 local]# scp /etc/profile mei02:/etc/
[root@qianfeng01 local]# scp /etc/profile mei03:/etc/
注意:千万别忘记修改第二台和第三台的myid文件
2.2 启动
--1. 启动脚本与指令
[root@qianfeng01 ~]# zkServer.sh start
需要注意的是:
(1)多台机器必须一起执行启动脚本
(2)日志的存储位置:在哪里启动,就在哪里生成,文件名zookeeper.out
(3)运行start,不代表就启动成功了,还需要查询状态 zkServer.sh status,
即使没有启动成功,jps后也能看到服务项
2.3 常用指令
2.3.1 客户端脚本连接zookeeper
语法:zkCli.sh -server host:port
案例1: 输入指令直接回车,连接的是本机上的服务项
[root@qianfeng01 ~]# zkCli.sh
案例2: 连接其他机器上的服务项
[root@qianfeng01 ~]# zkCli.sh -server qianfeng02:2181
案例3: 可以省略端口号
[root@qianfeng01 ~]# zkCli.sh -server qianfeng03
2.3.2 常用指令
[zk: qianfeng03(CONNECTED) 0] help
ZooKeeper -server host:port cmd args
stat path [watch]
set path data [version]
ls path [watch]
delquota [-n|-b] path
ls2 path [watch]
setAcl path acl
setquota -n|-b val path
history
redo cmdno
printwatches on|off
delete path [version]
sync path
listquota path
rmr path
get path [watch]
create [-s] [-e] path data acl
addauth scheme auth
quit
getAcl path
close
connect host:port
比较常用的如下:
1. ls -- 查看某个znode下有哪些子znode
2. ls2 -- 功能与ls基本一致,但是可以多查出来一些属性信息,比如time,version
3. create -- 创建znode,必须设置初始内容,例如:
4. get -- 获取znode的数据
5. set -- 修改znode内容
6. delete -- 删除znode
7. rmr -- 删除znode
7. quit -- 退出客户端
8. help -- 帮助命令
2.4 znode的类型
znode的类型分为两大类:
一类是永久节点:客户端窗的永久节点,与客户端是否退出无关,只要不手动删除,就一直存在
一类是临时节点:客户端创建的临时节点,一旦客户端的会话断开,临时节点就会被删除
每一类节点中都有两种情况:
分别是有序节点和自定义节点
三. Zookeeper的工作机制
3.1 zookeeper开机时的选举机制
3.1.1 说明
--1. zookeeper集群服务,是必须满足半数以上的节点存活才可以正常提供服务
--2. zookeeper里并没有配置谁是leader和follower,而是通过一种选举算法选择出来谁是leader。
3.1.2 刚启动时的选举流程
假设有五台机器,分别是server-1,server-2,server-3,server-4,server-5,并且启动顺序也是数字顺序。
1. 服务器1启动
此时只有它一台服务器启动了,它发出去的投票信息没有任何响应,所以它的选举状态一直是 LOOKING 状态。
2. 服务器2启动
它与最开始启动的服务器 1 进行通信,互相交换自己的选举结果,由于两者都没有历史数据,所以 id 值较大
的服务器 2 胜出,但是由于没有达到超过半数以上的服务器都同意选举它(这个例子中的半数以上是 3),所以
服务器 1、 2 还是继续保持LOOKING 状态。
3. 服务器3启动
根据前面的理论分析,服务器 3 成为服务器 1、 2、 3 中的老大,而与上面不同的是,此时有三台服务器选
举了它,所以它成为了这次选举的 leader。
4. 服务器4启动
根据前面的分析,理论上服务器 4 应该是服务器 1、 2、 3、 4 中最大的,但是由于前面已经有半数以上的
服务器选举了服务器 3,所以它只能接收当小弟的命
了。
5. 服务器5启动
同 4 一样当小弟
3.2 选举机制中的几个概念
- Server状态:选举状态
LOOKING:竞选状态
FOLLOWING:随从状态,同步leader状态,参与选票
OBSERVING:观察状态,同步leader状态,不参与选票
LEADER:领导者状态
--逻辑时钟:
指的是第几任选leader。比如之前已经挂掉了四个leader, 再投票选举时,就是选举第五次leader,这一任leader不是一次投票就选出来的。
--数据id:
服务器中存放的最大数据ID。值越大说明数据越新.
--serverid
就是配置文件zoo.cfg中的server.x的x值。
在重新选举leader期间,逻辑时钟,数据id,服务器id所占的权重不一样。权重越大,当leader的概率就越大。
逻辑时钟(epoch)>数据id>服务器id (重点)
3.3 监听原理(重点理解)
--1. 客户端首先调用zookeeper的客户端API接口
--2. 客户端会维护两个对象,一个是连接对象Connect,一个是监听对象Listen
--3. 客户端会通过连接对象,告诉zookeeper服务器,要监听的事件。
事件1:可能是某一个znode里存储的数据变化 /citys/shenzhen "aa"
事件2:可能是某一个znode的子znode的数量变量 /citys/shezhen
/citys/guangzhou
--4. zookeeper会将客户端要监听的事件注册到服务中
--5. 如果监听事件发生了变化,就会通知客户端
--6. 客户端收到通知后,就会执行自己的逻辑,也就是process方法中的逻辑
测试:
测试1: 监听/citys这个znode的子znode数量的编号
ls /citys watch
测试2: 监听/citys这个znode的存储数据的变化
get /citys watch
3.4 写流程
1. Client向Zookeeper的server1上写数据,发送一个写请求
2. 如果server1不是leader,那么server1会把请求进一步转发给leader。
3. 这个leader会将写请求广播给所有server。
4. 各个Server写成功后就会通知leader。
5. 当leader收到半数以上的server写成功的通知,就说明数据写成功了。写成功后,leader会告诉server1数据写成功了。
6. server1会进一步通知Client数据写成功了。这时就认为整个写操作成功。
四. Zookeeper的应用场景(熟悉)
4.1 集群应用程序的配置文件统一管理
比如 集群上的所有应用程序都连接mysql 都需要url,driver,username,pwd
那么,每个应用程序都会有自己独立的配置文件配置上述四个参数
假如有一天老板让修改mysql的密码,那么所有的应用程序都需要修改密码才能正常使用。相对来说是比较麻烦的。
但是,如果将配置文件的四个参数保存到zookeeper的某一个znode里。然后应用程序在连接mysql时,读取这个znode里的数据,就能访问mysql成功。
假如有一天老板让修改mysql的密码,只需要修改znode里的pwd的值。而所有的应用程序在mysql都还会读取znode里的数据,因此,这样的管理配置方式,非常简单,不需要为每一个应用程序单独修改配置属性
4.2 集群应用程序的管理节点的选举
比如namenode高可用,就是两个namenode。 那么这个两个namenode如果选举出来一个来管理集群,剩下一个当备用。
比如两个namenode,分别是qianfeng01和qianfeng02, 这两个守护进程都作为客户端向zookeeper的某一个znode(/hadoop-ha)下创建一个临时子节点(active),谁创建成功,谁就是活跃的namenode,来管理集群。没有创建成功的那个namenode监听/hadoop-ha/下的子节点的变量,如果发现消失,就立即创建active这个临时znode,就接管整个集群的工作。
/hadoop-ha/active (qianfeng01)
4.3 服务节点的动态上下线感知
/cluster/mei01
/cluster/mei02
/cluster/mei03
namenode只负责监听/cluster节点的子节点的数量以及名称
假如mei04想要上线,会先在/cluster下创建mei04子节点
zookeeper发现多一个节点,会通知namenode。namenode知道后,就可以将mei04当成工作节点为其分配任务
4.4 服务节点的软负载均衡
参考 https://blog.csdn.net/Michael__One/article/details/106630922
4.5 分布式锁
参考 https://blog.csdn.net/Michael__One/article/details/106630922
4.6 分布式队列
参考 https://blog.csdn.net/Michael__One/article/details/106630922
day02—————
一、HDFS的HA搭建
1.1 企业中使用HA的原因
namenode是一个时,出现以下问题,集群可用性极差
--1. 单点故障(SPOF)
--2. 硬件升级
1.2 搭建两个namenode
一个namenode作为active节点,表示正在管理整个集群
一个namenode作为standby节点,表示备用namenode,当active节点宕机时,这个standby节点接替工作。
注意:
datanode的心跳反馈也需要向standby节点反馈,这个优势,是standby节点可以立即接管工作,对于用户体验来说,是感觉不到有替换的间隙。
standby namenode在接替工作后,也要进行检查点机制,因此接替前的edit文件以及fsimage文件也要有,否则数据不准确。
当是HA时,standbyNamenode接替了secondaryNamenode的工作,即检查点机制由备用的namenode进行。
缺点:standbyNamenode在同步activeNamenode的edit文件时,出现网络震荡时,容易导致数据丢失,
1.3 journalnode集群
1.3.1 使用journalnode的原因
基于standbynamenode在同步activeNamenode的edit文件时,出现网络震荡时,容易导致数据丢失,所以使用journalNode集群。
1.3.2 journalnode的功能
--1. 存储activeNamenode的所有的edit日志文件
(1)activeNamenode会将edit日志文件写入journalnode
(2)journalnode集群有数据一致性的特点
(3)standbyNamenode会监听journalnode,一旦有数据更新,就同步到自己的内存和磁盘
--2. journalnode可以防止脑裂的产生(两个ActiveNamenode的情况就是脑裂)
journalNode只允许一个作者(activeNamenode写日志到journalnode上),如果active出现了网络延迟,那么standby会切换成Active。原来的Active网络延迟消失后,会被journalnode强制转为standby。
1.3.3journalnode集群的其他特点
--(1)适合安装在奇数台机器上
--(2)只要有半数以上(n+1)/2就可以提供服务
--(3)至少3个Journalnode节点
1.3.4 journalnode的缺点
故障发生后,只能手动进行故障转移,因此接管工作的时间间隙会比较明显,体验差。
因此需要提供一个能自动故障转移的机制,可以使用zookeeper。
1.4 使用zookeeper进行自动容灾
1.4.1 zookeeper集群
--zookeeper集群提供协调服务
--zookeeper集群有自己的数据模型(类似unix的文件系统的层次化结构)
--zookeeper提供监听和通知功能(核心技术)
1.4.2 ZKFC
--1. 是zookeeper在hdfs上的一个客户端程序
--2. zkfc会连接zookeeper服务器,始终保持连接
--3. zkfc和namenode在同一个机器上
--4. zkfc会定期的ping本机上的namenode,如果通信正常,则认为namenode是健康的
--5. zkfc会进行active与standby状态切换
(1) 开机时,两个zkfc会争抢创建active的znode,谁创建成功,谁对应的namenode就是active状态
(2) 如果有一个namenode宕机了,对应的zkfc会知道,然后zookeeper服务器的active的Znode会发生变化,然后zookeeper通知另一个zkfc,zkfc会将standby转为active状态
1.5 HA的配置
1.5.1 布局
mei01: namenode journalnode datanode nodemanager resourcemanager QuorumPeerMain
mei02: namenode journalnode datanode nodemanager QuorumPeerMain
mei03: journalnode datanode nodemanager QuorumPeerMain
1.5.2 修改hdfs-site.xml
1)配置逻辑名称
2)配置两个namenode的唯一标识符
3)配置rpc协议的ip和port
4)配置http协议的ip和port
5)配置journalnode集群和存储目录
6)配置java类型
7)配置防护机制,私钥文件,超时时间
8)配置自动容灾
1.5.3 修改core-site.xml
1)修改hdfs的schame,ip和port为逻辑名称
2)设置journalnode的日志存储目录的具体路径
3)设置hdfs的对应zookeeper集群
1.5.4 三台机器都要同步
scp /usr/local/hadoop/etc/hadoop/{core-site.xml,hdfs-site.xml} mei02:/usr/local/hadoop/etc/hadoop/
scp /usr/local/hadoop/etc/hadoop/{core-site.xml,hdfs-site.xml} mei03:/usr/local/hadoop/etc/hadoop/
1.6 HA的启动
1.6.1 说明
HA的启动分两种情况
--情况1. 搭建集群时,直接搭建HA, 这个时候还没有fsimage和edit文件
--情况2. 普通集群使用一段时间后,转为HA, 这个时候有一个挺大fsimage和一大堆edit文件
1.6.2 情况2的启动演示
1. 启动三个节点上的journalnode服务,(请注意,如果集群启动了,先把集群stop掉)
[root@mei01 ~]# hadoop-daemon.sh start journalnode
[root@mei02 ~]# hadoop-daemon.sh start journalnode
[root@mei03 ~]# hadoop-daemon.sh start journalnode
2. 同步日志到journalnode集群上
[root@mei01 ~]# hdfs namenode -initializeSharedEdits
3. 启动以前节点上的namenode进程
[root@mei01 ~]# hadoop-daemon.sh start namenode
4. 在新的namenode节点上拉取镜像文件
[root@mei02 ~]# hdfs namenode -bootstrapStandby
5. 格式化zkfc
- 1、前提QuorumPeerMain服务必须处于开启状态,客户端zkfc才能格式化成功
[root@mei01 ~]# zkServer.sh start
[root@mei02 ~]# zkServer.sh start
[root@mei03 ~]# zkServer.sh start
- 2、选择其中一个namenode节点进行格式化zkfc
[root@mei01 ~]# hdfs zkfc -formatZK
6. 你就可以快乐的开启HA集群进行测试了
[root@mei01 ~]# start-all.sh
注意,注意,注意:以后开HA集群时,要先开zookeeper服务,再开HDFS。
1.6.3 守护进程的说明
- QuorumPeerMain:zookeeper服务组件对应的进程
- JournalNode:qjm对应的守护进程
- DFSZKFailoverController:zookeeper对应的自动容灾客户端进程,运行在Namenode节点上
- NameNode:
- ZookeeperMain:手动连接zookeeper服务所产生的客户端进
1.7 HA转普通集群
--1. 关掉HA的所有进程
--2. 修改配置文件为普通集群的样式
--3. 将journalnode集群管理的所有edit文件复制到namenode的管理目录下,有写edit文件会重复,可以覆盖或者不覆盖都可以
--4. 删除旧的edit_inpro....,留下最新的
--5. 修改seen_txid的值为正在使用的日志的后面的数字
二、MAVEN的使用
2.1 maven的简介
--1. 是一个项目构建,项目管理的工具,可以跨平台,是基于java语言平台的项目管理工作
--2. 有自己的指令集
--3. 其中有一个功能是jar包依赖的管理
2.2 maven的安装
1)解压
2)配置本地仓库路径
3)配置远程仓库路径
4)配置环境变量
2.3 idea与maven的整合
参考文件
2.4 jar包下载
将今天的文档目录下的仓库压缩包,解压到你自己的本地仓库目录下