通过 docker-compose 快速部署 Flink 保姆级教程

一、概述

Apache Flink 是一个开源的流处理框架,用于处理和分析实时数据流 。它支持事件驱动的应用和复杂的事件处理(CEP),并且可以处理批处理任务。Flink 提供了高吞吐量、低延迟以及强大的状态管理和容错能力。它可以在各种环境中运行,包括本地集群、云环境和容器化环境(如 Docker 和 Kubernetes)。

Flink 的一些关键特性包括:

  • 高吞吐量和低延迟:Flink 能够处理大规模的数据流,同时保持毫秒级的处理延迟。

  • 状态管理和容错:Flink 提供了强大的状态管理功能,允许在发生故障时从检查点或保存点恢复作业。

  • 事件时间处理:Flink 支持基于事件时间的数据处理,可以处理乱序事件和长时间运行的计算。

  • CEP(复杂事件处理):Flink 可以识别和处理复杂的事件模式,这对于监控和警报等应用非常有用。

  • 批流一体Flink 统一了批处理和流处理,使得开发人员可以使用相同的 API 来编写批处理和流处理作业。

  • 可伸缩性Flink 可以在小型集群到大型集群中运行,支持水平伸缩以适应不同的负载需求。

  • 生态系统:Flink 拥有丰富的连接器和库,可以与各种数据源和数据存储系统集成。

  • 多语言支持 :Flink 提供了 Java 和 Scala API ,并且通过 DataStream API 支持 Python 和其他语言的集成。

Flink 适用于需要实时数据分析的场景,如金融市场监控、网络安全、物联网数据处理等。它的设计目标是提供一个易于使用、灵活且高性能的数据处理平台。

二、部署 hadoop 集群

容器部署 hadoop 环境可以参考我这篇文章:通过 docker-compose 快速部署 Hadoop 集群极简教程

bash 复制代码
# 拉取部署包
git clone https://gitee.com/hadoop-bigdata/docker-compose-hadoop.git

cd docker-compose-hadoop/hadoop

# 开始部署
# 这里-f docker-compose.yaml可以省略,如果文件名不是docker-compose.yaml就不能省略,-d 后台执行
docker-compose -f docker-compose.yaml up -d

# 查看部署状态
docker-compose -f docker-compose.yaml ps

在 Docker 中部署 Apache Flink 集群是一种流行的实践,因为它简化了环境的配置和管理工作。以下是关于使用 Docker 部署 Flink 的详细步骤和配置选项:

官方文档:nightlies.apache.org/flink/flink...

1)部署 docker

bash 复制代码
# 安装yum-config-manager配置工具
yum -y install yum-utils

# 建议使用阿里云yum源:(推荐)
#yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 安装docker-ce版本
yum install -y docker-ce
# 启动并开机启动
systemctl enable --now docker
docker --version

2)部署 docker-compose

bash 复制代码
curl -SL https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose

chmod +x /usr/bin/docker-compose
docker-compose --version

4)构建镜像

bash 复制代码
FROM flink:1.17.2
RUN rm -f /etc/localtime && ln -sv /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone

RUN export LANG=zh_CN.UTF-8

# 创建用户和用户组,跟yaml编排里的user: 10000:10000
RUN groupadd --system --gid=10000 hadoop && useradd --system --home-dir /home/hadoop --uid=10000 --gid=hadoop hadoop -m

# 给hadoop添加sudo权限
RUN echo "hadoop ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers

RUN mkdir /opt/apache

ADD hadoop-3.3.5.tar.gz  /opt/apache

RUN ln -s /opt/apache/hadoop-3.3.5 /opt/apache/hadoop

ENV HADOOP_HOME /opt/apache/hadoop
ENV PATH=$HADOOP_HOME/bin/:$PATH

RUN chown -R hadoop:hadoop /opt/

开始构建

bash 复制代码
# 需要查看构建镜像详细过程则需要加上 --progress=plain 选项
docker build -t registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/flink:1.17.2 . --no-cache --progress=plain

# 为了方便小伙伴下载即可使用,我这里将镜像文件推送到阿里云的镜像仓库
docker push registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/flink:1.17.2

### 参数解释
# -t:指定镜像名称
# . :当前目录Dockerfile
# -f:指定Dockerfile路径
#  --no-cache:不缓存

5)编排 docker-compose.yaml 部署

docker-compose.yml

bash 复制代码
version: '3'
services:
  jobmanager:
    image: registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/flink:1.17.2
    container_name: jobmanager
    hostname: jobmanager
    user: "hadoop:hadoop"
    ports:
      - "8081:8081"
    command: jobmanager
    volumes:
      - ./checkpoint:/opt/flink/checkpoint
      - ./savepoint:/opt/flink/savepoint
      - ./hadoop/etc/hadoop/core-site.xml:/opt/apache/hadoop/etc/hadoop/core-site.xml
      - ./hadoop/etc/hadoop/hdfs-site.xml:/opt/apache/hadoop/etc/hadoop/hdfs-site.xml
      - ./hadoop/etc/hadoop/yarn-site.yml:/opt/apache/hadoop/etc/hadoop/yarn-site.yml
    environment:
      - TZ=Asia/Shanghai
      - |
        FLINK_PROPERTIES=
        jobmanager.rpc.address: jobmanager
    networks:
      - hadoop_hadoop_network

  taskmanager:
    image: registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/flink:1.17.2
    user: "hadoop:hadoop"
    depends_on:
      - jobmanager
    command: taskmanager
    volumes:
      - ./checkpoint:/opt/flink/checkpoint
      - ./savepoint:/opt/flink/savepoint
      - ./hadoop/etc/hadoop/core-site.xml:/opt/apache/hadoop/etc/hadoop/core-site.xml
      - ./hadoop/etc/hadoop/hdfs-site.xml:/opt/apache/hadoop/etc/hadoop/hdfs-site.xml
      - ./hadoop/etc/hadoop/yarn-site.yml:/opt/apache/hadoop/etc/hadoop/yarn-site.yml
    environment:
      - TZ=Asia/Shanghai
      - |
        FLINK_PROPERTIES=
        jobmanager.rpc.address: jobmanager
        taskmanager.numberOfTaskSlots: 3
    networks:
      - hadoop_hadoop_network

# 连接外部网络
networks:
  hadoop_hadoop_network:
    external: true

可以使用 docker-compose scale 命令来调整 Flink TaskManager 服务的示例:

bash 复制代码
docker-compose scale taskmanager=3

6)测试验证

bash 复制代码
# 登录 hdfs 节点创建flink 目录
hdfs dfs -mkdir /flink
hdfs dfs -chmod 777 /flink

# 登录 flink 容器
docker exec -it docker-compose-flink_jobmanager_1_4495d6e63aa7 bash

# LICENSE 这个文件,读写HDFS文件
hadoop fs -mkdir /flink/
hadoop fs -put /opt/apache/hadoop/NOTICE.txt /flink/
hadoop fs -ls  /flink/NOTICE.txt

### 1、提交到flink集群
flink run -m localhost:8081 ./examples/batch/WordCount.jar -input hdfs://hadoop-hdfs-nn:9000/flink/NOTICE.txt -output hdfs://hadoop-hdfs-nn:9000/flink/wordcount-result

### 2、提交任务到YARN 集群
# 1、yarn-session.sh 模式
# Yarn-session模式下,首先向Yarn提交一个长时运行的空应用,运行起来之后,任务跑完集群也不释放,可以重复使用在Yarn上开启的Flink集群,也称为共享型集群,适合小任务。
yarn-session.sh -n 2 -jm 1024 -tm 1024 -d
flink run ./examples/batch/WordCount.jar -input hdfs://hadoop-hdfs-nn:9000/flink/NOTICE.txt -output hdfs://hadoop-hdfs-nn:9000/flink/wordcount-result2

# 2、Yarn-cluster模式下
# 每个任务单独在Yarn上启动一套Flink集群,适合大任务,运行完后结束,集群释放,资源释放,再有任务,会再起新的Flink集群,需要频繁的在Yanr上开启Flink集群,集群相互独立,适合大任务。
flink run -m yarn-cluster -yd -yjm 1024m -ytm 1024m -ynm WordCountJob -p 10 -ys 4 ./examples/batch/WordCount.jar --input hdfs://hadoop-hdfs-nn:9000/flink/NOTICE.txt --output hdfs://hadoop-hdfs-nn:9000/flink/wordcount-result3

# 3、Application模式
# Application模式原本需要客户端做的三件事被转移到了JobManager里,也就是说main()方法在集群中执行(入口点位于ApplicationClusterEntryPoint),Deployer只需要负责发起部署请求了。另外,如果一个main()方法中有多个env.execute()/executeAsync()调用,在Application模式下,这些作业会被视为属于同一个应用,在同一个集群中执行(如果在Per-Job模式下,就会启动多个集群)。可见,Application模式本质上是Session和Per-Job模式的折衷。
./bin/flink run-application -t yarn-application \
-Djobmanager.memory.process.size=2048m \
-Dtaskmanager.memory.process.size=4096m \
-Dtaskmanager.numberOfTaskSlots=2 \
-Dparallelism.default=10 \
-Dyarn.application.name="MyFlinkApp" \
./examples/batch/WordCount.jar

# 查看任务列表
flink list -m localhost:8081

# 取消任务
# ./bin/flink cancel <job-id>
flink cancel -m localhost:8081 21b729b27dafc971ac8daba85622d2af

# 查看YARN 上的flink任务
# flink list -m yarn-cluster -yid <applicatio_id>
flink list -m yarn-cluster -yid application_1712987032680_0003

往期推荐:

通过 docker-compose 快速部署 Flink 保姆级教程就先到这里了,有任何疑问也可关注我公众号:大数据与云原生技术分享,进行技术交流,如本篇文章对您有所帮助,麻烦帮忙一键三连(点赞、转发、收藏)~

相关推荐
tcoding1 天前
《基于Apache Flink的流处理》笔记
笔记·flink·apache
linmoo19861 天前
Flink 系列之二十二 - 高级概念 - 保存点
大数据·flink·savepoint·保存点
Doker 多克2 天前
Flink CDC —部署模式
大数据·flink
酷爱码2 天前
Spring Boot 整合 Apache Flink 的详细过程
spring boot·flink·apache
问道飞鱼2 天前
Flink 高可用集群部署指南
flink·部署·批处理·流式批处理
渣渣盟3 天前
基于Scala实现Flink的三种基本时间窗口操作
开发语言·flink·scala
网安INF3 天前
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
java·web安全·网络安全·flink·漏洞
一叶知秋哈3 天前
Java应用Flink CDC监听MySQL数据变动内容输出到控制台
java·mysql·flink
代码匠心3 天前
从零开始学Flink:揭开实时计算的神秘面纱
java·大数据·后端·flink