<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          打工人必備:Hive小文件合并與數(shù)據(jù)壓縮

          共 14902字,需瀏覽 30分鐘

           ·

          2020-12-11 21:02

          點擊上方藍色字體,選擇“設(shè)為星標

          回復(fù)”資源“獲取更多資源

          大數(shù)據(jù)技術(shù)與架構(gòu)
          點擊右側(cè)關(guān)注,大數(shù)據(jù)開發(fā)領(lǐng)域最強公眾號!

          大數(shù)據(jù)真好玩
          點擊右側(cè)關(guān)注,大數(shù)據(jù)真好玩!


          Hive倉庫表數(shù)據(jù)最終是存儲在HDFS上,由于Hadoop的特性,對大文件的處理非常高效。而且大文件可以減少文件元數(shù)據(jù)信息,減輕NameNode的存儲壓力。但是在數(shù)據(jù)倉庫中,越是上層的表匯總程度就越高,數(shù)據(jù)量也就越小,而且這些表通常會有日期分區(qū),隨著時間的推移,HDFS的文件數(shù)目就會逐步增加。

          一、小文件帶來的問題

          HDFS的文件包好數(shù)據(jù)塊和元信息,其中元信息包括位置、大小、分塊等信息,都保存在NameNode的內(nèi)存中。每個對象大約占用150個字節(jié),因此一千萬文件及分塊就會占用約3G的內(nèi)存空間,一旦接近這個量級,NameNode的性能就會開始下降。HDFS讀寫小文件時也會更加耗時,因為每次都需要從NameNode獲取元信息,并且對應(yīng)的DataNode建立連接。對于MapReduce程序來說,小文件會增加Mapper的數(shù)量,每個Map任務(wù)只會處理很少的數(shù)據(jù),浪費大量的調(diào)度時間。

          二、Hive小文件產(chǎn)生的原因

          一方面hive數(shù)據(jù)倉庫中匯總表的數(shù)據(jù)量通常比源數(shù)據(jù)少的多,而且為了提升運算速度,我們會增加Reduce的數(shù)量,Hive本身也會做類似的優(yōu)化----Reducer數(shù)量等于源數(shù)據(jù)的量除以hive.exec.reducers.bytes.per.reduce所配置的量(默認1G)。Reduce數(shù)量的增加也即意味著結(jié)果文件的增加,從而產(chǎn)生小文件的問題。

          解決小文件的問題可以從兩個方向入手:

          ?輸入合并。即在map前合并小文件。?輸出合并。即在輸出結(jié)果的時候合并小文件。

          三、配置Map輸入合并

          -- 每個Map最大輸入大小,決定合并后的文件數(shù)
          set mapred.max.split.size=256000000;
          -- 一個節(jié)點上split的至少的大小 ,決定了多個data node上的文件是否需要合并
          set mapred.min.split.size.per.node=100000000;
          -- 一個交換機下split的至少的大小,決定了多個交換機上的文件是否需要合并
          set mapred.min.split.size.per.rack=100000000;
          -- 執(zhí)行Map前進行小文件合并
          set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;

          四、配置hive結(jié)果合并

          通過設(shè)置hive的配置項在執(zhí)行結(jié)束后對結(jié)果文件進行合并:

          set hive.merge.mapfiles = true #在Map-only的任務(wù)結(jié)束時合并小文件
          set hive.merge.mapredfiles = true #在Map-Reduce的任務(wù)結(jié)束時合并小文件
          set hive.merge.size.per.task = 256*1000*1000 #合并文件的大小
          set hive.merge.smallfiles.avgsize=16000000 #當輸出文件的平均大小小于該值時,啟動一個獨立的map-reduce任務(wù)進行文件merge

          hive在對結(jié)果文件進行合并時會執(zhí)行一個額外的map-only腳本,mapper的數(shù)量是文件總大小除以size.per.task參數(shù)所得的值,觸發(fā)合并的條件是:根據(jù)查詢類型不同,相應(yīng)的mapfiles/mapredfiles參數(shù)需要打開;結(jié)果文件的平均大小需要大于avgsize參數(shù)的值。

          -- map-red job,5個reducer,產(chǎn)生560K的文件。
          create table dw_stage.zj_small as
          select paid, count (*)
          from dw_db.dw_soj_imp_dtl
          where log_dt = '2014-04-14'
          group by paid;
          -- 執(zhí)行額外的map-only job,一個mapper,產(chǎn)生一個300K的文件。
          set hive.merge.mapredfiles= true;
          create table dw_stage.zj_small as
          select paid, count (*)
          from dw_db.dw_soj_imp_dtl
          where log_dt = '2014-04-14'
          group by paid;
          -- map-only job,45個mapper,產(chǎn)生4525M左右的文件。
          create table dw_stage.zj_small as
          select *
          from dw_db.dw_soj_imp_dtl
          where log_dt = '2014-04-14'
          and paid like '%baidu%' ;
          -- 執(zhí)行額外的map-only job,4個mapper,產(chǎn)生4250M左右的文件。
          set hive.merge.smallfiles.avgsize=100000000;
          create table dw_stage.zj_small as
          select *
          from dw_db.dw_soj_imp_dtl
          where log_dt = '2014-04-14'
          and paid like '%baidu%' ;

          五、壓縮文件的處理

          對于輸出結(jié)果為壓縮文件形式存儲的情況,要解決小文件問題,如果在map輸入前合并,對輸出的文件存儲格式并沒有限制。但是如果使用輸出合并,則必須配合SequenceFile來存儲,否則無法進行合并,以下是實例:

          set mapred.output.compression.type=BLOCK;
          set hive.exec.compress.output= true;
          set mapred.output.compression.codec=org.apache.hadoop.io.compress.LzoCodec;
          set hive.merge.smallfiles.avgsize=100000000;
          drop table if exists dw_stage.zj_small;
          create table dw_stage.zj_small
          STORED AS SEQUENCEFILE
          as select *
          from dw_db.dw_soj_imp_dtl
          where log_dt = '2014-04-14'
          and paid like '%baidu%' ;

          六、使用HAR歸檔文件

          Hadoop的歸檔文件格式也是解決小文件問題的方式之一。而且hive提供了原生支持:

          set hive.archive.enabled= true;
          set hive.archive.har.parentdir.settable= true;
          set har.partfile.size=1099511627776;
          ALTER TABLE srcpart ARCHIVE PARTITION(ds= '2008-04-08', hr= '12' );
          ALTER TABLE srcpart UNARCHIVE PARTITION(ds= '2008-04-08', hr= '12' );

          如果使用的不是分區(qū)表,則可以創(chuàng)建成外部表,并使用har://協(xié)議來指定路徑。

          文件壓縮

          數(shù)據(jù)倉庫在建設(shè)使用的過程中,主要消耗的資源包含:CPU、MEMORY、DISK三部分。

          數(shù)據(jù)倉庫在計算過程中主要消耗CPU和Memory資源,當然也會消耗一些DISK資源用來存儲計算過程中的臨時結(jié)果。但是主要優(yōu)化的方向,還是降低CPU和MEMORY的消耗,這方面主要依賴于模型設(shè)計的合理性,所以在模型設(shè)計階段增加模型設(shè)計review的步驟,保證模型設(shè)計的合理性。

          數(shù)據(jù)倉庫在數(shù)據(jù)的存儲階段主要消耗MEMORY和DISK資源。memory資源主要是在NameNode存儲文件信息的時候消耗掉;DISK在存儲數(shù)據(jù)的時候消耗掉。在這個階段需要嚴格控制HIVE表的的定義,來降低資源的消耗。

          本次主要探討是數(shù)據(jù)倉庫在數(shù)據(jù)存儲階段對資源消耗的優(yōu)化,下面將通過2個方面展開,分別是:數(shù)據(jù)倉庫如何配置,可以實現(xiàn)數(shù)據(jù)壓縮,降低數(shù)據(jù)的存儲量,達到減少對DISK的消耗;數(shù)倉表如何設(shè)計,可以降低文件信息存儲量,達到減少對MEMORY的消耗。

          hive在存儲數(shù)據(jù)時支持通過不同的文件類型來組織,并且為了節(jié)省相應(yīng)的存儲資源,也提供了多種類型的壓縮算法,供用戶選擇。只要是配置正確的文件類型和壓縮類型,hive都可以按預(yù)期讀取并解析數(shù)據(jù),不影響上層HQL語句的使用。例如:SequenceFile本身的結(jié)構(gòu)已經(jīng)設(shè)計了對內(nèi)容進行壓縮,所以對于SequenceFile文件的壓縮,并不是先生成SequenceFile文件,再對文件進行壓縮;而是生成SequenceFile文件時,就對其中的內(nèi)容字段進行壓縮。最終壓縮后,對外仍然體現(xiàn)為一個SequenceFile。RCFile、ORCFile、Parquet、Avro對于壓縮的處理方式與SequenceFile相同。

          hive支持的文件類型有:TextFile、SequenceFile、RCFile、ORCFile、Parquet、Avro。

          hive支持的壓縮算法有:

          TextFile

          TextFile是hive數(shù)據(jù)表的默認格式,存儲方式:行存儲;可以采用多種壓縮方式,但是部分壓縮算法壓縮數(shù)據(jù)后生成的文件是不支持split;壓縮后的數(shù)據(jù)在反序列化過程中,必須逐個字段判斷是不是分隔符和行結(jié)束符,因此反序列化開銷會比SequenceFile高幾十倍。

          ?TextFile文件,非壓縮

          --創(chuàng)建一個表,格式為文本文件:
          CREATE EXTERNAL TABLE student_text (id STRING, name STRING)
          ROW FORMAT DELIMITED
          FIELDS TERMINATED BY ','
          LINES TERMINATED BY '\n'
          STORED AS TEXTFILE;
          --導(dǎo)入數(shù)據(jù)到此表中,將啟動MR任務(wù)
          INSERT OVERWRITE TABLE student_text SELECT * FROM student;

          可以看到生成的數(shù)據(jù)文件的格式為非壓縮的文本文件:

          hdfs dfs -cat /user/hive/warehouse/student_text/000000_0

          1001810081,cheyo
          1001810082,pku
          1001810083,rocky
          1001810084,stephen
          2002820081,sql
          2002820082,hello
          2002820083,hijj
          3001810081,hhhhhhh
          3001810082,abbbbbb

          ?TextFile文件,Deflate壓縮

          --創(chuàng)建一個表,格式為文件文件:
          CREATE TABLE student_text_def (id STRING, name STRING)
          ROW FORMAT DELIMITED
          FIELDS TERMINATED BY ','
          LINES TERMINATED BY '\n'
          STORED AS TEXTFILE;
          --設(shè)置壓縮類型為Gzip壓縮
          SET hive.exec.compress.output=true;
          SET mapred.output.compress=true;
          SET mapred.output.compression.codec=org.apache.hadoop.io.compress.DefaultCodec;
          --導(dǎo)入數(shù)據(jù):
          INSERT OVERWRITE TABLE student_text_def SELECT * FROM student;
          --查看數(shù)據(jù)
          SELECT * FROM student_text_def;

          查看數(shù)據(jù)文件,可以看到數(shù)據(jù)文件為多個.deflate文件

          hdfs dfs -ls /user/hive/warehouse/student_text_def/
          -rw-r--r-- 2015-09-16 12:48 /user/hive/warehouse/student_text_def/000000_0.deflate
          -rw-r--r-- 2015-09-16 12:48 /user/hive/warehouse/student_text_def/000001_0.deflate
          -rw-r--r-- 2015-09-16 12:48 /user/hive/warehouse/student_text_def/000002_0.deflate

          ?TextFile文件,Gzip壓縮

          --創(chuàng)建一個表,格式為文件文件:
          CREATE TABLE student_text_gzip (id STRING, name STRING)
          ROW FORMAT DELIMITED
          FIELDS TERMINATED BY ','
          LINES TERMINATED BY '\n'
          STORED AS TEXTFILE;
          --設(shè)置壓縮類型為Gzip壓縮
          SET hive.exec.compress.output=true;
          SET mapred.output.compress=true;
          SET mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;

          set io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec;
          --導(dǎo)入數(shù)據(jù):
          INSERT OVERWRITE TABLE student_text_gzip SELECT * FROM student;
          --查看數(shù)據(jù)
          SELECT * FROM student_text_gzip;

          查看數(shù)據(jù)文件,可以看到數(shù)據(jù)文件為多個.gz文件。解壓.gz文件,可以看到明文文本:

          hdfs dfs -ls /user/hive/warehouse/student_text_gzip/
          -rw-r--r-- 2015-09-15 10:03 /user/hive/warehouse/student_text_gzip/000000_0.gz
          -rw-r--r-- 2015-09-15 10:03 /user/hive/warehouse/student_text_gzip/000001_0.gz
          -rw-r--r-- 2015-09-15 10:03 /user/hive/warehouse/student_text_gzip/000002_0.gz

          ?TextFile文件,Bzip2壓縮

          --創(chuàng)建一個表,格式為文件文件:
          CREATE TABLE student_text_bzip2 (id STRING, name STRING)
          ROW FORMAT DELIMITED
          FIELDS TERMINATED BY ','
          LINES TERMINATED BY '\n'
          STORED AS TEXTFILE;
          --設(shè)置壓縮類型為Bzip2壓縮:
          SET hive.exec.compress.output=true;
          SET mapred.output.compress=true;
          SET mapred.output.compression.codec=org.apache.hadoop.io.compress.BZip2Codec;
          --導(dǎo)入數(shù)據(jù)
          INSERT OVERWRITE TABLE student_text_bzip2 SELECT * FROM student;
          --查看數(shù)據(jù):
          SELECT * FROM student_text_bzip2;

          查看數(shù)據(jù)文件,可看到數(shù)據(jù)文件為多個.bz2文件。解開.bz2文件,可以看到明文文本:

          hdfs dfs -ls /user/hive/warehouse/student_text_bzip2
          -rw-r--r-- 2015-09-15 10:09 /user/hive/warehouse/student_text_bzip2/000000_0.bz2
          -rw-r--r-- 2015-09-15 10:09 /user/hive/warehouse/student_text_bzip2/000001_0.bz2
          -rw-r--r-- 2015-09-15 10:09 /user/hive/warehouse/student_text_bzip2/000002_0.bz2

          ?TextFile文件,Lzo壓縮

          --創(chuàng)建表
          CREATE TABLE student_text_lzo (id STRING, name STRING)
          ROW FORMAT DELIMITED
          FIELDS TERMINATED BY ','
          LINES TERMINATED BY '\n'
          STORED AS TEXTFILE;
          --設(shè)置為LZO壓縮
          SET hive.exec.compress.output=true;
          SET mapred.output.compress=true;
          SET mapred.output.compression.codec=com.hadoop.compression.lzo.LzopCodec;
          --導(dǎo)入數(shù)據(jù)
          INSERT OVERWRITE TABLE student_text_lzo SELECT * FROM student;
          --查詢數(shù)據(jù)
          SELECT * FROM student_text_lzo;

          查看數(shù)據(jù)文件,可以看到數(shù)據(jù)文件為多個.lzo壓縮。解開.lzo文件,可以看到明文文件。(需要安裝lzop庫)

          ?TextFile文件,Lz4壓縮

          --創(chuàng)建表
          CREATE TABLE student_text_lz4 (id STRING, name STRING)
          ROW FORMAT DELIMITED
          FIELDS TERMINATED BY ','
          LINES TERMINATED BY '\n'
          STORED AS TEXTFILE;
          --設(shè)置為LZ4壓縮
          SET hive.exec.compress.output=true;
          SET mapred.output.compress=true;
          SET mapred.output.compression.codec=org.apache.hadoop.io.compress.Lz4Codec;
          --導(dǎo)入數(shù)據(jù)
          INSERT OVERWRITE TABLE student_text_lz4 SELECT * FROM student;

          查看數(shù)據(jù)文件,可看到數(shù)據(jù)文件為多個.lz4壓縮。使用cat查看.lz4文件,可以看到是壓縮后的文本。

          hdfs dfs -ls /user/hive/warehouse/student_text_lz4
          -rw-r--r-- 2015-09-16 12:06 /user/hive/warehouse/student_text_lz4/000000_0.lz4
          -rw-r--r-- 2015-09-16 12:06 /user/hive/warehouse/student_text_lz4/000001_0.lz4
          -rw-r--r-- 2015-09-16 12:06 /user/hive/warehouse/student_text_lz4/000002_0.lz4

          ?TextFile文件,Snappy壓縮

          --創(chuàng)建表
          CREATE TABLE student_text_snappy (id STRING, name STRING)
          ROW FORMAT DELIMITED
          FIELDS TERMINATED BY ','
          LINES TERMINATED BY '\n'
          STORED AS TEXTFILE;
          --設(shè)置壓縮
          SET hive.exec.compress.output=true;
          SET mapred.compress.map.output=true;
          SET mapred.output.compress=true;
          SET mapred.output.compression=org.apache.hadoop.io.compress.SnappyCodec;
          SET mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
          SET io.compression.codecs=org.apache.hadoop.io.compress.SnappyCodec;
          --導(dǎo)入數(shù)據(jù)
          INSERT OVERWRITE TABLE student_text_snappy SELECT * FROM student;
          --查詢數(shù)據(jù)
          SELECT * FROM student_text_snappy;

          查看數(shù)據(jù)文件,可看到數(shù)據(jù)文件多個.snappy壓縮文件。使用cat查看.snappy文件,可以看到是壓縮后的文本:

          hdfs dfs -ls /user/hive/warehouse/student_text_snappy
          Found 3 items
          -rw-r--r-- 2015-09-15 16:42 /user/hive/warehouse/student_text_snappy/000000_0.snappy
          -rw-r--r-- 2015-09-15 16:42 /user/hive/warehouse/student_text_snappy/000001_0.snappy
          -rw-r--r-- 2015-09-15 16:42 /user/hive/warehouse/student_text_snappy/000002_0.snappy

          SequenceFile文件

          SequenceFile是Hadoop API提供的一種二進制文件,它將數(shù)據(jù)以的形式序列化到文件中。這種二進制文件內(nèi)部使用hadoop的標準Writable接口實現(xiàn)序列化和反序列化。它與Hadoop API中的MapFile是互相兼容的。hive中的SequenceFile繼承自hadoop API的SequenceFile,不過它的key為空,使用value存放實際的值,這樣是為了避免MR在運行map階段的排序過程。

          ?SequenceFile是一種二進制文件,以的形式序列化到文件中。存儲方式:行存儲;?支持三種壓縮類型:None、Record、Block。默認采用Record,但是Record壓縮率低;一般建議使用Block壓縮;?優(yōu)勢是文件和Hadoop API的MapFile是相互兼容的。

          ?SequenceFile,Deflate壓縮

          --創(chuàng)建一個表,格式為文件文件:
          CREATE TABLE student_seq_def (id STRING, name STRING)
          ROW FORMAT DELIMITED
          FIELDS TERMINATED BY ','
          LINES TERMINATED BY '\n'
          STORED AS SEQUENCEFILE;
          --設(shè)置壓縮算法為Deflate壓縮
          SET hive.exec.compress.output=true;
          SET mapred.output.compress=true;
          SET mapred.output.compression.codec=org.apache.hadoop.io.compress.DeflateCodec;
          --設(shè)置壓縮類型為block
          SET mapred.output.compression.type=BLOCK
          --導(dǎo)入數(shù)據(jù):
          INSERT OVERWRITE TABLE student_seq_def SELECT * FROM student;
          --查看數(shù)據(jù)
          SELECT * FROM student_seq_def;

          查看數(shù)據(jù)文件,是一個密文的文件。

          hdfs dfs -ls /user/hive/warehouse/student_seq_def/
          -rw-r--r-- /user/hive/warehouse/student_seq_def/000000_0

          ?SequenceFile,Gzip壓縮

          --創(chuàng)建一個表,格式為文件文件:
          CREATE TABLE student_seq_gzip (id STRING, name STRING)
          ROW FORMAT DELIMITED
          FIELDS TERMINATED BY ','
          LINES TERMINATED BY '\n'
          STORED AS SEQUENCEFILE;
          --設(shè)置壓縮類型為Gzip壓縮
          SET hive.exec.compress.output=true;
          SET mapred.output.compress=true;
          SET mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;
          --設(shè)置壓縮類型為block
          SET mapred.output.compression.type=BLOCK
          --導(dǎo)入數(shù)據(jù):
          INSERT OVERWRITE TABLE student_seq_gzip SELECT * FROM student;
          --查看數(shù)據(jù)
          SELECT * FROM student_seq_gzip;

          查看數(shù)據(jù)文件,是一個密文的文件,無法通過gzip解壓:

          hdfs dfs -ls /user/hive/warehouse/student_seq_gzip/
          -rw-r--r-- /user/hive/warehouse/student_seq_gzip/000000_0

          RcFile

          存儲方式:數(shù)據(jù)按行分塊,每塊按列存儲。結(jié)合了行存儲和列存儲的有點:

          ?首先RCFile保證同一行的數(shù)據(jù)位于同一節(jié)點,因此元組重構(gòu)開銷很低;?其次像列存儲一樣,RCFile能夠利用列維度的數(shù)據(jù)壓縮,并且能跳過不必要的列讀取。

          RCFile的一個行組包括三部分:

          ?第一部分是行組頭部的
          同步標識,主要用于分割HDFS塊中的兩個連續(xù)行組;
          ?第二部分是行組的元數(shù)據(jù)頭部,用戶存儲行組單元的信息,包括行組中的記錄數(shù)、每個列的字節(jié)數(shù)、列中每個域的字節(jié)數(shù);?第三部分是
          表格數(shù)據(jù)段,即實際的列存儲數(shù)據(jù)。在該部分中,同一列的所有域順序存儲。

          數(shù)據(jù)追加:RCFile不支持任意方式的數(shù)據(jù)寫操作,僅提供一種追加接口,這是因為底層的HDFS當前僅僅支持數(shù)據(jù)追加寫文件尾部。

          行組大小:行組變大有助于提高數(shù)據(jù)壓縮的效率,但是可能會損害數(shù)據(jù)的讀取性能,因為這樣增加了 Lazy 解壓性能的消耗。而且行組變大會占用更多的內(nèi)存,這會影響并發(fā)執(zhí)行的其他MR作業(yè)。考慮到存儲空間和查詢效率兩個方面,F(xiàn)acebook 選擇 4MB 作為默認的行組大小,當然也允許用戶自行選擇參數(shù)進行配置。

          ?RcFile,Gzip壓縮

          CREATE TABLE student_rcfile_gzip (id STRING, name STRING)
          ROW FORMAT DELIMITED
          FIELDS TERMINATED BY ','
          LINES TERMINATED BY '\n'
          STORED AS RCFILE;

          --設(shè)置壓縮類型為Gzip壓縮
          SET hive.exec.compress.output=true;
          SET mapred.output.compress=true;
          SET mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;
          SET io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec;
          --導(dǎo)入數(shù)據(jù):
          INSERT OVERWRITE TABLE student_rcfile_gzip SELECT id,name FROM student;
          --查看數(shù)據(jù)
          SELECT * FROM student_rcfile_gzip;

          ORCFile

          ORCFile有自己的參數(shù)設(shè)置壓縮格式,一般不使用上述Hive參數(shù)設(shè)置壓縮參數(shù)。

          ?存儲方式:數(shù)據(jù)按行分塊,每塊按照列存儲;?壓縮快 快速列存取?效率比RCFile高,是RCFile的改良版本。

          ?ORCFile,Zlib壓縮

          --創(chuàng)建表
          CREATE TABLE student_orcfile_zlib (id STRING, name STRING)
          ROW FORMAT DELIMITED
          FIELDS TERMINATED BY ','
          LINES TERMINATED BY '\n'
          STORED AS ORCFILE TBLPROPERTIES ("orc.compress"="ZLIB");

          --導(dǎo)入數(shù)據(jù)
          INSERT OVERWRITE TABLE student_orcfile_zlib SELECT id,name FROM student;
          --查詢數(shù)據(jù)
          SELECT * FROM student_orcfile_zlib;

          ?ORCFile,Snappy壓縮

          --創(chuàng)建表
          CREATE TABLE student_orcfile_snappy2 (id STRING, name STRING)
          ROW FORMAT DELIMITED
          FIELDS TERMINATED BY ','
          LINES TERMINATED BY '\n'
          STORED AS ORCFILE TBLPROPERTIES ("orc.compress"="SNAPPY");

          --導(dǎo)入數(shù)據(jù)
          INSERT OVERWRITE TABLE student_orcfile_snappy2 SELECT id,name FROM student;
          --查詢數(shù)據(jù)
          SELECT * FROM student_orcfile_snappy2;

          ?不推薦

          一般不推薦使用下述方式。采用下述方式壓縮后,結(jié)果與上面同類型壓縮(Snappy)不同。

          --創(chuàng)建表
          CREATE TABLE student_orcfile_snappy (id STRING, name STRING)
          ROW FORMAT DELIMITED
          FIELDS TERMINATED BY ','
          LINES TERMINATED BY '\n'
          STORED AS ORCFILE;
          --設(shè)置壓縮
          SET hive.exec.compress.output=true;
          SET mapred.compress.map.output=true;
          SET mapred.output.compress=true;
          SET mapred.output.compression=org.apache.hadoop.io.compress.SnappyCodec;
          SET mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
          SET io.compression.codecs=org.apache.hadoop.io.compress.SnappyCodec;
          --導(dǎo)入數(shù)據(jù)
          INSERT OVERWRITE TABLE student_orcfile_snappy SELECT id,name FROM student;
          --查詢數(shù)據(jù)
          SELECT * FROM student_orcfile_snappy;

          Parquet

          ?Parquet,Snappy壓縮

          --創(chuàng)建表
          CREATE TABLE student_parquet_snappy (id STRING, name STRING)
          ROW FORMAT DELIMITED
          FIELDS TERMINATED BY ','
          LINES TERMINATED BY '\n'
          STORED AS PARQUET;
          --設(shè)置壓縮
          SET hive.exec.compress.output=true;
          SET mapred.compress.map.output=true;
          SET mapred.output.compress=true;
          SET mapred.output.compression=org.apache.hadoop.io.compress.SnappyCodec;
          SET mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
          SET io.compression.codecs=org.apache.hadoop.io.compress.SnappyCodec;
          --導(dǎo)入數(shù)據(jù)
          INSERT OVERWRITE TABLE student_parquet_snappy SELECT id,name FROM student;
          --查詢數(shù)據(jù)
          SELECT * FROM student_parquet_snappy;

          Avro

          ?Avro,Snappy壓縮

          --創(chuàng)建表
          CREATE TABLE student_avro_snappy (id STRING, name STRING)
          ROW FORMAT DELIMITED
          FIELDS TERMINATED BY ','
          LINES TERMINATED BY '\n'
          STORED AS AVRO;
          --設(shè)置壓縮
          SET hive.exec.compress.output=true;
          SET mapred.compress.map.output=true;
          SET mapred.output.compress=true;
          SET mapred.output.compression=org.apache.hadoop.io.compress.SnappyCodec;
          SET mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
          SET io.compression.codecs=org.apache.hadoop.io.compress.SnappyCodec;
          --導(dǎo)入數(shù)據(jù)
          INSERT OVERWRITE TABLE student_avro_snappy SELECT id,name FROM student;
          --查詢數(shù)據(jù)
          SELECT * FROM student_avro_snappy;

          不同壓縮算法比較

          數(shù)倉表分區(qū)優(yōu)化

          數(shù)據(jù)倉庫創(chuàng)建數(shù)倉表時,ETL開發(fā)人員基于使用習(xí)慣和處理的方便性,經(jīng)常創(chuàng)建多層分區(qū),來存儲數(shù)據(jù)。但是過多的分區(qū)會消耗NameNode大量的資源,并且也會引入小文件的問題。所以對于創(chuàng)建數(shù)倉表的分區(qū),要求如下:

          ?對于統(tǒng)計數(shù)據(jù)表、數(shù)據(jù)量不大的基礎(chǔ)表、業(yè)務(wù)上無累計快照和周期性快照要求的數(shù)據(jù)表,盡可能的不創(chuàng)建分區(qū),而采用數(shù)據(jù)合并回寫的方式解決;?對于一些數(shù)據(jù)量大的表,如果需要創(chuàng)建分區(qū),提高插敘過程中數(shù)據(jù)的加載速度,盡可能的只做天級分區(qū)。而對于賣點的原始數(shù)據(jù),這種特大的數(shù)據(jù)量的,可以采用小時分區(qū)。對于月分區(qū),堅決去掉。?對于一些周期快照和累計快照的表,我們盡可能只創(chuàng)建日分區(qū)。

          版權(quán)聲明:

          本文為大數(shù)據(jù)技術(shù)與架構(gòu)整理,原作者獨家授權(quán)。未經(jīng)原作者允許轉(zhuǎn)載追究侵權(quán)責(zé)任。
          編輯|冷眼丶
          微信公眾號|import_bigdata


          歡迎點贊+收藏+轉(zhuǎn)發(fā)朋友圈素質(zhì)三連


          文章不錯?點個【在看】吧!??

          瀏覽 61
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日本欧洲久久精品视频 | 亚洲无吗在线播放 | 成人精品视频99在线观看免费 | 狼人综合网| 三级片日日|