Spark Streaming揭秘 Day33

Kafka内核再揭秘

优秀的框架会把引擎做到极致,Kafka就是这样,让我们再深入一下研究。

设计目标

kafka系统有着比较独特的的设计,包括5点:

  1. kafka第一设计原则是速度,不是个考虑功能的消息组件,主要考虑的是消息的传递速度,为了速度可以舍弃功能。

  2. 首要的考量是消息的吞吐量,而不是功能。使用3台pc Server,可以达到每秒百万条消息的吞吐量。

  3. kafka和其他消息系统不太一样,消息在磁盘上可以持久化,所以消息存储能力是无限的,从kafka角度讲就是个分布式文件系统,消息可以重复消费。

  4. 哪些数据已经被使用,不是保存在broker上,而是保存在consumer中,所以可以根据业务逻辑去做很多很有意思的操作,可以认为kafka就是个实时的动态数据来源。consumer(比如sparkstreaming)去维护哪些消息被消费,这个和一般消息中间件也是不一样的。

  5. kafka是个天然分布式系统,producer和consumer分布在不同的机器上,数量不会收到限制。运行的时候可以动态增减brokers,因为brokers是被zk管理的,consumer也会和zk打交道,zk作为适配层,让我们不需要关心状态信息,所以就算是broker挂掉,我们也不会感知到。

Consumer group

在kafka中,最小的通信单位是消息,消息是什么,由应用说了算。producer会以topic的方式,把消息交给brokers,topic是个抽象,也是个数据组织的方式,broker收到消息后,会存在具体的机器上,consumer可以订阅topic,producer所有发布的消息都会被订阅者感知到。

对于我们的一个topic而言,无论有多少个consumer,消息只会存储一次。consumer会注册给zookeeper,它会管理拓扑结构,所以可以协调数据的传输,

在订阅过程中,有个consumer group的概念,不同的group会同时消费,类似广播机制。但是如果在一个consumer group中有多个consumer,消息会在相同group中互斥。把所有的consumer放到一个group中,就类似队列。处理方式很灵活。

为什么会有consumer group的概念,每个consumer都一定要属于一个group,每个消息只会发给每个group中的一个consumer,一个group中的多个consumer,可能在不同机器上,但在逻辑上还是一个单位。这个抽象概念非常强大,目标是可以协调消费者,可以灵活的实现广播和队列。

性能设计

一个topic就是个table,table会动态增长,而且只是追加,在集群中有很多table,访问时访问table中的数据,有个巨大的优势是,只会在最新的基础上追加数据,所以不会有冲突,不需要加锁。完全可以使用磁盘的顺序读写,比随机读写快10000倍。

Kafka中用到了sendfile机制,随机读写是每秒k级别的,如果是线性读写可能能到每秒上G,kafka在实现时,速度非常快,是因为会把数据立即写入文件系统的持久化日志中,不是先写在缓存中,再flush到磁盘中。也就是说,数据过来的时候,是传输在os kernel的页面缓存中,由os刷新到磁盘中。在os采用sendfile的机制,os可以从页面缓存一步发送数据到网络中,同时,kafka支持gzip和Snappy对数据进行压缩,这个对传输数据至关重要。

数据存储采用topic-partition-record的三层体系,是个树状数据结构。对于树的存储,比较常用的是B tree,运行时间是O(logN),但是在因为需要锁定机制,在磁盘层面,在高速交换、数据规模比较大的时候,性能损耗还是比较厉害的。Kafka的方式是把所有消息看成普通的日志,理念就是把日志内容简单的追加,采用offset读取数据,优势是性能完全是线性的,和数据大小没有关系,同时,读取操作和写入操作不会互相阻塞,性能能永远达到最大化。

小结

通过一系列的设计,使用kafka,我们可以抛弃昂贵的高性能硬盘,可以以十分之一的硬件投入产生十倍的消息吞吐能力,还能存储无限大的消息,构建一个在线的、交互式、个性化的大数据系统!!!

欲知后事如何,且听下回分解!

DT大数据每天晚上20:00YY频道现场授课频道68917580

Kakfa揭秘 Day2 Kafka内核再揭秘的更多相关文章

  1. Kakfa揭秘 Day4 Kafka中分区深度解析

    Kakfa揭秘 Day4 Kafka中分区深度解析 今天主要谈Kafka中的分区数和consumer中的并行度.从使用Kafka的角度说,这些都是至关重要的. 分区原则 Partition代表一个to ...

  2. Kakfa揭秘 Day3 Kafka源码概述

    Kakfa揭秘 Day3 Kafka源码概述 今天开始进入Kafka的源码,本次学习基于最新的0.10.0版本进行.由于之前在学习Spark过程中积累了很多的经验和思想,这些在kafka上是通用的. ...

  3. Kakfa揭秘 Day1 Kafka原理内幕

    Spark Streaming揭秘 Day32 Kafka原理内幕 今天开始,会有几天的时间,和大家研究下Kafka.在大数据处理体系中,kafka的重要性不亚于SparkStreaming.可以认为 ...

  4. Kafka 高性能吞吐揭秘

    Kafka 高性能吞吐揭秘   Kafka作为时下最流行的开源消息系统,被广泛地应用在数据缓冲.异步通信.汇集日志.系统解耦等方面.相比较于RocketMQ等其他常见消息系统,Kafka在保障了大部分 ...

  5. 阅读《Oracle内核技术揭秘》的读书笔记

    阅读<Oracle内核技术揭秘>,对oracle的内存结构.锁.共享池.undo.redo等整理成了如下的思维导图:

  6. Spark Tungsten揭秘 Day2 Tungsten-sort Based Shuffle

    Spark Tungsten揭秘 Day2 Tungsten-sort Based Shuffle 今天在对钨丝计划思考的基础上,讲解下基于Tungsten的shuffle. 首先解释下概念,Tung ...

  7. Catalyst揭秘 Day2 Catalyst源码初探

    Catalyst揭秘 Day2 Catalyst源码初探 这节课从源码角度来讲catalyst. 首先有一个观点要澄清,就是技术不是越底层就越是性能和效率更高.因为除了指令执行性能以外,更重要的是架构 ...

  8. Kafka内核中的分布式机制实现

    Kafka内核中的分布式机制实现 一个Topic中的所有数据分布式的存储在kafka集群的所有机器(broker)上,以分区(partition)的的形式进行数据存储:每个分区允许存在备份数据/备份分 ...

  9. 干货 | Kafka 内核知识梳理,附思维导图

    前面我们已经分享过几篇Kafka的文章,最近简单梳理了下Kafka内核相关的知识,涵盖了Kafka架构总结,副本机制,控制器,高水位机制,日志或消息存储,消息发送与消费机制等方面知识.文末含对应的Ka ...

随机推荐

  1. Swift 玩转gif

    众所周知,iOS默认是不支持gif类型图片的显示的,但是我们项目中常常是需要显示gif为动态图片.那肿么办?第三方库?是的 ,很多第三方都支持gif , 如果一直只停留在用第三方上,技术难有提高.上版 ...

  2. Android(java)学习笔记115:Android InputMethodManager输入法简介

    正文 一.结构 public final class InputMethodManager extends Object Java.lang.Object android.view.inputmeth ...

  3. javaweb学习总结十(xml解析<SAX以及DOM方式>)

    一:XML解析技术 一般我们使用sun公司或者开源组织开发的工具包解析xml效率比较高. 1:jaxp解析xml,jaxp是sun公司开发的解析xml工具包 2:jaxp解析xml代码如下 a:获取d ...

  4. 浅谈 Data URI 与 BASE 64 编码

    前言(废话):鼓捣 Stylish 的时候发现了这么个奇怪的代码行: Data:image/gif;BASE64,R0lGODlhEAAQAKEAAEKF9NPi/AAAAAAAACH5BAEAAAI ...

  5. Java Concurrency - 线程的基础操作

    创建线程 在 Java 中,创建线程有两种方式: 继承 java.lang.Thread 类,重写 run 方法. public class MyJob extends Thread { @Overr ...

  6. Tomcat - 设置 HTTP 摘要认证

    在 Tomcat 中设置 HTTP 摘要认证的示例 在 Tomcat 中设置摘要认证与设置基本认证几乎一样,差别在于配置 web.xml 时,<login-config/> 元素在指定认证 ...

  7. MyBatis(3.2.3) - Multiple results as a map

    If we have a mapped statement that returns multiple rows and we want the results in a HashMap with s ...

  8. Java集合类 java.util包

    概述   软件包  类  使用  树  已过时  索引  帮助  JavaTM Platform Standard Ed. 6  上一个软件包   下一个软件包 框架    无框架           ...

  9. 修改msconfig->引导->高级选项-》最大内存为512M

    本来想开机提速的!手贱  把 最大内存设置成了512M  结果开机悲剧了,启用了微软的自动修复也不能解决问题!最后是WIN7 PE系统下直接修复boot结果了.遇到这种问题的朋友们可以试试喔

  10. C#中的 ref 传进出的到底是什么 解惑篇

    今天在浏览博文时,看到这篇文章:C#中的ref 传进出的到底是什么 ? 在传对象时使用ref的疑问 另附言: 本文写于早上,就在想发布的那瞬间,靠,公司断网了,原来修改的部分丢失了. 网一断就是一天了 ...