2019寒假訓練營第三次做業part2 - 實驗題

熱身題

服務器正在運轉着,也不知道這個技術可不可用,萬一服務器被弄崩了,那損失可不小。
因此, 決定在虛擬機上試驗一下,不當心弄壞了也不要緊。須要在的電腦上裝上虛擬機和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')

如今須要獲取用戶的請求信息,其實請求就是網絡傳輸的數據包,可使用本身的網絡環境來模擬服務器的請求,使用工具來捕獲這個數據包:緩存

  • 1.安裝並使用抓包工具tcpdump
  • 2.輸入tcpdump -n 獲取數據包的信息
    • 在這部分中,由於Ubuntu的版本緣由,卡了好久。最後改爲Ubuntu16.04後才能順利抓包。>_<
    • 原本是像抓100000條內容的,但由於種種緣由,不得已中斷了兩次,最後只有80000多條
  • 3.使用linux 重定向的方法把該信息用文本文件存起來,文件命名爲 pakcet_capture.txt。

  • 編寫一個py程序,處理獲得的數據

  • 獲得的Request.txt

測試新技術

完事具有,只欠東風:

  • 用跑通的Count-min sketch程序讀文件,得到最後的處理結果,請求大小超過閾值T認定爲黑客,此處T本身定義。對於你所完成題目,把實現思路和實現結果記錄在博客中,把代碼提交到github的倉庫上。
    稍微改造一下第二次做業中的代碼,添加了count-min sketch算法

開放題(50')

  • 理論部分(25')
    • 解釋爲何 sketch 能夠省空間
      • count-min sketch算法使用了hash函數,經過壓縮映射,使得散列值的空間遠遠小於輸入值的空間。
    • 用流程圖描述Count-min sketch的算法過程

    • 拿它和你改進後方法進行對比,分析優劣
      • 優勢:引入了count-min sketch後,很大程度上減少了空間佔用和處理速度。
      • 缺點:
        • 多是筆者不是很懂count-min sketch算法中m,d值的設置,抑或是算法自己的緣由,獲得的數據不甚準確,每次計算獲得的值基本不一樣。但由於是針對大致量數據進行的計算,一些偏差能夠看淡甚至忽略不計。但如果對較少數據量的計算,偏差則會嚴重影響精度(例如本文中給出的,對《飄》中地名的統計,難以獲得較爲準確的數據)
    • 吐槽Count-min sketch
      • 筆者在GitHub上找到的代碼過於久遠,py中的xrange()函數已經被棄用了,須要手動改爲range()。
      • readme文件有些地方說得晦澀難懂,花了一些功夫才搞懂怎麼使用。
  • 實驗部分(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的相關內容
相關文章
相關標籤/搜索