[轉]資料分析與處理之二:Leveldb 實現原理
鄭重宣告:本篇部落格是自己學習 Leveldb 實現原理時參考了郎格科技系列部落格整理的,原文地址:
LevelDb日知錄之一:LevelDb 101
說起LevelDb也許您不清楚,但是如果作為IT工程師,不知道下面兩位大神級別的工程師,那您的領導估計會Hold不住了:Jeff Dean和Sanjay Ghemawat。這兩位是Google公司重量級的工程師,為數甚少的Google Fellow之二。
LevelDb就是這兩位大神級別的工程師發起的開源專案,簡而言之,LevelDb是能夠處理十億級別規模Key-Value型資料永續性儲存的C++ 程式庫。正像上面介紹的,這二位是Bigtable的設計和實現者,
LevelDb有如下一些特點:
首先,LevelDb是一個持久化儲存的KV系統,和Redis這種記憶體型的KV系統不同,LevelDb不會像Redis一樣狂吃記憶體,而是將大部分資料儲存到磁碟上。
其次,LevleDb在儲存資料時,
再次,像大多數KV系統一樣,LevelDb的操作介面很簡單,基本操作包括寫記錄,讀記錄以及刪除記錄。也支援針對多條操作的原子批量操作。
另外,LevelDb支援資料快照(snapshot)功能,使得讀取操作不受寫操作影響,可以在讀操作過程中始終看到一致的資料。
除此外,LevelDb還支援資料壓縮等操作,這對於減小儲存空間以及增快IO效率都有直接的幫助。
LevelDb效能非常突出,官方網站報道其隨機寫效能達到40
LevelDb日知錄之二:整體架構
LevelDb本質上是一套儲存系統以及在這套儲存系統上提供的一些操作介面。為了便於理解整個系統及其處理流程,我們可以從兩個不同的角度來看待LevleDb:靜態角度和動態角度。從靜態角度,可以假想整個系統正在執行過程中(不斷插入刪除讀取資料),此時我們給LevelDb照相,從照片可以看到之前系統的資料在記憶體和磁碟中是如何分佈的,處於什麼狀態等;從動態的角度,主要是瞭解系統是如何寫入一條記錄,讀出一條記錄,刪除一條記錄的,同時也包括除了這些介面操作外的內部操作比如compaction,系統執行時崩潰後如何恢復系統等等方面。
本節所講的整體架構主要從靜態角度來描述,之後接下來的幾節內容會詳述靜態結構涉及到的檔案或者記憶體資料結構,LevelDb日知錄後半部分主要介紹動態視角下的LevelDb,就是說整個系統是怎麼運轉起來的。
LevelDb作為儲存系統,資料記錄的儲存介質包括記憶體以及磁碟檔案,如果像上面說的,當LevelDb運行了一段時間,此時我們給LevelDb進行透視拍照,那麼您會看到如下一番景象:
圖1.1:LevelDb結構
從圖中可以看出,構成LevelDb靜態結構的包括六個主要部分:記憶體中的MemTable和Immutable MemTable以及磁碟上的幾種主要檔案:Current檔案,Manifest檔案,log檔案以及SSTable檔案。當然,LevelDb除了這六個主要部分還有一些輔助的檔案,但是以上六個檔案和資料結構是LevelDb的主體構成元素。
LevelDb的Log檔案和Memtable與Bigtable論文中介紹的是一致的,當應用寫入一條Key:Value記錄的時候,LevelDb會先往log檔案裡寫入,成功後將記錄插進Memtable中,這樣基本就算完成了寫入操作,因為一次寫入操作只涉及一次磁碟順序寫和一次記憶體寫入,所以這是為何說LevelDb寫入速度極快的主要原因。
Log檔案在系統中的作用主要是用於系統崩潰恢復而不丟失資料,假如沒有Log檔案,因為寫入的記錄剛開始是儲存在記憶體中的,此時如果系統崩潰,記憶體中的資料還沒有來得及Dump到磁碟,所以會丟失資料(Redis就存在這個問題)。為了避免這種情況,LevelDb在寫入記憶體前先將操作記錄到Log檔案中,然後再記入記憶體中,這樣即使系統崩潰,也可以從Log檔案中恢復記憶體中的Memtable,不會造成資料的丟失。
當Memtable插入的資料佔用記憶體到了一個界限後,需要將記憶體的記錄匯出到外存檔案中,LevleDb會生成新的Log檔案和Memtable,原先的Memtable就成為Immutable Memtable,顧名思義,就是說這個Memtable的內容是不可更改的,只能讀不能寫入或者刪除。新到來的資料被記入新的Log檔案和Memtable,LevelDb後臺排程會將Immutable Memtable的資料匯出到磁碟,形成一個新的SSTable檔案。SSTable就是由記憶體中的資料不斷匯出並進行Compaction操作後形成的,而且SSTable的所有檔案是一種層級結構,第一層為Level 0,第二層為Level 1,依次類推,層級逐漸增高,這也是為何稱之為LevelDb的原因。
SSTable中的檔案是Key有序的,就是說在檔案中小key記錄排在大Key記錄之前,各個Level的SSTable都是如此,但是這裡需要注意的一點是:Level 0的SSTable檔案(字尾為.sst)和其它Level的檔案相比有特殊性:這個層級內的.sst檔案,兩個檔案可能存在key重疊,比如有兩個level 0的sst檔案,檔案A和檔案B,檔案A的key範圍是:{bar, car},檔案B的Key範圍是{blue,samecity},那麼很可能兩個檔案都存在key=”blood”的記錄。對於其它Level的SSTable檔案來說,則不會出現同一層級內.sst檔案的key重疊現象,就是說Level L中任意兩個.sst檔案,那麼可以保證它們的key值是不會重疊的。這點需要特別注意,後面您會看到很多操作的差異都是由於這個原因造成的。
SSTable中的某個檔案屬於特定層級,而且其儲存的記錄是key有序的,那麼必然有檔案中的最小key和最大key,這是非常重要的資訊,LevelDb應該記下這些資訊。Manifest就是幹這個的,它記載了SSTable各個檔案的管理資訊,比如屬於哪個Level,檔名稱叫啥,最小key和最大key各自是多少。下圖是Manifest所儲存內容的示意:
圖2.1:Manifest儲存示意圖
圖中只顯示了兩個檔案(manifest會記載所有SSTable檔案的這些資訊),即Level 0的test.sst1和test.sst2檔案,同時記載了這些檔案各自對應的key範圍,比如test.sstt1的key範圍是“an”到 “banana”,而檔案test.sst2的key範圍是“baby”到“samecity”,可以看出兩者的key範圍是有重疊的。
Current檔案是幹什麼的呢?這個檔案的內容只有一個資訊,就是記載當前的manifest檔名。因為在LevleDb的執行過程中,隨著Compaction的進行,SSTable檔案會發生變化,會有新的檔案產生,老的檔案被廢棄,Manifest也會跟著反映這種變化,此時往往會新生成Manifest檔案來記載這種變化,而Current則用來指出哪個Manifest檔案才是我們關心的那個Manifest檔案。
以上介紹的內容就構成了LevelDb的整體靜態結構,在LevelDb日知錄接下來的內容中,我們會首先介紹重要檔案或者記憶體資料的具體資料佈局與結構。
LevelDb日知錄之三:log檔案
上節內容講到log檔案在LevelDb中的主要作用是系統故障恢復時,能夠保證不會丟失資料。因為在將記錄寫入記憶體的Memtable之前,會先寫入Log檔案,這樣即使系統發生故障,Memtable中的資料沒有來得及Dump到磁碟的SSTable檔案,LevelDB也可以根據log檔案恢復記憶體的Memtable資料結構內容,不會造成系統丟失資料,在這點上LevelDb和Bigtable是一致的。
下面我們帶大家看看log檔案的具體物理和邏輯佈局是怎樣的,LevelDb對於一個log檔案,會把它切割成以32K為單位的物理Block,每次讀取的單位以一個Block作為基本讀取單位,下圖展示的log檔案由3個Block構成,所以從物理佈局來講,一個log檔案就是由連續的32K大小Block構成的。
圖3.1 log檔案佈局
在應用的視野裡是看不到這些Block的,應用看到的是一系列的Key:Value對,在LevelDb內部,會將一個Key:Value對看做一條記錄的資料,另外在這個資料前增加一個記錄頭,用來記載一些管理資訊,以方便內部處理,圖3.2顯示了一個記錄在LevelDb內部是如何表示的。
圖3.2 記錄結構
記錄頭包含三個欄位,ChechSum是對“型別”和“資料”欄位的校驗碼,為了避免處理不完整或者是被破壞的資料,當LevelDb讀取記錄資料時候會對資料進行校驗,如果發現和儲存的CheckSum相同,說明資料完整無破壞,可以繼續後續流程。“記錄長度”記載了資料的大小,“資料”則是上面講的Key:Value數值對,“型別”欄位則指出了每條記錄的邏輯結構和log檔案物理分塊結構之間的關係,具體而言,主要有以下四種類型:FULL/FIRST/MIDDLE/LAST。
如果記錄型別是FULL,代表了當前記錄內容完整地儲存在一個物理Block裡,沒有被不同的物理Block切割開;如果記錄被相鄰的物理Block切割開,則型別會是其他三種類型中的一種。我們以圖3.1所示的例子來具體說明。
假設目前存在三條記錄,Record A,Record B和Record C,其中Record A大小為10K,Record B 大小為80K,Record C大小為12K,那麼其在log檔案中的邏輯佈局會如圖3.1所示。Record A是圖中藍色區域所示,因為大小為10K<32K,能夠放在一個物理Block中,所以其型別為FULL;Record B 大小為80K,而Block 1因為放入了Record A,所以還剩下22K,不足以放下Record B,所以在Block 1的剩餘部分放入Record B的開頭一部分,型別標識為FIRST,代表了是一個記錄的起始部分;Record B還有58K沒有儲存,這些只能依次放在後續的物理Block裡面,因為Block 2大小隻有32K,仍然放不下Record B的剩餘部分,所以Block 2全部用來放Record B,且標識型別為MIDDLE,意思是這是Record B中間一段資料;Record B剩下的部分可以完全放在Block 3中,型別標識為LAST,代表了這是Record B的末尾資料;圖中黃色的Record C因為大小為12K,Block 3剩下的空間足以全部放下它,所以其型別標識為FULL。
從這個小例子可以看出邏輯記錄和物理Block之間的關係,LevelDb一次物理讀取為一個Block,然後根據型別情況拼接出邏輯記錄,供後續流程處理。
LevelDb日知錄之四:SSTable檔案
SSTable是Bigtable中至關重要的一塊,對於LevelDb來說也是如此,對LevelDb的SSTable實現細節的瞭解也有助於瞭解Bigtable中一些實現細節。
本節內容主要講述SSTable的靜態佈局結構,我們曾在“LevelDb日知錄之二:整體架構”中說過,SSTable檔案形成了不同Level的層級結構,至於這個層級結構是如何形成的我們放在後面Compaction一節細說。本節主要介紹SSTable某個檔案的物理佈局和邏輯佈局結構,這對了解LevelDb的執行過程很有幫助。
LevelDb
鄭重宣告:本篇部落格是自己學習 Leveldb 實現原理時參考了郎格科技系列部落格整理的,原文地址:LevelDb日知錄之一:LevelDb 101 說起LevelDb也許您不清楚,但是如果作為IT工程師,不知道下面兩位大神級別的工程師,那您的領導估計會Hold不住了:Je 經過了資料採集和同步之後,就可以在阿里雲上進行資料分析和處理,來玩轉您的資料了。本文向您介紹在阿里雲大資料各產品中,以及各產品之間怎樣來完成您的資料處理和資料分析。
MaxCompute
基於MaxCompute的大資料計算(MaxCompute + RDS)
使用MaxCompute分析IP
資料分析之表示
NumPy庫入門
資料的維度
一維資料
一維資料由對等關係的有序或無序資料構成,採用線性方式組織。
例如:3.1413, 3.1398, 3.1404, 3.1401, 3.1349, 3.1376。
對應列
目錄
資料整合
簡單變換
資料整合
#資料整合
import numpy
a=numpy.array([[1,5,6],[9,4,3]])
b=numpy.array([[6,36,7],[2,3,39]])
c=numpy.conca
上文中我們實現了一個非常簡單的功能:點選按鈕關閉應用。不過那種呼叫connect函式的寫法是在QT程式設計中常用的(用C++語言寫QT應用),顯得中規中矩,我們這裡是PyQt,自然要來一種PyQt的寫法,我們先看程式碼:
import sys
from P
MySQL的EXPLAIN命令用於SQL語句的查詢執行計劃(QEP)。這條命令的輸出結果能夠讓我們瞭解MySQL 優化器是如何執行SQL 語句的。這條命令並沒有提供任何調整建議,但它能夠提供重要的資訊幫助你做出調優決策。
語法
MySQL 的EXPLAIN 語法可以執行在SELECT 語句或者特定表上。
LevelDb日知錄之一:LevelDb 101
說起LevelDb也許您不清楚,但是如果作為IT工程師,不知道下面兩位大神級別的工程師,那您的領導估計會Hold不住了:Jeff Dean和Sanjay Ghemawat。這兩位是Google公司重量級的工程師,為數甚少的Google Fel
資料探索的目的是及早發現數據的一些簡單規律或特徵,資料清洗的目的是留下可靠的資料,避免髒資料的干擾。
這兩者沒有嚴格的先後順序,經常在一個階段進行。
&nb
深入PCI與PCIe之二:軟體篇
https://zhuanlan.zhihu.com/p/26244141
我們前一篇文章(
深入PCI與PCIe之一:硬體篇 - 知乎專欄)介紹了PCI和PCIe的硬體部分。本篇主要介紹PCI和PCIe的軟體介面和UEFI對P
聚類不指定類別進行分類
(劃分(分裂)法,層次分析法、密度分析法)、網格法、模型法
Kmeans演算法屬於分裂法
隨機選擇k各點作為聚類中心
計算各個點到這K個點的距離
將對應的點聚到與它最近的這個聚類中心
重新
程式碼中有詳細的註釋
訓練檔案: Txt檔案中為0,1矩陣,將圖片轉換為0,1矩陣見上一篇部落格方法
import numpy
import operator
from os import listdir
class Bayes:
def __init__(self):
一.分析
異常值分析是檢驗資料是否有錄入錯誤以及含有不合常理的資料。忽視異常值的存在是十分危險的,不加剔除地把異常值包括進資料的計算分析過程中,會給結果帶來不良影響;重視異常值的出現,分析其產生的原因,常常成為發現問題改進決策的契機。
異常值是指樣本中的個別值,其數值明顯偏移其餘的觀測值。異
1 二叉搜尋樹(BSTree)的概念
二叉搜尋樹又被稱為二叉排序樹,那麼它本身也是一棵二叉樹,那麼滿足以下性質的二叉樹就是二叉搜尋樹,如圖:
若左子樹不為空,則左子樹上所有節點的值都小於根節點的值;
若它的右子樹不為空,則它的右子樹上所有節點的值都大於
視訊解析 https://edu.csdn.net/course/play/7813
假定,你要為你的生日聚會邀請你的朋友和親戚。對此,你需要給他們打電話。你正在擁有10,000條記錄的電話本中查詢名為Steve的電話號碼。然而,電話本中的
首選方法二!
方法一:寫一個內部類,在類中實現點選事件
1、在父類中呼叫點選事件
bt_dail.setOnClickListener(new MyButtonListener());
2、建立內部類
private class MyButtonListener
//圖的鄰接矩陣實現
//廣度遍歷bfs和深度遍歷dfs
//構造最小生成樹的prim、kruskal演算法
#include <iostream>
#include<stack>
#include<queue>
#define WEI
棧是一種常用資料結構,其特性是FILO(first in last out),其基本概念這裡不做介紹,相信都學過了。直接食用java中已經封裝好Stack<>類。
棧的效率:入棧出棧複雜度為O(1),不需要比較和移動操作。
案例1:單詞逆序
比
在上一篇中,我們以經介紹了程式的流程和框架,在本篇將詳細討論各個功能的實現主要包括1.獲取磁碟資訊2.獲取目錄資訊3.獲取檔案資訊4.執行指定檔案5.刪除指定檔案6.刪除指定目錄7.建立指定目錄8.上傳下載檔案9.獲取遠端檔案圖示獲取磁碟資訊磁碟資訊可以用API GetDri
開發執行環境:JDevloper 11.1.2.4.0+ Oracle Database 11gR2 XE本文最後一次修改日期:2013-07-01在Fusion Order Demo的StandaloneExamples中的AdvancedViewObjectsExamp
資料結構和演算法,本身就是要解決 “快” 和 “省” 的問題。考量的指標分別就是 “時間複雜度” 和 “空間複雜度”。
時間複雜度表示程式碼執行時間隨著資料規模增長的變化趨勢,也叫漸進時間複雜度。
空間複雜度,全稱漸進空間複雜度,表示演算法的儲存空間和資料規模之間的增長關 相關推薦
[轉]資料分析與處理之二:Leveldb 實現原理
玩轉大資料系列之二:資料分析與處理
python進階之資料分析與展示(二)
資料分析與挖掘之資料預處理
PyQt之玩轉signal(訊號)與slot(槽)二:新增自定義槽
分析診斷工具之二:Explain結果解讀與實踐
資料分析與處理 -- Leveldb 實現原理
python資料分析與挖掘之資料清洗
[知乎]老狼:深入PCI與PCIe之二:軟體篇
python資料分析與挖掘之聚類kmeans演算法
python資料分析與挖掘之貝葉斯演算法演算法實現
異常資料分析與處理
資料結構與演算法之二叉搜尋樹插入、查詢與刪除
資料結構與演算法之二 排序
事件處理之二:點選事件監聽器的五種寫法
(c++)資料結構與演算法之圖:鄰接矩陣、深度廣度遍歷、構造最小生成樹(prim、kruskal演算法)
資料結構與演算法之二(棧常見案例)
c++實現檔案傳輸之二:功能實現
VO高階使用技巧之二:程式設計實現基於Ref Cursor的VO
資料結構與算法系列課程之二:複雜度分析(上)