嵐のビッグデータ学習リアルタイム統計サイトでは、ケース35を訪問します

ケース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のデータ。そして、完了統計後にデータを追加します。プログラムは、統計情報を継続していきます

 

おすすめ

転載: www.cnblogs.com/hidamowang/p/10987864.html