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

相关推荐
小屁孩大帅-杨一凡40 分钟前
Flink 简介和简单的demo
大数据·flink
天冬忘忧1 小时前
Flink调优----反压处理
大数据·flink
老周聊架构2 小时前
聊聊Flink:Flink的状态管理
大数据·flink
ssxueyi21 小时前
如何查看flink错误信息
大数据·flink
core5121 天前
flink SQL实现mysql source sink
mysql·flink·jdbc·source·cdc·sink·mysql-cdc
天冬忘忧1 天前
Flink调优----资源配置调优与状态及Checkpoint调优
大数据·flink
Ekine2 天前
【Flink-scala】DataStream编程模型之状态编程
大数据·flink·scala
别这么骄傲4 天前
使用Flinkcdc 采集mysql数据
大数据·数据库·flink
core5124 天前
flink实现复杂kafka数据读取
大数据·flink·kafka·cdc
xyz20114 天前
Flink State面试题和参考答案-(下)
flink·状态模式