大数据组件学习

Kafka为什么拥有高性能?

2018-12-06  本文已影响10人  阿猫阿狗Hakuna

架构层面

1.利用Partition实现并行处理

       Kafka中的每个Topic都包含一个或多个Partition,且它们位于不同节点。同时,Partition在物理上对应一个本地文件夹,每个Partition包含一个或多个Segment,其中包含一个数据文件与一个索引文件。Partition像一个数组,可以通过索引(offset)去访问其数据。
       Kafka不仅可以实现机器间的并行处理,因为其Partition物理上对应一个文件夹,可以通过配置让同一节点的不同Partition置于不同的disk drive上,从而实现磁盘间的并行处理。具体方法:将不同磁盘mount到不同目录,在server.properties中,将log.dirs设置为多目录(逗号分隔),Kafka会自动将所有Partition均匀分配到不同disk上。
       一个Partition只能被一个Consumer消费,如果Consumer的个数多于Partition的个数,会有部分Consumer无法消费该Topic的数据,所以,Partition的个数决定了最大并行度
       如果用Spark消费Kafka数据,如果Topic的Partition数为N,则有效的Spark最大并行度也为N,即使Spark的Executor数为N+M,最多也只有N个Executor可以同时处理该Topic数据。

2.ISR实现CAP中可用性与数据一致性的动态平衡

       Kafka的数据复制方案接近于Master-Slave,不同的是,Kafka既不是完全的同步复制,也不是完全的一步复制,而是基于ISR的动态复制方案。
       ISR,In-Sync Replica,每个Partition的Leader都会维护这样一个列表,其中包含了所有与之同步的Replica。每次写入数据时,只有ISR中的所有Replica都复制完,Leader才会将这条数据置为Commit,它才能被Consumer消费。
       与同步复制不同的是,这个ISR是由Leader动态维护的,如果Follower不能紧跟上Leader,它将被Leader从ISR中移除,待它重新“跟上”Leader后,会被Leader再次加入ISR中。每次改变ISR后,Leader会将最新ISR持久化到Zookeeper中。
       那么如何判断Follower是否“跟上”Leader?

为什么要使用ISR方案?
ISR相关配置

实现层面

1.高效实用磁盘
顺序写磁盘

       将写磁盘的过程变为顺序写,可极大提高对磁盘的利用率。Consumer通过offset顺序消费这些数据,且不删除已经消费的数据,从而避免随机写磁盘的过程。
       Kafka删除旧数据的方式是删除整个Segment对应的log文件和整个index文件,而不是删除部分内容。如下代码所示:


image.png
充分利用Page Cache

Page Cache的优点:

零拷贝

       Kafka中存在大量网络数据持久化到磁盘(Producer到Broker)和磁盘文件通过网络发送(Broker到Consumer)的过程,这个过程中,传统模式下要进行数据的四次拷贝,但是Kafka通过零拷贝技术将其减为了一次,大大增加了效率,原理可以在另一篇文章(https://www.jianshu.com/p/835ec2d4c170)中获得。

3.减少网络开销
批处理

       批处理减少了网络传输的overhead,又提高了写磁盘的效率。
       Kafka的API做中,从send接口来看,一次只能发送一个ProducerRecord,但是send方法并不是立即将消息发送出去,而是通过batch.size和linger.ms控制实际发送频率,从而实现批量发送。

数据压缩降低网络负载
高效的序列化方式
上一篇 下一篇

猜你喜欢

热点阅读