本文是为基于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启动所有容器:
[root@docker-linux recommend]# docker-compose up -d
2. 给 Mysql / Redis 填充数据,给 Hbase 创建表结构
进入mysql container, 连接mysql
[root@docker-linux recommend]# docker exec -ti mysql bash
root@6fdc02332cd0:/# mysql -u root -p
通过提前制作好的sql文件填充mysql
mysql> source /opt/contact.sql
之后是构建 hbase 表结构
[root@docker-linux recommend]# docker exec -ti hbase bash
root@docker-linux:/opt/hbase# hbase shell /opt/hbase_ini.sql
通过 list 命令可以看到我们创建的表都已成功
hbase(main):001:0> list
TABLE ···
8 row(s) in 0.1390 seconds
=> ["con", "p_history", "prod", "ps", "px", "u_history", "u_interest", "user"]
最后进入redis,创建10个热度数据
[root@docker-linux recommend]# docker exec -ti redis bash
root@7735aff1391f:/bin# redis-cli
启动客户端后,之后按照如下格式创建 set 0 123之类的创建从0-9的10条数据即可,最后一位为商品id,在0-999内任意取值。
3. 启动 Kafka 消息生成器
进入kafka容器并启动shell脚本即可,脚本会按照每秒一次的频率发送message到log这个topic里。
[root@docker-linux recommend]# docker exec -ti kafka bash
bash-4.4# sh /opt/generator.sh -d
验证成功发送消息的方法是重新开一个连接进入kafka容器并启动Consumer,注意kafka内部端口号配置的是9093
bash-4.4# $KAFKA_HOME/bin/kafka-console-consumer.sh --bootstrap-server kafka:9093 --topic log
正确看到如下格式的消息即可
558,559,1574180802,1
576,576,1574180819,3
585,585,1574180828,3
594,594,1574180837,3
603,603,1574180846,3
613,613,1574180856,1
执行任务:
我们这个项目一共有6个flink的任务,如果只是在本地测试的话,可以直接在IDEA中启动对应的任务即可,为了做实验,我们把项目打包并提交到 Docker 的 Flink 中,为了方便就不再把各种依赖单独放到集群中,而是直接打到任务的jar包中。正确的打包方法可以参考这篇博客
我们直接把打包好的jar包放到集群中,并拷贝到flink的docker中(jobmanager)
[root@docker-linux pkg]# docker cp ./logtask.jar flink_jobmanager:/opt/
然后进入flink jobmanager的容器中,提交jar包到集群
[root@docker-linux pkg]# docker exec -ti flink_jobmanager bash
root@0f5edbeeecb9:/opt/flink# flink run /opt/logtask.jar
提交成功后可以在Flink WebUI观察我们提交的任务