004-storm开发计数程序本地模式运行
原创
©著作权归作者所有:来自51CTO博客作者艾文编程的原创作品,请联系作者获取转载授权,否则将追究法律责任
在eclipse中建立maven工程
1、版本
JDK版本: 1.7
Storm版本: 0.9.3
Maven版本: 3.0
2、本地模式运行Storm
2.1 引入storm-core核心包
<dependency>
<groupId>org.apache.storm</groupId>
<artifactId>storm-core</artifactId>
<version>0.9.3</version>
<scope>provided</scope>
</dependency>
其中:provided表示只在编译的classpath中加载和使用,打包的时候不会包含在目标包中。这里主要避免提交到storm集群后冲突
2.2 代码演示
package storm;
import java.util.Map;
import backtype.storm.Config;
import backtype.storm.LocalCluster;
import backtype.storm.spout.SpoutOutputCollector;
import backtype.storm.task.OutputCollector;
import backtype.storm.task.TopologyContext;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.topology.TopologyBuilder;
import backtype.storm.topology.base.BaseRichBolt;
import backtype.storm.topology.base.BaseRichSpout;
import backtype.storm.tuple.Fields;
import backtype.storm.tuple.Tuple;
import backtype.storm.tuple.Values;
public class CountStormClusterTopology {
public static void main(String[] args) {
TopologyBuilder builder = new TopologyBuilder();
builder.setSpout( "spout_id", new DataSourceSpout());
builder.setBolt( "bolt_id", new SumBolt()).shuffleGrouping("spout_id" );
LocalCluster localCluster = new LocalCluster();
Config config = new Config();
config.setMaxTaskParallelism(1);
localCluster.submitTopology(
CountStormClusterTopology. class.getSimpleName() + System.currentTimeMillis(), config,
builder.createTopology());
}
/**
* 数据源
*
* @author shenfl
*
*/
public static class DataSourceSpout extends BaseRichSpout {
private static final long serialVersionUID = 1L;
private Map conf;
private TopologyContext context;
private SpoutOutputCollector collector ;
/**
* 初始化方法: 本实例运行的时候执行一次且仅一次
*/
public void open(Map conf, TopologyContext context, SpoutOutputCollector collector ) {
this.conf = conf ;
this.context = context ;
this.collector = collector ;
}
int i = 0;
/**
* 死循环调用: tuple 为storm传输数据基本单位
*/
public void nextTuple() {
System. out.println("发送的内容: " + i);
/**
* Emits a tuple to the output stream
*/
this.collector .emit(new Values(i++));
try {
Thread. sleep(1000);
} catch (InterruptedException e ) {
e.printStackTrace();
}
}
public void declareOutputFields(OutputFieldsDeclarer declarer ) {
// Fields 是一个list列表,参数和nextTuple中的values的数值一一对应
declarer.declare( new Fields("num" ));
}
}
/**
* 数据源累加
*
* @author shenfl
*
*/
public static class SumBolt extends BaseRichBolt {
private Map stormConf;
private TopologyContext context;
private OutputCollector collector;
/**
*
*/
private static final long serialVersionUID = 1L;
public void prepare(Map stormConf, TopologyContext context, OutputCollector collector ) {
this.stormConf = stormConf ;
this.context = context ;
this.collector = collector ;
}
int sum = 0;
/**
* 接收spout中的nextTuple,数据传输以Tuple为单位
*/
public void execute(Tuple input) {
Integer num = input.getIntegerByField("num" );
sum += num;
System. out.println("接收内容: " + num);
}
public void declareOutputFields(OutputFieldsDeclarer declarer ) {
}
}
}
常见问题以及解决方案:
1、
解决maven引用jdk中的tools.jar报Missing artifact的问题
很多框架都会依赖jdk中的tools.jar,但是maven仓库中却没有.
如在eclipse+maven编写mapreduce代码,就会报Missing artifact jdk.toos:jdk.toos:jar:1.7
如何解决这个问题呢,只需要在项目的pom.xml 文件中加入以下配置,指定maven去本地寻找 tools.jar、
<dependency>
<groupId>jdk.tools</groupId>
<artifactId>jdk.tools</artifactId>
<version>1.7</version>
<scope>system</scope>
<systemPath>${JAVA_HOME}/lib/tools.jar</systemPath>
</dependency>
2、通过maven方式管理jar,若公司有代理的话,需要设置代理后才能下载jar
进入${M2_HOME}\conf 目录下,找到settings.xml文件,大概94-103行左右,设置自己公司代理
<proxy>
<id>myproxy</id>
<active>true</active>
<protocol>http</protocol>
<username>ai\yyyyy</username>
<password>123waq!</password>
<host>proxy.xxxxx.com</host>
<port>8080</port>
<nonProxyHosts>local.net|some.host.com</nonProxyHosts>
</proxy>
3、引入storm的核心包,maven出现一直更新不来
分析原因: 由于网络不好,导致不能正常更新
解决方案: 可以删除对应的文件所在的目录,然后在eclipse中执行 maven->Update Project ,然后就可以正常下载了。