架构:消息传输层-流处理层
消息传输层:
01.Kafka 的出现,直接解决了replayable的数据框架的问题。建造和分析分布式数据处理系统的思维体系
持久化:kafka文件存储
偏移offset管理
02.Pulsar 是pub-sub模式的分布式消息平台:为了解决吞吐等问题,Pulsar和Kafka一样,采用了分区(Partition)的机制
持久化-Pulsar通过 BookKeeper 来存储消息,保证消息不会丢失-服务和数据是分离的-存储和计算的分离
- Pulsar Broker 是无状态的,与存储相互分离
Broker:提供发布和订阅的服务(Pulsar的组件)
Bookie:提供存储能力(BookKeeper的存储组件)
支持消息TTL Time-to-Live(TTL)
流处理层:
Flink
Spark Streaming/ Structure Streaming
消息传输层:
Kafka
01.使用
Producer Consumer Broker Topic Message Partition Log LogSegment Relica Rebalance
offset ZooKeeper
02.管控:
Topic:Topic的名字
Partition:Topic包含的分区
Partition以及Partition副本由一系列的Segment和索引文件组成
kafka消费信息lag
logsize: 已经写到该分区的消息数
offset : Kafka Consumer已经消费分区上的消息数
lag :还有多少消息未读取(Lag = logSize - Offset)
offset代表数据消费能力 logsize代表进入速度 lag 数据积压情况-Lag(延迟) 如果lag量持续增长说明系统出现问题。
生产数据 msg/s -- 集群的吞吐量(msg/s)
每秒产生的消息数(mps)和每个消息的字节大小(bpm)
Message :Kafka中的一条记录或数据单位。每条消息都有一个键和对应的一个值,有时还会有可选的消息头。
恢复正常所需要的时间,取决于Consumer每秒能够应对的消息速度
time=messages/(consume rate per second - produce rate per second)
使用案例:
Flink实时计算--Flink集成Kafka
Flink
01.connector
内嵌的Source
Custom Source
addSource
02.Data Enrichment via Async I/O
连接Kafka
Flink’s Kafka consumer is called FlinkKafkaConsumer08
FlinkKafkaConsumer for Kafka >= 1.0.0 versions)
1.5 flink-connector-kafka-0.8_2.11 Kafka 版本:0.8.x
代码示例:
Properties properties = new Properties();
properties.setProperty("bootstrap.servers", "localhost:9092");
// only required for Kafka 0.8
properties.setProperty("zookeeper.connect", "localhost:2181");
properties.setProperty("group.id", "test");
DataStream<String> stream = env
.addSource(new FlinkKafkaConsumer08<>("topic", new SimpleStringSchema(), properties));
//SimpleStringSchema 来反系列化message,这个类是实现了 DeserializationSchema 接口,并重写了T deserialize(byte[] message)函数
// SerializationSchema
Pulsar
基本情况:高性能流式处理(Apache Kafka所追求的)和灵活的传统队列(RabbitMQ所追求的)
Producer Consumer Topic Cursors
Subscription
Bookkeeper
分层抽象:
Topic (主题) Subscription (订阅) Cursors (游标)
Apache Pulsar使用游标来跟踪偏移量,
Subscription 订阅来消费Topic中的消息。订阅是游标(跟踪偏移量)的逻辑实体,订阅不包含消息的数据,只包含元数据和游标
Apache Pulsar中的分区也是Topic
Bookkeeper- 每个Bookkeeper节点称为Bookie。
Pulsar和Bookkeeper都使用Apache Zookeeper来存储元数据和监控节点健康状况
如果Zookeeper不可用整个Pulsar将不可用。
ledgers流 子日志(Ledgers) Ledger作为最小的删除单元 Ledgers本身也被分解为多个Fragment。
Ledger有三个关键配置: Ensemble Size (E) Write Quorum Size (Qw) Ack Quorum Size (Qa)
Ensemble Size (E) 决定了 Pulsar 写入 Ledger 可用的 Bookies 池的大小。
Write Quorum (Qw) 是 Pulsar 将要写入的实际的 Bookies 数量
Fragment是Bookkeeper集群中最小的分布单元
Entries
数据恢复协议
Broker缓存尾部消息日志,可以非常高效的为尾部读取操作提供服务
journal(日志)
分阶段:
结合到一个统一的消息传递模型和API
Apache Pulsar 内部构成: Pulsar Broker / Apache BookKeeper / Pulsar Functions / ZooKeeper集群
消息部分由 Pulsar Broker 来负责;
提供了基于 Stream 和 Queue 的统一的消费模式
主题 Topic (租户 (Tenant) ,命名空间(namespace)和 Topic 名字)、生产者 Producer 和消费者 Consumer
消费模式: exclusive、failover 和 shared 三种订阅类型
shared 的消费模式,它属于 Queue 的模式,常见的 RabbitMQ、ActiveMQ 均属于这种模式
存储部分使用了 Apache BookKeeper,通用的分布式日志存储解决方案
Bookie 节点 Segment
计算部分由 Pulsar Functions 来负责。
设计基于 Serverless 的,由消息来驱动的“Stream-native”的 Pulsar Functions
提供两种 API,
第一种是 SDK less 的 API,用户不用依赖 Pulsar 的 sdk,只用实现 java.util.function.Function 的接口。
第二种借助 Pulsar SDK 的 API,通过 Context 来和 Pulsar 交互和定制
提供了 Stream-native 的轻量级计算框架,保证了数据的即时流式处理
使用
通过多种方式融合使用 Pulsar 和 Flink。
例如,在 Flink DataStream 应用程序中,Pulsar 可以作为流数据源和流接收器
PulsarSourceBuilder<String>builder = PulsarSourceBuilder.builder(new SimpleStringSchema())
.serviceUrl(serviceUrl)
.topic(inputTopic)
.subscriptionName(subscription);
SourceFunction<String> src = builder.build();
DataStream<String> input = env.addSource(src);
Pulsar应用: 多接入边缘计算(multi-access edge computing) 边缘计算(Edge Computing)
雾计算(Fog Computing)
云计算(Cloud Computing
附录-版本历史:
01.消息传输层
001.Kafka - 商业 Confluent 公司
0.7.0 Release 2012-01-04
0.8.x, 版本 2015-02-02
0.9.x 版本 2015-11-23 Uses the new Consumer API Kafka.
0.10.x 版本 0.10.0.x,0.10.1.x,0.10.2.x,0.11.0.x,
1.0.x 版本 2017-11-01
1.1.x 版本 2018-03-28
2.0.0 版本 2018-07-30
2.1.0 版本 2018-11-20
2.2.x 版本 2019-03-22
2.3.x 版本 2019-09-25
002. Pulsar
1.14 — 2016-08-31
2.2.0 2018-10-24
2.3.0 2019-02-20
2.3.2 2019-05-30
02.流处理层
Flink版本
Flink 0.8.0 - 2015-01-22
Flink 1.4.2 - 2018-03-08
Flink 1.5.0 - 2018-05-25
Flink 1.5.6 - 2018-12-21
Flink 1.6.0 - 2018-08-08
Flink 1.6.4 - 2019-02-25
Flink 1.7.0 - 2018-11-30
Flink 1.7.2 - 2019-02-15
Flink 1.8.0 - 2019-04-20
Spark版本
Spark 0.6.0 2012-1-15
Spark 2.0.0 2016-07-26
Spark 2.2.0 2017-07-11
Spark 2.3.3 2019-02-15
Spark 2.4.0 2018-11-02
Spark 2.4.3 2019-05-07
说明:
Flink 商业化公司 Data Artisans
Spark 商业化公司 Databricks
Kafka 商业化公司 Confluent
其他:
Apache Flink State Backends
RocksDB --高性能的Key-Value数据库
所有的数据在引擎中是有序存储,可以支持Get(key)、Put(Key)、Delete(Key)和NewIterator()。
RocksDB的基本组成是memtable、sstfile和logfile
Bookies读取逻辑如下:Write Cache -> Read Cache -> Log Entry Files(RocksDB 作为索引)
参考:
https://flink.apache.org/zh/downloads.html
http://spark.apache.org/news/index.html
http://kafka.apache.org/downloads
http://pulsar.apache.org/en/release-notes/
Apache Kafka Connecto https://ci.apache.org/projects/flink/flink-docs-release-1.8/dev/connectors/kafka.html
https://www.jianshu.com/p/83cccc14e0b8
https://flink.apache.org/2019/05/03/pulsar-flink.html