本文目录导读:

是的,可以通过脚本自动管理Kafka主题,以下是一些实用脚本示例,覆盖常见管理场景:
批量创建主题脚本
#!/bin/bash
# create_kafka_topics.sh
KAFKA_HOME="/opt/kafka"
BOOTSTRAP_SERVER="localhost:9092"
TOPICS_FILE="topics.txt"
# topics.txt 格式: topic_name partitions replication_factor
# example:
# user-events 3 2
# order-logs 5 3
# system-metrics 1 1
while IFS=' ' read -r topic partitions replication
do
echo "Creating topic: $topic with $partitions partitions and $replication replication"
$KAFKA_HOME/bin/kafka-topics.sh \
--create \
--bootstrap-server $BOOTSTRAP_SERVER \
--topic $topic \
--partitions $partitions \
--replication-factor $replication \
--if-not-exists
if [ $? -eq 0 ]; then
echo "✅ Successfully created topic: $topic"
else
echo "❌ Failed to create topic: $topic"
fi
done < "$TOPICS_FILE"
自动清理过期主题脚本
#!/bin/bash
# cleanup_old_topics.sh
KAFKA_HOME="/opt/kafka"
BOOTSTRAP_SERVER="localhost:9092"
RETENTION_DAYS=30
CUTOFF_DATE=$(date -d "$RETENTION_DAYS days ago" +%s)
# 获取所有主题列表
topics=$($KAFKA_HOME/bin/kafka-topics.sh \
--list \
--bootstrap-server $BOOTSTRAP_SERVER)
for topic in $topics; do
# 跳过内部主题
[[ $topic == __* ]] && continue
# 获取主题创建时间(需要启用主题元数据)
create_time=$($KAFKA_HOME/bin/kafka-topics.sh \
--describe \
--bootstrap-server $BOOTSTRAP_SERVER \
--topic $topic \
| grep -oP 'CreateTime:\K\d+' 2>/dev/null)
if [ -n "$create_time" ] && [ $create_time -lt $CUTOFF_DATE ]; then
echo "Deleting old topic: $topic (created: $(date -d @$create_time))"
$KAFKA_HOME/bin/kafka-topics.sh \
--delete \
--bootstrap-server $BOOTSTRAP_SERVER \
--topic $topic
fi
done
主题配置批量修改脚本
#!/bin/bash
# update_topic_configs.sh
KAFKA_HOME="/opt/kafka"
BOOTSTRAP_SERVER="localhost:9092"
TAG_PREFIX="env:production"
# 为特定环境的所有主题设置统一的配置
topics=$($KAFKA_HOME/bin/kafka-topics.sh \
--list \
--bootstrap-server $BOOTSTRAP_SERVER)
for topic in $topics; do
# 只处理生产环境主题
if [[ $topic == $TAG_PREFIX* ]] || [[ $topic == "prod-"* ]]; then
echo "Updating config for topic: $topic"
# 设置保留时间和大小
$KAFKA_HOME/bin/kafka-configs.sh \
--bootstrap-server $BOOTSTRAP_SERVER \
--entity-type topics \
--entity-name $topic \
--alter \
--add-config "retention.ms=604800000,retention.bytes=1073741824"
# 设置压缩类型
$KAFKA_HOME/bin/kafka-configs.sh \
--bootstrap-server $BOOTSTRAP_SERVER \
--entity-type topics \
--entity-name $topic \
--alter \
--add-config "compression.type=snappy"
fi
done
Python自动化管理脚本
#!/usr/bin/env python3
# kafka_topic_manager.py
import json
import subprocess
import re
from datetime import datetime, timedelta
class KafkaTopicManager:
def __init__(self, bootstrap_servers="localhost:9092", kafka_home="/opt/kafka"):
self.bootstrap_servers = bootstrap_servers
self.kafka_bin = f"{kafka_home}/bin"
def run_kafka_cmd(self, cmd_type, args):
"""执行Kafka命令"""
cmd_map = {
'topics': f"{self.kafka_bin}/kafka-topics.sh",
'configs': f"{self.kafka_bin}/kafka-configs.sh",
}
cmd = [cmd_map[cmd_type]] + args + ["--bootstrap-server", self.bootstrap_servers]
result = subprocess.run(cmd, capture_output=True, text=True)
return result.stdout.strip() if result.returncode == 0 else None
def list_topics(self, exclude_internal=True):
"""列出所有主题"""
topics = self.run_kafka_cmd('topics', ['--list'])
if not topics:
return []
topic_list = topics.split('\n')
if exclude_internal:
topic_list = [t for t in topic_list if not t.startswith('__')]
return topic_list
def get_topic_details(self, topic_name):
"""获取主题详细信息"""
description = self.run_kafka_cmd('topics', ['--describe', '--topic', topic_name])
if not description:
return None
# 解析描述信息
lines = description.split('\n')
if not lines:
return None
# 提取基本配置
main_line = lines[0]
pattern = r'Topic: (\S+).*?PartitionCount: (\d+).*?ReplicationFactor: (\d+)'
match = re.search(pattern, main_line)
if match:
return {
'name': match.group(1),
'partitions': int(match.group(2)),
'replication_factor': int(match.group(3)),
'configs': self.get_topic_configs(topic_name)
}
return None
def get_topic_configs(self, topic_name):
"""获取主题配置"""
output = self.run_kafka_cmd('configs', [
'--describe',
'--entity-type', 'topics',
'--entity-name', topic_name,
'--all'
])
if not output:
return {}
configs = {}
for line in output.split('\n'):
if '=' in line:
key, value = line.split('=', 1)
configs[key.strip()] = value.strip()
return configs
def create_topic(self, name, partitions=3, replication=2, configs=None):
"""创建主题"""
args = ['--create', '--topic', name,
'--partitions', str(partitions),
'--replication-factor', str(replication)]
if configs:
config_str = ','.join(f"{k}={v}" for k, v in configs.items())
args.extend(['--config', config_str])
return self.run_kafka_cmd('topics', args)
def delete_topic(self, name):
"""删除主题"""
return self.run_kafka_cmd('topics', ['--delete', '--topic', name])
def update_config(self, topic_name, configs):
"""更新主题配置"""
config_str = ','.join(f"{k}={v}" for k, v in configs.items())
return self.run_kafka_cmd('configs', [
'--alter',
'--entity-type', 'topics',
'--entity-name', topic_name,
'--add-config', config_str
])
def find_topics_by_pattern(self, pattern):
"""根据模式查找主题"""
import fnmatch
all_topics = self.list_topics()
return [t for t in all_topics if fnmatch.fnmatch(t, pattern)]
def bulk_operation(self, topics, operation, **kwargs):
"""批量操作主题"""
results = {}
for topic in topics:
try:
if operation == 'delete':
results[topic] = self.delete_topic(topic)
elif operation == 'update_config':
results[topic] = self.update_config(topic, kwargs.get('configs', {}))
elif operation == 'create':
results[topic] = self.create_topic(
topic,
kwargs.get('partitions', 3),
kwargs.get('replication', 2)
)
except Exception as e:
results[topic] = f"Error: {str(e)}"
return results
# 使用示例
if __name__ == "__main__":
manager = KafkaTopicManager()
# 1. 列出所有主题
print("=== 所有主题列表 ===")
for topic in manager.list_topics():
details = manager.get_topic_details(topic)
if details:
print(f"Topic: {details['name']}, Partitions: {details['partitions']}, Replication: {details['replication_factor']}")
# 2. 批量创建主题
print("\n=== 批量创建主题 ===")
new_topics = {
'clickstream': {'partitions': 5, 'replication': 3},
'user-profiles': {'partitions': 3, 'replication': 2}
}
for name, config in new_topics.items():
result = manager.create_topic(name, **config)
print(f"Create {name}: {result}")
# 3. 更新配置
print("\n=== 更新配置 ===")
config_updates = {'retention.ms': '604800000', 'compression.type': 'gzip'}
result = manager.update_config('clickstream', config_updates)
print(f"Update clickstream config: {result}")
# 4. 按模式查找并操作
print("\n=== 查找并操作用户相关主题 ===")
user_topics = manager.find_topics_by_pattern('user-*')
print(f"找到用户主题: {user_topics}")
定时维护脚本(Cron)
#!/bin/bash # /etc/cron.d/kafka-topic-maintenance # 每天凌晨2点执行主题清理 0 2 * * * root /opt/scripts/cleanup_old_topics.sh >> /var/log/kafka-cleanup.log 2>&1 # 每6小时检查一次主题磁盘使用 0 */6 * * * root /opt/scripts/monitor_topic_disk.sh # 每周一凌晨3点更新所有主题配置 0 3 * * 1 root /opt/scripts/update_topic_configs.sh
YAML配置驱动的脚本
# kafka_topics_config.yaml
topics:
- name: user-events
partitions: 3
replication_factor: 2
configs:
retention.ms: 604800000
compression.type: snappy
cleanup.policy: delete
min.insync.replicas: 2
- name: order-logs
partitions: 5
replication_factor: 3
configs:
retention.ms: 2592000000
compression.type: gzip
cleanup.policy: compact
delete.retention.ms: 86400000
- name: system-metrics
partitions: 1
replication_factor: 1
configs:
retention.ms: 3600000
retention.bytes: 1073741824
配套的Python解析脚本:
# yaml_to_kafka.py
import yaml
from kafka_topic_manager import KafkaTopicManager
def load_config_and_apply():
with open('kafka_topics_config.yaml', 'r') as f:
config = yaml.safe_load(f)
manager = KafkaTopicManager()
for topic_config in config['topics']:
name = topic_config['name']
existing = manager.get_topic_details(name)
if existing:
print(f"Topic {name} already exists, updating config...")
if topic_config.get('configs'):
manager.update_config(name, topic_config['configs'])
else:
print(f"Creating topic {name}...")
manager.create_topic(
name=name,
partitions=topic_config['partitions'],
replication=topic_config['replication_factor'],
configs=topic_config.get('configs')
)
if __name__ == "__main__":
load_config_and_apply()
使用建议
- 权限管理:生产环境使用Kafka ACL控制脚本权限
- 错误处理:添加重试机制和错误日志
- 版本兼容:注意不同Kafka版本的命令差异
- 安全考虑:敏感信息(密码、密钥)使用环境变量或密钥管理服务
- 测试环境:先在测试环境验证脚本效果
这些脚本可以根据你的具体需求进行调整,实现Kafka主题的自动化管理。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播