Apache Flink简单示例以及连接kafka消费数据

在 Apache Flink 的 Local 模式下,通过 IDE(如 IntelliJ IDEA 或 Eclipse)来运行 Flink 程序非常方便。Local 模式指的是在本地环境下执行 Flink 程序,而不是在分布式集群中运行。下面是具体的步骤和一个简单的 Flink 示例:

1. 配置开发环境

  • 下载 Flink 依赖
    在 Maven 项目中,你需要在 pom.xml 文件中添加 Flink 依赖:
    <dependencies>
        <!-- Apache Flink 依赖 -->
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-streaming-java_2.12</artifactId>
            <version>1.16.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-clients_2.12</artifactId>
            <version>1.16.0</version>
        </dependency>
    </dependencies>
    

或者

<!-- Apache Flink 依赖 -->
      <dependency>
          <groupId>org.apache.flink</groupId>
          <artifactId>flink-streaming-java_2.12</artifactId>
          <version>1.14.6</version>
      </dependency>
      <dependency>
          <groupId>org.apache.flink</groupId>
          <artifactId>flink-clients_2.12</artifactId>
          <version>1.14.6</version>
      </dependency>
  • IDE 配置
    选择 IntelliJ IDEA 或 Eclipse,并确保项目的 JDK 和 Maven 正确配置。如果使用 IntelliJ IDEA,建议安装 Flink 插件来增强对 Flink 项目的支持。

2. Flink计算从socket输入的词频

2.1. 编写 Flink 程序

在 IDE 中创建一个 Java 类,编写一个简单的 Flink 程序,计算从 socket 输入的词频。

import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.util.Collector;

public class WordCount {

    public static void main(String[] args) throws Exception {
        // 获取执行环境
        final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        // 从 socket 读取数据 (假设本地 socket 服务运行在端口 9999 上)
        DataStream<String> text = env.socketTextStream("localhost", 9999);

        // 分割字符串,计算单词出现次数
        DataStream<Tuple2<String, Integer>> counts = text
            .flatMap(new Tokenizer())
            .keyBy(value -> value.f0)
            .sum(1);

        // 打印结果
        counts.print();

        // 执行程序
        env.execute("Flink Streaming WordCount");
    }

    // Tokenizer: 将每行文本分割成单词
    public static final class Tokenizer implements FlatMapFunction<String, Tuple2<String, Integer>> {
        @Override
        public void flatMap(String value, Collector<Tuple2<String, Integer>> out) {
            // 按空格分割字符串
            String[] tokens = value.toLowerCase().split("\\W+");

            // 输出每个单词和1的Tuple
            for (String token : tokens) {
                if (token.length() > 0) {
                    out.collect(new Tuple2<>(token, 1));
                }
            }
        }
    }
}

2.2. 运行 Flink 程序

  • 启动 socket 服务:在运行程序之前,打开终端并启动一个简单的 socket 服务:

    nc -lk 9999
    

    这将创建一个监听 9999 端口的 socket 服务,用于接收输入。

  • 运行 Flink 程序:在 IDE 中运行主类 WordCount,然后在终端的 socket 服务中输入一些文本。例如:

    hello flink
    flink is awesome
    hello world
    
  • 查看输出:Flink 程序将计算词频并输出到控制台。例如:

    (hello,1)
    (flink,1)
    (is,1)
    (awesome,1)
    (hello,2)
    

3. Flink连接kafka从中消费数据

使用 Apache Flink 从 Kafka 中消费数据并进行处理是一个常见的场景,尤其是在实时流处理的应用中。下面是一个简单的 Flink 示例,从 Kafka 中读取数据,处理后输出到控制台。

3.1. 配置 Kafka 和 Flink

你需要确保 Kafka 已经在本地或服务器上运行,并且有一个 Kafka 主题准备好用于消费数据。

3.2. Flink 程序示例

import org.apache.flink.api.common.serialization.SimpleStringSchema;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer;
import org.apache.kafka.clients.consumer.ConsumerConfig;

import java.util.Properties;

public class KafkaFlinkExample {

    public static void main(String[] args) throws Exception {
        // 创建执行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        // Kafka 配置
        Properties properties = new Properties();
        properties.setProperty(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
        properties.setProperty(ConsumerConfig.GROUP_ID_CONFIG, "flink-consumer-group");

        // 从 Kafka 读取数据,使用 SimpleStringSchema 解码器
        FlinkKafkaConsumer<String> kafkaConsumer = new FlinkKafkaConsumer<>(
                "test-topic", // Kafka 主题名称
                new SimpleStringSchema(),
                properties
        );

        // 让 Kafka 从最新的 offset 开始消费
        kafkaConsumer.setStartFromLatest();

        // 添加 Kafka 作为数据源
        DataStream<String> stream = env.addSource(kafkaConsumer);

        // 简单处理:把每条消息转换为大写
        DataStream<String> processedStream = stream.map(String::toUpperCase);

        // 打印处理结果到控制台
        processedStream.print();

        // 启动程序
        env.execute("Flink Kafka Consumer Example");
    }
}

3.3. 运行步骤

  1. 启动 Kafka:确保 Kafka 和 Zookeeper 服务已经启动。可以参考以下命令:

    # 启动 Zookeeper
    zookeeper-server-start.sh /usr/local/etc/kafka/zookeeper.properties
    
    # 启动 Kafka
    kafka-server-start.sh /usr/local/etc/kafka/server.properties
    
  2. 创建 Kafka 主题
    使用以下命令创建一个名为 test-topic 的 Kafka 主题:

    kafka-topics.sh --create --topic test-topic --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1
    
  3. 发送消息到 Kafka
    打开一个生产者终端,向 test-topic 发送一些测试消息:

    kafka-console-producer.sh --topic test-topic --bootstrap-server localhost:9092
    

    输入一些消息,比如:

    hello flink
    kafka integration
    flink kafka example
    
  4. 运行 Flink 程序
    在 IDE 中运行 KafkaFlinkExample,你会看到程序从 Kafka 中消费的消息,并将其转换为大写后输出到控制台:

    HELLO FLINK
    KAFKA INTEGRATION
    FLINK KAFKA EXAMPLE
    

小结

这个示例展示了如何使用 Flink 连接 Kafka,从中消费数据并进行简单的处理。你可以根据实际需求扩展处理逻辑,比如复杂的流计算、窗口操作等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值