Storm 集群搭建和自定义调度器

编写项目并打包上传

为了方便, 这里我们把自定义调度器DirectScheduler和测试用拓扑程序DirectScheduledTopology放在一个项目中.

pom.xml

自定义Scheduler

测试用拓扑

打成jar包, 上传至nimbus所在节点的storm下的lib目录下

集群环境搭建(3节点)

准备三台机器,hadoop001, hadoop002, hadoop003.

我们希望hadoop001启动: nimbus, ui, logviewer, supervisor

hadoop002,hadoop002启动: supervisor, logviewer

各节点的分工如下:

hostname nimbus supervisor zookeeper
hadoop001 √(supervisor001) server.1
hadoop002 √(supervisor002) server.2
hadoop003 √(supervisor003) server.3

虚拟机准备

可以先配置一台机器, 假设主机名为hadoop001, 静态IP为192.168.186.100. 接下来分别安装jdk环境, 解压zookeeper和storm的安装文件到指定目录~/app下面, 配置环境变量如下:

~/.bash_profile

之后再克隆出另外两台虚拟机, 修改IP分别为192.168.186.102和192.168.186.103.修改主机名为hadoop002和hadoop003.

克隆方式如下:

image-20211014104419615

三台机器/etc/hosts文件修改如下:

配置SSH免密

为了便于集群中个节点互访, 每台机器都需要通过ssh-keygen命令后输入三次回车生成一对密钥(公钥和私钥), 可以在~/.ssh下查看, 并将自己的公钥通过ssh-copy-id命令分发给其他机器的~/.ssh/authorized_keys(必须是600权限)文件中:

测试: (以从hadoop001连接hadoop002为例)

搭建zookeeper集群

跟单机基本一致, 配置文件相同

但是$dataDir下的myid文件保存的数字应该和对应server的id一致

然后分别启动三个机器的zookeeper就可以了

使用status查看应该有2个follower和1个leader

搭建Storm集群

除了storm.zookeeper.serversnimbus.seeds的配置不同之外, 和单机的storm配置基本相同.

hadoop001的配置:

hadoop002的配置:

hadoop003的配置:

然后分别启动以下进程

集群启停脚本编写

start-zookeeper-cluster.sh

start-storm-cluster.sh

需要保证三台机器都设置正确的环境变量, 如果必要可以将hadoop001的环境变量通过scp命令覆盖到其他机器上去如:

下面这个xRunCommand.sh脚本用来在集群中执行相同的命令并返回结果

比如可以xRunCommand.sh jps来查看集群中三台机器中的所有java进程

提交拓扑到集群

在hadoop001及nimbus所在节点,使用以下命令提交拓扑

其中:

  1. 第一个参数sum-topo 为拓扑名称

  2. 第二个参数supervisor002和第三个参数supervisor003表示调度的目的地

    即调度spout组件到supervisor002节点,调度bolt组件到supervisor003节点

    具体逻辑请查看DirectScheduledTopology类中的源代码

提交后, 即可在UI界面查看结果:

image-20211017023208132

可见我们的自定义调度器确实起作用了.

也可以通过$STORM_HOME/logs/nimbus.log查看到DirectScheduler类输出的相关日志, 例如:

Nimbus失败异常处理

问题描述

启动Storm集群后发现错误如下:

问题原因

可能是Zookeeper所保存的数据和现在集群的状态不一致, 也可能是nimbus进程异常退出(具体可在nimbus节点查看nimbus日志$STORM_HOME/logs/nimbus.log进行错误排查)

解决办法

不管是何种原因, 都可以使用下面的方法简单粗暴的解决:

注意, 以下处理方法会导致Storm集群中的所有运行的拓扑任务丢失.

  1. 先停止storm集群再停止zookeeper集群

  2. 删除所有zookeeper下dataDir除了myid之外的所有文件.

  3. 启动zookeeper集群

  4. 在任意zookeeper集群的节点使用以下命令删除Storm保存在zookeeper中的数据

  5. 最后启动storm集群即可.

谢谢!

Views: 307

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注