Flink Standalone集群模式下使用minio作为statebackend存储

需求

flink standalone模式下不使用hdfs作为state的存储,而使用其他更加轻便的存储系统,本文使用minio作为statebackend的存储目录,环境全部使用docker构建。项目完成:

1.flink使用docker搭建,代码完成从kafka中消费,同时写入kafka,测试checkpoint是否能写入minio。

2.保存savepoint,同时使用savepoint,查看是否能重放消费kafka数据。

官网:

Flink’s checkpointing mechanism interacts with durable storage for streams and state. In general, it requires:

A persistent (or durable) data source that can replay records for a certain amount of time. Examples for such sources are persistent messages queues (e.g., Apache Kafka, RabbitMQ, Amazon Kinesis, Google PubSub) or file systems (e.g., HDFS, S3, GFS, NFS, Ceph, …).
A persistent storage for state, typically a distributed filesystem (e.g., HDFS, S3, GFS, NFS, Ceph, …)

minio介绍

轻量级的对象存储服务,兼容Amazon’ S3,简单理解相当于本地的S3存储服务。

关于存储的技术选型参考:https://blog.csdn.net/lily_214/article/details/106606729

环境搭建

version: '3.1'
services:
# kafka管理工具
  km:
    image: km
    container_name: km
    environment:
      - ZK_HOSTS=${ip}:2181/kafka
    ports:
      - "8088:9000"
    volumes:
      - /etc/hosts:/etc/hosts
    restart: always
# kafka
  #------3.4.14 无法将zk文件持久化到本地,所以zk容器不能删除--------
  zookeeper:
    image: wurstmeister/zookeeper
    ports:
      - "2181:2181"
    restart: always

  # kakfa端口和隐射的端口不一致会出现异常,导致broker无法连接
  kafka:
    image: wurstmeister/kafka:2.12-2.3.1
    ports:
      - "9092:9092"
    environment:
      - TZ=Asia/Shanghai
      - KAFKA_BROKER_ID=0
      - KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181/kafka
      - KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://${ip}:9092
      - KAFKA_LISTENERS=PLAINTEXT://:9092
      - KAFKA_AUTO_CREATE_TOPICS_ENABLE=true
    volumes:
      - /etc/hosts:/etc/hosts
      - /var/run/docker.sock:/var/run/docker.sock
      - ./kafka/data:/kafka
      - ./kafka/log:/opt/kafka/logs
    restart: always
  # flink
  jobmanager:
    image: registry.cn-hangzhou.aliyuncs.com/binlin/flink:1.9.2-scala_2.12
    expose:
      - "6123"
    ports:
      - "8081:8081"
    command: jobmanager
    environment:
      - TZ=Asia/Shanghai
      - JOB_MANAGER_RPC_ADDRESS=jobmanager
    volumes:
      - /etc/hosts:/etc/hosts
      # 容器是flink用户,挂载到本地会有权限问题,如果出现权限问题chmod对应修改即可
      - ./flink/conf:/opt/flink/conf
      - ./flink/docker-entrypoint.sh:/docker-entrypoint.sh

  taskmanager:
    image: registry.cn-hangzhou.aliyuncs.com/binlin/flink:1.9.2-scala_2.12
    expose:
      - "6121"
      - "6122"
    depends_on:
      - jobmanager
    command: taskmanager
    links:
      - "jobmanager:jobmanager"
    environment:
      - TZ=Asia/Shanghai
      - JOB_MANAGER_RPC_ADDRESS=jobmanager
    volumes:
      - /etc/hosts:/etc/hosts
      - ./flink/conf:/opt/flink/conf
      - ./flink/docker-entrypoint.sh:/docker-entrypoint.sh
 # minio 兼容s3的存储 ,密码必须大于等于8位
  minio:
    image: minio/minio:latest
    entrypoint: sh
    environment:
      - MINIO_ACCESS_KEY=root
      - MINIO_SECRET_KEY=hellowin(☄⊙ω⊙)☄彩蛋
    expose:
      - "9000"
    ports:
      - "9000:9000"
    volumes:
      - ./minio:/data
    command: -c '/usr/bin/minio server /data'

配置flink-conf.yaml:

state.backend: filesystem (or rocksdb)
state.checkpoints.dir: s3://state/checkpoint
s3.endpoint: http://${ip}:9000
s3.path.style.access: true
s3.access-key: root
s3.secret-key: 12345678

flink代码摘要

public class S3CheckpointKakfa {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.enableCheckpointing(15000, CheckpointingMode.EXACTLY_ONCE);

        env.setRestartStrategy(RestartStrategies.noRestart());

        CheckpointConfig checkpointConfig = env.getCheckpointConfig();
        checkpointConfig.setMaxConcurrentCheckpoints(3);
        checkpointConfig.setMinPauseBetweenCheckpoints(3000);

        checkpointConfig.enableExternalizedCheckpoints(CheckpointConfig.ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION);

        FlinkKafkaConsumer<String> consumer = new FlinkKafkaConsumer<String>("mytest"
                , new SimpleStringSchema(Charset.defaultCharset())
                , consumerConfig());

        SingleOutputStreamOperator<String> source = env.addSource(consumer).uid("111").setParallelism(2).filter(new FilterFunction<String>() {
            @Override
            public boolean filter(String value) throws Exception {
                return !StringUtils.isNullOrWhitespaceOnly(value);
            }
        }).setParallelism(1);

        source.addSink(new FlinkKafkaProducer<String>("target", new KafkaSerializationSchema<String>() {
            @Override
            public ProducerRecord<byte[], byte[]> serialize(String element, @Nullable Long timestamp) {
                return new ProducerRecord<>("target", element.getBytes());
            }
        }, producerConfig(), FlinkKafkaProducer.Semantic.EXACTLY_ONCE, 3)).uid("222").setParallelism(3);

        env.execute("s3 test");
    }
}

执行

打包 拷贝至容器内部,执行:

docker-compose exec jobmanager bin/flink run  -c kafka.S3CheckpointKakfa flink-java-1.0.jar

结果

checkpoint创建正常,savepoint正常

保存savepoint

docker-compose exec jobmanager bin/flink savepoint 2beed3f30424b5203872a23204589cc9 s3://state/savepoint-1

通过savepoint重启程序,kafka也能回放offset消费。

 

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答1: Flink standalone集群搭建步骤如下: 1. 下载Flink安装包并解压缩到指定目录。 2. 配置Flink集群的masters和workers节点,可以在conf目录下的masters和workers文件中进行配置。 3. 启动Flink集群的masters节点,可以使用bin/start-cluster.sh命令启动。 4. 启动Flink集群的workers节点,可以使用bin/taskmanager.sh start命令启动。 5. 验证Flink集群是否正常运行,可以使用bin/flink list命令查看当前运行的Flink作业。 6. 在Flink集群中提交作业,可以使用bin/flink run命令提交作业。 7. 监控Flink集群的运行状态,可以使用Flink的Web UI或者JMX监控工具进行监控。 以上就是Flink standalone集群搭建的基本步骤,希望对您有所帮助。 ### 回答2: Apache Flink是一个处理流和批量数据的通用分布式计算引擎,可在大规模数据集上快速实现低延迟和高吞吐量。Flink提供了一个Standalone集群模式,使开发人员可以在自己的本地机器上测试和验证他们的应用程序,而无需构建一个完整的分布式环境。在本文中,我们将介绍如何搭建一个Flink Standalone集群。 1. 确保你的环境满足Flink的要求,比如安装Java环境等。 2. 下载Flink二进制文件。从Flink官网下载最新的tar文件,然后解压到一个目录下。 3. 配置Flink。打开conf/flink-conf.yaml文件,配置Flink的参数,比如jobmanager.rpc.address(JobManager监听的主机地址),taskmanager.numberOfTaskSlots(每个TaskManager能够执行的任务数)等。 4. 启动JobManager。在Flink的bin目录下执行以下命令: ./start-cluster.sh 这将启动JobManager和TaskManager进程。 5. 访问Flink Web Dashboard。在浏览器中输入http://localhost:8081,可以访问Flink Web Dashboard。这里可以查看集群的状态、运行中的任务、日志等。 6. 启动应用程序。使用Flink提供的运行脚本(bin/flink run)来提交应用程序。 7. 观察应用程序的运行状态。可以在Flink Web Dashboard中查看应用程序的运行状态和日志,还可以监控各种指标,如吞吐量、延迟、资源使用情况等。 8. 停止集群。在bin目录下执行以下命令: ./stop-cluster.sh 这将停止JobManager和TaskManager进程。 总之,通过Flink Standalone集群,您可以在本地机器上测试和验证您的应用程序,并且几乎没有任何成本。值得注意的是,Standalone集群并不适合生产环境,但当您需要在本地机器上调试应用程序时,它是一个很好的选择。 ### 回答3: Apache Flink是一个开源的分布式流处理系统。它以高效、可伸缩和容错为设计目标,因此广泛应用于大数据领域。Flink可以运行在各种集群上,包括Hadoop YARN和Apache Mesos等。在本文中,我们将讨论如何在Flink standalone集群上搭建分布式流处理系统。 Flink standalone集群搭建的准备工作: 在搭建Flink standalone集群之前,需要确保已经完成以下准备工作: 1. 安装Java 8或更高版本。 2. 下载Flink发行版,并解压缩至安装目录。 Flink standalone集群搭建的步骤: 1. 在主节点上启动Flink集群管理器。在Flink所在目录下,输入以下命令: ./bin/start-cluster.sh 2. 查看集群状态。在Flink所在目录下,输入以下命令: ./bin/flink list 如果输出结果为空,则说明集群状态正常。 3. 在从节点上启动TaskManager。在从节点所在机器上,输入以下命令: ./bin/taskmanager.sh start 4. 查看TaskManager状态。在从节点所在机器上,输入以下命令: ./bin/taskmanager.sh status 如果输出结果为“正常运行”,则说明TaskManager已经成功启动。 5. 提交Flink作业。在Flink所在目录下,输入以下命令: ./bin/flink run ./examples/streaming/SocketWindowWordCount.jar --port 9000 其中,SocketWindowWordCount.jar是一个简单的Flink作业,用于计算流式数据的词频统计。 6. 监控作业运行情况。在浏览器中输入以下地址: http://localhost:8081 可以查看作业的运行状态、性能指标等信息。 总结: 通过以上步骤,我们已经成功搭建了Flink standalone集群,并提交了一个简单的流处理作业。需要注意的是,本文仅提供了基础的搭建步骤,实际生产环境中还需要进行更加细致的配置和管理。同时,Flink具有丰富的API和生态系统,可以灵活应对不同的数据处理场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值