[大数据框架]kafka+flink(环境搭建+集成实战)

759 阅读2分钟

完整步骤:搭建 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)

  1. 下载并解压 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
    
  2. 启动服务

    # 启动 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
    
  3. 创建测试 Topic

    bin/kafka-topics.sh --create --topic input-topic --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1
    

3. 安装 Apache Flink

  1. 下载并解压 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
    
  2. 启动 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. 验证结果

  1. Flink Web UI (http://localhost:8081):

    • 查看 "Running Jobs" 状态
    • 在 "Task Managers" 中检查 Stdout 日志
  2. 输出示例

    Processed: event-0
    Processed: event-1
    ...
    

9. 扩展:输出结果到 Kafka

  1. 创建输出 Topic

    bin/kafka-topics.sh --create --topic output-topic --bootstrap-server localhost:9092
    
  2. 修改 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)
    

常见问题排查

  1. Kafka 连接失败

    • 检查 bootstrap.servers 地址
    • 确认 Kafka 服务运行:netstat -tuln | grep 9092
  2. 缺少 JAR 包

    • 确保 flink-sql-connector-kafka-*.jar 在 Flink 的 lib/ 目录
  3. Python 依赖冲突

    • 使用虚拟环境:python -m venv flink-env && source flink-env/bin/activate

完整文档参考: