kafka入门与安装

Kafka是最初由Linkedin公司开发,是一个分布式、分区的、多副本的、发布-订阅模式,基于zookeeper协调的分布式日志系统。

简介

Kafka用于构建实时数据管道和流式应用程序。它的底层是由java和scala语音所编写的,具有水平可扩展性、容错性、速度极快,并在数千家公司投入生产。

特点

  • 发布和订阅记录流,类似于消息队列或企业消息传递系统。
  • 以容错、持久的方式存储记录流。
  • 流式处理信息,即当数据产生时立即处理。

适用场景

  • 日志收集:一个公司可以用Kafka可以收集各种服务的log,通过kafka以统一接口服务的方式开放给各种consumer;
  • 应用解耦:Kafka可作为不同应用间传递消息的中间平台。例如销售系统和库存系统中间的消息传递,降低系统耦合,提升整体稳定性。
  • 流量削锋:在秒杀应用中,防止用户数量过大而引起服务器超负荷,可以将用户请求写入消息队列,再由秒杀系统消费消息队列中的用户请求数据。
工作模式
基本概念

1. broker
kafka 集群可以由多个 kafka 实例组成,每个实例(server)称为 broker,可以理解为一次单机安装kafka是一个实例。broker存储topic的数据。
2. Topic
每条发布到Kafka集群的消息都有一个类别,这个类别被称为Topic。每一个生成者都可以往一个或多个topic中写入信息,消费者可以从已订阅的topic中消费信息。(同一个Topic的数据在实际上可能是存放在不同的broker的)
3. Partition
topic中的数据分割为一个或多个partition。每个topic至少有一个partition。每个partition中的数据使用多个segment文件存储。
4. Producer
生产者即数据的发布者,该角色将消息发布到Kafka的topic中。broker接收到生产者发送的消息后,broker将该消息追加到当前用于追加数据的segment文件中。
5. Consumer
消费者可以从broker中读取数据。消费者可以消费多个topic中的数据。
6. Consumer Group
每个Consumer属于一个特定的Consumer Group(可为每个Consumer指定group name,若不指定group name则属于默认的group)
7. Leader
每个partition有多个副本,其中有且仅有一个作为Leader,Leader是当前负责数据的读写的partition。
8. Follower
Follower跟随Leader,所有写请求都通过Leader路由,数据变更会广播给所有Follower,Follower与Leader保持数据同步。如果Leader失效,则从Follower中选举出一个新的Leader。

单机版安装

一、环境准备

  • 安装java环境,linux环境,可使用sudo apt install openjdk-8-jdk命令安装。
  • 安装zookeeper,apt install zookeeper下载,默认下载路径为: /usr/share/zookeeper/bin
  • 启动zookeeper:./zkServer.sh start
  • 下载kafka安装包并解压:
wget https://www.apache.org/dyn/closer.cgi?path=/kafka/2.7.0/kafka_2.12-2.7.0.tgz
tar -zxvf kafka_2.12-2.7.0.tgz
  • 修改配置文件
Python接口

kafka提供了python调用接口,通过kafka模块,可以使用python创建kafka集群的生产者和消费者。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from kafka import KafkaConsumer
from kafka import KafkaProducer

class Pipe:
  def __init__(self, group_id=None):
      self.topic = 'YourTopicName'
      brokers = BROKERS[YourIpAddress:9092]
      self.consumer = KafkaConsumer(bootstrap_servers=brokers, auto_offset_reset='latest', group_id=group_id, fetch_min_bytes=1024)
      self.producer = KafkaProducer(bootstrap_servers=brokers)
  
  def consume(self):
      self.consumer.subscribe([self.topic])
      res = []
      while True:
          for message in self.consumer:
              res.append(message.value)
      return res
              
  def produce(self, data):
      raw_data = json.dumps(data).encode('utf-8')
      self.producer.send(self.topic, raw_data)

if __name__ == '__main__':
  data = {'age'18'name''Lihua'}
  pipe = Pipe()
  pipe.produce(data)
  pipe.consume()

更多内容欢迎关注个人公众号:PythonAndDataTech
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值