完整步骤:搭建 Kafka 和 Flink 环境(从安装到数据处理)
1. java环境准备
- 操作系统:Linux/MacOS(Windows 建议使用 WSL2)
- 依赖安装:
# 安装 Java (>= JDK 8) sudo apt update sudo apt install openjdk-11-jdk
2. 安装 Apache Kafka(kafka依赖java, 所以上一步需要先安装java)
-
下载并解压 Kafka:
wget https://downloads.apache.org/kafka/3.6.1/kafka_2.13-3.6.1.tgz tar -xzf kafka_2.13-3.6.1.tgz cd kafka_2.13-3.6.1 -
启动服务:
# 启动 Zookeeper(Kafka 依赖, 如果是kafka是4.0.0及以上版本的, 则不需要zookeeper, 而是kraft) bin/zookeeper-server-start.sh config/zookeeper.properties # 新终端:启动 Kafka bin/kafka-server-start.sh config/server.properties -
创建测试 Topic:
bin/kafka-topics.sh --create --topic input-topic --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1
3. 安装 Apache Flink
-
下载并解压 Flink:
wget https://downloads.apache.org/flink/flink-1.18.0/flink-1.18.0-bin-scala_2.12.tgz tar -xzf flink-1.18.0-bin-scala_2.12.tgz cd flink-1.18.0 -
启动 Flink 集群:
bin/start-cluster.sh # 访问 Web UI: http://localhost:8081
4. Python 依赖准备(安装kafka和flink的客户端)
pip install apache-flink==1.18.0 kafka-python
5. 数据生产:Python 发送数据到 Kafka
# producer.py
from kafka import KafkaProducer
producer = KafkaProducer(
bootstrap_servers='localhost:9092',
value_serializer=lambda v: v.encode('utf-8') # 数据的序列化处理, 在kafka中存储的是字节类型,其他所有类型的数据,在写入到kafka之前,都要进行数据的序列化的处理
)
for i in range(10):
producer.send('input-topic', f'event-{i}')
producer.flush()
运行生产者, 数据写入到kafka的指定的topic中
python producer.py
6. Flink 处理程序(Python API)
# flink_processor.py
from pyflink.datastream import StreamExecutionEnvironment
from pyflink.datastream.connectors.kafka import FlinkKafkaConsumer
from pyflink.common.serialization import SimpleStringSchema
from pyflink.common.typeinfo import Types
env = StreamExecutionEnvironment.get_execution_environment()
env.add_jars("file:///path/to/flink-sql-connector-kafka-3.0.0-1.18.jar") # 下载 JAR 包
# 配置 Kafka Source
kafka_props = {
'bootstrap.servers': 'localhost:9092',
'group.id': 'flink-group'
}
kafka_source = FlinkKafkaConsumer( # 这里, 其实, flink充当的是kafka的消费者的角色
topics='input-topic',
deserialization_schema=SimpleStringSchema(),
properties=kafka_props
)
# 定义处理流程
ds = env.add_source(kafka_source) \
.map(lambda s: f"Processed: {s}", output_type=Types.STRING())
# 打印结果(生产环境可输出到 Kafka/文件)
ds.print()
env.execute("Kafka-Flink Demo")
重要:下载 Kafka 连接器 JAR:
wget https://repo1.maven.org/maven2/org/apache/flink/flink-sql-connector-kafka/3.0.0-1.18/flink-sql-connector-kafka-3.0.0-1.18.jar -P flink-1.18.0/lib/
7. 提交 Flink 作业
# 在 Flink 目录下运行
bin/flink run -py /path/to/flink_processor.py \
-d # 后台运行
8. 验证结果
-
Flink Web UI (http://localhost:8081):
- 查看 "Running Jobs" 状态
- 在 "Task Managers" 中检查 Stdout 日志
-
输出示例:
Processed: event-0 Processed: event-1 ...
9. 扩展:输出结果到 Kafka
-
创建输出 Topic:
bin/kafka-topics.sh --create --topic output-topic --bootstrap-server localhost:9092 -
修改 Flink 程序:
from pyflink.datastream.connectors.kafka import FlinkKafkaProducer # 替换 ds.print() 为: kafka_sink = FlinkKafkaProducer( topic='output-topic', serialization_schema=SimpleStringSchema(), producer_config={'bootstrap.servers': 'localhost:9092'} ) ds.add_sink(kafka_sink)
常见问题排查
-
Kafka 连接失败:
- 检查
bootstrap.servers地址 - 确认 Kafka 服务运行:
netstat -tuln | grep 9092
- 检查
-
缺少 JAR 包:
- 确保
flink-sql-connector-kafka-*.jar在 Flink 的lib/目录
- 确保
-
Python 依赖冲突:
- 使用虚拟环境:
python -m venv flink-env && source flink-env/bin/activate
- 使用虚拟环境:
完整文档参考: