在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出现一直更新不来


分析原因:  由于网络不好,导致不能正常更新



004-storm开发计数程序本地模式运行_maven



解决方案: 可以删除对应的文件所在的目录,然后在eclipse中执行 maven->Update Project ,然后就可以正常下载了。