本次大作业的环境涉及到使用Docker搭建一个zookeeper+kafka+storm的集群环境并进行数字大屏可视化展示,在这个过程中不可避免会碰到许多难以预料的问题,下面我将针对在这一过程中遇到的问题进行总结归纳。
一、Docker Desktop安装位置
Docker安装的位置默认在C盘中且在交互界面中没有提供修改安装路径的方式,为了将其安装在C盘之外的地方,我阅读了Docker的官方文档,并通过控制台安装的方式通过命令参数指定安装的路径,并最终将其安装到了F盘中,详细的参考材料如下:
安装命令:"Docker Desktop Installer.exe" install --installation-dir=<path>,其中需要将<path>修改为自己实际需要安装的位置。
官方文档:Install Docker Desktop on Windows | Docker Docs
二、安装成功后无法运行Docker
首先给出问题展示图:
可以看到提示"WSL Kernel version too low",因此我们需要对WSL的版本进行升级。
这个问题的解决方法就是在管理员powershell中使用wsl --update进行更新,在完成更新之后使用netsh winsock reset即可。
三、Docker Engine stopped
出现这个的原因是没有打开计算机的wls功能,按照下面的方式打开即可:
四、pull速度太慢
出现pull的速度太慢一般是由于镜像仓库在国外,通过国内的网络进行下载会出现这种下载速度非常慢的问题,因此,我们只需要设置Docker的下载源为国内源即可。
下面给出我目前设置的国内源:
"registry-mirrors": [
"http://hub-mirror.c.163.com"
]
五、Docker内存太小导致部分容器无法启动
在一些时候如果我们开启的容器过多会使用掉大量的内存以及CPU资源,如果我们给WSL设置的内存过小或者给的CPU核数过小,就会出现容器无法打开甚至卡死的问题,那么就需要通过设置给WSL分配的内存大小来解决这个问题。
注意:配置这些内容会导致Docker中的容器和镜像丢失!!!
1.进入UserProfile目录
通过CTRL+R会弹出下面的窗口
在下面的窗口中输入%UserProfile%即可进入到UserProfile页面中。
在页面中打开.wslconfig文件(如果没有的话就创建这个文件)
之后可以看到下面的内容(没有的话就将下面的内容复制进去):
[wsl2]
memory=4GB
processors=8
swap=0
localhostForwarding=true
可以分别看到有4个可调节的参数项,memory是设置WSL的内存大小的,processors是设置给WSL分配的最大CPU核心数。
重启电脑即可。
再次注意:配置这些内容会导致Docker中的容器和镜像丢失!!!
六、nimbus找不到zookeeper
如果你使用的是wurstmeister/kafka你可能就会出现这个问题。
首先可以先进入到nimbus中
通过配置storm中的配置文件我们可以看到下面的内容:
可以看到这个文件中对storm.zookepper.servers指定的名字叫做zookeeper并且目前我还没有发现有什么地方可以修改这个设置,所以在实际搭建集群的时候可以将zookeeper容器的名称就指定为zookeeper。
七、supervisor找不到nimbus
和上面的问题一样,在storm镜像的配置文件中已经写定了nimbus的名字就叫nimbus所以如果你的nimbus容器命名成了其他的名称就会出现找不到的问题。
八、在主机连接不到kafka
如果在Java中使用Local模式连接kafka出现连接不上kafka的情况可能是由于在创建kafka容器的时候没有正确的将本机主机的IP地址指定到docker容器的配置中。
下面是我的kafka配置,注意将IP地址改为你实际的IP地址:
九、storm本地模式莫名中断
其实出现中断的原因特别简单。
下面是使用本地模式提交拓扑的一段代码:
// 本地模式运行
LocalCluster localCluster = new LocalCluster();
localCluster.submitTopology("StockTopology", config, topology);
// 在本地运行10秒钟
Thread.sleep(10000);
// 停止本地集群
localCluster.killTopology("StockTopology");
localCluster.shutdown();
可以看到指定了Thread.sleep(10000),这行代码的作用是阻止程序继续向下运行到localCluster.shutdown()从而终止集群,因此如果这个sleep的时间设置的太小就会出现莫名的程序中断,所以注意将这个数值修改大一些。