- 先说点题外话,本来这篇文章十天之前就该写了,后来结果电脑坏了,今天才搞好。中间经历了一场考试,端午还回了趟家。
- 项目分析思路,其实这个地方没有完全做到实时,数据放在HDFS上,完全实时的可以用kafka,这个正在测试中。
- ReadSpout分析
public class ReadSpout extends BaseRichSpout {
SpoutOutputCollector coll;
@Override
public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) {
// TODO Auto-generated method stub
coll=collector;
}
@Override
public void nextTuple() {
// TODO Auto-generated method stub
String uri = "hdfs://localhostlei:8020/storm/app.log"; //日志存放在hdfs上
InputStream in = null;
try {
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(URI.create(uri), conf);
in = fs.open(new Path(uri));
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String line = null;
while (null != (line = br.readLine())) {
coll.emit(new Values(line)); //日志记录为行为单位
Utils.sleep(100); 频率为1s10条
}
} catch (IOException e) {
e.printStackTrace();
} finally {
IOUtils.closeStream(in);
}
}
@Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
// TODO Auto-generated method stub
declarer.declare(new Fields("ip"));
}
}
4.GetAreaBolt分析,这里我是通过高德地图的接口得到的省份名称, 这里提供链接参考。http://lbs.amap.com/api/webservice/guide/api/ipconfig
public class GetAreaBolt implements IBasicBolt {
public void execute(Tuple tuple, BasicOutputCollector collector) {
String line = tuple.toString();
String all[] = line.split("\t", -1);
String s=HttpRequest.sendGet("http://restapi.amap.com/v3/ip",
"key=填写你的key&ip="+all[3]);
collector.emit(new Values(s)); //得到省份名称
}
public void declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declare(new Fields("area"));
}
public Map<String, Object> getComponentConfiguration() {
return null;
}
@SuppressWarnings("rawtypes")
@Override
public void prepare(Map stormConf, TopologyContext context) {
}
@Override
public void cleanup() {
}
}
- WriteBolt分析
public class WriteBolt implements IBasicBolt {
private static final long serialVersionUID = 1L;
static Connection conn;
static Statement st;
public static void insert(String area) {
System.out.println("开始插入数据");
try {
String sql="update position set num=num+1 where area='"+area+"'";
int result=st.executeUpdate(sql); // exec sql
System.out.println("数据更新结果:"+result+area);
} catch (SQLException e) {
System.out.println("update failed! " + e.getMessage());
}
}
public void execute(Tuple tuple, BasicOutputCollector collector) {
String word = tuple.getString(0);
if (word!=null&&word.length()>0) {
word=ProvinceUtil.ProcessPro(word); //为了后面的图表方便,这里要进行一些处理
insert(word);
}
}
@Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declare(new Fields("area"));
}
@Override
public Map<String, Object> getComponentConfiguration() {
return null;
}
@Override
public void prepare(Map stormConf, TopologyContext context) {
conn = Dao.getConn(); // get connection
try {
st = (Statement) conn.createStatement();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} // create static sql statement
}
@Override
public void cleanup() {
try {
st.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
6其余的代码就不介绍了,项目源码地址https://github.com/iareuniqe/app-storm/tree/master/storm-master分析项目下主要介绍下如何制作出中国地图的效果,先放张图,今天有点困了,明天早上起来写吧!测试数据下载地址http://pan.baidu.com/s/1eSzivKI 密码ev54