部署Storm集群。
环境配置
Strom
下载
-
首先从官网下载Strom压缩包,这里以最新的Strom1.2.2作为演示。
-
解压到/usr/local:
-
sudo tar xzvf apache-storm-1.2.2.tar.gz -C /usr/local
-
-
查看解压文件:
-
需要重命名:
-
sudo mv /usr/local/apache-storm-1.2.2/ /usr/local/storm
-
-
修改拥有者:
-
sudo chown -R hadoop:hadoop storm
-
-
添加到环境变量
-
vim ~/.bashrc export STROM=/usr/local/storm source ~/.bashrc
-
修改配置文件
-
进入软件目录,修改文件
storm.yaml
-
cd /usr/local/storm/ sudo vim conf/storm.yaml
-
-
修改为本地server:
-
storm.zookeeper.servers: - "localhost" nimbus.seeds: ["localhost"] supervisor.slots.ports: - 6700 - 6701 - 6702 - 6703 storm.zookeeper.port: 2181 storm.local.dir: "/usr/local/storm/storm-local" storm.health.check.dir: "healthchecks" storm.health.check.timeout.ms: 5000
-
Python
- 检查是否有高于2.6版本的python:
启动storm
修改执行脚本
-
参考这里修改脚本,主要是修改python的路径
-
先查找自己的python路径:
-
ls /usr/bin/python*
-
-
找到执行脚本,在
./bin/storm
中,根据之前的python路径修改
启动
-
执行命令:
-
nohup storm nimbus >/dev/null 2>&1 & nohup storm supervisor >/dev/null 2>&1 & nohup storm ui >/dev/null 2>&1 &
-
这里的
2>&1
表示就是把所有标准输出(&1)和标准出错(2)都扔到垃圾桶里面,最后的&
表示后台执行
-
-
这里可能需要几分钟才能完成启动,使用
jps
命令查看可以看到nimbus, supervisor, core: -
在浏览器中
localhost:8080
上查看集群情况: -
成功!
测试运行
示例
-
/usr/local/storm/example
目录下的storm-starter
里有很多Storm
的项目,比如DRPC
、Word Count
。 -
在该目录路径下使用maven来打包
Storm
jar包 -
首先找到该目录:
-
我们发现该目录是用
maven
进行打包的: -
因此,我们可以使用IDEA来打包,也可以直接使用mvn:
-
mvn clean install -Dmaven.test.skip=true mvn package
-
Stream Join的简单实例
WordCount
SentenceSpout.java
该文件为模拟外部输入
import java.util.Map;
import java.util.UUID;
import org.apache.storm.spout.SpoutOutputCollector;
import org.apache.storm.task.TopologyContext;
import org.apache.storm.topology.OutputFieldsDeclarer;
import org.apache.storm.topology.base.BaseRichSpout;
import org.apache.storm.tuple.Fields;
import org.apache.storm.tuple.Values;
import org.apache.storm.utils.Utils;
public class SentenceSpout extends BaseRichSpout {
private SpoutOutputCollector spoutOutputCollector;
private String[] sentences = {
"the cow jumped over the moon", "an apple a day keeps the doctor away",
"four score and seven years ago", "snow white and the seven dwarfs", "i am at two with nature"};
public void open(Map map, TopologyContext topologycontext, SpoutOutputCollector spoutoutputcollector) {
this.spoutOutputCollector = spoutoutputcollector;
}
public void nextTuple() {
for (String sentence : sentences) {
Values values = new Values(sentence);
UUID msgId = UUID.randomUUID();
this.spoutOutputCollector.emit(values, msgId);
}
Utils.sleep(1000);
}
public void declareOutputFields(OutputFieldsDeclarer outputfieldsdeclarer) {
outputfieldsdeclarer.declare(new Fields("sentence"));
}
}
SplitSentenceBolt.java
分割字符的bolt
import java.util.Map;
import org.apache.storm.task.OutputCollector;
import org.apache.storm.task.TopologyContext;
import org.apache.storm.topology.OutputFieldsDeclarer;
import org.apache.storm.topology.base.BaseRichBolt;
import org.apache.storm.tuple.Fields;
import org.apache.storm.tuple.Tuple;
import org.apache.