本文是为基于Flink的商品推荐系统所搭建的Docker环境,目的为了方便体验项目,一键部署项目需要的所有环境,并预填充所需要的数据。完整的环境包括Zookeeper 、Kafka 、 Hbase 、 Mysql 、 Redis 、 Flink 。
环境介绍:
- zookeeper 3.4.5
- kafka 2.12-2.2.1
- hbase 1.5.0
- mysql 8.0.18
- redis
- flink 1.9.0
整个项目的部署和工作环境如上图所示。由于 kafka 和 hbase 均需要 zookeeper 的支持,所以没有使用集成式的 hbase docker镜像,所以笔者自己基于 hbase 1.5.0 制作了一版镜像,由于 hbase 的 standlone模式端口会随机生成,故也搭建成了伪分布式,HMaster 和 HRegionserver均在同一个 Docker Container 中。 在Kafka容器中,配置了对内对外两个地址,这是为了方便远程的队列消费,以及在容器内自动生产消息。
搭建步骤:
1. 拉取镜像并启动
首先请下载 目录 内的所有文件,因为mysql和hbase需要插入数据,kafka需要启动一个shell脚本自动的模拟用户点击行为。对应的请修改docker-compose.yml文件中对应的文件地址为自己所保存的地址。
首先请保证已经成功安装了docker和docker-compose,其次请将docker-compose.yml文件中的 hbase 的 hostname
修改为自己的主机名。
最后通过docker-compose启动所有容器:
1 | [root@docker-linux recommend]# docker-compose up -d |
2. 给 Mysql / Redis 填充数据,给 Hbase 创建表结构
进入mysql container, 连接mysql
1 | [root@docker-linux recommend]# docker exec -ti mysql bash |
通过提前制作好的sql文件填充mysql
1 | source /opt/contact.sql |
之后是构建 hbase 表结构
1 | [root@docker-linux recommend]# docker exec -ti hbase bash |
通过 list 命令可以看到我们创建的表都已成功
1 | hbase(main):001:0> list |
最后进入redis,创建10个热度数据
1 | [root@docker-linux recommend]# docker exec -ti redis bash |
启动客户端后,之后按照如下格式创建 set 0 123之类的创建从0-9的10条数据即可,最后一位为商品id,在0-999内任意取值。
3. 启动 Kafka 消息生成器
进入kafka容器并启动shell脚本即可,脚本会按照每秒一次的频率发送message到log这个topic里。
1 | [root@docker-linux recommend]# docker exec -ti kafka bash |
验证成功发送消息的方法是重新开一个连接进入kafka容器并启动Consumer,注意kafka内部端口号配置的是9093
1 | bash-4.4# $KAFKA_HOME/bin/kafka-console-consumer.sh --bootstrap-server kafka:9093 --topic log |
正确看到如下格式的消息即可
1 | 558,559,1574180802,1 |
执行任务:
我们这个项目一共有6个flink的任务,如果只是在本地测试的话,可以直接在IDEA中启动对应的任务即可,为了做实验,我们把项目打包并提交到 Docker 的 Flink 中,为了方便就不再把各种依赖单独放到集群中,而是直接打到任务的jar包中。正确的打包方法可以参考这篇博客
我们直接把打包好的jar包放到集群中,并拷贝到flink的docker中(jobmanager)
1 | [root@docker-linux pkg]# docker cp ./logtask.jar flink_jobmanager:/opt/ |
然后进入flink jobmanager的容器中,提交jar包到集群
1 | [root@docker-linux pkg]# docker exec -ti flink_jobmanager bash |
提交成功后可以在Flink WebUI观察我们提交的任务