Yahoo Finance への Apache Storm の適用
Yahoo Finance は、インターネットを代表するビジネス ニュースおよび財務データの Web サイトです。これは Yahoo の一部であり、誰でもアクセスできる金融ニュース、市場統計、国際市場データ、その他の金融リソースに関する情報を提供します。
Yahoo! 登録ユーザーの場合は、Yahoo! Finance をカスタマイズして、その特定の製品を活用できます。 Yahoo! Finance API は、Yahoo! から財務データ をクエリするために使用されます。
この API は、リアルタイムの 15 分遅れのデータを表示し、データベースを 1 分ごとに更新して、現在の株式関連情報にアクセスします。ここで、企業のリアルタイム シナリオを見て、企業の株価が 100 を下回ったときにアラートがどのように発せられるかを見てみましょう。
スパウト
スパウトを作成する目的は、会社の詳細を取得し、価格スパウトを送信することです。次のプログラム コードを使用して注ぎ口を作成できます。
コーディング: YahooFinanceSpout.java
import java.util.*; import java.io.*; import java.math.BigDecimal; //import yahoofinace packages import yahoofinance.YahooFinance; import yahoofinance.Stock; import backtype.storm.tuple.Fields; import backtype.storm.tuple.Values; import backtype.storm.topology.IRichSpout; import backtype.storm.topology.OutputFieldsDeclarer; import backtype.storm.spout.SpoutOutputCollector; import backtype.storm.task.TopologyContext; public class YahooFinanceSpout implements IRichSpout { private SpoutOutputCollector collector; private boolean completed = false; private TopologyContext context; @Override public void open(Map conf, TopologyContext context, SpoutOutputCollector collector){ this.context = context; this.collector = collector; } @Override public void nextTuple() { try { Stock stock = YahooFinance.get("INTC"); BigDecimal price = stock.getQuote().getPrice(); this.collector.emit(new Values("INTC", price.doubleValue())); stock = YahooFinance.get("GOOGL"); price = stock.getQuote().getPrice(); this.collector.emit(new Values("GOOGL", price.doubleValue())); stock = YahooFinance.get("AAPL"); price = stock.getQuote().getPrice(); this.collector.emit(new Values("AAPL", price.doubleValue())); } catch(Exception e) {} } @Override public void declareOutputFields(OutputFieldsDeclarer declarer) { declarer.declare(new Fields("company", "price")); } @Override public void close() {} public boolean isDistributed() { return false; } @Override public void activate() {} @Override public void deactivate() {} @Override public void ack(Object msgId) {} @Override public void fail(Object msgId) {} @Override public Map<String, Object> getComponentConfiguration() { return null; } }
ボルト作成
ここでの目的は、特定の企業の価格が 100 未満の場合にその価格を処理することです。 。 Java Map オブジェクトを使用して、株価が 100 未満の場合はカットオフ価格制限アラートを true に設定し、それ以外の場合は false に設定します。完全なプログラム コードは次のとおりです。
コーディング: PriceCutOffBolt.java
import java.util.HashMap; import java.util.Map; import backtype.storm.tuple.Fields; import backtype.storm.tuple.Values; import backtype.storm.task.OutputCollector; import backtype.storm.task.TopologyContext; import backtype.storm.topology.IRichBolt; import backtype.storm.topology.OutputFieldsDeclarer; import backtype.storm.tuple.Tuple; public class PriceCutOffBolt implements IRichBolt { Map<String, Integer> cutOffMap; Map<String, Boolean> resultMap; private OutputCollector collector; @Override public void prepare(Map conf, TopologyContext context, OutputCollector collector) { this.cutOffMap = new HashMap <String, Integer>(); this.cutOffMap.put("INTC", 100); this.cutOffMap.put("AAPL", 100); this.cutOffMap.put("GOOGL", 100); this.resultMap = new HashMap<String, Boolean>(); this.collector = collector; } @Override public void execute(Tuple tuple) { String company = tuple.getString(0); Double price = tuple.getDouble(1); if(this.cutOffMap.containsKey(company)){ Integer cutOffPrice = this.cutOffMap.get(company); if(price < cutOffPrice) { this.resultMap.put(company, true); } else { this.resultMap.put(company, false); } } collector.ack(tuple); } @Override public void cleanup() { for(Map.Entry<String, Boolean> entry:resultMap.entrySet()){ System.out.println(entry.getKey()+" : " + entry.getValue()); } } @Override public void declareOutputFields(OutputFieldsDeclarer declarer) { declarer.declare(new Fields("cut_off_price")); } @Override public Map<String, Object> getComponentConfiguration() { return null; } }
トポロジの送信
これは、YahooFinanceSpout.java と PriceCutOffBolt.java が接続されて生成されたものです。トポロジの主なアプリケーション。次のプログラム コードは、トポロジを送信する方法を示しています。
コーディング: YahooFinanceStorm.java
import backtype.storm.tuple.Fields; import backtype.storm.tuple.Values; import backtype.storm.Config; import backtype.storm.LocalCluster; import backtype.storm.topology.TopologyBuilder; public class YahooFinanceStorm { public static void main(String[] args) throws Exception{ Config config = new Config(); config.setDebug(true); TopologyBuilder builder = new TopologyBuilder(); builder.setSpout("yahoo-finance-spout", new YahooFinanceSpout()); builder.setBolt("price-cutoff-bolt", new PriceCutOffBolt()) .fieldsGrouping("yahoo-finance-spout", new Fields("company")); LocalCluster cluster = new LocalCluster(); cluster.submitTopology("YahooFinanceStorm", config, builder.createTopology()); Thread.sleep(10000); cluster.shutdown(); } }
アプリケーションの構築と実行
完全なアプリケーションには 3 つの Java コードがあります。それらは次のとおりです -
- YahooFinanceSpout.java
- PriceCutOffBolt.java
- YahooFinanceStorm.java
アプリケーションは次を使用して構築できます。次のコマンド -
javac -cp “/path/to/storm/apache-storm-0.9.5/lib/*”:”/path/to/yahoofinance/lib/*” *.java
次のコマンドを使用してアプリケーションを実行できます -
javac -cp “/path/to/storm/apache-storm-0.9.5/lib/*”:”/path/to/yahoofinance/lib/*”:. YahooFinanceStorm
出力
出力は次のようになります -