1. 程式人生 > >大規模資料處理漫談【2】

大規模資料處理漫談【2】

   上回說到了磁碟的一些特性,感覺不說說檔案不太妥。以及對比檔案系統和raw device的優劣。

   在目前的各種檔案系統中,JFS是一種比較適合大規模資料處理的檔案系統,但常用的依然是ext2,ext3. 不同的檔案系統受到特定業務的影響在保持通用的前提下,各有側重,下面談談主要優化需要考慮的問題:

   檔案系統都要求整塊讀寫磁碟的,按照block size = 4K為例,如果需要在一個塊上寫1K資料,則首先需要從磁碟將這個塊讀入記憶體,在記憶體中寫入1K資料(看做是合併塊中其他資料),再回寫磁碟。顯然如果寫的是4K資料,且恰好是寫在一個塊上的,則系統就免去讀入記憶體和合並的開銷,因此我們一般一次寫入儘可能多,例如寫入10K,則有可能是前兩個是整塊寫,而後一個是半塊寫,半塊寫的額外代價攤下來就不顯的很多。
 
   由於尋道時間是磁碟訪問代價中最大的一塊,而且道次跳得越大代價越高,因此我們希望檔案所包含的塊(fileplace命令檢視)儘可能連續,而檔案系統也是這麼做得,但遺憾的是無論怎樣,檔案也會向不連續的方向發展,特別是系統中各種檔案大量建立,追加,刪除後。因此在磁碟長期使用後,明明檔案是順序讀寫,但實際上已經是隨機讀寫。這叫做檔案碎片。

   如果事先知道結果檔案的大小預分配是很好的選擇,怎樣快速建立一個大檔案呢?
   這裡有個快速的方法:
   int fd = open("./file", O_RDWR|O_CREAT|O_TRUNC,00777);
   off64_t set = 5*G;
   lseek64(fd,set,SEEK_SET);
   write(fd,"/0",1);
   然而遺憾的是,這樣的做法分配的是一個空洞檔案(稀疏檔案),這個貌似5G的檔案大小其實並沒有申請到真正的磁碟塊,只有在實際寫入的時候才會分配,BDB的臨時檔案db00x就是這麼創建出來的,這也是BDB慢的一個重要原因。
   怎麼快速建立一個真正的大檔案呢?我留一個問題,請大家回答。
   另外附帶的一個問題是,為什麼寫磁碟比讀磁碟要慢,慢在哪裡,如果去掉這一部分是否可以加快寫的速度?
  
   檔案系統無論如何也很難滿足業務上的需要,大部分情況下需要直接處理raw device。或者說自己按照業務需要對裸裝置進行格式化,建立自己的特定讀寫系統。
   比如這樣一個場景,需要對每一天的資料(key,value pair)寫入raw device, key都是定長而value大小各異。如果把key,data 看做二維,看成如下矩形:
  
   date(近 ---------------------------->遠)
   -------------------------------------------
key|  A |  B
   |----|---------------------------------C
   |    |
   |    |
   -------------------------------------------
   不難理解越近的日期訪問頻率越高(A區訪問的概率遠大約B區,A區為熱區),而某些key會在一個長的日期範圍內長期使用(線C是訪問熱點,叫做熱線吧)。

   首先我們系統資料按照日期的順序進行存放,條件允許的話,越近日期的資料放在距離raw device 零位置越近的區域,資料在順序讀寫時均不會出現躍2個磁軌以上的情況。在業務上這種順序讀寫是顯然的,大量的,資料按天生產,按天處理寫入,使用(讀)也多為按天處理。隨機讀寫也多發生於A區,A區所佔的道次比較有限,因此跳躍的道次也一般較少。不跳的概率較高。C線也很有趣,比如順序讀取某個key,全部天數的資料,則無論由近讀到遠或者由遠讀到近,道次都好像電梯一樣升降,不會來回跑,因此開銷也是很小的,當然與A區相比,想盡可能不跳只轉是不可能的了。

   但如何解決value大小各異的問題呢?外部需要哪些索引呢?raw device怎麼copy呢,怎麼備份呢?在容量不夠時如何擴充套件呢?在享受了raw device的好處後,還需要解決很多這些細節的問題,需要在實際的環境中更多實踐。

相關推薦

大規模資料處理漫談2

   上回說到了磁碟的一些特性,感覺不說說檔案不太妥。以及對比檔案系統和raw device的優劣。    在目前的各種檔案系統中,JFS是一種比較適合大規模資料處理的檔案系統,但常用的依然是ext2,ext3. 不同的檔案系統受到特定業務的影響在保持通用的前提下,各有側重

大規模資料處理漫談1

當然也是我發的了,以後我計劃在這裡以及我的另外一個部落格 繼續該連載,希望廣大網友關注,感興趣的網頁可以轉載,不註明也沒關係,我只是希望推廣大規模資料處理技術,如果能對大家學習工作有所幫助,十分欣慰。 我此前寫過《走進搜尋引擎》,翻譯了《Managing gigabyte

利用Python學習資料探勘2

本文結合程式碼例項待你上手python資料探勘和機器學習技術。   本文包含了五個知識點: 1. 資料探勘與機器學習技術簡介   2. Python資料預處理實戰   3. 常見分類演算法介紹  

2信息的表示和處理

float 執行 單獨 因此 com alt 卡片 acl AC 1.現代計算機存儲和處理的信息都以二值信號表示。 2.機器為什麽要使用二進制進行存儲和處理? 答:二值信號能夠很容易的被表示、存儲、傳輸。例如: 可以表示為穿孔卡片上有洞和無洞、導線上的高壓和低壓,順逆

2Caffe學習系列:資料層及引數

要執行caffe,需要先建立一個模型(model),如比較常用的Lenet,Alex等, 而一個模型由多個屋(layer)構成,每一屋又由許多引數組成。所有的引數都定義在caffe.proto這個檔案中。要熟練使用caffe,最重要的就是學會配置檔案(prototxt)的編寫。 層有很多種型別,

2Caffe學習系列(11):影象資料轉換成db(leveldb/lmdb)檔案

在深度學習的實際應用中,我們經常用到的原始資料是圖片檔案,如jpg,jpeg,png,tif等格式的,而且有可能圖片的大小還不一致。而在caffe中經常使用的資料型別是lmdb或leveldb,因此就產生了這樣的一個問題:如何從原始圖片檔案轉換成caffe中能夠執行的db(l

大話資料結構2—演算法

  經常聽他們吹牛逼,這個用了什麼什麼牛逼的演算法,起了一個牛哄哄的名字,反正挺嚇人人的,不知道為什麼,現在給新東西起名字是越來越“嚇人了”!   其實演算法就是解決特定問題的求解步驟,在計算機中表現為指令的有限序列。沒有什麼嚇人的東西,只是它的思想很精妙,有些作者可能是為

Servlet學習筆記2---Http資料

本文主要講Http協議相關知識。 1 Http協議特點 單向性:客戶端和服務端是單向通訊的,只有客戶端發請求,服務端才會響應產生。(異於推送模式) 無狀態:協議本身並沒有狀態的記錄,當客戶端多次訪問伺服器時,服務端並不知道你曾經訪問。STP協議是有狀態的(即客戶端連線服務端後,服務端會記錄連線狀態,下次連結繼

Socket學習2——持續接收資料

持續接收資料 伺服器端 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Sys

圖解 Spring:HTTP 請求的處理流程與機制2

2. HTTP 請求在 Web 容器中的處理流程 Web 容器以程序的方式在計算機上執行,我們知道程序是系統資源分配的最小單元,執行緒是系統任務執行的最小單元。從這個角度看,Web 容器就像是郵包收件人所居住的樓宇或小區,HTTP 這套物流快遞體系只能將郵包投遞到樓宇前臺或者小區物業等處,而樓宇前臺或小區物業

Spring-Security2DelegatingFilterProxy

pat security clas 添加 chain let XML org mapping Spring Security 對我們應用的影響是通過一系列的 ServletRequest 過濾器實現的。 Spring Security 使用了 o.s.web.filter

2JVM-JAVA對象的訪問

lin oar XML nts java棧 article value new string Java中對象的訪問 JAVA是面向對象的語言,那麽在JAVA虛擬機中,存在非常多的對象,對象訪問是無處不在的。即時是最簡單的訪問,也會涉及到JAVA棧、JAVA堆、方法區

Android組件系列----ContentProvider內容提供者2

resolv blank lan int 復制 pad otto rtp wrap 二、代碼舉例: 終於全部project文件的文件夾結構例如以下: PersonDao是增刪改查數據庫的工具類,並在PersonContentProvider中得到調用。DBHe

quick-cocos2d-x遊戲開發2——項目結構分析、創建新場景

fileutil 遊戲 log world plain ack 設計 avi sca 創建完一個新項目之後,我們能夠簡單的看一看這個項目的文件組成,有這麽一個文件層次結構 幾個proj.*目錄就不用說了,是相應的平臺的解決方式,res專門存放我們的遊戲資源

Cocos2d-x v3.0正式版嘗鮮體驗2 Android平臺移植

生成 ble ack nts 做的 導入 eclipse so文件 腳本 今天沒事又嘗試了下3.0正式版關於Android平臺的移植,把新建的項目移植了下。過程僅用了十分鐘左右,什麽概念?!好吧,事實上我想說,這個版本號真的移植非常輕松啊,只是還沒加上其它東西,只是就眼

java持有對象2ArrayList容器續解

對象 符號 向上 ont 轉換 選擇 同時 是什麽 object 此為JDK API1.6.0對ArrayList的解釋。 ArrayList 使用java泛型創建類很復雜,但是應用預定義的泛型很簡單。例如,要想定義用來保存Apple對象的ArrayList,可以聲明

Fiddler抓包2_捕獲設置

from lang 請求 user src file ati 允許 iphone 1、Fiddler抓web網站請求 手動設置方法一:Tools--->WinINET Options--->連接--->局域網設置--->代理服務器勾選後“高級

Linux(Centos )的網絡內核參數優化來提高服務器並發處理能力

正在 數量 庫服務器 sdn 正常 般的 優化 trie 字數 簡介 提高服務器性能有很多方法,比如劃分圖片服務器,主從數據庫服務器,和網站服務器在服務器。但是硬件資源額定有限的情況下,最大的壓榨服務器的性能,提高服務器的並發處理能力,是很多運維技術人員思考的問題。要提高

LeetCode數組類的題目提交記錄 2

targe result 有序 suppose middle size body some 遞歸 /***********************************************************************33. Search in Ro

DOM案例2註冊文本倒計時

元素 text disable als har www .org document www. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/h