1、框架版本

Hadoop2.7.2 + Flume1.7.0 + Kafka0.11 + Hive1.2.1 + MySQL5.6 + Java1.8 + Zookeeper3.4

2、Hadoop HA

实现hadoop的HA,必须保证在NN和RM故障时,采取容错机制,可以让集群继续使用。
核心在于避免NN和RM单点故障。
HDFS满足高可用:
NN:一个集群只有一个,负责接受客户端请求。
DN:一个集群可以启动N个。
YARN满足高可用:
RM:一个集群只有一个,负责接受客户端请求。
NM:一个集群可以启动N个。

  • HDFS HA

    搭建步骤:
    ①配置:
    (1)fs.defaultFS=hdfs://hadoop101:9000 进行修改;
    (2)在整个集群中需要启动N个NN,配置N个NN运行的主机和开放的端口;
    (3)配置Journalnode。
    ②启动:
    (1)先启动Journalnode;
    (2)格式化NN,精格式化后的fsimage文件同步到其他的NN;
    (3)启动所有的NN,需要将其中之一转为active状态。

  • ①NN启动多个进程,一旦当前正在提供服务的NN故障了,让其他的备用的NN继续顶上;

  • ②NN负责接受客户端的请求,在接收客户端的写请求时,NN还负责记录用户上传文件的元数据,保证正在提供服务的NN,必须和备用的NN之中的元数据必须是一致的。

    元数据的同步:
    (1)在active的nn格式化后,将空白的fsimage文件拷贝到所有的nn的机器上;
    (2)active的nn在启动后,将edits文件中的内容发送给Journalnode进程,standby状态的nn主动从Journalnode进程拷贝数据,保证元数据的同步;
    PS:
    (1)Journalnode在设计时,采用paxos协议, Journalnode适合在奇数台机器上启动!在hadoop中,要求至少需要3个Journalnode进程;
    (2)如果开启了hdfs的ha,不能再启动2nn。

  • ③当启动了多个NN时,不允许多个NN同时对外提供服务,因为如果多个NN同时对外提供服务,那么在同步元数据时,非常消耗性能,而且容易出错。在同一时刻,最多只能有一个NN作为主节点,对外提供服务,其余的NN,作为备用节点。使用active状态来标记主节点,使用standby状态标记备用节点。

  • Zookeeper实现自动故障转移

    zookeeper通过启动Zkfc Failover controller进程来创建一个zookeeper客户端实例。这两个客户端就会在zookeeper服务端指定的路径上写同一个节点(谁先启动谁写成功),成功抢占之后就会对这个节点进行加锁,别的客户端就无法对这个节点进行操作。同时zk客户端所对应的namenode就会提升为active状态,其余为stanby。
    本机的zkfs会定期地对本机的namenode进行一个ping,如果namenode没有及时回复,就会判定为假死,zkfs便会对session进行销毁,所对应的节点就会消失。剩余的zkfc会监听到服务器节点发生变化,就会抢着去注册节点,抢占成功之前需要将假死的namenode干掉,进行fence(隔离)操作,通过 ssh kill -9 来将namenode杀死。

    防止脑裂(两个active namenode):①ssh 发送kill指令;②调用用户自定义脚本程序。

3、MySQL HA(元数据的备份)

KeepAlived:基于VRRP(Virtual Router Redundancy Protocol,虚拟路由器冗余协议)协议的一款高可用软件。Keepailived有一台主服务器(master)和多台备份服务器(backup),在主服务器和备份服务器上面部署相同的服务配置,使用一个虚拟IP地址对外提供服务,当主服务器出现故障时,虚拟IP地址会自动漂移到备份服务器。

每一个服务器里都有一个MySQL以及keepAlive进程,每个keepAlive定时给MySQL发送心跳来对MySQL进行监听。一旦Active状态的MySQL出现问题,我们需要让当前机器监控MySQL的keepAlive进程结束(service keepalived stop),结束后,当前占用的虚拟IP才可以被放弃,放弃后其他的keepAlive进程才会被抢占,将请求路由到当前机器的MySQL。

ip a 命令查看当前机器是否持有虚拟IP。

4、数据采集

Flume + Kafka + Flume

第一层Flume(采集日志数据) hadoop102 hadoop103

TailDirSource
---> ETL拦截器(判断数据是否符合格式要求)
----> 类型区分拦截器
----> Kafka Channel1(直接读入到Kafka的主题topic_start) / Kafka Channel2(直接读入到Kafka的主题topic_event)

第二层Flume(消费Kafka里面的数据) hadoop104

topic_start / topic_event(Kafka里的主题)
-----> KafkaSource
-----> File Channel1 / File channel2
-----> HDFSSink1 / HDFSSink2(直接持久化到HDFS)
filechannel是Flume的持久化通道,将所有事件写入磁盘,因此就算机器关机也不会丢失数据。

5、步骤

(1)搭建环境

用 docker 搭建hadoop102 hadoop103 hadoop104 三个镜像,并且实例化成三个对应的容器。
镜像已上传到阿里云的镜像仓库。
使用命令分别启动三个容器:
开启镜像时要注意端口映射,例如使用ZK时要将本地的2181、2182、2183端口绑定到对应的容器的2181端口上。
--name :用于对容器
-d :将容器放到后台运行
exec :不是用run来启动,用exec启动容器,exit退出时容器不关闭
-p :端口映射

docker exec -itd --name hadoop102  offline_data_warehouse -p 2181:2181 /bin/bash
docker exec -itd --name hadoop103  offline_data_warehouse -p 2182:2181 /bin/bash
docker exec -itd --name hadoop104  offline_data_warehouse -p 2183:2181 /bin/bash

常用命令:
docker ps:查看正在运行的容器
docker images:查看本地主机上的镜像
docker pull:从仓库获取镜像
docker push:提交镜像到仓库
docker rm -f:删除容器

各机器进程分配:

服务名称 子服务 hadoop102 hadoop103 hadoop104
HDFS NameNode
DataNode
SecondaryNameNode
Yarn NodeManager
Resourcemanager
Zookeeper Zookeeper Server
Flume(采集日志) Flume
Kafka Kafka
Flume(消费 Kafka) Flume
Hive Hive
MySQL MySQL