首先,我不知道这是Kafka的问题还是多克的问题……我对这两个主题都是新手。但我认为这更像是一个 Docker 而不是Kafka的问题(事实上,这将是我的问题,不真正了解其中一个…)。
我在raspberry 4上安装了docker,并为kafka和zookeeper创建了docker图像;我必须自己创建它们,因为64位raspi不受任何现有图像的支持(至少我找不到任何人)。但我让他们工作了。
接下来,我实现了kafka文档中的kafka流示例(wordcount);它运行得很好,计算你输入的所有文本中的单词,保留以前所有运行的数字。这在某种程度上是意料之中的;至少在那个文档中是这样描述的。
所以在一些测试运行之后,我想重置整个东西。
我认为最简单的方法是关闭docker容器,删除主机上装载的文件夹,然后重新开始。
但这不起作用:单词计数器仍然存在!意思是字数不是从0开始的…
好,下一步:不仅移除容器,还要重建图像!当然了,Zookeeper和Kafka!
没有区别!保留了以前所有运行的字数。
使用 docker system prune --volumes
也没什么区别…
从我对docker的有限理解来看,我假设任何运行时数据都存储在容器中,或者存储在装载的文件夹(卷)中。因此,当我删除容器和docker主机上由容器装载的文件夹时,我希望任何状态都会消失。
显然不是…所以我错过了一些重要的事情,很可能是docker。
我使用的docker compose文件:
version: '3'
services:
zookeeper:
image: tquadrat/zookeeper:latest
ports:
- "2181:2181"
- "2888:2888"
- "3888:3888"
- "8080:8080"
volumes:
- /data/zookeeper/config:/config
- /data/zookeeper/data:/data
- /data/zookeeper/datalog:/datalog
- /data/zookeeper/logs:/logs
environment:
ZOO_SERVERS: "server.1=zookeeper:2888:3888;2181"
restart: always
kafka:
image: tquadrat/kafka:latest
depends_on:
- zookeeper
ports:
- "9091:9091"
volumes:
- /data/kafka/config:/config
- /data/kafka/logs:/logs
environment:
KAFKA_LISTENERS: "INTERNAL://kafka:29091,EXTERNAL://:9091"
KAFKA_ADVERTISED_LISTENERS: "INTERNAL://kafka:29091,EXTERNAL://TCON-PI4003:9091"
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: "INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT"
KAFKA_INTER_BROKER_LISTENER_NAME: "INTERNAL"
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_DELETE_TOPIC_ENABLE: "true"
restart: always
我用来清除挂载文件夹的脚本文件:
# !/bin/sh
set -eux
DATA="/data"
KAFKA_DATA="$DATA/kafka"
ZOOKEEPER_DATA="$DATA/zookeeper"
sudo rm -R "$KAFKA_DATA"
sudo rm -R "$ZOOKEEPER_DATA"
mkdir -p "$KAFKA_DATA/config" "$KAFKA_DATA/logs"
mkdir -p "$ZOOKEEPER_DATA/config" "$ZOOKEEPER_DATA/data" "$ZOOKEEPER_DATA/datalog" "$ZOOKEEPER_DATA/logs"
有什么想法吗?
2条答案
按热度按时间alen0pnh1#
我从一开始就认为,问题主要是我缺乏知识。
我观察到的行为与docker的神奇数据存储无关,docker可以在所有试图杀死它的尝试中幸存下来;它和docker一点关系都没有。
我用这些docker图像来运行zookeeper和kafka服务器。然后我切换回我的工作站机器,编写了实现kafka流处理器的代码(“wordcount”示例)。当我在ide中启动时,它在本地机器上执行,通过网络访问Kafka。
我的假设是,任何状态都存储在kafka服务器上,因此转储应该重置整个事件;因为这不起作用,我也甩了Zookeeper,因为这也无济于事,我删除了几乎所有…
在这里给出一些提示之后,我发现kafka streams处理器在通过配置的文件系统文件夹中维护自己的本地状态
state.dir
(StreamsConfig.STATE_DIR_CONFIG
)–请参阅配置streams应用程序。这意味着kafka流处理器独立于任何kafka服务器维护自己的本地状态,并且-就像在我的本地计算机上运行时一样-也在任何docker容器之外/与之无关…根据文档,默认位置应该是
/var/lib/kafka-streams
,但这在我的环境中是不可写的–不知道流处理器将其状态放在何处。设置配置值后
state.dir
对于我的streams处理器,我可以在我的主目录中的一个文件夹中看到该状态,在删除该状态后,字数从1开始。深入查看Kafka流的文档发现,我可以通过调用
KafkaStream.cleanup()
在启动流处理器之前或关闭流处理器之后(不需要删除文件系统上的文件)。carvr3hs2#
Kafka流存储自己的状态下
"state.dir"
在其运行的主机上进行配置。在apachekafka库中,这是在/tmp
. 首先检查是否已在代码中重写该属性。至于docker,请先尝试不使用卷。
使用docker系统prune--卷也没有区别…
这将清除由
docker volume create
或者volumes:
在compose中,而不是主机装载的目录中。