Apache Storm依赖的软件
- Java
- Python 2.x
- unzip
- ZeroMQ
- JZMQ
- Apache ZooKeeper
安装OpenJDK
Arch Linux需要设置JAVA_HOME
1 2
| pacman -S extra/jdk8-openjdk echo "export JAVA_HOME=/usr/lib/jvm/java-8-openjdk" >> /etc/profile.d/jre.sh
|
安装python2, unzip
安装编译工具
Apache Storm 用到 ZeroMQ v2.1.7,而Arch Linux官方软件仓库中的是4.x版本,故ZeroMQ需要使用源码编译安装。
1
| pacman -S gcc libtool pkg-config make autoconf git util-linux
|
编译安装ZeroMQ, JZMQ
编译安装ZeroMQ
1 2 3 4 5 6
| curl -O http://download.zeromq.org/zeromq-2.1.7.tar.gz tar xzvf zeromq-2.1.7.tar.gz cd zeromq-2.1.7 make make install ldconfig # 更新LD_LIBRARY_PATH
|
编译安装JZMQ
1 2 3 4 5 6
| git clone https://github.com/nathanmarz/jzmq.git cd jzmq ./autogen.sh ./configure --with-zeromq=/usr/local make make install
|
make时可能会出错,解决办法是修改jzmq/src/Makefile.am,将classdist_noinst.stamp修改为classnoinst.stamp
验证libjzmq确实使用的zeromq是自行编译的版本:
1
| ldd /usr/local/lib/libjzmq.so
|
如果libzmq.so.1确实指向/usr/local/lib中的版本,则说明版本使用正确。
安装Apache ZooKeeper
1 2
| yaourt -S zookeeper vi /usr/bin/zkServer.sh
|
因为zookeeper只对IPv6地址进行监听,为了强制其只监听IPv4地址,需要修改 /usr/bin/zkServer.sh,在nohup "$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \
后添加一行:
"-Djava.net.preferIPv4Stack=true" \
启动Apache ZooKeeper
1
| /usr/bin/zkServer.sh start
|
安装Apache Storm
方法一:使用Arch Linux AUR仓库中的软件包
1 2 3 4
| yaourt -S storm systemctl start storm-nimbus.service systemctl start storm-supervisor.service systemctl start storm-ui.service
|
方法二:使用官方编译好的安装包
用浏览器打开 http://www.apache.org/dyn/closer.cgi/storm/apache-storm-0.9.3/apache-storm-0.9.3.tar.gz 页面,从中选择一个镜像站下载软件包
1 2 3
| curl -O http://mirror.bit.edu.cn/apache/storm/apache-storm-0.9.3/apache-storm-0.9.3.tar.gz tar xzvf apache-storm-0.9.3.tar.gz cd apache-storm-0.9.3/bin
|
使用konsole或gnome-terminal等终端模拟器,在不同的标签页分别执行./storm nimbus
, ./storm supervisor
, ./storm ui
如果ui启动成功,可以使用浏览器来访问localhost:8080查看整个cluster的状况了
部署Topology到cluster
以官方apache-storm-0.9.3.tar.gz中带的starter为例
1
| ./storm jar ../examples/storm-starter/storm-starter-topologies-0.9.3.jar storm.starter.ExclamationTopology exclamationTopology
|
一切顺利的话,可以看到输出:
1
| 1574 [main] INFO backtype.storm.StormSubmitter - Finished submitting topology: exclamationTopology
|
如果需要 kill 该 topology,则需要运行
1
| ./storm kill exclamationTopology
|
使用PHP写Topology示例
本示例基于storm-starter的word count程序创建。
附件是本示例的完整代码,代码目录结构如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| joelhy@arminix: /tmp $ tree motiondetect motiondetect ├── multilang │ └── resources │ ├── RandomSentenceSpout.php │ ├── splitsentence.php │ └── storm.php ├── pom.xml └── src └── surveil └── motiondetect └── WordCountTopologyPhp.java 5 directories, 5 files
|
创建过程说明如下
安装Apache Storm到本地repository中
1 2 3 4
| pacman -S maven git clone git://github.com/apache/storm.git git checkout v0.9.3 mvn install -DskipTests=true
|
如果由于下载依赖关系失败等原因导致安装失败,可下载 http://pan.baidu.com/s/1qW6vylY 中的软件包到~/.m2/repository目录中,再重试。
基于storm-starter的pom.xml建立 pom.xml 文件
其中groupId, artifactId, packaging, version, name 是需要修改的
1 2 3 4 5
| <groupId>com.example.surveil</groupId> <artifactId>motiondetect</artifactId> <packaging>jar</packaging> <version>0.1</version> <name>motiondetect</name>
|
创建maven所需的目录结构
使用mkdir创建如下目录结构
1 2 3 4 5 6 7
| joelhy@arminix: /tmp/motiondetect $ tree -d . . ├── multilang │ └── resources └── src └── surveil └── motiondetect
|
引入storm的PHP支持类文件
1 2
| cd multilang/resources/ curl -O https://raw.githubusercontent.com/Lazyshot/storm-php/master/lib/storm.php
|
实现业务逻辑
仿照storm-starter下的nodejs版wordcount
在目录 multilang/resources/ 目录下创建文件RandomSentenceSpout.php, splitsentence.php
在目录 src/surveil/motiondetect/ 中创建文件WordCountTopologyPhp.java
文件的具体内容见附件
编译代码
在motiondetect目录下运行
1
| mvn clean install -DskipTests=true
|
运行完后在motiondetect目录下会生成target目录,里面有编译相关的文件
部署Topolgy
命令行下运行如下命令
1
| storm jar target/motiondetect-0.1-jar-with-dependencies.jar surveil.motiondetect.WordCountTopologyNode wc
|