课程表

Apache Storm课程

工具箱
速查手册

Storm在雅虎财经上的应用

当前位置:免费教程 » 大数据/云 » Apache Storm

雅虎财经是互联网领先的商业新闻和金融数据网站。它是雅虎的一部分,并提供有关金融新闻,市场统计,国际市场数据和其他任何人都可以访问的财务资源信息。

如果您是注册的Yahoo!用户,那么您可以自定义Yahoo! Finance以利用其特定产品。Yahoo! Finance API用于从Yahoo!查询财务数据

此API显示实时延迟15分钟的数据,并每1分钟更新其数据库,以访问当前股票相关信息。现在让我们看一家公司的实时情景,看看当公司的股票价值低于100时如何提高警报。

Spout创建

spout的目的是获得公司的详细信息,并发出价格spout。您可以使用以下程序代码创建spout

编码:YahooFinanceSpout.java

  1. import java.util.*;
  2. import java.io.*;
  3. import java.math.BigDecimal;
  4.  
  5. //import yahoofinace packages
  6. import yahoofinance.YahooFinance;
  7. import yahoofinance.Stock;
  8.  
  9. import backtype.storm.tuple.Fields;
  10. import backtype.storm.tuple.Values;
  11.  
  12. import backtype.storm.topology.IRichSpout;
  13. import backtype.storm.topology.OutputFieldsDeclarer;
  14.  
  15. import backtype.storm.spout.SpoutOutputCollector;
  16. import backtype.storm.task.TopologyContext;
  17.  
  18. public class YahooFinanceSpout implements IRichSpout {
  19. private SpoutOutputCollector collector;
  20. private boolean completed = false;
  21. private TopologyContext context;
  22. @Override
  23. public void open(Map conf, TopologyContext context, SpoutOutputCollector collector){
  24. this.context = context;
  25. this.collector = collector;
  26. }
  27.  
  28. @Override
  29. public void nextTuple() {
  30. try {
  31. Stock stock = YahooFinance.get("INTC");
  32. BigDecimal price = stock.getQuote().getPrice();
  33.  
  34. this.collector.emit(new Values("INTC", price.doubleValue()));
  35. stock = YahooFinance.get("GOOGL");
  36. price = stock.getQuote().getPrice();
  37.  
  38. this.collector.emit(new Values("GOOGL", price.doubleValue()));
  39. stock = YahooFinance.get("AAPL");
  40. price = stock.getQuote().getPrice();
  41.  
  42. this.collector.emit(new Values("AAPL", price.doubleValue()));
  43. } catch(Exception e) {}
  44. }
  45.  
  46. @Override
  47. public void declareOutputFields(OutputFieldsDeclarer declarer) {
  48. declarer.declare(new Fields("company", "price"));
  49. }
  50.  
  51. @Override
  52. public void close() {}
  53. public boolean isDistributed() {
  54. return false;
  55. }
  56.  
  57. @Override
  58. public void activate() {}
  59.  
  60. @Override
  61. public void deactivate() {}
  62.  
  63. @Override
  64. public void ack(Object msgId) {}
  65.  
  66. @Override
  67. public void fail(Object msgId) {}
  68.  
  69. @Override
  70. public Map<String, Object> getComponentConfiguration() {
  71. return null;
  72. }
  73. }

Bolt创建

这里的的目的是当价格低于100时处理给定公司的价格。它使用Java Map对象在股价低于100时设置截止价格限制警报为真;否则为false。完整的程序代码如下 -

编码:PriceCutOffBolt.java

  1. import java.util.HashMap;
  2. import java.util.Map;
  3.  
  4. import backtype.storm.tuple.Fields;
  5. import backtype.storm.tuple.Values;
  6.  
  7. import backtype.storm.task.OutputCollector;
  8. import backtype.storm.task.TopologyContext;
  9.  
  10. import backtype.storm.topology.IRichBolt;
  11. import backtype.storm.topology.OutputFieldsDeclarer;
  12.  
  13. import backtype.storm.tuple.Tuple;
  14.  
  15. public class PriceCutOffBolt implements IRichBolt {
  16. Map<String, Integer> cutOffMap;
  17. Map<String, Boolean> resultMap;
  18. private OutputCollector collector;
  19.  
  20. @Override
  21. public void prepare(Map conf, TopologyContext context, OutputCollector collector) {
  22. this.cutOffMap = new HashMap <String, Integer>();
  23. this.cutOffMap.put("INTC", 100);
  24. this.cutOffMap.put("AAPL", 100);
  25. this.cutOffMap.put("GOOGL", 100);
  26.  
  27. this.resultMap = new HashMap<String, Boolean>();
  28. this.collector = collector;
  29. }
  30.  
  31. @Override
  32. public void execute(Tuple tuple) {
  33. String company = tuple.getString(0);
  34. Double price = tuple.getDouble(1);
  35.  
  36. if(this.cutOffMap.containsKey(company)){
  37. Integer cutOffPrice = this.cutOffMap.get(company);
  38.  
  39. if(price < cutOffPrice) {
  40. this.resultMap.put(company, true);
  41. } else {
  42. this.resultMap.put(company, false);
  43. }
  44. }
  45. collector.ack(tuple);
  46. }
  47.  
  48. @Override
  49. public void cleanup() {
  50. for(Map.Entry<String, Boolean> entry:resultMap.entrySet()){
  51. System.out.println(entry.getKey()+" : " + entry.getValue());
  52. }
  53. }
  54.  
  55. @Override
  56. public void declareOutputFields(OutputFieldsDeclarer declarer) {
  57. declarer.declare(new Fields("cut_off_price"));
  58. }
  59. @Override
  60. public Map<String, Object> getComponentConfiguration() {
  61. return null;
  62. }
  63. }

提交拓扑

这是YahooFinanceSpout.java和PriceCutOffBolt.java连接在一起并生成拓扑的主要应用程序。以下程序代码显示了如何提交拓扑。

编码:YahooFinanceStorm.java

  1. import backtype.storm.tuple.Fields;
  2. import backtype.storm.tuple.Values;
  3.  
  4. import backtype.storm.Config;
  5. import backtype.storm.LocalCluster;
  6. import backtype.storm.topology.TopologyBuilder;
  7.  
  8. public class YahooFinanceStorm {
  9. public static void main(String[] args) throws Exception{
  10. Config config = new Config();
  11. config.setDebug(true);
  12. TopologyBuilder builder = new TopologyBuilder();
  13. builder.setSpout("yahoo-finance-spout", new YahooFinanceSpout());
  14.  
  15. builder.setBolt("price-cutoff-bolt", new PriceCutOffBolt())
  16. .fieldsGrouping("yahoo-finance-spout", new Fields("company"));
  17. LocalCluster cluster = new LocalCluster();
  18. cluster.submitTopology("YahooFinanceStorm", config, builder.createTopology());
  19. Thread.sleep(10000);
  20. cluster.shutdown();
  21. }
  22. }

构建和运行应用程序

完整的应用程序有三个Java代码。他们如下 -

  • YahooFinanceSpout.java
  • PriceCutOffBolt.java
  • YahooFinanceStorm.java

应用程序可以使用以下命令构建 -

  1. javac -cp “/path/to/storm/apache-storm-0.9.5/lib/*”:”/path/to/yahoofinance/lib/*” *.java

应用程序可以使用以下命令运行 -

  1. javac -cp “/path/to/storm/apache-storm-0.9.5/lib/*”:”/path/to/yahoofinance/lib/*”:.
  2. YahooFinanceStorm

输出

输出将类似于以下内容 -

  1. GOOGL : false
  2. AAPL : false
  3. INTC : true
转载本站内容时,请务必注明来自W3xue,违者必究。
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号