ケースI:統計のウェブサイト(リアルタイム統計)
ライブストリーミングフレームが計算されますストームを
1)噴出
データソース、データソースへのアクセス
次のようにローカルのファイルがあります
注ぎ口の手順を書きます:
パッケージpvcount。 輸入java.io.BufferedReader; 輸入java.io.FileInputStream; 輸入java.io.FileNotFoundException。 インポートにjava.io.IOException; 輸入java.io.InputStreamReader。 輸入java.util.Map; 輸入org.apache.storm.spout.SpoutOutputCollector。 輸入org.apache.storm.task.TopologyContext; 輸入org.apache.storm.topology.IRichSpout; 輸入org.apache.storm.topology.OutputFieldsDeclarer。 輸入org.apache.storm.tuple.Fields。 輸入org.apache.storm.tuple.Values。 / ** * @authorドーン * @date 2019年6月7日10時19分39秒 * @version 1.0 *编写注ぎ口。接入本地数据源 * / パブリッククラスPvCountSpoutは{IRichSpoutを実装 コレクターSpoutOutputCollectorプライベート; プライベートをBufferedReaderのBR、 専用線のString; @Override ます。public void nextTuple(){ //各行で送信されたデータの読み取り 試し{ しばらく((= br.readLineライン())!= NULL){ // splitboltにデータを送信 collector.emit(新しい新しい値(行)); //遅延設定 のThread.sleep(500); } }キャッチ(IOExceptionをE){ // TODO自動生成されたブロックキャッチ e.printStackTrace(); }キャッチ(InterruptedExceptionあるE){ // TODO自動生成されたブロックキャッチ e.printStackTrace(); } } @Override 公共ボイドオープン(マップarg0に、TopologyContextのARG1、SpoutOutputCollectorコレクタ){ this.collector =コレクタ。 //读取文件 {試みる BR =新しいBufferedReaderの(新しいInputStreamReaderの(新規のFileInputStream( "F:/ TEMP /ストーム实时统计访问量/weblog.logを")))。 }キャッチ(にFileNotFoundException電子){ // TODO自動生成キャッチブロック e.printStackTrace(); } //别关流!!!! //最後に{ //もし(BR = nullを!){ //試し{ // br.close(); //}キャッチ(IOExceptionを電子){ // TODO自動生成されたcatchブロック // e.printStackTrace(); //} //} //} } @Override 公共ボイドdeclareOutputFields(ディクレアラーOutputFieldsDeclarer){ //声明 declarer.declare(新しい新しいフィールド( "ログ")); } //タプル成功したコールバック処理方法。カフカコールバックコールバック関数、ならびに飼育係コールバック関数プロセスような @Override 公共ボイドACK(オブジェクトarg0に){ // TODO自動生成方法、スタブ } //注ぎ口が、この方法は、故障モードが起動され呼び出された場合、およびコマンドの嵐は、[トポロジ名]、Linuxで同じ効果アクティブ @Override アクティベート(公共のボイド){ // TODO自動生成されたメソッドスタブが } 保証することはできません注ぎ口の前に実行されるプログラムを閉じて//実行さ殺す-9嵐のキルを行っていない実行されません @Override ます。public void利用クローズ(){ // TODO自動生成方法、スタブ } 注ぎ口の間に//失敗を、nextTupleは呼び出されませんし、嵐は、Linuxでのコマンドを無効にする[トポロジ名]と同じ効果 @Override 公共ボイド無効(){ // TODO自動生成方法スタブ } 処理方法//タプル障害コールバックを @Override 公共ボイドは(オブジェクトarg0に){失敗 // TODO自動生成方法スタブ } //配置 @Override パブリックマップの<string、オブジェクト> getComponentConfiguration(){ // TODO自動生成方法スタブ 戻りNULLと、 } }
2)スプリットボルト
ビジネスロジックの処理
セグメンテーションデータ
URLを取得するには
pvcountパッケージ; インポートjava.util.Map; インポートorg.apache.storm.task.OutputCollector; インポートorg.apache.storm.task.TopologyContext; インポートorg.apache.storm.topology.IRichBolt; インポートorg.apache.storm。 topology.OutputFieldsDeclarer; インポートorg.apache.storm.tuple.Fields; インポートorg.apache.storm.tuple.Tuple; インポートorg.apache.storm.tuple.Values; / ** * @authorドーン * @date 2019年6月5月7日10時30分38秒 * @version 1.0 *セグメンテーションデータ、URLを取得 * / 実装IRichBolt {PvCountSplitBoltパブリッククラスを プライベートOutputCollectorコレクター; プライベートpvnum int型= 0; //同時スレッドのサービスロジック分散クラスタは(受信次いで、処理されたタプル) @Override 空のパブリック(タプルINPUT){実行 //データを取得1.。 文字列= input.getStringByFieldライン( "ログ"); //区分データ・2 列[] = line.splitフィールド( "\ T"); 文字列SESSION_IDフィールド= [1]、 .. 3 //ローカル蓄積 IF(!SESSION_ID = NULL){ pvnum ++; //出力 collector.emit(新しい新しい値(にThread.currentThread()のgetId()、pvnum)); } } //初期化コール @Override 公共ボイド(arg0にマップTopologyContextのARG1、OutputCollectorコレクタ){PREPARE ; this.collector =コレクタ } //宣言 @Override {(ディクレアラーOutputFieldsDeclarer)公共ボイドdeclareOutputFieldsを //出力を宣言する declarer.declare(新しい新しいフィールドが(「スレッドID」、「pvnum」)); } リソースのクリーンアップを保証することはできませんコールがボルトがオフに来//呼ばれ @Override ます。public voidクリーンアップ(){ // TODO自動生成方法、スタブ } //設定 @Overrideが パブリックマップの<string、オブジェクト> getComponentConfiguration(){ //生成されるメソッドスタブTODO自動の 戻りNULL; } }
3)ボルト
合計の累積数
パッケージpvcount。 輸入java.util.HashMapを; インポートするjava.util.Iterator; 輸入java.util.Map; 輸入org.apache.storm.task.OutputCollector。 輸入org.apache.storm.task.TopologyContext; 輸入org.apache.storm.topology.IRichBolt。 輸入org.apache.storm.topology.OutputFieldsDeclarer。 輸入org.apache.storm.tuple.Tuple。 / ** * @authorドーン * @date 2019年6月7日午前10時39分52秒 * @version 1.0 *累加次数求和 * / IRichBolt {実装パブリッククラスPvCountSumBolt プライベートOutputCollectorコレクタを、 民間のHashMap <ロング、整数>ハッシュマップ=新しいHashMapの<>(); @Override 公共ボイドクリーンアップ(){ } @Override 公共ボイド実行(タプル入力){ //データを取得1。 ロングスレッドID = input.getLongByField( "のThreadID"); 整数pvnum = input.getIntegerByFieldを( "pvnum"); 2 //セットのストレージを作成する(スレッドID、 pvnum) hashmap.put(スレッドID、pvnum); //累積合計3(コレクション内のすべての値の値を取得するため)。。 ;イテレータ<整数> = hashmap.valuesイテレータ()イテレータ()。 // 4が空の前に。データ INTのSUM = 0; 一方(iterator.hasNext()){ SUM Iterator.next + =(); } System.err.println(にThread.currentThread()のgetName()+ "の合計- >" +和。 ); } @Override 公共ボイドPREPARE(arg0にマップTopologyContextのARG1、OutputCollectorコレクタ){ } @Override 公共ボイドdeclareOutputFields(ディクレアラーOutputFieldsDeclarer){ } @Override パブリックマップの<string、オブジェクト> getComponentConfiguration(){ // TODO自動生成方法スタブ 戻りヌル。 } }
4)ドライバ
フィールドのグループ化を使用します
pvcountパッケージ; インポートorg.apache.storm.Config; インポートorg.apache.storm.LocalCluster; インポートorg.apache.storm.topology.TopologyBuilder; インポートorg.apache.storm.tuple.Fields; / ** * @authorドーン * @date 2019インディアン6越7 Riを10時45分53秒 * 1.0 @versionサイトのトラフィックの統計情報(リアルタイム統計) * / パブリッククラスPvCountDriver { 公共の静的な無効メイン(文字列[] args){ // 1.トポロジの作成 TopologyBuilderを=新しい新しいTopologyBuilderビルダーを(); // 2.セット指定 (1 ,. "pvcountspout"、新たな新pvCountSpout())builder.setSpoutと、 builder.setBolt( "pvsplitbolt"、新たな新PvCountSplitBolt(),. 6).setNumTasks(4)。 fieldsGrouping( "pvcountspout"、 新新しいフィールド( "ログ")); builder.setBolt( "pvcountbolt"、新PvCountSumBolt()、1).fieldsGrouping( "pvsplitbolt"、 新フィールド( "スレッドID"、 "pvnum")); // 3.创建配置信息 コンフィグのconf =新しい設定(); conf.setNumWorkers(2)。 // 4.提交任务 LocalCluster localCluster =新しいLocalCluster(); localCluster.submitTopology( "pvcounttopology"、CONF、builder.createTopology()); } }
結果は以下の通りであります:
合計 190のデータ。そして、完了統計後にデータを追加します。プログラムは、統計情報を継続していきます