熱身題
服務器正在運轉着,也不知道這個技術可不可用,萬一服務器被弄崩了,那損失可不小。
因此, 決定在虛擬機上試驗一下,不當心弄壞了也不要緊。須要在的電腦上裝上虛擬機和linux系統
安裝虛擬機(可參考Vmware、Virtual Box等)
安裝ubuntu系統(推薦安裝16.04版本)
寫一個helloworld程序,在ubuntu系統上編譯運行
(你可能須要瞭解linux系統的終端和一些基本命令、文本編輯工具nano、如何編譯代碼、運行程序)html
- 1.安裝虛擬機Vmware:在官網下載頁面選擇workstation pro,下載並安裝。

運行workstation pro節目以下
python
基本題
瞭解新技術
衆多sketch的技術中,Count-min sketch 經常使用也並不複雜,但你可能須要稍微瞭解一點點散列的知識。從它入手不失爲一個好選擇,把它記錄在你的技術博客上:linux
- 1.簡單描述什麼是sketch
- sketch是基於哈希的數據結構,經過合理設置哈希函數(也稱散列函數),在將數據進行哈希運算後(可能包含屢次哈希運算,即多重哈希,目的是提升精確度),將具備相同哈希值的鍵值數據存入相同的特定區域內,以減小空間開銷。將各個區域內的數據值做爲測量結果,存在必定的偏差,但可使用各類方式減少偏差。
- 2.描述Count-min sketch的算法過程
- 摘自維基百科:In computing, the count–min sketch (CM sketch) is a probabilistic data structure that serves as a frequency table of events in a stream of data. It uses hash functions to map events to frequencies, but unlike a hash table uses only sub-linear space, at the expense of overcounting some events due to collisions.( 在計算中,count-min sketch(CM sketch)是一種機率數據結構,用做數據流中事件的頻率表。它使用散列函數將事件映射到頻率,但不像散列表僅使用子線性空間,代價是因爲衝突致使一些事件過分計數。)
- 目的:統計一個實時的數據流中元素出現的頻率,而且準備隨時回答某個元素出現的頻率,不須要的精確的計數。
- 技巧:由於儲存全部元素的話太耗費內存空間,全部不存儲全部的不一樣的元素,只存儲它們Sketch的計數。
- 實現大體過程:
- 創建一個1~x的數組,做爲儲存計數的載體。
- 對於一個新元素,哈希到0~x中的一個數x0,做爲該元素的數組索引。
- 查詢元素出現頻率時,返回元素對於數組索引中儲存的數便可。
實現新技術(30')
大體瞭解了Count-min sketch,接下來就須要實現它了。本着不須要重複造輪子的思想,你上github一查,果真發現了相關代碼。
並不須要深入理解代碼,你只須要會用,你的目標是在虛擬機上跑通Count-min sketch:c++
- 1.克隆一種版本(python或者c語言)的代碼,大體瞭解如何使用這個代碼,在ubuntu系統上編譯。本身任意編寫一個小測試,成功運行這個代碼。
經過pip安裝countminsketch0.2
git
在GitHub上找到了一個countminsketch項目
github
- 由於代碼比較久遠,須要把xrange()函數更替爲range()函數
- 出現Unicode-objects must be encoded before hashing問題時,發現是update() 方法必須指定要指定編碼格式,不然會報錯。應在update()內添加.encode("utf8")
- 在網絡上下載《飄》的英文版
編寫程序,統計文中的地名「tala」的出現次數
算法
運行成程序三次,結果分別爲
ubuntu
2.你也能夠本身實現Count-min sketch。數組
獲取用戶請求(15')
如今須要獲取用戶的請求信息,其實請求就是網絡傳輸的數據包,可使用本身的網絡環境來模擬服務器的請求,使用工具來捕獲這個數據包:緩存
測試新技術
完事具有,只欠東風:
- 用跑通的Count-min sketch程序讀文件,得到最後的處理結果,請求大小超過閾值T認定爲黑客,此處T本身定義。對於你所完成題目,把實現思路和實現結果記錄在博客中,把代碼提交到github的倉庫上。
稍微改造一下第二次做業中的代碼,添加了count-min sketch算法
開放題(50')
- 理論部分(25')
- 實驗部分(25')
- 1.here-->整合了兩個步驟,減小了代碼讀寫,由packet_capture直接獲得結果
- 改進中的問題:
- 整合後代碼的運算結果與原來的結果有出入,可能的緣由是原算法的第一步篩選過程當中錯誤篩除了一些內容。

- 新程序出現了一些莫名其妙的數組越界錯誤,但檢查後並未發現packet_capture.txt中有存在單行內容由於無空格以致於split()函數沒法分割的問題。因此加了一個len(list())>a繞開這個問題
- 2.實時處理請求還未能實現,
- 主要障礙有:
- 是不懂得如何在程序中啓動tcpdump進行抓包
- 由於Ubuntu虛擬機上py配置出了一些問題,不得已將packet_capture.txt文件移動到win10下進行處理
- 對這部分的一些想法:
- 基本流程應該是:
- 數據生成->實時採集->將數據保存在緩存中->實時計算->計算結果存儲->被查詢
- 引入一些大數據處理框架。大數據處理系統可分爲批式大數據和流式大數據兩類。其中,批式大數據又被稱爲歷史大數據,流式大數據又被稱爲實時大數據。流式大數據系統包括了:Spark Streaming、Storm、Flink等
- 能否模仿CentOS與wireshark之間利用PIPE接口實現數據從虛擬機上實時拷貝到win系統中進行處理
- 這篇文章中提到了關於python調用tcpdump的相關內容