kafka学习(一):Kafka集群安装及踩坑

系列文章目录

kafka学习(一):Kafka集群安装及踩坑

kafka学习(二):Kafka基本概念

kafka学习(三):生产者


目录

环境说明

1. 集群创建

1.1 虚拟机安装

1.2 设置静态IP地址

1.3 集群免登录设置

1.4 踩坑

2. Zookeeper安装

2.1 Java 安装

2.2 Zookeeper 安装

2.3 简单配置

2.4 踩坑

3. Kafka安装

3.1 scala安装

3.2 Kafka 安装

3.3 简单配置

3.4 踩坑

4. 设置开机启动

4.1 Zookeeper 设置开机启动

4.2 Kafka 设置开机启动

4.3 踩坑


环境说明

        笔者使用Mac笔记本,安装了 VMWare Fusion,准备采用三个节点的虚拟集群安装Zookeeper和Kafka,并在集群之上运行zk和Kafka的集群模式,之后在这个上面进行一系列的学习和实验。需要说明的是:笔者这里服务启动和管理均采用非 root 用户,均使用了 kafka 用户。

        Kafka 版本:2.8.0(Scala 2.13 版本 ) 下载地址

        zookeeper 版本:3.4.5  

        Java 版本:Oracle jdk 8        下载地址

        Scala 版本:2.13         下载地址

        可以在笔者上传的资源直接打包下载地址:打包下载
        也可以官网自己手动下载。

        虚拟机版本:CentOS 7 

        其他说明:笔者这里 Kafka 版本使用的是 2.8.0,Kafka 最新的版本为 3.7,这里使用 2.8.0 版本是因为笔者是基于 2.X 版本学习的,二是因为最新版本不再强依赖 Zoo

### Flask与Kafka集成常见问题及解决方案 #### 1. Kafka依赖库安装失败 当尝试在Flask应用中引入`kafka-python`或其他Kafka客户端库时,可能会遇到包安装失败的情况。这通常是因为环境配置不当或缺少必要的编译工具。 解决方法是在虚拟环境中执行安装命令,并确保操作系统已安装Python开发文件以及构建必需的软件包[^1]: ```bash pip install kafka-python ``` 如果仍然无法成功安装,则考虑升级Pip版本或将特定版本号固定下来再试次。 #### 2. 连接超时错误 创建生产者或消费者实例时发生连接超时异常,表明应用程序未能及时建立到Kafka集群的有效链接。可能的原因有网络延迟过高、目标服务器地址不正确或是防火墙阻止了通信端口。 建议先验证Broker列表中的主机名和端口号设置无误;接着确认本地机器能够正常访问远程服务;最后调整socket_timeout_ms参数值来增加等待时间窗口: ```python from kafka import KafkaProducer producer = KafkaProducer( bootstrap_servers=['localhost:9092'], socket_timeout_ms=30*1000 # 设置为30秒 ) ``` #### 3. 数据序列化/反序列化格式不符 向主题发送消息前需指定合适的键值编码方式,默认情况下采用字符串形式表示。然而实际场景下经常需要用到JSON对象或者其他自定义结构体作为负载内容,在这种情形下就需要额外处理数据转换逻辑。 可以利用json.dumps()函数将字典转成合法的JSON串并附带相应的内容类型头信息传递给send()接口调用: ```python import json message_value = {"key": "value"} future_record_metadata = producer.send('my-topic', value=json.dumps(message_value).encode()) ``` 对于消费端而言则相反,接收后应立即解码恢复原始形态以便后续业务流程继续运作下去: ```python for message in consumer: decoded_message = json.loads(message.value.decode()) print(decoded_message["key"]) ``` #### 4. 并发性能瓶颈 随着并发请求量增大,单线程模式下的I/O密集型操作容易成为整个系统的效率短板所在。此时可借助多进程或多线程技术实现异步非阻塞式的批量提交机制从而提高吞吐率表现。 通过继承ThreadingMixIn类来自定义HTTPServer类即可轻松达成目的: ```python from http.server import HTTPServer, BaseHTTPRequestHandler from threading import Thread from concurrent.futures.thread import ThreadPoolExecutor class SimpleHttpServer(HTTPServer): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.executor = ThreadPoolExecutor(max_workers=8) if __name__ == '__main__': server_address = ('', 8000) handler_class = MyRequestHandler with SimpleHttpServer(server_address, handler_class) as httpd: threads = [] while True: request, client_address = httpd.get_request() thread = Thread(target=httpd.process_request_thread, args=(request, client_address)) thread.start() threads.append(thread) if len(threads) >= 8: for t in threads[:]: t.join(timeout=0.1) if not t.is_alive(): threads.remove(t) ``` 当然也可以直接选用gevent等第三方协程框架进步简化代码复杂度的同时获得更好的资源利用率效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值