storm2

Storm2

storm如何保障消息的完全处理?

​ Storm可以保证从Spout发出的每个消息都能被完全处理。Storm的可靠性机制是完全分布式的(distributed),可伸缩的(scalable),容错的(fault-tolerant)。

​ 一条消息被完整处理是指一个从Spout发出的元组所触发的消息树中所有的消息都被Storm处理了,从Spout中发出的Tuple,以及基于他所产生Tuple由这些消息就构成了一棵tuple树,当这棵tuple树发送完成,并且树当中每一条消息都被正确处理,就表明spout发送消息被“完整处理”,即消息的完整性。如果在指定的超时时间里,这个Spout元组触发的消息树中有任何一个消息没有处理完,就认为这个Spout元组处理失败了。这个超时时间是通过每个拓扑的Config.TOPOLOGY_MESSAGE_TIMEOUT_SECS配置项来进行配置的,默认是30秒。只有消息树中所有的消息都被Storm处理完了,才算是这条Spout消息被完整处理了。

Acker – 消息完整性的实现机制

​ 一个Storm拓扑有一组特殊的"acker"任务,它们负责跟踪由每个Spout元组触发的消息的处理状态。当一个"acker"看到一个Spout元组产生的有向无环图中的消息被完全处理,就通知当初创建这个Spout元组的Spout任务,这个元组被成功处理。可以通过拓扑配置项Config.TOPOLOGY_ACKER_EXECUTORS来设置一个拓扑中acker任务executor的数量。Storm默认TOPOLOGY_ACKER_EXECUTORS和拓扑中配置的Worker的数量相同,对于需要处理大量消息的拓扑来说,需要增大acker executor的数量。

​ 当拓扑创建了元组,就会为其分配一个随机的64bit的id,acker使用该ID追踪spout发送的每个元组。元组树上的元组都知道这个ID。当在闪电中创建了新的元组,该ids会拷贝给新的元组。当元组确认后,元素发送消息给acker任务,以改变元组树。

![img](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml20008\wps8.jpg)

​ 当通过C衍生出D和E并且确认之后,就会从元组树中移除C。这样可以保证元组树不会过早地完成。

​ storm使用hash取模的方式将一个spout的元组id跟一个acker任务绑定。

​ spout发射元组的时候会给合适的acker发送一个消息表示对哪个spout的元组负责。acker发现元组树完成了,就知道向哪个spout任务发送完成的消息。

​ acker不显式地追踪元组。如果有数十万的节点,追踪所有的元组会有耗尽acker内存的风险。acker使用一个定长的空间20字节做这个工作。这个是storm的主要创新。

​ acker将spout发射的元组id和一个64bit的数字(ack val)相关联。ack val代表了该元组树的状态,不管spout发射的元组及其衍生的元组有多少,它仅仅是对所有创建的元组以及确认的元组id求异或xor操作。如果最终这个值ack val变成0,表示元组树已经被完全处理。某个元组的id和该64bit的数字异或结果是0的情况极其少见,比如每秒处理10k的元组,需要5000万年才会产生一个错误,造成数据丢失。

storm中drpc做什么用的?架构是什么样的?

​ DRPC (Distributed RPC) remote procedure call
​ 分布式远程过程调用

​ DRPC 是通过一个 DRPC 服务端(DRPC server)来实现分布式 RPC 功能的。
​ DRPC Server 负责接收 RPC 请求,并将该请求发送到 Storm中运行的 Topology,等待接收 Topology 发送的处理结果,并将该结果返回给发送请求的客户端。

​ DRPC把大量请求分布式的去做,一次请求如果串行的话可能会比较慢,并行的来处理,另一方面通过来降低平均一次请求的时间,解决了响应的吞吐。

​ DRPC设计目的:
​ 为了充分利用Storm的计算能力实现高密度的并行实时计算。
​ (Storm接收若干个数据流输入,数据在Topology当中运行完成,然后通过DRPC将结果进行输出。)

​ 客户端通过向 DRPC 服务器发送待执行函数的名称以及该函数的参数来获取处理结果。实现该函数的拓扑使用一个DRPCSpout 从 DRPC 服务器中接收一个函数调用流。DRPC 服务器会为每个函数调用都标记了一个唯一的 id。随后拓扑会执行函数来计算结果,并在拓扑的最后使用一个名为 ReturnResults 的 bolt 连接到 DRPC 服务器,根据函数调用的 id 来将函数调用的结果返回。

1561461883475

详述kafka的架构

​ Apache Kafka是一个分布式发布 - 订阅消息系统和一个强大的队列,可以处理大量的数据,并使您能够将消息从一个端点传递到另一个端点。 Kafka适合离线和在线消息消费。 Kafka消息保留在磁盘上,并在群集内复制以防止数据丢失。 Kafka构建在ZooKeeper同步服务之上。 它与Apache Storm和Spark非常好地集成,用于实时流式数据分析。

​ Kafka专为分布式高吞吐量系统而设计。 与其他消息传递系统相比,Kafka具有更好的吞吐量,内置分区,复制和固有的容错能力,这使得它非常适合大规模消息处理应用程序。

2

主题和分区

​ kafka的消息通过主题进行分类。主题类似于数据库中的表。

​ 主题可以被分为若干个分区,一个分区就是一个提交日志。

​ 消息以追加的方式写入分区,然后以先入先出的顺序读取。

​ 无法保证整个主题消息的顺序,可以保证一个分区内的消息顺序。

​ kafka通过分区实现数据冗余和伸缩性。

​ 一个主题通过将分区分布于不同的服务器上,横跨多个服务器,提供更大的性能。

![img](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml20008\wps1.png)

​ 可以把一个主题的数据看成一个流,不管它有多少个分区。流是一组从生产者移动到消费者的数据。

生产者和消费者

​ 生产者(发布者、写入者)将消息发布到一个特定的主题上。

​ 生产者默认情况下把消息均匀地分布到主题的所有分区上,而不关心特定消息会写到哪个分区。

​ 分区器为消息的键生成一个散列值,映射到指定的分区上。这样可以保证包含同一个键的消息被写入到同一个分区。

​ 消费者(订阅者、读者)订阅一个或多个主题,按照消息生成的顺序读取消息。

​ 消费者通过偏移量区分已经读取过的消息。

​ 偏移量是元数据,递增的整数值,在创建消息时kafka把它添加到消息里。

​ 在给定的分区,每个消息偏移量唯一。

​ 消费者把每个分区最后读取的消息偏移量保存在zookeeper或kafka上。

​ 消费者是消费者群组一部分,群组保证每个分区只能被一个消费者使用。

​ 消费者与分区之间的映射称为消费者对分区的所有权关系。

![img](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml20008\wps2.png)

broker和集群

​ 一个独立的kafka服务器是一个broker。

​ broker接收来自生产者的消息,为消息设置偏移量,提交消息到磁盘保存。

​ broker响应消费者请求,对读取分区做出响应,返回已经提交到磁盘上的消息。

​ 单个broker可以轻松处理数千个分区以及每秒百万级的消息量。

​ 每个集群有一个broker是集群控制器(自动选举)

​ 控制器将分区分配给broker和监控broker。

​ 一个分区属于一个broker,broker是分区的master

​ 一个分区可以分配给多个broker,提供了消息冗余,多个副本之间主从切换。

​ 消费者和生产者通过master操作消息。

![img](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml20008\wps3.png)

​ 保留消息是kafka的重要特性。默认的消息保留策略是,要么保存一段时间(7天),要么保留消息到一定大小的字节数(1GB)。当消息数量达到这些上限,旧消息过期被删除。

​ 对每个主题,可配置消息保留策略。

多集群

需求:

​ 数据类型分离

​ 安全需求隔离

​ 多数据中心(灾难恢复)

如果使用多个数据中心,需要在它们之间同步消息。

kafka提供了MirrorMaker工具用于实现多个集群间的消息同步。MirrorMaker核心组件包含一个生产者和一个消费者,两者之间通过队列相连。消费者从一个集群读取消息,生产者把消息发送到另一个集群。

![img](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml20008\wps4.png)

详述kafka消息队列的安装步骤

集群规划:

Zookeeper集群共三台服务器,分别为:node1、node2、node3。

Kafka集群共三台服务器,分别为:node1、node2、node3。

1、Zookeeper集群准备

kafka是一个分布式消息队列,需要依赖ZooKeeper,先安装好zk集群。

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](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml20008\wps5.jpg)

![img](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml20008\wps6.jpg)

核心配置参数说明:

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 node1:2181,node2:2181,node3: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](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml20008\wps7.jpg)

创建生产者:

bin/kafka-console-producer.sh --broker-list node4:9092,node2:9092,node3:9092 --topic test

创建消费者:

bin/kafka-console-consumer.sh --zookeeper node4:2181,node2:2181,node3:2181 --from-beginning --topic test

详述电信项目的整体架构

1561466738396

(1) 采取flume采集数据,实现日志收集,使用负载均衡策略

(2) 使用kafka作为消息通道,将数据传递给storm集群,作用是解耦及不同速度系统缓冲

(3) Storm接收kafka中的数据,通过FiterBolt过滤掉不合法的数据,然后消费合法的数据进行计算,将计算结果传递给Hbase数据库

(4) Hbase:存储storm实时计算的结果

(5) Tomcat:取出Hbase的数据进行数据处理,使用WEB框架展示

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值