0%

Storm 环境搭建(Ubuntu 18.04)


Storm 环境配置 (Ubuntu 18.04)

因为一些需要,在Ubuntu上进行了Storm环境的配置。配置过程中出现了一些问题,故做总结。

概述

仅本机器作为结点!

参考教程如下:Apache Storm - Installation,在其基础上有所修改。

涉及到软件版本如下:

软件 版本
jdk openjdk-8
Maven 3.6.0
ZooKeeper 3.5.5
Storm 1.2.3

JAVA环境

使用apt安装

apt的源中openjdk有两个版本:openjdk-8openjdk-11
我们选择安装openjdk-8,具体原因在后文说明:jdk的版本选择

1
sudo apt-get install openjdk-8-* -y

测试

执行下面命令,你会看到它的版本号:

1
2
java -version
javac -version

设置环境变量

修改

修改/etc/environment文件,在其中加入

1
JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64"

/usr/lib/jvm/java-8-openjdk-amd64是apt默认选择的位置。
若使用其他安装方式,路径可能会不同。

测试

执行命令,查看是否会输出正确的路径

1
2
source /etc/enviroment
echo $JAVA_HOME

ps:其他已经打开的终端窗口,也需要source或者重新打开。

安装Maven&换源

安装

使用apt来安装Maven

1
2
sudo apt-get install maven -y
mvn -version #查看版本

Storm相关文档中对Maven的版本要求提到(preferably version 3.x)
Ubuntu 18.04自带的版本是3.6,满足需求。
其他安装方式需要注意版本。

换源

修改 Maven的安装目录下/conf/setting.xml文件。
Maven的安装目录可通过mvn -version查看
apt安装默认应该是/usr/share/maven

在其中加入以下片段:(注意放到settings的mirrors中,这个可能比较靠后,注意不要放到注释中)

1
2
3
4
5
6
<mirror>
<id>alimaven< /id>
<mirrorOf>central< /mirrorOf>
<name>aliyun maven< /name>
<url>http://maven.aliyun.com/nexus/content/groups/public/< /url>
< /mirror>

创建新用户

1
2
3
sudo useradd hadoop #会有设置密码等过程
sudo mkdir /data
sudo chown -R hadoop:hadoop /data
  1. hadoop是分布式计算开源框架的名字,名字并没有什么关系
  2. useraddadduser的一个区别是:是否会在home下创建对应目录(后面需要该目录)
  3. /data目录中之后用于ZooKeeper和Storm的数据目录,不创建(或者名字更改)都没有关系,与配置文件对应即可。

ps:后面的命令没有特殊说明均以hadoop用户执行

ZooKeeper安装与配置

安装

ZooKeeper下载地址

目前(2019.8.13前)官方提供的版本为3.4.14和3.5.5。我选择的版本为3.4.14,原因之后说明:ZooKeeper的版本选择

1
2
3
cd /opt
wget https://www-us.apache.org/dist/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
tar -xzvf zookeeper-3.4.14.tar.gz

配置

  1. 在/data目录下创建文件夹zookeeper:

    1
    mkdir /data/zookeeper
  2. 修改(新建)ZooKeeper的配置文件:

    1
    vim /opt/zookeeper-3.4.14/conf/zoo.cfg

    内容如下:

    1
    2
    3
    4
    5
    6
    tickTime=2000
    dataDir=/data/zookeeper
    clientPort=2181
    initLimit=5
    syncLimit=2
    server.1=127.0.0.1:2888:3888
    • server.id=A:B:C中:
      id(数字)表示server的id(称呼为myid)
      A为IP地址. B,C暂时没搞清楚
    • dataDir为data的目录
    • clientPort需要和Storm中配置相匹配
  3. 向我们的机器写入myid

    1
    bash -c "echo '1' >> /data/zookeeper/myid"

    每个服务器的 myid 都不同, 且需要使和zoo.cfg中”server.id=host:port:port” 的 id 值一致。
    id 的范围为[1,255]

启动

1
./opt/zookeeper-3.4.14/bin/zkServer.sh start

输出大致如下:

1
2
3
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.4.14/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

start参数换为stop与restart,即为停止和重启 。
start后会待在后台中,不占用当前shell

测试

1
/opt/zookeeper-3.4.14/bin/zkCli.sh

执行上述命令后,可获得以下响应:

1
2
3
4
5
6
7
8
9
10
Connecting to localhost:2181
................
................
................
Welcome to ZooKeeper!
................
................
WATCHER::
WatchedEvent state:SyncConnected type: None path:null
[zk: localhost:2181(CONNECTED) 0]

测试成功后,退出即可。

Storm安装与配置

安装

Storm下载地址

目前(2019.8.13前)官方提供的版本为2.0.0和1.2.3。我选择的版本为1.2.3,这个额没有原因。

不过该地址好像会通过ip分配到不同的源上(我猜),所以不在下面使用wget命令了。

1
2
3
4
mkdir /data/storm #创建data目录
cd /opt
tar -zxf apache-storm-1.2.3.tar.gz
cd apache-storm-1.2.3

配置

编辑 Storm安装目录下/conf/storm.yaml,加入下列内容

1
2
3
4
5
6
7
8
9
10
storm.zookeeper.servers:
- "localhost"
storm.local.dir: "/data/storm"
nimbus.host: "localhost"
storm.zookeeper.port: 2181
supervisor.slots.ports:
- 6700
- 6701
- 6702
- 6703
配置名 含义
storm.zookeeper.servers 集群的ip(非一个)
storm.local.dir 数据存放目录
nimbus.host 主节点的ip
storm.zookeeper.port ZooKeeper端口,需要和zookeeper的配置匹配

运行

逐步运行以下命令:

1
2
3
4
cd /opt/apache-storm-1.2.3/bin/
./storm nimbus
./storm supervisor
./storm ui

http://localhost:8080中可看到与下图类似的效果:

项目打包与执行

打包

Storm中本身携带了一些样例,为了测试使用其中最基本的storm-starter.

1
cd /opt/apache-storm-1.2.3/examples/storm-starter

执行mvn package就会进行打包,其他参数没有查过。
这个时候可能会下载一些依赖,位于~/.m2中.

storm-starter在打包中可能会出错,寻找不到tools.jar

打开pom.xml,加入以下内容(需要加在dependencies项中间)

1
2
3
4
5
6
7
<dependency>
<groupId>jdk.tools< /groupId>
<artifactId>jdk.toolsartifactId>
<version>1.7< /version>
<scope>system< /scope>
<systemPath>${JAVA_HOME}/lib/tools.jar< /systemPath>
< /dependency>

执行

执行以下命令,等待过程结束:

1
2
cd /opt/apache-storm-1.2.3/bin/
./storm jar ../examples/storm-starter/target/storm-starter-1.2.3.jar org.apache.storm.starter.ExclamationTopology nb

nb 是name,必须写。写什么无所谓

http://localhost:8080中查看Topology Summary项。
若是有结果则正确运行。

注意事项

jdk的版本选择

我面临的选择是openjdk-8openjdk-11

项目打包与执行-打包中需要加入tools.jar,但是openjdk-11中并没有tools.jar(从9的时候就没有了).

但需要引入tools.jar的错误,我并没有复现。

不过我只是删除了.m2中repo,还原了pom.xml,删除了生成的dependency-reduced-pom.xml文件。 并没有彻底重新搭建环境。

ZooKeeper的版本选择

我面临的选择是3.4.143.5.5

在使用3.5.5的时候,ZooKeeper并没有办法启动。
原因是没有zookeeper-3.5.5.jar

但是在参考相关教程中并没人提到这一点。
最后在官网的说明中找到了些端倪,https://zookeeper.apache.org/releases.html#download

在3.5.5的升级说明中:

  1. jdk的最低推荐版本为1.8
  2. Release artifacts发生很大变化
1
2
3
4
5
6
Please also note:

Minimum recommended JDK version is now 1.8
Release artifacts have been changed considerably:
apache-zookeeper-X.Y.Z.tar.gz is standard source-only release,
apache-zookeeper-X.Y.Z-bin.tar.gz is the convenience tarball which contains the binaries

对比两个版本,变化还是不小的.
暂时没有时间研究具体的变化所以选择了3.4.14.
1

Storm的执行命令

关于Storm的执行命令,我参考的内容是样例中的Readme。

其中部分如下:

1
2
3
4
5
6
# Example 1: Run the ExclamationTopology in local mode (LocalCluster)
$ storm jar target/storm-starter-*.jar org.apache.storm.starter.ExclamationTopology

# Example 2: Run the RollingTopWords in remote/cluster mode,
# under the name "production-topology"
$ storm jar target/storm-starter-*.jar org.apache.storm.starter.RollingTopWords production-topology remote

所以要注意的是:

  1. remote/cluster 模式下和本地的命令可能有区别
  2. Example 1(remote/cluster 模式下不确定) 中 末尾应该少个参数,即name。 这个问题我还卡了一些时间,但是我没有从上下文中读到这个参数。TAT

其他

多机器执行注意事项(未测试)

ZooKeeper的配置文件:

  1. server.id=A:B:C 配置的完成

Storm的配置文件:

  1. storm.zookeeper.servers项的完成

所有机器的配置文件应当是相同的

不同

ZooKeeper的data目录下的myid是不同的,而且需要和ZooKeeper配置文件匹配。

ps:

  1. nimbus是主结点!ui和nimbus只在主结点服务器上启动!

  2. 主结点上可以不跑supervisor服务

  3. 运行的命令和单机可能不同

jdk内存分配不足

如果是虚拟机运行mvn package有可能出现无法分配内存的问题(error=12),可以进行如下配置:

/proc/sys/vm/max_map_count里的值改大,默认是65530。

具体原因不清楚,参考别人的博客。
ubuntu中报错:无法分配内存 (errno=12)