使用Docker快速部署Flink分布式集群

本文涉及的产品
实时计算 Flink 版,1000CU*H 3个月
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
简介: 使用Docker快速部署Flink分布式集群

前言

大家是否记得自己是怎么开始学习大数据的内容呢,估计关注我得同学会发现前面有点陆续有点关于Docker的小烂文,是因为使用Docker可以最快的速度让我们拥有一个学习的环境。大数据的东西都逃不过搭建环境测试跑通这么一个过程,我自己也是过来人,尤其是刚刚接触比较新的东西的时候受制于当前的网络,当前的配置一系列的问题,导致大量从入门到放弃的情况非常多,今天我通过一些实际的例子,让大家感受一下这种便利性。

误区

首先一定要纠正一个误区,尤其是这种技术类型的,不是说需要掌握100%才去使用,但凡了解了一丢丢,你就应该去做了,很多人一上来就干到很深的底层原理,那样学习本身的成本就很高了,没必要。另外一方面来说试错这个事情本身就是学习的过程。更重要的一点,一定是你自己亲自动手跑通的才算,因为参考学习视频学的时候,你发现老师操作的时候异常顺利,因为有些问题老师处理过了,有的问题在老师的环境上面就没有。

目标

我这里是两个小案例,通过这种案例让大家感受到docker作为工具给我们带来便利,一是自己编写的java使用docker跑通,第二个是使用docker快速获得flink的环境。 前提,大家机器里面有docker环境,注意了docker环境在mac和windows都是有图形安装的,所以和安装QQ这种完全是一样的,官网在这里,点击,下载安装包安装就行,不用很复杂的配置。我知道这里面在很多教学资料告诉怎么去linux上面安装,那是深入学习的时候才会到linux上面去,这个地方千万别花太多时间折腾了。

跑通一个自己的Java程序

首先当然是构建一个maven工程,大家养成习惯为了让后面的人工作顺利进行,前面的工作做好,我这里提前准备一下maven仓库的配置,内容如下

cat /Users/zhuxuemin/.m2/settings_aliyun.xml

这里面关键的内容其实是阿里云仓库配置,这样后面会顺利一些

<mirror>
            <id>alimaven</id>
            <name>aliyun maven</name>
            <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
            <mirrorOf>central</mirrorOf>
</mirror>

构建工程了,我是比较喜欢先命令行构建出来,再导入idea,所以下面的命令顺利会和前面工作有关系

mvn --settings /Users/zhuxuemin/.m2/settings_aliyun.xml archetype:generate -DgroupId=net.blog.csdn -DartifactId=docker-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

构建出来导入idea,就是一个简单的maven工程,帮我们输出一下。

![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/direct/ef0af76c7bc144eca352d18f5112208b.png

在根目录下面新建Dockerfile文件,里面放入内容,如下:

FROM williamyeh/java8
COPY target/docker-app-1.0-SNAPSHOT.jar /usr/local/docker-app-1.0-SNAPSHOT.jar
CMD ["java", "-cp", "/usr/local/docker-app-1.0-SNAPSHOT.jar","net.blog.csdn.App"]

构建镜像

docker build . -t docker-java-app

显示如下:

Sending build context to Docker daemon  38.91kB
Step 1/3 : FROM williamyeh/java8
 ---> 00bc163fa009
Step 2/3 : COPY target/docker-app-1.0-SNAPSHOT.jar /usr/local/docker-app-1.0-SNAPSHOT.jar
 ---> 4738e15804e9
Step 3/3 : CMD ["java", "-jar", "/usr/local/docker-app-1.0-SNAPSHOT.jar"]
 ---> Running in d9a68086b6ce
Removing intermediate container d9a68086b6ce
 ---> 519ece8e6b16
Successfully built 519ece8e6b16
Successfully tagged docker-java-app:latest

运行如下,至此我们的程序顺利在docker环境下面运行了

docker run docker-java-app
Hello World!

接下来,学会学习,如果就是这样子copy过去,十有八九干不成功,事实上这个套路百度是可以搜索到的。现在都是大模型交互的方式,所以大家要学会去问了。

好了,这里面情况就是,下面myjavaapp还好理解,大家改成自己的工程名字就行,需要说明的情况是from这个命令

FROM openjdk:8-jdk-alpine

这里是这样的,我们运行java不是要一个java环境嘛,这里面按照docker的术语来说就是基于之前的镜像去走叠加,相当于他有一个床架子,我们可以往上面加我们喜欢的被子,这里面就是要看自己的仓库有哪些基础环境

docker search jdk

结果如下,这里面可以看到一堆相关的,选择一个就行,细心的同学可以看到,并没有我上面代码上面使用到的williamyeh/java8,这个是因为我之前使用的时候有,然后在本机已经有了,所以说这个镜像其实是会变化的,大家需要灵活调整。

NAME                                  DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
java                                  DEPRECATED; use "openjdk" (or other JDK impl…   2002      [OK]       
bellsoft/liberica-runtime-container   Alpaquita based image for Liberica JDK and J…   17                   
eclipse/ubuntu_jdk8                   Ubuntu, JDK8, Maven 3, git, curl, nmap, mc, …   17                   [OK]
jdkato/vale                           The official Docker image for Vale.             10                   
eclipse/centos_jdk8                   CentOS, JDK8, Maven 3, git, curl, nmap, mc, …   5                    [OK]
dockette/jdk8                         My Oracle Java 8 Dockerfile                     5                    [OK]
jdkelley/simple-http-server                                                           1                    
eucm/maven                            Maven 3.3.9 with Java jdk 8 Docker image rep…   1                    [OK]
eclipse/ubuntu_jdk8_x11               Based on Ubuntu 14, JDK 8, Maven 3.3.9, x11 …   1                    [OK]
sismics/debian-java                   Debian Jessy + Oracle JDK                       1                    
eclipse/debian_jdk8                   Debian, JDK8, Maven 3, git, curl, nmap, mc, …   1                    [OK]
eclipse/debian_jdk8_node              Node (+ Angular stuff) + JDK8. Debian based     1                    [OK]
eclipse/alpine_jdk8                   Based on Alpine 3.3. JDK 1.8, Maven 3.3.9, T…   1                    [OK]
eclipse/ubuntu_wildfly8               Ubuntu 14.04, JDK 1.8, Maven 3.3.9, Wildfly 8   0                    [OK]
eclipse/hadoop-dev                    Ubuntu 14.04, Maven 3.3.9, JDK8, Tomcat 8       0                    [OK]
clarinpl/java                         Ubuntu with java ( jdk-8u161)                   0                    
eclipse/ubuntu_gradle                 Ubuntu, JDK1.8, Gradle2.3                       0                    [OK]
bellsoft/buildpacks.liberica          A Cloud Native Buildpack for Alpaquita Linux…   0                    
jdk1/php-redis-modified                                                               0                    
vespaengine/vespa-pipeline            Docker image with supported versions of Mave…   0           

快速上手flink环境

这个就比较有意思了,相信很多人想玩大数据的东西,第一时间是想找个地方爽一把先,但是往往搭建环境这个事情上怀疑人生,上网搜索吧,乱七八糟的讲啥都有。文档在这里,点我

其实官网就是给了2+N动作,首先就是设置一个配置参数,因为后面需要不断使用这个参数,再构建一个网络,可以理解后面的节点要相互通信,就都使用同一个网络就好了。

FLINK_PROPERTIES="jobmanager.rpc.address: jobmanager"
docker network create flink-network

第二步,来个主节点

docker run \
    --rm \
    --name=jobmanager \
    --network flink-network \
    --publish 8081:8081 \
    --env FLINK_PROPERTIES="${FLINK_PROPERTIES}" \
    flink:1.18.1-scala_2.12 jobmanager

其实这个时候已经可以在浏览器输入 http://localhost:8081,访问到了,不过玩多了大数据的人都知道,这种时候管的是主备,不能光这个。

下面就是启动从节点了:

docker run \
    --rm \
    --name=taskmanager \
    --network flink-network \
    --env FLINK_PROPERTIES="${FLINK_PROPERTIES}" \
    flink:1.18.1-scala_2.12 taskmanager

不过有个问题发现启动主节点的时候那个控制台一直没有退出,卡着,从节点这里好像没有办法去写命令,这里可以开一个新窗口去搞,没问题。

当然一模一样抄过来代码也显得我这种博客其实是废物,还不如直接去官网抄就好。当然,只有实际动手的同学才会对下面的内容感兴趣,所以我们对节点启动命令调整一下,首先是启动节点,我们希望在后台运行就可以了。

–rm 其实是说退出后可以把容器都销毁的意思,主打一个绿色环保,我们调整成 -d ,deamon 的意思。

主节点启动命令:

docker run \
    -d \
    --name=jobmanager \
    --network flink-network \
    --publish 8081:8081 \
    --env FLINK_PROPERTIES="${FLINK_PROPERTIES}" \
    flink:1.18.1-scala_2.12 jobmanager

对应从节点, 相应改造即可,这个从节点,执行一次便会启动一个从节点,所以可以执行多次,但是如果每次执行的话taskmanager作为容器名字不能重复,不方便,所以我改了两个地方,一个是 调整为-d模式,后台执行

第二个是去掉指定容器名称的操作

docker run \
  -d \
    --network flink-network \
    --env FLINK_PROPERTIES="${FLINK_PROPERTIES}" \
    flink:1.18.1-scala_2.12 taskmanager

每次运行一次,都可以在Task managers的地方多新增节点,这便是分布式部署的样子啦。

这其实就结束了。

跑起来

flink其实是有很多开发好的应用的,不过在容器的环境,我们怎么跑起来,首先找到我们运行的容器,随便哪个都行

docker ps
CONTAINER ID   IMAGE                             COMMAND                  CREATED             STATUS             PORTS                              NAMES
26d17915e2dd   flink:1.18.1-scala_2.12           "/docker-entrypoint.…"   24 minutes ago      Up 24 minutes      6123/tcp, 8081/tcp                 magical_carson
a244103c431b   flink:1.18.1-scala_2.12           "/docker-entrypoint.…"   24 minutes ago      Up 24 minutes      6123/tcp, 8081/tcp                 sharp_mestorf
926ecf993f0f   flink:1.18.1-scala_2.12           "/docker-entrypoint.…"   24 minutes ago      Up 24 minutes      6123/tcp, 8081/tcp                 epic_hofstadter
cc868476ee11   flink:1.18.1-scala_2.12           "/docker-entrypoint.…"   28 minutes ago      Up 28 minutes      6123/tcp, 8081/tcp                 taskmanager
cd422928babc   flink:1.18.1-scala_2.12           "/docker-entrypoint.…"   About an hour ago   Up About an hour   6123/tcp, 0.0.0.0:8081->8081/tcp   jobmanager

docker容器是支持写一部分id就可以匹配,我们从容器上把jar可以copy到本机

docker cp 26d1:/opt/flink/examples/streaming/WordCount.jar .

然后在页面上上次jar即可

然后就跑起来了。

总结

本文其实是介绍了最长见的两种使用docker的场景,一个是自己开发的程序如何用docker跑起来,第二是使用现成的容器更快速让我们入门。这两种方式在以后会经常碰到。

相关实践学习
基于Hologres+Flink搭建GitHub实时数据大屏
通过使用Flink、Hologres构建实时数仓,并通过Hologres对接BI分析工具(以DataV为例),实现海量数据实时分析.
实时计算 Flink 实战课程
如何使用实时计算 Flink 搞定数据处理难题?实时计算 Flink 极客训练营产品、技术专家齐上阵,从开源 Flink功能介绍到实时计算 Flink 优势详解,现场实操,5天即可上手! 欢迎开通实时计算 Flink 版: https://cn.aliyun.com/product/bigdata/sc Flink Forward Asia 介绍: Flink Forward 是由 Apache 官方授权,Apache Flink Community China 支持的会议,通过参会不仅可以了解到 Flink 社区的最新动态和发展计划,还可以了解到国内外一线大厂围绕 Flink 生态的生产实践经验,是 Flink 开发者和使用者不可错过的盛会。 去年经过品牌升级后的 Flink Forward Asia 吸引了超过2000人线下参与,一举成为国内最大的 Apache 顶级项目会议。结合2020年的特殊情况,Flink Forward Asia 2020 将在12月26日以线上峰会的形式与大家见面。
目录
相关文章
|
2月前
|
存储 负载均衡 NoSQL
【赵渝强老师】Redis Cluster分布式集群
Redis Cluster是Redis的分布式存储解决方案,通过哈希槽(slot)实现数据分片,支持水平扩展,具备高可用性和负载均衡能力,适用于大规模数据场景。
204 2
|
5月前
|
消息中间件 运维 Kafka
直播预告|Kafka+Flink双引擎实战:手把手带你搭建分布式实时分析平台!
在数字化转型中,企业亟需从海量数据中快速提取价值并转化为业务增长动力。5月15日19:00-21:00,阿里云三位技术专家将讲解Kafka与Flink的强强联合方案,帮助企业零门槛构建分布式实时分析平台。此组合广泛应用于实时风控、用户行为追踪等场景,具备高吞吐、弹性扩缩容及亚秒级响应优势。直播适合初学者、开发者和数据工程师,参与还有机会领取定制好礼!扫描海报二维码或点击链接预约直播:[https://developer.aliyun.com/live/255088](https://developer.aliyun.com/live/255088)
352 35
直播预告|Kafka+Flink双引擎实战:手把手带你搭建分布式实时分析平台!
|
5月前
|
消息中间件 运维 Kafka
直播预告|Kafka+Flink 双引擎实战:手把手带你搭建分布式实时分析平台!
直播预告|Kafka+Flink 双引擎实战:手把手带你搭建分布式实时分析平台!
177 11
|
7月前
|
Cloud Native 关系型数据库 分布式数据库
登顶TPC-C|云原生数据库PolarDB技术揭秘:Limitless集群和分布式扩展篇
阿里云PolarDB云原生数据库在TPC-C基准测试中以20.55亿tpmC的成绩刷新世界纪录,展现卓越性能与性价比。其轻量版满足国产化需求,兼具高性能与低成本,适用于多种场景,推动数据库技术革新与发展。
|
6月前
|
Cloud Native 关系型数据库 分布式数据库
登顶TPC-C|云原生数据库PolarDB技术揭秘:Limitless集群和分布式扩展篇
云原生数据库PolarDB技术揭秘:Limitless集群和分布式扩展篇
|
7月前
|
并行计算 PyTorch 算法框架/工具
融合AMD与NVIDIA GPU集群的MLOps:异构计算环境中的分布式训练架构实践
本文探讨了如何通过技术手段混合使用AMD与NVIDIA GPU集群以支持PyTorch分布式训练。面对CUDA与ROCm框架互操作性不足的问题,文章提出利用UCC和UCX等统一通信框架实现高效数据传输,并在异构Kubernetes集群中部署任务。通过解决轻度与强度异构环境下的挑战,如计算能力不平衡、内存容量差异及通信性能优化,文章展示了如何无需重构代码即可充分利用异构硬件资源。尽管存在RDMA验证不足、通信性能次优等局限性,但该方案为最大化GPU资源利用率、降低供应商锁定提供了可行路径。源代码已公开,供读者参考实践。
494 3
融合AMD与NVIDIA GPU集群的MLOps:异构计算环境中的分布式训练架构实践
zdl
|
11月前
|
消息中间件 运维 大数据
大数据实时计算产品的对比测评:实时计算Flink版 VS 自建Flink集群
本文介绍了实时计算Flink版与自建Flink集群的对比,涵盖部署成本、性能表现、易用性和企业级能力等方面。实时计算Flink版作为全托管服务,显著降低了运维成本,提供了强大的集成能力和弹性扩展,特别适合中小型团队和业务波动大的场景。文中还提出了改进建议,并探讨了与其他产品的联动可能性。总结指出,实时计算Flink版在简化运维、降低成本和提升易用性方面表现出色,是大数据实时计算的优选方案。
zdl
435 56
|
10月前
|
存储 SpringCloudAlibaba Java
【SpringCloud Alibaba系列】一文全面解析Zookeeper安装、常用命令、JavaAPI操作、Watch事件监听、分布式锁、集群搭建、核心理论
一文全面解析Zookeeper安装、常用命令、JavaAPI操作、Watch事件监听、分布式锁、集群搭建、核心理论。
【SpringCloud Alibaba系列】一文全面解析Zookeeper安装、常用命令、JavaAPI操作、Watch事件监听、分布式锁、集群搭建、核心理论
|
2月前
|
存储 缓存 NoSQL
【📕分布式锁通关指南 12】源码剖析redisson如何利用Redis数据结构实现Semaphore和CountDownLatch
本文解析 Redisson 如何通过 Redis 实现分布式信号量(RSemaphore)与倒数闩(RCountDownLatch),利用 Lua 脚本与原子操作保障分布式环境下的同步控制,帮助开发者更好地理解其原理与应用。
109 0
|
3月前
|
存储 缓存 NoSQL
Redis核心数据结构与分布式锁实现详解
Redis 是高性能键值数据库,支持多种数据结构,如字符串、列表、集合、哈希、有序集合等,广泛用于缓存、消息队列和实时数据处理。本文详解其核心数据结构及分布式锁实现,帮助开发者提升系统性能与并发控制能力。

热门文章

最新文章