kafka和spark总结
本文涉及到的技术版本号:
- scala 2.11.8
- kafka1.1.0
- spark2.3.1
kafka简介
kafka是一个分布式流平台,流媒体平台有三个功能
- 发布和订阅记录流
- 以容错的持久化的方式存储记录流
- 发生数据时对流进行处理
kafka通常用于两大类应用
- 构件在系统或应用程序之间可靠获取数据的实时数据管道
- 构件转换或响应数据流的实时流应用程序
kafka的几个概念
- kafka运行在集群上,或一个或多个能跨越数据中心的服务器上
- kafka集群上存储流记录的称为topic
- kafka的topic里,每一条记录包括一个key、一个value和一个时间戳timestamp
kafka有四个核心API
-
Producer API
生产者api允许应用程序发布一个记录流到一个或多个kafka的topic
-
Consumer API
消费者api允许应用程序订阅一个或多个topic并且接受处理传送给消费者的数据流
-
Streams API
流api允许应用程序作为一个流处理器,从一个或多个输入topic中消费输入流,并生产一个输出流到一个或多个输出topic中
-
Connector API
连接器api允许构建和运行中的kafka的topic连接到现有的应用程序或数据系统中重用生产者或消费者。例如关系数据库的连接器可以捕获对表的每一个更改操作
kafka中的客户端和服务端之间是通过简单、高性能的语言无关的TCP协议完成的,该协议已经版本化并且高版本向低版本向后兼容。
topics
topic为kafka为记录流提供的核心抽象,类似于数据通道,并且topic是发布记录和订阅的核心。
kafka的topic是多用户的,一个topic可以有0个、1个或多个消费者订阅记录
对于每一个topic,kafka集群都维护了一个如下所示的分区记录:
其中每一个分区都是有序的不可变的记录序列,并且新数据是不断的追加到结构化的记录中。分区中的记录每个都分配了一个offset作为ID,它唯一标识分区中的每个记录。
kafka集群默认是保存所有记录,无论是否被消费过,但是可以通过配置保留时间策略。例如如果设置数据保留策略为两天,则超过两天的数据将被丢弃释放空间。kafka的性能受数据大小影响不大,因此长时间的存储数据并不是太大的问题。
其中,kafka 的消费者唯一对topic中的每一个分区都可以设置偏移量offset,标识当前消费者从哪个分区的哪一条数据开始消费,消费者通过对偏移量的设置可以灵活的对topic进行消费。如下图
消费者控制自己的偏移量就意味着kafka的消费者是轻量的,消费者之间互不影响。
topic记录中的分区有多种用途,首先它允许topic扩展到超出单台服务器适合的大小。每个分区都需要有适合托管分区的服务器,而topic可以有很多分区,因此一个topic可以处理任意数量的数据。另外这些分区作为并行的单位,效率很高,这也是相当重要的一点。
分配
记录分区分布在kafka集群服务器上,每个服务器共同处理数据并请求分区的共享。每个分区都可以在可用服务器的数量上进行复制,以此实现容错。
每一个分区都会有一个服务器作为leader,0个或多个服务器作为followers。leader处理分区的所有读取和写入请求,而follower被动的复制leader。如果leader出错,则其中一个follower会自动称为新的leader。集群中的每个服务器都充当某分区的leader和其他分区的follower,因此能在集群中达到负载均衡。
生产者
生产者将数据发布到所选择的分区,生产者在发布数据是需要选择将数据发送到哪个分区,分配分区可以通过循环方式完成也可以根据语义分区的功能实现。
消费者
消费者使用消费者组(consumer group)标记自己。发布到topic的每个记录会被发送到每个消费者组中的一个消费者实例。所以当一个消费者组中有多个消费者实例,则记录将在该消费者组中的所有消费者之间进行有效的负载均衡。
topic接受的每一条记录都会被广播发送到每个消费者组中。示意图如下:
上图有两个机器的kafka集群,某topic有四个分区p0-p3,有两个消费者组A/B订阅该topic,消费者组A有两个消费者实例,消费者组B有四个消费者实例。
kafka中实现消费的方式是通过在消费者实例上划分分区实现,保证实例在任何时间点都是公平分配的。消费者组中的成员划分分区是由kafka协议进行动态处理。如果新实例加入该组,那新加入的实例会从改组的成员中接管一些分区。如果消费者组中的某个实例死亡,则它所划分的分区分配给该消费组的其他实例。
kafka只能提供一个分区内的记录的顺序,但是不保证多个分区的记录顺序。如果用户想保证topic中的顺序,则使用一个分区的topic即可,但这样就意味着每个消费者组中只能有一个消费者实例。
kafka提供的保证
- 同一个生产者实例发送到特定topic的特定分区的两条数据M1和M2,并且M1发送早于M2,则M1将拥有更低的偏移量,即可以保证插入顺序。
- 消费者可以按照记录存储的顺序消费记录
- 对于复制因子为N的topic,最多可以容忍N-1个服务器故障,而不会丢失提交到topic中的记录
kafka常用命令
-
启动Zookeeper server
bin/zookeeper-server-start.sh config/zookeeper.properties &
-
启动Kafka server
nohup bin/kafka-server-start.sh config/ser