數據的列式與行式存儲以及大數據的存儲格式


一、數據的列式與行式存儲

1、列式存儲是相對於傳統關系型數據庫的行式存儲來說的。兩者的區別就是如何組織表;從下圖可知,行式存儲是將數據的一條記錄(多列組成)存儲起來的,但是列式存儲是將數據的一條記錄的各列分開進行存儲。

    

 

2、區別

(1)數據寫入區別

  1)行存儲的寫入是一次完成。可以保證寫入過程的成功或者失敗,數據的完整性因此可以確定。

  2)列存儲由於需要把一行記錄拆分成單列保存,寫入次數明顯比行存儲多(意味着磁頭調度次數多,而磁頭調度是需要時間的,一般在1ms~10ms),再加上磁頭需要在磁盤片上移動和定位花費的時間,故行存儲在寫入上占有很大的優勢。

  3)對於數據修改,其實也是數據寫入過程。不同的是,數據修改是對磁盤上的記錄做刪除標記。行存儲是在指定位置寫入一次,列存儲是將磁盤定位到多個列上分別寫入,這個過程仍是行存儲的列數倍。所以,數據修改也是以行存儲占優。

(2)數據讀取的區別

  1)數據讀取時,行存儲是將一行數據完全讀出,若只需其中幾列數據的話,就會存在冗余列,出於縮短處理時間的考慮,消除冗余列的過程是在內存中進行的。

  2)列存儲每次讀取的數據是集合的一段或者全部,不存在冗余性問題。

  3)兩種存儲的數據分布。由於列存儲的每一列數據類型是同質的,不存在二義性問題。比如說某列數據類型為整型(int),那么它的數據集合一定是整型數據。這種情況使數據解析變得十分容易。相比之下,行存儲則要復雜得多,因為在一行記錄中保存了多種類型的數據,數據解析需要在多種數據類型之間頻繁轉換,這個操作很消耗CPU,增加了解析的時間。所以,列存儲的解析過程更有利於分析大數據。

  4)列式存儲數據類型一致,數據特征相似,可以高效壓縮。行式存儲壓縮效果比較差。

  行存儲的寫入是一次性完成,消耗的時間比列存儲少,並且能夠保證數據的完整性,缺點是數據讀取過程中會產生冗余數據,如果只有少量數據,此影響可以忽略;數量大可能會影響到數據的處理效率。

  列存儲在寫入效率、保證數據完整性上都不如行存儲,它的優勢是在讀取過程,不會產生冗余數據,這對數據完整性要求不高的大數據處理領域,猶為重要。

二、OLTP 與OLTP

1、OLTP和OLAP的區別

(1)OLAP主要涉及到HIVE,HBASE,OLTP主要涉及到Mysql,Oracle

(2)基本含義不同

  a、OLTP是傳統關系型數據庫的應用,涉及到基本的事務處理和記錄的增、刪、改、查,比如在銀行存取一筆款,就是一個事務交易。

  b、OLAP是聯機分析處理,是數據倉庫的核心部心,支持復雜的分析操作,側重決策支持,並且提供直觀易懂的查詢結果。典型的應用就是復雜的動態報表系統。

(3)實時性要求不同

  a、OLTP實時性要求高,OLTP 數據庫旨在使事務應用程序僅寫入所需的數據,以便盡快處理單個事務。

  b、OLAP的實時性要求不是很高,很多應用頂多是每天更新一下數據。

(4)數據量不同

  a、OLTP數據量不是很大,一般只讀/寫數十條記錄,處理簡單的事務。

  b、OLAP數據量大,因為OLAP支持的是動態查詢

(5)用戶和系統的面向性不同:OLTP是面向顧客的,用於事務和查詢處理。OLAP是面向市場的,用於數據分析。

三、大數據框架的存儲格式

1、Hadoop的存儲格式

  面向行:同一行的數據存儲在一起,即連續存儲。SequenceFile,MapFile,Avro Datafile。采用這種方式,如果只需要訪問行的一小部分數據,亦需要將整行讀入內存,推遲序列化一定程度上可以緩解這個問題,但是從磁盤讀取整行數據的開銷卻無法避免。面向行的存儲適合於整行數據需要同時處理的情況。

  面向列:整個文件被切割為若干列數據,每一列數據一起存儲。Parquet , RCFile,ORCFile。面向列的格式使得讀取數據時,可以跳過不需要的列,適用於處理一行中部分列數據。但是這種格式的讀寫需要更多的內存空間,因為需要緩存行在內存中(為了獲取多行中的某一列)。同時不適合流式寫入,因為一旦寫入失敗,當前文件無法恢復,而面向行的數據在寫入失敗時可以重新同步到最后一個同步點。

(1)面向行的存儲格式

  1)SequenceFile按照是否壓縮可以分為以下部分

   a、不壓縮:按照記錄長度、Key長度、Value程度、Key值、Value值依次存儲。長度是指字節數。采用指定的Serialization進行序列化。

   b、Record壓縮:只有value被壓縮,壓縮的codec保存在Header中。

   c、Block壓縮:多條記錄被壓縮在一起,可以利用記錄之間的相似性,更節省空間。Block前后都加入了同步標識。

  2)MapFile是SequenceFile的變種,在SequenceFile中加入索引並排序后就是MapFile。索引作為一個單獨的文件存儲,一般每個128個記錄存儲一個索引。索引可以被載入內存,用於快速查找。存放數據的文件根據Key定義的順序排列。 MapFile的記錄必須按照順序寫入,否則拋出IOException。MapFile變種SetFile,ArrayFile.

(2)面向列的存儲格式

  1)RCFile:是Hadoop中第一個列文件格式。能夠很好的壓縮和快速的查詢性能,但是不支持模式演進。 RCFile是一種行列存儲相結合的存儲方式。首先,其將數據按行分塊,保證同一個record在一個塊上,避免讀一個記錄需要讀取多個block。其次,塊數據列式存儲,有利於數據壓縮和快速的列存取。

  2)ORCFile:提供了一種比RCFile更加高效的文件格式。其內部將數據划分為默認大小為250M的Stripe。每個Stripe包括索引、數據和Footer。索引存儲每一列的最大最小值,以及列中每一行的位置。數據按行分塊 每塊按照列存儲 ,壓縮快,查詢快.

  3)Parquet:能夠很好的壓縮,有很好的查詢性能,支持有限的模式演進。但是寫速度通常比較慢。這中文件格式主要是用在Cloudera Impala上面的。

注意:hive主要涉及到TextFile,RCFile,ORCFile,Parquet這四種格式.

四、大數據的壓縮格式

1、壓縮的優缺點

(1)優點:減少磁盤存儲空間,降低IO(其中包括網絡IO和磁盤IO),加快數據在磁盤和網絡中的傳輸速度,從而提高系統的處理速度

(2)缺點:由於使用數據時需要先解壓,就會加重CPU的負荷

2、壓縮格式:gzip,lzo,snappy,bzip2,壓縮比即壓縮率,是文件壓縮后的大小與壓縮前的大小之比

(1)Gzip壓縮格式

  1)優點:壓縮比在四種壓縮方式中較高,hadoop本身支持,在應用中處理gzip格式的文件就和直接處理文本一樣,大部分linux系統自帶gzip命令,使用方便。

  2)缺點:不支持split

(2)lzo壓縮格式

  1)優點:壓縮速率僅次於gzip,解壓速率是最快的;支持split,是hadoop中最流行的壓縮格式;需要在linux系統下自行安裝lzop命令,使用方便。

  2)缺點:壓縮比要比gzip低;hadoop本身比支持,需要安裝;lzo雖然支持split,但是需要對lzo文件建索引,否則hadoop也是會把lzo文件看成一個普通文件(為了支持split需要建索引,需要制定inputformat為lzo格式)

(3)snappy

  1)優點:壓縮速度最快,在應用中處理snappy格式的文件就和直接處理文本一樣

  2)缺點:不支持split,hadoop本身不支持,需要安裝,linux系統下沒有對應的命令

(4)bzip2

  1)優點:支持split;壓縮比最高比gzip都高;hadoop本身支持;在應用中處理snappy格式的文件就和直接處理文本一樣;在linux系統下自帶bzip2命令,使用方便

  2)缺點:壓縮解壓速率慢,不支持native

每一種壓縮方式都有他的優缺點,講求壓縮效率,壓縮比就會低,占用的網絡io和磁盤io就多,講求壓縮比,對cpu的損耗就比較大,同時壓縮和解壓的耗時就比較多,對於支持split的(lzo和bzip)可以實現並行處理。

3、實例:為什么map端用snappy壓縮格式;而reduce用gzip或者bzip2的壓縮格式呢?為什么每個reduce端壓縮后的數據不要超過一個block的大小呢?      

  考慮MR每次都要落地到磁盤,Map壓縮主要是增加mr運行的效率,我們就需要找壓縮效率最高的壓縮格式,snappy的壓縮時間最快;Reduce壓縮就是輸出文件壓縮 ,故考慮占用磁盤空間的大小;選擇高壓縮比gzip或者bzip2;而考慮到會用reduce結果做二次運算;

4、壓縮與解壓的時機

5、如何使用壓縮

(1)hive使用壓縮

  1)set mapred.map.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec //設置壓縮格式

  2)set hive.exec.compress.intermediate=ture //開啟中間壓縮

  3)set mapred.output.compression.type=BLOCK //塊壓縮

  4)set hive.exec.compress.output=true; 

(2)spark使用壓縮

  配置executor端的壓縮

  1)配置Spark讀寫壓縮格式相關的類庫和jar,具體配置如下:

    spark.executor.extraLibraryPath=/usr/lib/native/

    spark.executor.extraClassPath=/usr/lib/hadoop/lib/hadoop-lzo.jar

  2)代碼中配置:

    val textFile = sc.textFile(args(0), 1)

    textFile.saveAsTextFile(args(1),  classOf[LzopCodec])

  配置Driver端的壓縮

  --driver-class-path /usr/lib/hadoop/lib/hadoop-lzo.jar

  --driver-library-path /usr/lib/native

  在使用Spark SQL的時候,配置Executor和Driver與壓縮相關的屬性就可以正常讀取Hive目錄下的壓縮文件。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM