出处:http://blog.csdn.net/yfkiss/article/details/17348693
1. 引言
互联网够公司的日志无处不在,web日志,js日志,搜索日志,监控日志等等。对于这些日志的离线分析(Hadoop),wget&rsync虽然人力维护成本较高,但可以满足功能行需求。但对于这些日志的实时分析需求(例如实时推荐,监控系统),则往往必须要引入一些“高大上”的系统。
传统的企业消息系统(例如WebSphere)并不是非常适合大规模的日志处理系统,理由如下:
1) 过于关注可靠性,这些可靠性增加了系统实现&API的复杂度,而在日志处理过程中,丢失几条日志常常“无伤大雅”
2) 包括API,scale及消息缓冲的设计理念都不适合Hign Throughput的日志处理系统
针对这些问题,近些年各个公司都做了一些自己的日志收集系统,例如:Facebook的Scribe、Yahoo的data highway,Cloudera的Flume,Apache的Chukwa,百度的BigPipe,阿里的RocketMQ。
Kafka是LinkedIn开发并开源出来的一个高吞吐的分布式消息系统。其具有以下特点:
1) 支持高Throughput的应用
2) scale out:无需停机即可扩展机器
3) 持久化:通过将数据持久化到硬盘以及replication防止数据丢失
4) 支持online和offline的场景。
2. 介绍
kafka使用scala开发,支持多语言客户端(c++、java、python、go等)其架构如下[2]:
Producer:消息发布者
Broker:消息中间件处理结点,一个kafka节点就是一个broker
Consumer:消息订阅者
kafka的消息分几个层次:
1) Topic:一类消息,例如page view日志,click日志等都可以以topic的形式存在,kafka集群能够同时负责多个topic的分发
2) Partition: Topic物理上的分组,一个topic可以分为多个partition,每个partition是一个有序的队列。partition中的每条消息都会被分配一个有序的id(offset)。
3) Message:消息,最小订阅单元
具体流程:
1. Producer根据指定的partition方法(round-robin、hash等),将消息发布到指定topic的partition里面
2. kafka集群接收到Producer发过来的消息后,将其持久化到硬盘,并保留消息指定时长(可配置),而不关注消息是否被消费。
3. Consumer从kafka集群pull数据,并控制获取消息的offset
3. 设计
ThroughPut
High Throughput是kafka需要实现的核心目标之一,为此kafka做了以下一些设计:
1)数据磁盘持久化:消息不在内存中cache,直接写入到磁盘,充分利用磁盘的顺序读写性能
2)zero-copy:减少IO操作步骤
3)数据批量发送
4)数据压缩
5)Topic划分为多个partition,提高parallelism
load balance&HA
1) producer根据用户指定的算法,将消息发送到指定的partition
2) 存在多个partiiton,每个partition有自己的replica,每个replica分布在不同的Broker节点上
3) 多个partition需要选取出lead partition,lead partition负责读写,并由zookeeper负责fail over
4) 通过zookeeper管理broker与consumer的动态加入与离开
pull-based system
由于kafka broker会持久化数据,broker没有内存压力,因此,consumer非常适合采取pull的方式消费数据,具有以下几点好处:
1)简化kafka设计
2)consumer根据消费能力自主控制消息拉取速度
3)consumer根据自身情况自主选择消费模式,例如批量,重复消费,从尾端开始消费等
Scale Out
当需要增加broker结点时,新增的broker会向zookeeper注册,而producer及consumer会根据注册在zookeeper上的watcher感知这些变化,并及时作出调整。
Reference
[1] Apache Kafka
[2] Kafka: a Distributed Messaging System for Log Processing
[3] Kafka Client
相关推荐
通过深入研究kafka-clients的源码,我们可以更好地理解Kafka的工作原理,提升开发效率,解决实际问题,同时为优化和扩展Kafka-clients提供理论基础。在实际开发中,结合源码调试和学习,将使我们对Kafka-clients有更...
【Kafka基础知识】 Kafka是由Apache开发的分布式流处理平台,它主要被设计用来处理实时数据流。在大数据处理领域,Kafka常被用于构建实时数据管道和流应用,能够高效地处理大量的实时数据。 【Java与Kafka的结合】...
在本文中,我们将深入探讨基于Java的Kafka生产者与消费者的实现,这主要围绕...通过深入学习和实践"Kafka-java-demo"项目,你将对基于Java的Kafka生产和消费有更深入的理解,从而能够在实际项目中灵活运用Kafka的功能。
首先,让我们了解一下SpringBoot和Kafka的基础。SpringBoot是Spring框架的简化版本,它通过自动配置和起步依赖使得创建独立的、生产级别的基于Spring的应用程序变得更加容易。Kafka,另一方面,是由Apache开发的一个...
**Kafka基础知识** Apache Kafka是一个高性能、分布式的发布/订阅消息系统,最初由LinkedIn开发,后来成为Apache软件基金会的顶级项目。Kafka主要设计用于处理实时数据流,提供高吞吐量的数据传输能力,并能够持久...
Kafka通常需要Java Development Kit (JDK) 8或以上版本作为基础,因为它是用Java编写的。因此,确保你的Linux系统已经安装了兼容的JDK是安装Kafka的第一步。 压缩包中的"**kafka_2.12-2.8.2**"文件是Kafka的一个...
总之,"kafka-storm-starter-develop" 是一个很好的起点,为开发者提供了实现 Kafka 和 Storm 集成的基础。通过这个项目,开发者可以深入理解如何在实际环境中使用这两个工具,为实时数据处理和分析构建坚实的基础。
Cloudurable发布的“cloudurable-kafka-tutorial”是一个宝贵资源,为学习和深入了解Kafka提供了丰富的材料。教程不仅涵盖了Kafka的基础知识,还讲解了其在实际应用中的不同使用案例,以及如何与Cassandra等其他技术...
总结,"spring-kafka-demo"项目提供了一个很好的学习平台,帮助开发者快速上手Spring Kafka,理解其核心概念和操作方式。通过实际的编码和测试,可以深入理解Kafka与Spring的集成,从而在实际项目中更加自如地使用...
通过深入研究Kafka 2.5.0的源码,开发者不仅可以理解Kafka的工作原理,还能学习到分布式系统设计、并发编程、网络通信等相关知识,为开发高性能、高可用的数据处理系统打下坚实基础。同时,源码分析有助于解决实际...
3. **教学研究**:对于学习和研究Kafka的用户,Kafka Eagle提供了友好的界面和实用的功能,降低了学习门槛。 四、具体操作 1. **安装部署**:解压`kafka-eagle-web-2.0.3`压缩包后,按照官方文档的指引进行环境...
Kafka Eagle,作为一款高效且易用的Kafka监控与管理工具,其3.0.1版本在原有的功能基础上进行了优化和增强,为用户提供了更加完善的Kafka集群管理和监控体验。本文将深入探讨Kafka Eagle 3.0.1的核心特性、安装部署...
- **Example代码**: 压缩包中的源码提供了各种使用场景,如简单的生产消费、分组聚合、水印窗口等,通过对这些示例的学习,可以更深入地理解Akka Streams与Kafka的集成。 总结,"akka-streams-kafka-examples-源码...
在学习和实践这个过程时,你可能需要了解以下几个方面: 1. 分布式系统的基本概念,如CAP理论和Paxos算法。 2. 各组件的配置文件详解,理解每个参数的作用和默认值。 3. 数据序列化和反序列化,如JSON、Avro或...
下面,我们将深入学习这个集成过程中的关键知识点。 首先,我们要了解Spring Boot的基础。Spring Boot是Spring框架的一个扩展,旨在简化Spring应用的初始搭建以及开发过程。它通过自动配置、起步依赖和命令行接口等...
Apache Kafka 是一个分布式流处理平台,常用于构建实时数据管道和流应用。在这个"apache-kafka-...通过这个例子,你可以进一步学习Kafka的高级特性,比如分区策略、幂等性生产者、消费者位移提交以及Kafka Streams等。
总的来说,这个集成环境包提供了一个快速启动Kafka、ZooKeeper和Kafka Connect的基础,适合开发者和数据工程师进行测试、学习或搭建生产环境。通过理解这三个组件的工作原理和相互关系,可以更好地利用它们构建高效...
总的来说,Kafka Manager 2.0.0.2提供了丰富的功能和强大的工具集,通过源码学习,我们可以更深入地理解Kafka集群的运维,并能针对具体需求进行定制和扩展。源码阅读和分析对于提升Kafka运维能力、优化系统性能具有...
掌握Egg-kafka-node插件的使用,首先需要了解Node.js的基础知识,包括模块导入、异步编程等。然后,需要熟悉Egg.js的框架结构和插件机制。对于Kafka,理解其基本概念和操作方式,如producer、consumer、topic、...
这只是一个基础的Spring Boot整合Kafka的示例,实际上,Kafka支持更复杂的消息模式,如键值对、批处理、事务以及错误处理等。 此外,Kafka还提供了一个高可用性和容错性的特性,例如副本和分区,确保数据的可靠传输...