pykafka的简单使用

PyFlink实战--PyFlink安装与入门介绍 简介 PyFlink 是什么?简单点说就是 Flink + Python,也就是 Flink on Python,Flink 从 1.9.0 版本开始增加了对 Python 的支持(PyFlink)。那么到底 Flink on Python 意味着这什么呢?那么一个非常容易想到的方面就是能够让 Python 用享受到 Flink 的所有功能。其实不仅如此... 阅读详情
# 一些概念
"""
topic ( pykafka.topic.Topic) – 此消费者应该消费的主题
cluster ( pykafka.cluster.Cluster) – 此消费者应连接到的集群
consumer_group ( str ) – 此消费者应加入的消费者组的名称。消费者组名称在集群级别命名空间,这意味着使用相同组名称的两个消费者将被视为同一组的一部分。
fetch_message_max_bytes ( int ) – 每次获取请求时尝试获取的消息字节数
num_consumer_fetchers ( int ) – 用于进行 FetchRequests 的工作人员数量
auto_commit_enable ( bool ) – 如果为 true,则定期向 kafka 提交已从消耗 () 调用返回的消息的偏移量。要求 consumer_group不是None。
auto_commit_interval_ms ( int ) – 消费者的偏移量提交给 kafka 的频率(以毫秒为单位)。如果auto_commit_enable为False ,则忽略此设置。
queued_max_messages ( int ) – 在内部缓冲以供消费的最大消息数 pykafka.simpleconsumer.SimpleConsumer
fetch_min_bytes ( int ) – 服务器应为获取请求返回的最小数据量(以字节为单位)。如果没有足够的数据可用,请求将阻塞,直到有足够的数据可用。
fetch_error_backoff_ms ( int ) –未使用。见pykafka.simpleconsumer.SimpleConsumer。
fetch_wait_max_ms ( int ) – 如果没有足够的数据来立即满足fetch_min_bytes,服务器将在响应获取请求之前阻塞的最长时间(以毫秒为单位)。
offsets_channel_backoff_ms ( int ) – 重试失败的偏移提交和获取的退避时间。
offsets_commit_max_retries ( int ) – 偏移量提交工作者在引发错误之前应该重试的次数。
auto_offset_reset ( pykafka.common.OffsetType) – 如果偏移量超出范围怎么办。此设置指示在遇到OffsetOutOfRangeError时如何重置使用者的内部偏移计数器。
consumer_timeout_ms ( int ) – 在返回 None 之前,消费者在没有可用消息的情况下可能花费的时间(以毫秒为单位)。
rebalance_max_retries ( int ) – 在引发错误之前重新平衡应重试的次数。
rebalance_backoff_ms ( int ) – 重新平衡期间重试之间的退避时间(以毫秒为单位)。
zookeeper_connection_timeout_ms ( int ) – 消费者在与 zookeeper 建立连接时等待的最长时间(以毫秒为单位)。
zookeeper_connect ( str ) – 已弃用::2.7,3.6 逗号分隔 (ip1:port1,ip2:port2) 字符串,指示要连接的 zookeeper 节点。
zookeeper_hosts ( str ) – 要连接的 ZooKeeper 主机的 KazooClient 格式字符串。
zookeeper ( kazoo.client.KazooClient) – 连接到 Zookeeper 实例的 KazooClient。如果提供,zookeeper_connect 将被忽略。
auto_start ( bool ) – __init__ 完成后消费者是否应该开始与zookeeper 通信。如果为 false,则可以使用start()开始通信。
reset_offset_on_start ( bool ) – 消费者是否应将其内部偏移计数器重置为self._auto_offset_reset并在启动时立即提交该偏移量
post_rebalance_callback ( function ) – 在进行重新平衡时要调用的函数。这个函数应该接受三个参数:pykafka.balancedconsumer.BalancedConsumer刚刚完成重新平衡的 实例,重新平衡之前它拥有的分区字典,以及重新平衡之后它拥有的分区字典。这些字典将分区 id 映射到这些分区的最近已知的偏移量。此函数可以选择返回一个字典,将分区 id 映射到偏移量。如果是这样,消费者将在继续消费之前将其偏移量重置为提供的值。请注意,在此回调运行时 BalancedConsumer 处于定义不佳的状态,因此访问其属性(例如hold_offsets或partitions) 可能会产生令人困惑的结果。相反,回调应该真正依赖于提供的 partition-id dicts,它们是明确定义的。
use_rdkafka ( bool ) – 如果可用,使用 librdkafka 支持的消费者
compacted_topic ( bool ) – 设置为从压缩的主题中读取。强制消费者使用不太严格的消息排序逻辑,因为压缩的主题不会以严格的递增顺序提供偏移量。
members_protocol ( pykafka.membershipprotocol.GroupMembershipProtocol) – 此消费者应遵守的组成员协议
deserializer ( function ) – 定义如何反序列化从 Kafka 返回的消息的函数。具有签名 d(value, partition_key) 的函数,该函数返回 (deserialized_value, deserialized_pa​​rtition_key) 的元组。传递给该函数的参数是消息值和分区键的字节表示,返回的数据应该是根据客户端代码的序列化逻辑转换的这些字段。有关库存实现,请参阅pykafka.utils.__init__。
reset_offset_on_fetch ( bool ) – fetch_offsets 期间是否更新偏移量。禁用只读用例以防止副作用。
"""
# 生产者.py
import queue
import time

from pykafka import KafkaClient


class KafkaTest(object):
    """
    测试kafka常用api
    """

    def __init__(self, host, topic):
        self._client = KafkaClient(hosts=host)
        self._topic = self._client.topics[topic.encode()]

    def producer_partition(self):
        """
        生产者分区查看,主要查看生产消息时offset的变化
        """
        partitions = self._topic.partitions
        print("查看所有分区:", partitions)

        earliest_offset = self._topic.earliest_available_offsets()
        print("获取最早可用的offset:", earliest_offset)

        last_offset = self._topic.latest_available_offsets()
        print("最近可用的offset:", last_offset)

        # 同步生产消息
        p = self._topic.get_producer(sync=True)
        p.produce(str(time.time()).encode())

        # 查看offset的变化
        last_offset_new = self._topic.latest_available_offsets()
        print("最新最近可用的offset:", last_offset_new)

    def producer_designated_partition(self):
        """
        往指定分区写消息,如果要控制打印到某个分区,
        需要再获取生产者的时候指定选取函数,
        并且再生成消息的时候额外指一个key
        """

        def assign_patition(pid, key):
            """
            指定特定分区,这里测试写入第一个分区(id=0)
            :param: 分区列表
            """
            print("为消息分配分区partition:", pid, key)
            return pid[0]

        # sync ( bool ) – 对生产的调用是否应该在返回之前等待消息发送。
        # 如果为True,则如果交付给 kafka 失败,则会从produce()引发异常
        # partitioner 分区器
        p = self._topic.get_producer(sync=True, partitioner=assign_patition)
        p.produce(str(time.time()).encode(), partition_key=b"partition_key_0")

    def async_produce_message(self):
        """
        异步生产消息,消息会被推到一个队列里面,
        另外一个线程会在队列中消息大小满足一个阈值(min_queued_messages)
        或到达一段时间(linger_ms)后统一发送,默认5s
        :return:
        """
        last_offset = self._topic.latest_available_offsets()
        print("最近的偏移量offse=", last_offset)

        # 记录最初的偏移量
        old_offset = last_offset[0].offset[0]
        p = self._topic.get_producer(sync=False, partitioner=lambda pid, key: pid[0])
        p.produce(str(time.time()).encode())
        s_time = time.time()
        while True:
            last_offset = self._topic.latest_available_offsets()
            print("最近可用的offset=", last_offset)
            if last_offset[0].offset[0] != old_offset:
                e_time = time.time()
                print("cont time = ", e_time - s_time)
                break
            time.sleep(1)

    def get_produce_message_report(self):
        """
        查看异步发送消息报告,默认会等待5秒后才能获得报告
        :return:
        """
        last_offset = self._topic.latest_available_offsets()
        print("最近的偏移量offset=", last_offset)
        # delivery_reports 获取消息的传递确认
        p = self._topic.get_producer(sync=False, delivery_reports=True, partitioner=lambda pid, key: pid[0])
        p.produce(str(time.time()).encode())
        s_time = time.time()
        delivery_report = p.get_delivery_report()  # 必须设置delivery_reports=True才能获取反馈
        e_time = time.time()
        print('等待{}s, 递交报告{}'.format(e_time - s_time, delivery_report))
        last_offset = self._topic.latest_available_offsets
        print("最近的偏移量offset=", last_offset)

    def get_produce_message_report_exc(self):
        message = "test message test message1"
        # 生产环境,为了达到高吞吐量,要采用异步的方式,通过delivery_reports =True来启用队列接口;
        last_offset = self._topic.latest_available_offsets()
        print("最近的偏移量offset=", last_offset)
        producer = self._topic.get_producer(sync=False, delivery_reports=True)
        producer.produce(bytes(message.encode()))
        last_offset = self._topic.latest_available_offsets()
        print("最近的偏移量offset=", last_offset)
        try:
            print("get info,直接运行速度太快,msg无法获取,直接报异常了")
            msg, exc = producer.get_delivery_report(block=False)
            print("msg", msg)
            if exc is not None:
                print('Failed to deliver msg {}: {}'.format(msg.partition_key, repr(exc)))
            else:
                print('Successfully delivered msg {}'.format(msg.partition_key))

        except queue.Empty:
            pass
        except Exception as e:
            print(e)


if __name__ == '__main__':
    host = "192.168.0.120:9092"
    topic = "trademark_info"
    kafka_ins = KafkaTest(host=host, topic=topic)
    # kafka_ins.producer_partition()
    # kafka_ins.producer_designated_partition()
    # kafka_ins.async_produce_message()
    # kafka_ins.get_produce_message_report()
    kafka_ins.get_produce_message_report_exc()
# 消费者.py
from pykafka import KafkaClient


class KafkaTest(object):
    """
    测试kafka常用api
    """

    def __init__(self, host, topic):
        self._client = KafkaClient(hosts=host)
        self._topic = self._client.topics[topic.encode()]

    def simple_consumer(self, offset=0):
        """
        消费者指定消费
        :param offset:偏移量
        :return:
        """
        partitions = self._topic.partitions
        print("查看所有分区partitions=", partitions)
        last_offset = self._topic.latest_available_offsets()
        print("最近的偏移量offset=", last_offset)
        consumer = self._topic.get_simple_consumer(consumer_group="trademark_info",
                                                   partitions=[partitions[0]])  # 选择一个分区进行消费
        offset_list = consumer.held_offsets
        print("当前消费者分区offset情况{}".format(offset_list))  # 消费者拥有的分区offset的情况
        consumer.reset_offsets([(partitions[0], offset)])  # 设置offset偏移值
        msg = consumer.consume()
        print("消费 :{}".format(msg.value.decode()))
        msg = consumer.consume()
        print("消费 :{}".format(msg.value.decode()))
        msg = consumer.consume()
        print("消费 :{}".format(msg.value.decode()))
        offset = consumer.held_offsets  # 返回从分区 id 到每个分区的持有偏移量的映射
        print("当前消费者分区offset情况{}".format(offset_list))  # 返回从分区 id 到每个分区的持有偏移量的映射

    def balance_consumer(self, offset=0):
        """
        使用balance consumer 去消费 kafka
        :param offset:
        :return:
        """
        # managed=True 设置后,使用新式reblance分区方法,不需要使用zk,
        # 而False是通过zk来实现reblance的需要使用zk
        consumer = self._topic.get_balanced_consumer(consumer_group="trademark_info", managed=True)
        partitions = self._topic.partitions
        print("分区 {}".format(partitions))
        earliest_offsets = self._topic.earliest_available_offsets()
        print("最早可用offset {}".format(earliest_offsets))
        last_offsets = self._topic.latest_available_offsets()
        print("最近可用offset {}".format(last_offsets))
        offset = consumer.held_offsets
        print("当前消费者分区offset情况{}".format(offset))
        while True:
            msg = consumer.consume()
            offset = consumer.held_offsets
            print("{}, 当前消费者分区offset情况{}".format(msg.value.decode(), offset))


if __name__ == '__main__':
    host = "192.168.0.120:9092"
    topic = "trademark_info"
    kafka_ins = KafkaTest(host=host, topic=topic)
    kafka_ins.simple_consumer()
    # kafka_ins.balance_consumer()
让AI稳定生成流程图:基于Skill与Mermaid的工程化实践 流程图是软件工程中沟通业务逻辑的通用语言,但其绘制与维护却长期依赖手工工具,导致文档更新滞后、协作成本高。随着大语言模型技术的成熟,自然语言生成代码已成为可落地的技术路径,而Mermaid作为一款文本化图表语法,凭借其可版本管理、可自动渲染和可嵌入文档的优势,正逐步取代传统绘图工具。要让AI稳定输出合格的流程图,关键在于为模型定义一套清晰的Skill规则,约束输入结构、处理逻辑和输出格式。本文从流程图的工程痛点出发,介绍如何利用大模型将自然语言描述转化为结构化文本,再通过Mermaid CLI渲染成可视化图 阅读详情

相关推荐

EPICS Phoebus手册1

EPICS客户端phoebus 手册

yuyuyuliang00的博客 3949

kafka简介以及pykafka的基本操作

“Kafka是最初由Linkedin公司开发,是一个分布式、分区的、多副本的、多订阅者,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/nginx日...

wutao22的博客 2531

从PWM到正弦波:RC低通滤波器的魔法转换之旅

本文详细介绍了如何利用RC低通滤波器将STM32F103生成的PWM信号转换为高质量正弦波的技术原理与实践方法。通过分析滤波器设计、参数计算、硬件实现及Proteus仿真验证,为嵌入式开发者提供了一套完整的PWM转正弦波解决方案,适用于电机控制、音频信号生成等多种应用场景。

jupi8的博客 380

python3-使用pykafka模块连接kafka

前言 最近有个日志需求,因为太过频繁,且还要有通过日志的频率来启动报警机制,于是想到使用kafka来做,下面就主要记录一下pthon怎么使用kafaka,我这边使用的pyKafka,至于什么是kafka,kafka的原理以及自身的形成机制或搭建之类的,请自行百度一番即可,这边只记录代码 先贴下 pykafka的官方API文档地址 正文 1、导入模块 from pykafka import KafkaClient 2、实例化 client = KafkaClient(hosts="host:port")

波风水门 2140

Kill5.37版本下,使用ARMcomplier6编译__asm 函数报错的问题

Kill5-5.37版本下,使用ARMcomplier6编译__asm 函数报错的问题 问题简要描述: 昨日更新了keil5软件的版本,从5.17更新到了5.37版本,然后编译STM32项目文件时,软件提示编译报错。报错问题如下: Build started: Project: QKsoftware *** Using Compiler 'V6.18', folder: 'E:\MDK-ARM\ARM\ARM\ARMCLANG\Bin' Build target 'QKsoftware' compiling

weixin_43644424的博客 1万+

计算pi小数点后10000位

数据结构课上,老师让我们计算一下pi的10000位,复习一下面向对象。 First Try:定义一个高精度类hp(high precision),实现加减乘除,输入输出,然后随便找一个公式,比如Wallis公式,全都用hp进行计算。 现实是:大数乘大数或者大数除大数,实在是太慢了。而且Wallis公式收敛太慢。 Second Try先找到一个收敛较快的公司:BBP公式,观察公式发现,...

我的技术人生 7394

python操作Kafka简单使用

一. kafka-python和pykafka区别: https://blog.youkuaiyun.com/qq_38110368/article/details/108615786 与confluent_kafka优劣: -- 二. 相关概念: broker 消息中间件处理结点,一个Kafka节点就是一个broker,多个broker可以组成一个Kafka集群,相当于物理层面上的一台服务器。 topic 消息的主题,一个broker可有多个topi...

weixin_45059006的博客 715

第2章: MMU Notifier 全局通知器的核心原理⭐

摘要 MMU Notifier机制是Linux内核中用于处理内存地址空间变化通知的关键框架。其设计遵循解耦与标准化、最小侵入性、高性能和安全性四大原则,采用三层架构实现上层应用、核心层与内存管理层的协作。框架提供两种通知模型:全局订阅的mmu_notifier和区间订阅的mmu_interval_notifier,分别适用于KVM虚拟化和GPU共享虚拟内存等不同场景。核心数据结构mmu_notifier_ops定义了设备驱动需要实现的回调函数集合,包括进程退出处理、页面老化管理、地址范围失效通知等功能。

图形/计算GPU的驱动与虚拟化技术分享园地 4550

python 读写kafka

11qwe

MusicDancing的博客 803

HTML蓝色动态爱心(完整代码)

HTML语言实现蓝色动态爱心的完整代码。

AIGC 8万+

从 Chat 提示词到可运行 Fiori 应用,ADT for VS Code 正在把 RAP 开发带进 Agent 时代

本文探讨了在VS Code中使用AI辅助进行ABAP RAP开发的新模式。文章指出,传统RAP开发需要手工创建数据库表、CDS视图、行为定义等十多个关联对象,命名和关联关系容易出错。现在通过GitHub Copilot Agent Mode配合ADT MCP Server,开发者可用自然语言描述业务场景直接生成完整的RAP业务对象。这种生成式开发的核心价值在于:1)通过标准化工具接口(MCP)连接ABAP后端,确保生成符合规范的RAP对象;2)能正确处理多实体组合场景下的命名一致性和关联关系;3)保持生成结

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 85

python3连接kafka模块pykafka生产者简单封装

1.1安装模块 pip install pykafka 1.2基本使用 # -* coding:utf8 *- from pykafka import KafkaClient host = 'IP:9092, IP:9092, IP:9092' client = KafkaClient(hosts = host) # 生产者 topicdocu = client.topics['...

清水渔渔的博客 7519

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

pykafka简单应用

简单的pykafka生产/消费/再生产过程;

qq_14961743的博客 361

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

python kafka生产者_python3连接kafka模块pykafka生产者简单封装代码

1.1安装模块pip install pykafka1.2基本使用# -* coding:utf8 *-from pykafka import KafkaClienthost = "IP:9092, IP:9092, IP:9092"client = KafkaClient(hosts = host)# 生产者topicdocu = client.topics["my-topic"]produce...

weixin_39526564的博客 397

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

python 使用pykafka连接kafka生产消息

开始使用了kafka-python, 发现对gevent协程支持不太好,就选择了pykafka, 异步也是使用协程greenlet。了解gevent的应该都知道,gevent是greenlet的升级。 安装非常简单,(我是py2.7)直接pip: pip install pykafka 下面直接上代码:生产者的代码 import Queue import json from datetime import datetime import traceback import random imp..

qq_41998415的博客 1592

使用pykafka读取实时数据小例子

使用pykafka读取实时数据 import sys from KafkaConfig import Config from pykafka import KafkaClient from pykafka.balancedconsumer import BalancedConsumer from pykafka.simpleconsumer import OwnedPartition,

zhidao_wenge的专栏 8395

记pykafka的一个问题

pykafka的使用问题 由于业务需要,需使用kafka,由于底层使用的是python,要是使用python的API 现有的包有kafka-python和pykafka,前者需要自己手动管理消费者的offset,比较麻烦,pykafka可使用zk管理offset,相对简单 pykafka Demo 在选定号方案之后,一个简单的Demo如下: # encoding:utf-8 """ 使用p...

QiuYang18的博客 1328

通过pykafka接收Kafka消息队列

没有Kafka环境,所以也没有进行验证。感觉今后应该能用到,所以借抄在此,备查。 pykafka使用示例,自动消费最新消息,不重复消费: # -* coding:utf8 *- from pykafka import KafkaClient host = '192.168.200.38' client = KafkaClient(hosts="%s:9092" % host) print

BabyFish13 2009

kafka-python 停止消费

使用kafka-python时,不消费数据,也没有异常 换为pykafka库后解决 使用例子 from pykafka import KafkaClient client = KafkaClient(hosts='127.0.0.1:9092') topic = client.topics['logsget'] consumer = topic.get_simpl

zhidao_wenge的专栏 3562

Yandex SHRI 2018 入学测试实战解析:用 Express + Sequelize + GraphQL 编写员工会议信息应用并完成全量排错(entrance-task-1)

本文围绕 Yandex 前端开发学院(Школа разработки интерфейсов, SHRI)2018 年秋季入学测试的第一道任务([entrance-task-1.md](https://link.gitcode.com/i/e0363b4cffe53bf1f2bb172161b3518e))展开:它要求候选人在一个基于 Node.js 8、由 express、sequelize、

gitblog_00274的博客 913

python操作pykafka

from pykafka import KafkaClient client = KafkaClient(hosts ="127.0.0.1:9092") #可接受多个client #查看所有的topic topic = client.topics[b'test'] print(topic) #选择一个topic message ="test message test message" #生产ka...

唐僧不爱八戒 2699

使用Python向kafka中写入数据

第一步安装pykafka pip install pykafka PyKafka — pykafka 2.8.1-dev.2 documentation 第二步编写写入相应主题的数据代码, 这里只是demo from pykafka import KafkaClient client = KafkaClient(hosts="192.168.220.202:9092,192.168.220.203:9092,192.168.220.204:9092") topic = client.top

a857553315的博客 4094

python发送zookeeper的kafka集群消息

python发kafka消息 目前技术一般采用基于zk的kafka集群,传统直连方式不可取。因此采用pykafka三方类库来进行消息的发送和接收,本文实现了同步sync和异步async的消息发送produce,接收消息consume部分topic查询不到消息,欢迎技术同学帮我补充(本文也是参考网上文章,基于python3.7) 直接上代码(实践可用) rom pykafka import Ka...

lx2324268860的博客 1446

python3.5读取kafka中的数据

安装包 pykafka 代码如下: from pykafka import KafkaClient client = KafkaClient(hosts="test43:9092") print(client.topics) topic = client.topics[b'rokid'] #topic名称 consumer = topic.get_simple_con...

weixin_30699235的博客 165

kafka生产者——python Api发送

kafka生产者——python Api使用一、环境简介 一、环境简介 机器:13-inch, M1, 2020 编码:pycharm 环境:python3.8.10 kafka包:pykafka (pip install pykafka) 如果你也是以上的环境那么该案例对你有一定的参考意义! 以下内容为参考:博主文章实践的内容 ...

叁木大数据 4157
上一篇: aiohttp+aiofiles异步爬虫光速下载图片
下一篇: js一些参数
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值