1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

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

        共 14902字,需瀏覽 30分鐘

         ·

        2020-12-11 21:02

        點(diǎn)擊上方藍(lán)色字體,選擇“設(shè)為星標(biāo)

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

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

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


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

        一、小文件帶來的問題

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

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

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

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

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

        三、配置Map輸入合并

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

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

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

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

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

        -- map-red job,5個(gè)reducer,產(chǎn)生5個(gè)60K的文件。
        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,一個(gè)mapper,產(chǎn)生一個(gè)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個(gè)mapper,產(chǎn)生45個(gè)25M左右的文件。
        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個(gè)mapper,產(chǎn)生4個(gè)250M左右的文件。
        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%' ;

        五、壓縮文件的處理

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

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

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

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

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

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

        hive支持的壓縮算法有:

        TextFile

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

        ?TextFile文件,非壓縮

        --創(chuàng)建一個(gè)表,格式為文本文件:
        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ù)到此表中,將啟動(dòng)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)建一個(gè)表,格式為文件文件:
        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ù)文件為多個(gè).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)建一個(gè)表,格式為文件文件:
        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ù)文件為多個(gè).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)建一個(gè)表,格式為文件文件:
        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ù)文件為多個(gè).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è)置為L(zhǎng)ZO壓縮
        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ù)文件為多個(gè).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è)置為L(zhǎng)Z4壓縮
        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ù)文件為多個(gè).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ù)文件多個(gè).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提供的一種二進(jìn)制文件,它將數(shù)據(jù)以的形式序列化到文件中。這種二進(jìn)制文件內(nèi)部使用hadoop的標(biāo)準(zhǔn)Writable接口實(shí)現(xiàn)序列化和反序列化。它與Hadoop API中的MapFile是互相兼容的。hive中的SequenceFile繼承自hadoop API的SequenceFile,不過它的key為空,使用value存放實(shí)際的值,這樣是為了避免MR在運(yùn)行map階段的排序過程。

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

        ?SequenceFile,Deflate壓縮

        --創(chuàng)建一個(gè)表,格式為文件文件:
        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ù)文件,是一個(gè)密文的文件。

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

        ?SequenceFile,Gzip壓縮

        --創(chuàng)建一個(gè)表,格式為文件文件:
        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ù)文件,是一個(gè)密文的文件,無法通過gzip解壓:

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

        RcFile

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

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

        RCFile的一個(gè)行組包括三部分:

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

        數(shù)據(jù)追加:RCFile不支持任意方式的數(shù)據(jù)寫操作,僅提供一種追加接口,這是因?yàn)榈讓拥腍DFS當(dāng)前僅僅支持?jǐn)?shù)據(jù)追加寫文件尾部。

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

        ?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ù)。

        ?存儲(chǔ)方式:數(shù)據(jù)按行分塊,每塊按照列存儲(chǔ);?壓縮快 快速列存取?效率比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ù)倉表時(shí),ETL開發(fā)人員基于使用習(xí)慣和處理的方便性,經(jīng)常創(chuàng)建多層分區(qū),來存儲(chǔ)數(shù)據(jù)。但是過多的分區(qū)會(huì)消耗NameNode大量的資源,并且也會(huì)引入小文件的問題。所以對(duì)于創(chuàng)建數(shù)倉表的分區(qū),要求如下:

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

        版權(quán)聲明:

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


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


        文章不錯(cuò)?點(diǎn)個(gè)【在看】吧!??

        瀏覽 61
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            欧美日日干 | 国产女主播视频一区二区三区 | 黄色三级片视频 | 国产精品无码免费 | 西西444WWW无码大胆-百度 | 亚洲男人天堂2024 | 国产精品黑料吃瓜网曝事件海角 | 男女无遮挡xx00动态图120秒 | 北条麻妃肉色开裆丝袜 | 亚洲精品无码不卡在线播HE |