[Scala/Flink] 基于Docker搭建Flink+Kafka+Redis流数据处理系统

本文介绍了如何在 CentOS7 上使用 Docker 和 Docker-compose 搭建 Flink、Kafka、Redis 流数据处理系统。详细步骤包括环境配置,如非 root 用户启动 Docker,配置并启动相关容器,以及 Flink 从 Kafka 读取数据和写入 Redis 的操作。同时,针对可能出现的错误,如 StandaloneSessionClusterEntrypoint 和 DispatcherResourceManagerComponent,提供了相应的解决方法。
摘要由CSDN通过智能技术生成

1. 环境搭建

1.1 安装 docker 和 docker-compose

在 centos7 上安装 docker 和 docker-compose, 可以参考这篇文章

1.2 设置 docker 非 root 用户启动

使用 root 用户启动 docker 有安全隐患, 所以最好设置 docker 非 root 用户启动, 设置方法是将普通用户加入 docker 组, 具体操作如下

// 查看 docker 组是否存在, 没有的话使用 sudo groupadd docker 添加
sudo cat /etc/group |grep docker
// 将 tmp 用户加入 dockersudo gpasswd -a tmp docker
// 刷新用户组
newgrp docker
1.3 配置相关容器

需要启动的容器包括:

  • Flink 的 jobmanager: 负责提交及查看任务
  • Flink 的 taskmanager: 负责执行任务
  • kafka: 负责数据的缓存和分发
  • zookeeper: 负责集群调度
  • almond: 负责启动包含 Scala 内核的 Jupyter
  • redis: 存储数据

docker-compose.yml 内容如下:

version: '3.8'

services:
  zookeeper:
    container_name: zookeeper
    image: wurstmeister/zookeeper
    ports:
      - "2181:2181"

  kafka:
    container_name: kafka
    image: wurstmeister/kafka
    depends_on: [ zookeeper ]
    ports:
      - "9092:9092"
    environment:
      KAFKA_ADVERTISED_HOST_NAME: xxx.xx.xx.xx
      KAFKA_CREATE_TOPICS: "Topic1:1:3,Topic2:1:1"
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

  jobmanager:
    container_name: jobmanager
    image: flink:latest
    ports:
      - "8081:8081"
    command: jobmanager
    environment:
      - |
        FLINK_PROPERTIES=
        jobmanager.rpc.address: jobmanager 

  taskmanager:
    container_name: taskmanager
    image: flink:latest
    depends_on:
      - jobmanager
    command: taskmanager
    scale: 1
    environment:
      - |
        FLINK_PROPERTIES=
        jobmanager.rpc.address: jobmanager
        taskmanager.numberOfTaskSlots: 2     

  almond:
    
使用ScalaFlinkKafka实时来一条统计PV的方法如下: 首先,我们需要创建一个Flink处理任务。在任务中,我们可以使用Flink提供的Kafka Consumer来消费Kafka中的消息,并使用Flink的处理函数对消息进行处理。 在处理函数中,我们可以将消费到的每条消息的PV字段进行累加。假设每条消息中包含一个PV字段(表示Page Views,即页面访问量),我们可以定义一个累加器,并使用Flink的MapState来保存当前的PV值。 下面是一个简单的示例代码: ``` import org.apache.flink.api.common.functions.MapFunction import org.apache.flink.api.common.state.MapStateDescriptor import org.apache.flink.api.common.typeinfo.{TypeHint, TypeInformation} import org.apache.flink.streaming.api.scala._ import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer object PVStatistics { def main(args: Array[String]): Unit = { val env = StreamExecutionEnvironment.getExecutionEnvironment val kafkaProps = new Properties() kafkaProps.setProperty("bootstrap.servers", "localhost:9092") kafkaProps.setProperty("group.id", "pv-consumer-group") val inputTopic = "pv-topic" val kafkaConsumer = new FlinkKafkaConsumer[String](inputTopic, new SimpleStringSchema(), kafkaProps) val stream = env.addSource(kafkaConsumer) // 定义累加器和MapStateDescriptor val pvAccumulator = new IntCounter val pvStateDescriptor = new MapStateDescriptor[String, Int]("pv-state", TypeInformation.of(new TypeHint[String]{}), TypeInformation.of(new TypeHint[Int]{})) val pvStream = stream.map(new MapFunction[String, Int] { override def map(value: String): Int = { pvAccumulator.add(1) pvAccumulator.getLocalValue } }).keyBy(_ => "pv-key") .mapWithState[(String, Int), MapState[String, Int]] { // 更新PV值并返回累加结果 case (value, state: MapState[String, Int]) => val pv = state.get("pv") val newPv = pv + value state.put("pv", newPv) ((inputTopic, newPv), state) } pvStream.print() env.execute("PV Statistics") } } ``` 在上述代码中,我们定义了一个`pvAccumulator`作为累加器,并通过`pvStateDescriptor`创建了一个MapState来保存每个topic的PV值。 然后,我们使用`FlinkKafkaConsumer`创建了一个Kafka Consumer,并从指定的topic `pv-topic`中消费消息。接着,我们使用`map`函数将每一条消息的PV字段累加到累加器中,并将累加结果输出为`(topic, pv)`的元组形式。 最后,我们使用`execute`方法执行Flink任务,即开始实时统计PV。 以上是使用ScalaFlinkKafka实时统计PV的一个简单示例。实际情况中,你可能需要根据具体需求进行更详细的配置和调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值