Storm-容错机制、Drpc、kafka
Storm-容错机制
架构
Nimbus 分配任务、资源调度、上传jar包
ZooKeeper 代理协调、健康检查(心跳)
Supervisor 接收Nimbus任务、开启/关闭自己管理的worker进程(可以开启n个woker)
Worker 运行具体处理运算组件的进程(每个Worker对应执行一个Topology的子集)
执行任务(可以执行n个task(spolt–推送数据/bolt–逻辑单元处理)任务)
附:每个worker中有1-n个进程,一个进程可以执行1-n个task任务(spout,blot)
集群出现的问题以及解决办法
集群节点宕机 --物理问题
Nimbus
在交付任务给ZK之后短时间内没有更多实质性任务,此时Nimbus可以闲置
当Supervisor 和Nimbus同时宕机,此时Nimbus需要重启
当客户端推送新任务时,Nimbus宕机,此时Nimbus需要重启
Supervisor
当Supervisor宕机时,ZK会通知Nimbus,再重新将任务分配给其他Supervisor。当宕机的Supervisor恢复后,会心跳到ZK寻找自己之前的任务,如果任务被分配则执行快速自毁机制(杀死未完成原任务的进程),重新处于等待
Worker
当Worker宕掉时,Supervisor先发现,并重新启动Worker,如果长时间启动不了,ZK会发现当前Worker宕掉,此时ZK会将宕掉的Worker任务交由其他Worker完成。当宕机的Worker恢复后,会执行快速自毁机制(杀死未完成原任务的进程),重新处于等待
进程挂掉
当进程挂掉时,由ZK将该进程的任务重新分配新的进程
消息的完整性
将包装的数据流做16位的二进制streamID,每发生stream流交互时将前后的ID进行异或运算,最终异或结果为0,则数据传递成功没有故障;若传递故障则推送给上一个节点重新发送。
tips: 与 全1为1,有0则0 要求严格
或 有1为1,全0为0 要求不严
异或 相异为1,相同为0
ack无法保证数据不被重复计算,但是可以保证数据至少被正确使用一次
Drpc
分布式远程过程调用 —DrpcServer在客户端和storm之间承担桥梁作用
客户端通过DrpcServer将所需args发送给spout,再和bolt进行计算后,经过resultBolt汇总后将结果交由DrpcServer,最终由DrpcServer将结果展示给客户端
tops:DrpcServer与spout、resultBolt交互时都带有request-id用于分别不同客户端需求
定义DRPC拓扑:
方法1:
通过LinearDRPCTopologyBuilder (该方法也过期,不建议使用)
该方法会自动为我们设定Spout、将结果返回给DRPC Server等,我们只需要将Topology实现
方法2:
直接通过普通的拓扑构造方法TopologyBuilder来创建DRPC拓扑
需要手动设定好开始的DRPCSpout以及结束的ReturnResults
kafka
集群的分布式消息队列系统,遵循先进先出,数据有序原则
角色: Producers(生产者)、Broker(缓存代理)、Consumers(消费者)
storm处于消费者的地位
在生产数据之前先创建topic,在topic下面生产数据,生产出同一个主题的东西可以根据实际的业务需求放到不同的partitions(分区)上,在同一个分区上生产和消费的顺序是有序的(依据偏移量)
架构原理:Kafka给Producer和Consumer提供注册的接口,数据从Producer发送到Broker,Broker承担一个中间缓存和分发的作用,负责分发注册到系统中的Consumer。
一个分区属于一个broker,broker是分区的master
ZK管理Broker
kafka集群搭建
集群规划:
Zookeeper集群共三台服务器,分别为:node1、node2、node3。
Kafka集群共三台服务器,分别为:node1、node2、node3。
1、Zookeeper集群准备
kafka是一个分布式消息队列,需要依赖ZooKeeper,请先安装好zk集群。
Zookeeper集群安装步骤略。
2、安装Kafka
下载压缩包(官网地址:http://kafka.apache.org/downloads.html)
解压:
tar zxvf kafka_2.10-0.9.0.1.tgz -C /opt/
mv kafka_2.10-0.9.0.1/ kafka
修改配置文件:config/server.properties
[外链图片转存失败(img-5Frb3INj-1563925076034)(file:///C:/Users/86158/AppData/Local/Temp/msohtmlclip1/01/clip_image002.png)]
[外链图片转存失败(img-be1mhZ15-1563925076035)(file:///C:/Users/86158/AppData/Local/Temp/msohtmlclip1/01/clip_image004.png)]
核心配置参数说明:
broker.id: broker集群中唯一标识id,0、1、2、3依次增长(broker即Kafka集群中的一台服务器)
注:当前Kafka集群共三台节点,分别为:node1、node2、node3。对应的broker.id分别为0、1、2。
zookeeper.connect: zk集群地址列表
将当前node1服务器上的Kafka目录复制到其他node2、node3服务器上:
scp -r /opt/kafka/ node2:/opt
scp -r /opt/kafka/ node3:/opt
修改node2、node3上Kafka配置文件中的broker.id(分别在node2、3服务器上执行以下命令修改broker.id)
sed -i -e ‘s/broker.id=.*/broker.id=1/’ /opt/kafka/config/server.properties
sed -i -e ‘s/broker.id=.*/broker.id=2/’ /opt/kafka/config/server.properties
3、启动Kafka集群
A、启动Zookeeper集群。
B、启动Kafka集群。
分别在三台服务器上执行以下命令启动:
bin/kafka-server-start.sh config/server.properties
4、测试
创建话题(kafka-topics.sh --help查看帮助手册)
创建topic:
bin/kafka-topics.sh --zookeeper sxt002:2181,sxt003:2181,sxt004:2181 --create --replication-factor 2 --partitions 3 --topic test
(参数说明:
–replication-factor*:指定每个分区的复制因子个数,默认1个*
–partitions*:指定当前创建的kafka分区数量,默认为1个*
–topic*:指定新建topic的名称)*
查看topic列表:
bin/kafka-topics.sh --zookeeper node4:2181,node2:2181,node3:2181 --list
查看“test”topic描述:
bin/kafka-topics.sh --zookeeper node4:2181,node2:2181,node3:2181 --describe --topic test
[外链图片转存失败(img-eGtcEHLD-1563925076035)(file:///C:/Users/86158/AppData/Local/Temp/msohtmlclip1/01/clip_image006.png)]
创建生产者:
bin/kafka-console-producer.sh --broker-list sxt002:9092,sxt003:9092,sxt004:9092 --topic test2
创建消费者:
bin/kafka-console-consumer.sh --zookeeper node4:2181,node2:2181,node3:2181 --from-beginning --topic test
查看帮助手册:
bin/kafka-console-consumer.sh help