導航:首頁 > 文件處理 > hive壓縮文件

hive壓縮文件

發布時間:2022-10-31 05:13:24

⑴ Hive優化之Hive的配置參數優化

Hive是大數據領域常用的組件之一,主要用於大數據離線數倉的運算,關於Hive的性能調優在日常工作和面試中是經常涉及的一個點,因此掌握一些Hive調優是必不可少的一項技能。影響Hive效率的主要因素有數據傾斜、數據冗餘、job的IO以及不同底層引擎配置情況和Hive本身參數和HiveSQL的執行等。本文主要從建表配置參數方面對Hive優化進行講解。

1. 創建一個普通表

table test_user1(id int, name string,code string,code_id string ) ROW FORMAT DELIMITED FIELDS TERMINATED  BY ',';

2. 查看這張表的信息

DESCRIBE FORMATTED  test_user1;

我們從該表的描述信息介紹建表時的一些可優化點。

2.1 表的文件數

numFiles表示表中含有的文件數,當文件數過多時可能意味著該表的小文件過多,這時候我們可以針對小文件的問題進行一些優化,HDFS本身提供了解決方案:

(1)Hadoop Archive/HAR:將小文件打包成大文件。

(2)SEQUENCEFILE格式:將大量小文件壓縮成一個SEQUENCEFILE文件。

(3)CombineFileInputFormat:在map和rece處理之前組合小文件。

(4)HDFS Federation:HDFS聯盟,使用多個namenode節點管理文件。

除此之外,我們還可以通過設置hive的參數來合並小文件。

(1)輸入階段合並

需要更改Hive的輸入文件格式,即參數hive.input.format,默認值是org.apache.hadoop.hive.ql.io.HiveInputFormat,我們改成org.apache.hadoop.hive.ql.io.CombineHiveInputFormat。這樣比起上面對mapper數的調整,會多出兩個參數,分別是mapred.min.split.size.per.node和mapred.min.split.size.per.rack,含義是單節點和單機架上的最小split大小。如果發現有split大小小於這兩個值(默認都是100MB),則會進行合並。具體邏輯可以參看Hive源碼中的對應類。

(2)輸出階段合並

直接將hive.merge.mapfiles和hive.merge.mapredfiles都設為true即可,前者表示將map-only任務的輸出合並,後者表示將map-rece任務的輸出合並,Hive會額外啟動一個mr作業將輸出的小文件合並成大文件。另外,hive.merge.size.per.task可以指定每個task輸出後合並文件大小的期望值,hive.merge.size.smallfiles.avgsize可以指定所有輸出文件大小的均值閾值,默認值都是1GB。如果平均大小不足的話,就會另外啟動一個任務來進行合並。

2.2 表的存儲格式

通過InputFormat和OutputFormat可以看出表的存儲格式是TEXT類型,Hive支持TEXTFILE, SEQUENCEFILE, AVRO, RCFILE, ORC,以及PARQUET文件格式,可以通過兩種方式指定表的文件格式:

(1)CREATE TABLE ... STORE AS <file_format>:在建表時指定文件格式,默認是TEXTFILE

(2)ALTER TABLE ... [PARTITION partition_spec] SET FILEFORMAT <file_format>:修改具體表的文件格式

如果要改變創建表的默認文件格式,可以使用set

hive.default.fileformat=<file_format>進行配置,適用於所有表。同時也可以使用set

hive.default.fileformat.managed = <file_format>進行配置,僅適用於內部表或外部表。

擴展:不同存儲方式的情況

TEXT,

SEQUENCE和

AVRO文件是面向行的文件存儲格式,不是最佳的文件格式,因為即便只查詢一列數據,使用這些存儲格式的表也需要讀取完整的一行數據。另一方面,面向列的存儲格式(RCFILE,

ORC, PARQUET)可以很好地解決上面的問題。關於每種文件格式的說明,如下:

(1)TEXTFILE

創建表時的默認文件格式,數據被存儲成文本格式。文本文件可以被分割和並行處理,也可以使用壓縮,比如GZip、LZO或者Snappy。然而大部分的壓縮文件不支持分割和並行處理,會造成一個作業只有一個mapper去處理數據,使用壓縮的文本文件要確保文件不要過大,一般接近兩個HDFS塊的大小。

(2)SEQUENCEFILE

key/value對的二進制存儲格式,sequence文件的優勢是比文本格式更好壓縮,sequence文件可以被壓縮成塊級別的記錄,塊級別的壓縮是一個很好的壓縮比例。如果使用塊壓縮,需要使用下面的配置:set

hive.exec.compress.output=true; set io.seqfile.compression.type=BLOCK

(3)AVRO

二進制格式文件,除此之外,avro也是一個序列化和反序列化的框架。avro提供了具體的數據schema。

(4)RCFILE

全稱是Record Columnar File,首先將表分為幾個行組,對每個行組內的數據進行按列存儲,每一列的數據都是分開存儲,即先水平劃分,再垂直劃分。

(5)ORC

全稱是Optimized Row Columnar,從hive0.11版本開始支持,ORC格式是RCFILE格式的一種優化的格式,提供了更大的默認塊(256M)

(6)PARQUET

另外一種列式存儲的文件格式,與ORC非常類似,與ORC相比,Parquet格式支持的生態更廣,比如低版本的impala不支持ORC格式。

配置同樣數據同樣欄位的兩張表,以常見的TEXT行存儲和ORC列存儲兩種存儲方式為例,對比執行速度。

TEXT存儲方式

總結: 從上圖中可以看出列存儲在對指定列進行查詢時,速度更快, 建議在建表時設置列存儲的存儲方式 。

2.3 表的壓縮

對Hive表進行壓縮是常見的優化手段,一些存儲方式自帶壓縮選擇,比如SEQUENCEFILE支持三種壓縮選擇:NONE,RECORD,BLOCK。Record壓縮率低,一般建議使用BLOCK壓縮;

ORC支持三種壓縮選擇:NONE,ZLIB,SNAPPY。我們以TEXT存儲方式和ORC存儲方式為例,查看錶的壓縮情況。

配置同樣數據同樣欄位的四張表,一張TEXT存儲方式,另外三張分別是默認壓縮方式的ORC存儲、SNAPPY壓縮方式的ORC存儲和NONE壓縮方式的ORC存儲,查看在hdfs上的存儲情況:

TEXT存儲方式

默認壓縮ORC存儲方式

SNAPPY壓縮的ORC存儲方式

NONE壓縮的ORC存儲方式

總結 :可以看到ORC存儲方式將數據存放為兩個block,默認壓縮大小加起來134.69M,SNAPPY壓縮大小加起來196.67M,NONE壓縮大小加起來247.55M,TEXT存儲方式的文件大小為366.58M,且默認block兩種存儲方式分別為256M和128M,ORC默認的壓縮方式比SNAPPY壓縮得到的文件還小,原因是ORZ默認的ZLIB壓縮方式採用的是deflate壓縮演算法,比Snappy壓縮演算法得到的壓縮比高,壓縮的文件更小。 ORC不同壓縮方式之間的執行速度,經過多次測試發現三種壓縮方式的執行速度差不多,所以建議採用ORC默認的存儲方式進行存儲數據。

2.4 分桶分區

Num Buckets表示桶的數量,我們可以通過分桶和分區操作對Hive表進行優化:

對於一張較大的表,可以將它設計成分區表,如果不設置成分區表,數據是全盤掃描的,設置成分區表後,查詢時只在指定的分區中進行數據掃描,提升查詢效率。要注意盡量避免多級分區,一般二級分區足夠使用。常見的分區欄位:

(1)日期或者時間,比如year、month、day或者hour,當表中存在時間或者日期欄位時,可以使用些欄位。

(2)地理位置,比如國家、省份、城市等

(3)業務邏輯,比如部門、銷售區域、客戶等等

與分區表類似,分桶表的組織方式是將HDFS上的一張大表文件分割成多個文件。分桶是相對分區進行更細粒度的劃分,分桶將整個數據內容按照分桶欄位屬性值得hash值進行區分,分桶可以加快數據采樣,也可以提升join的性能(join的欄位是分桶欄位),因為分桶可以確保某個key對應的數據在一個特定的桶內(文件),所以巧妙地選擇分桶欄位可以大幅度提升join的性能。通常情況下,分桶欄位可以選擇經常用在過濾操作或者join操作的欄位。

創建分桶表

create

table test_user_bucket(id int, name string,code string,code_id string )

clustered by(id) into 3 buckets ROW FORMAT DELIMITED FIELDS TERMINATED 

BY ',';

查看描述信息

DESCRIBE FORMATTED test_user_bucket

多出了如下信息

查看該表的hdfs

同樣的數據查看普通表和分桶表查詢效率

普通表

分桶表

普通表是全表掃描,分桶表在按照分桶欄位的hash值分桶後,根據join欄位或者where過濾欄位在特定的桶中進行掃描,效率提升。

本文首發於: 數棧研習社

數棧是雲原生—站式數據中台PaaS,我們在github上有一個有趣的開源項目: FlinkX

FlinkX是一個基於Flink的批流統一的數據同步工具,既可以採集靜態的數據,比如MySQL,HDFS等,也可以採集實時變化的數據,比如MySQL

binlog,Kafka等,是全域、異構、批流一體的數據同步引擎,大家如果有興趣,歡迎來github社區找我們玩~

⑵ ubuntu 安裝hive下哪個壓縮包 src bin

ubuntu 安裝hive下哪個壓縮包 src bin
不行。 安裝 vm 下載:去官網下 VMware-player-5.0.1-894247.zip 安裝和配置ubanto 下載:去官網下 ubuntu-12.10-desktop-i386.iso 打開vm,載入ubanto iso文件,進行安裝更新 進入ubanto,如果是第一個進入,則需要設置root的密碼

⑶ hadoop文件格式和壓縮

Hadoop中的文件格式大致上分為面向行和面向列兩類:

面向行:TextFile、SequenceFile、MapFile、Avro Datafile

二進制格式文件大小比文本文件大。

生產環境常用,作為原始表的存儲格式,會佔用更多磁碟資源,對它的 解析開銷一般會比二進制格式高 幾十倍以上。

Hadoop API 提供的一種二進制文件,它將數據以<key,value>的形式序列化到文件中。這種二進制文件內部使用Hadoop 的標準的Writable 介面實現序列化和反序列化。它與Hadoop API中的MapFile 是互相兼容的。

MapFile即為排序後的SequeneceFile,它會額外生成一個索引文件提供按鍵的查找。文件不支持復寫操作,不能向已存在的SequenceFile(MapFile)追加存儲記錄,在執行文件寫操作的時候,該文件是不可讀取的。

Avro是一種用於支持數據密集型的二進制文件格式。它的文件格式更為緊湊,若要讀取大量數據時,Avro能夠提供更好的序列化和反序列化性能。並且Avro數據文件天生是帶Schema定義的,所以它不需要開發者在API 級別實現自己的Writable對象。最近多個Hadoop 子項目都支持Avro 數據格式,如Pig 、Hive、Flume、Sqoop和Hcatalog。

面向列:Parquet 、RCFile、ORCFile

RCFile是Hive推出的一種專門面向列的數據格式。 它遵循「先按列劃分,再垂直劃分」的設計理念。當查詢過程中,針對它並不關心的列時,它會在IO上跳過這些列。

ORCFile (Optimized Record Columnar File)提供了一種比RCFile更加高效的文件格式。其內部將數據劃分為默認大小為250M的Stripe。每個Stripe包括索引、數據和Footer。索引存儲每一列的最大最小值,以及列中每一行的位置。

Parquet 是一種支持嵌套結構的列式存儲格式。Parquet 的存儲模型主要由行組(Row Group)、列塊(Column Chuck)、頁(Page)組成。

1、行組,Row Group:Parquet 在水平方向上將數據劃分為行組,默認行組大小與 HDFS Block 塊大小對齊,Parquet 保證一個行組會被一個 Mapper 處理。

2、列塊,Column Chunk:行組中每一列保存在一個列塊中,一個列塊具有相同的數據類型,不同的列塊可以使用不同的壓縮。

3、頁,Page:Parquet 是頁存儲方式,每一個列塊包含多個頁,一個頁是最小的編碼的單位,同一列塊的不同頁可以使用不同的編碼方式。

一般原始表數據使用文本格式存儲,其他的都是列式存儲。

目前在Hadoop中常用的幾種壓縮格式:lzo,gzip,snappy,bzip2,主要特性對比如下:

其性能對比如下:

2.1 lzo

hadoop中最流行的壓縮格式,壓縮/解壓速度也比較快,合理的壓縮率,支持split。適用於較大文本的處理。

對於lzo壓縮,常用的有LzoCodec和lzopCodec,可以對sequenceFile和TextFile進行壓縮。對TextFile壓縮後,mapred對壓縮後的文件默認是不能夠進行split操作,需要對該lzo壓縮文件進行index操作,生成lzo.index文件,map操作才可以進行split。如果設置LzoCodec,那麼就生成.lzo後綴的文件,可以用LzoIndexer 進行支持split的index計算,如果設置LzopCodec,那麼生成.lzo_deflate後綴的文件,不支持建立index。

⑷ 如何檢測hadoop中gz壓縮文件是否損壞

執行hive任務的時候,進入到8088的map詳細進度列表,即是RUNNING MAP attempts in job_1456816082333_1354,查看最後出錯的map是哪個節點或者在頁面直接點擊logs進入詳細log日誌查看,或者進入到節點的Hadoop的logs/userlogs目錄
根據jobid找到對應的目錄: application_1456816082333_1354,裡面有錯誤的文件id,然後刪除掉hdfs的對應的損壞文件。

⑸ hive 中的壓縮格式 rcfile,textfile,sequencefile 各有什麼區別

TextFile:
Hive默認格式,數據不做壓縮,磁碟開銷大,數據解析開銷大。
可結合Gzip、Bzip2、Snappy等使用(系統自動檢查,執行查詢時自動解壓),但使用這種方式,hive不會對數據進行切分,從而無法對數據進行並行操作。

⑹ Hive 資料庫表的基本操作,必須掌握的基本功

說明:hive 的表存放位置模式是由 hive-site.xml 當中的一個屬性指定的,默認是存放在該配置文件設置的路徑下,也可在創建資料庫時單獨指定存儲路徑。

資料庫有一些描述性的屬性信息,可以在創建時添加:

查看資料庫的鍵值對信息

修改資料庫的鍵值對信息

與mysql查詢語句是一樣的語法

刪除一個空資料庫,如果資料庫下面有數據表,那麼就會報錯

強制刪除資料庫,包含資料庫下面的表一起刪除(請謹慎操作)


[]里的屬性為可選屬性,不是必須的,但是如果有可選屬性,會使 sql 語句的易讀性更好,更標准與規范。

例如:[comment '欄位注釋信息'][comment '表的描述信息']等,[external]屬性除外


1. CREATE TABLE
創建一個指定名字的表,如果相同名字的表已存在,則拋出異常提示:表已存在,使用時可以使用IF NOT EXISTS語句來忽略這個異常。

如果創建的表名已存在,則不會再創建,也不會拋出異常提示:表已存在。否則則自動創建該表。


2. EXTERNAL
顧名思義是外部的意思,此關鍵字在建表語句中讓使用者可以創建一個外部表,如果不加該關鍵字,則默認創建內部表。

外部表在創建時必須同時指定一個指向實際數據的路徑(LOCATION),Hive在創建內部表時,會將數據移動到數據倉庫指向的路徑;

若創建外部表,僅記錄數據所在的路徑,不對數據的位置作任何改變。

內部表在刪除後,其元數據和數據都會被一起刪除。
外部表在刪除後,只刪除其元數據,數據不會被刪除。


3. COMMENT
用於給表的各個欄位或整張表的內容作解釋說明的,便於他人理解其含義。


4. PARTITIONED BY
區分表是否是分區表的關鍵欄位,依據具體欄位名和類型來決定表的分區欄位。


5. CLUSTERED BY
依據column_name對表進行分桶,在 Hive 中對於每一張表或分區,Hive 可以通過分桶的方式將數據以更細粒度進行數據范圍劃分。Hive採用對列值哈希,然後除以桶的個數求余的方式決定該條記錄存放在哪個桶當中。


6. SORTED BY
指定表數據的排序欄位和排序規則,是正序還是倒序排列。


7. ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '
指定表存儲中列的分隔符,這里指定的是' ',也可以是其他分隔符。


8. STORED AS SEQUENCEFILE|TEXTFILE|RCFILE
指定表的存儲格式,如果文件數據是純文本格式,可以使用STORED AS TEXTFILE,如果數據需要壓縮,則可以使用STORED AS SEQUENCEFILE。


9. LOCATION
指定 Hive 表在 hdfs 里的存儲路徑,一般內部表(Managed Table)不需要自定義,使用配置文件中設置的路徑即可。
如果創建的是一張外部表,則需要單獨指定一個路徑。


1. 使用create table語句創建表
例子:


2. 使用create table ... as select...語句創建表
例子:

使用 create table ... as select ...語句來創建新表sub_student,此時sub_student 表的結構及表數據與 t_student 表一模一樣, 相當於直接將 t_student 的表結構和表數據復制一份到 sub_student 表。


注意:
(1). select 中選取的列名(如果是 * 則表示選取所有列名)會作為新表 sub_student 的列名。

(2). 該種創建表的方式會改變表的屬性以及結構,例如不能是外部表,只能是內部表,也不支持分區、分桶。

如果as select後的表是分區表,並且使用select *,則分區欄位在新表裡只是作為欄位存在,而不是作為分區欄位存在。

在使用該種方式創建時,create 與 table 之間不能加 external 關鍵字,即不能通過該種方式創建外部目標表,默認只支持創建內部目標表。

(3). 該種創建表的方式所創建的目標表存儲格式會變成默認的格式textfile。


3.使用like語句創建表
例子:


注意:
(1). 只是將 t_student 的表結構復制給 sub1_student 表。

(2). 並不復制 t_student 表的數據給 sub1_student 表。

(3). 目標表可以創建為外部表,即:

⑺ hive下導入數據,生成表後的壓縮率大致有多大

hive不做壓縮的,只是在hdfs中移動數據,或是從本地文件系統移動到hdfs。原來是多大就是多大。
如果要壓縮,可以先壓縮好再導入,hive是不會替你做這步的。hive支持gz格式和lzo格式。gz格式原生支持。lzo格式需要某個特殊的serde。

⑻ hive 外部表和內部表 數據壓縮上有區別嗎

Hive中內部表與外部表的區別:
Hive
創建內部表時,會將數據移動到數據倉庫指向的路徑;若創建外部表,僅記錄數據所在的路徑,不對數據的位置做任何改變。在刪除表的時候,內部表的元數據和數據會被一起刪除,而外部表只刪除元數據,不刪除數據。這樣外部表相對來說更加安全些,數據組織也更加靈活,方便共享源數據。
需要注意的是傳統資料庫對表數據驗證是
schema
on
write(寫時模式),而
Hive
在load時是不檢查數據是否符合schema的,hive
遵循的是
schema
on
read(讀時模式),只有在讀的時候hive才檢查、解析具體的數據欄位、schema。
讀時模式的優勢是load
data
非常迅速,因為它不需要讀取數據進行解析,僅僅進行文件的復制或者移動。
寫時模式的優勢是提升了查詢性能,因為預先解析之後可以對列建立索引,並壓縮,但這樣也會花費要多的載入時間。

⑼ hive的幾種文件格式

hive文件存儲格式包括以下幾類:

1、TEXTFILE

2、SEQUENCEFILE

3、RCFILE

4、ORCFILE(0.11以後出現)

其中TEXTFILE為默認格式,建表時不指定默認為這個格式,導入數據時會直接把數據文件拷貝到hdfs上不進行處理;

SEQUENCEFILE,RCFILE,ORCFILE格式的表不能直接從本地文件導入數據,數據要先導入到textfile格式的表中, 然後再從表中用insert導入SequenceFile,RCFile,ORCFile表中。

前提創建環境:

hive 0.8

創建一張testfile_table表,格式為textfile。

create table if not exists testfile_table( site string, url string, pv bigint, label string) row format delimited fields terminated by ' ' stored as textfile;

load data local inpath '/app/weibo.txt' overwrite into table textfile_table;

一、TEXTFILE
默認格式,數據不做壓縮,磁碟開銷大,數據解析開銷大。
可結合Gzip、Bzip2使用(系統自動檢查,執行查詢時自動解壓),但使用這種方式,hive不會對數據進行切分,
從而無法對數據進行並行操作。
示例:

總結:
相比TEXTFILE和SEQUENCEFILE,RCFILE由於列式存儲方式,數據載入時性能消耗較大,但是具有較好的壓縮比和查詢響應。數據倉庫的特點是一次寫入、多次讀取,因此,整體來看,RCFILE相比其餘兩種格式具有較明顯的優勢。

⑽ hive性能優化及參數調優

記錄一下自己在工作中經常用到的幾個參數設置,從調整的實際效果看還是有效果的。

企業相關伺服器資源配置:平均600台active的節點,

每個節點可用的內存在200G左右,可用的memory total:116T

1、**set hive.exec.parallel=true;**

開啟job的並行:基本每個hql腳本都會開啟這個參數,默認並行度為8,

在集群資源充足的情況下,可以提高job並行的數量:

set hive.exec.parallel.thread.number=16;  (企業生產中我是很少用到這個的,都是用的默認值,因為太消耗資源怕影響別的任務,搞不好會被運維抓住,郵件通報批評!當然使用時還是看具體情況吧!)

因為需求中一張表的job的數量每次基本都在20個以上,在相關維度多,涉及到的欄位邏輯復雜的情況下,

一張表中job的數量會超過100個,之前做的一個需求中insert插入的腳本中job的數量達到了169個,

在測試環境運行的時候只用了一個小時就跑完了,數據量在一億條左右,大概有一百多G。

2、**set hive.map.aggr=true;**

在map端中會做部分聚集操作,效率更高但需要更多的內存,可以根據自己企業的資源情況來設置,

如果我的腳本涉及到的數據量不大的話,我一般不會開啟這個參數。

3、**set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;**

hive0.5開始的默認值,執行map前進行小文件合並,在一個job中生成的map的數量很多的時候,

和第二個參數一起開啟配合使用,在實際生產中多次驗證發現可以減少一倍以上的map數量。

在開啟前我的一個job的map數量有577個,開啟後的map的數量只有196個,極大提高程序的運行效率。

4、**set mapred.max.split.size=256000000;**

每個Map(一個切片的)最大輸入大小(這個值決定了合並後文件的數量),和第3個參數配合一起使用

默認值也是256000000,

mapred.min.split.size默認值是10000000

dfs.block.size默認是128M,這個參數通過hive來更改是沒有實際用的,只能通過hdfs來修改

***實際在hive中,並不是split的大小要小於等於blocksize,而是可以遠大於blocksize,為什麼???(map的數量)***

<1>當hive需要處理的文件是壓縮,且壓縮演算法不支持文件切分的時候,決定map個數的因素主要是文件塊實際存儲的大小,

如果文件塊本身很大,比如500Mb左右,那麼每個map處理的splitsize至少要是500Mb左右。

這個時候我們不能人為通過參數降低每個map的splitsize來增加map個數,只能通過增加splitsize,減少map個數,

如果hive處理的文件是壓縮模式,且壓縮模式不支持文件切分,那麼這個時候我們只能通過控制參數來減少map個數,而不能通過配置參數來增加map個數,所以Hive對於壓縮不可切分文件的調優有限

<2>如果Hive處理的的文件為非壓縮格式或者壓縮可切分,且inputFormat為CombineHiveInputFormat時,

則控制map個數是由以下四個參數起作用,關於這四個參數作用優先順序與使用注意事項請參考如下:

一般來講這幾個參數的結果大小要滿足以下條件:

max.split.size >= min.split.size >= min.size.per.node >= min.size.per.rack

幾個參數的作用優先順序為:

max.split.size <= min.split.size <= min.size.per.node <= min.size.per.rack

總結:所以對於控制map的個數進行調優,首先需要看是否開啟了壓縮,壓縮演算法是否支持切分,參數的設置等等!

5、**set mapred.min.split.size.per.node=256000000;**

一個節點上split的至少的大小(這個值決定了多個DataNode上的文件是否需要合並) ,

和第3和第4個參數一起配合使用。

6、**set mapred.min.split.size.per.rack=256000000;**

一個交換機下split的至少的大小(這個值決定了多個交換機上的文件是否需要合並) ,

也適合第3,4,5的參數一起配合使用。

7、**set hive.exec.mode.local.auto=true;**

開啟本地模式,這個參數在自己學習中可能經常用到,但是在實際生產中用到的還是比較少,

因為這個參數開啟後,針對的是小數據集,在單台機器上處理所有的任務,對生產中的任務不適用!

8、**set hive.exec.recers.bytes.per.recer=512*1000*1000;**

每個rece任務處理的數據量,默認為256M,在hive0.14.0之前默認是1G,我們公司設置的是512M,寫的是512*1000*1000因為在網路傳輸中用的是1000,而不是1024機制,

將該參數值調小可以增加rece的數量,提高運行的效率,

當然也不是rece的數量越多越好,因為啟動和初始化rece都是會消耗資源和時間的,

而且有多少個rece就會有多少個輸出文件,如果這些文件作為下一個任務的輸入,就會造成小文件過多的問題

9、**hive.exec.recers.max**

每個任務最大的rece數,默認為1009,在hive0.14.0之前默認是999

計算recer數的公式很簡單N=min(參數9,總輸入數據量/參數8)

即,如果rece的輸入(map的輸出)總大小不超過1G,那麼只會有一個rece任務;

10、**set mapred.rece.tasks = 15;**

設置rece的個數(在實際生產中謹慎使用)

那麼什麼時候可以進行手動設定rece數量呢?比如系統自動計算的rece個數,因為集群資源不足,

造成程序運行出現OOM(內存溢出不足)時,可以根據推定的rece個數手動增加數量,保證程序在跑的慢的基礎上可以完整運行

那麼在什麼情況下只有一個rece呢?

<1>、當map的輸出文件小於hive.exec.recers.bytes.per.recer時

<2>、手動設置set mapred.rece.tasks =1時

<3>、使用了order by時(全局排序會使用一個rece去處理)

<4>、表關聯時出現笛卡爾積

<5>、單獨使用count時,比如:select count(*) from tablename,

如果改寫加入了group by配合使用就不會出現一個rece,比如:select sign_date,count(*) from tablename group by sign_date;

11、**set mapred.job.reuse.jvm.num.tasks=10;**

用於避免小文件的場景或者task特別多的場景,這類場景大多數執行時間都很短,因為hive調起maprece任務,JVM的啟動過程會造成很大的開銷,尤其是job有成千上萬個task任務時,JVM重用可以使得JVM實例在同一個job中重新使用N次

12、**set hive.exec.dynamic.partition=true;**

表示開啟動態分區功能

13、**set hive.exec.dynamic.partition.mode=nonstrict;**

表示允許所有分區都是動態的,

默認是strict,表示必須保證至少有一個分區是靜態的

14、**set hive.groupby.skewindata=true;**

有數據傾斜的時候進行負載均衡 ,決定group by操作是否支持傾斜數據,其實說白了就相當於MR中的conbiner做了一次預聚合。

注意:只能對單個欄位聚合。

控制生成兩個MR Job,第一個MR Job Map的輸出結果隨機分配到rece中減少某些key值條數過多某些key條數過小造成的數據傾斜問題。

在第一個 MapRece 中,map 的輸出結果集合會隨機分布到 rece 中, 每個rece 做部分聚合操作,並輸出結果。這樣處理的結果是,相同的 Group By Key 有可能分發到不同的rece中,從而達到負載均衡的目的;

第二個 MapRece 任務再根據預處理的數據結果按照 Group By Key 分布到 rece 中(這個過程可以保證相同的 Group By Key 分布到同一個 rece 中),最後完成最終的聚合操作

15、**set hive.auto.convert.join=true;**

開啟map join

16、**set hive.mapjoin.smalltable.filesize=512000000;**

map join的小表的大小,也是開啟和關閉map join的閾值

17、**hive.exec.compress.output=true;**

開啟壓縮,我們公司使用的是默認的壓縮演算法deflate

壓縮演算法有:<1>、org.apache.hadoop.io.compress.GzipCodec,

  <2>、org.apache.hadoop.io.compress.DefaultCodec,

  <3>、com.hadoop.compression.lzo.LzoCodec,

  <4>、com.hadoop.compression.lzo.LzopCodec,

  <5>、org.apache.hadoop.io.compress.BZip2Codec

使用的壓縮演算法:

set maprece.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.DefaultCodec

**針對上述小文件合並的三個參數值做以下解釋:**

大於文件塊大小128m的,按照128m來分隔,小於128m,大於100m的,按照100m來分隔,把那些小於100m的(包括小文件和分隔大文件剩下的),進行合並

閱讀全文

與hive壓縮文件相關的資料

熱點內容
php內核源碼入口 瀏覽:910
java內存圖片 瀏覽:227
電器原理pdf 瀏覽:273
谷歌注冊無法連接網路連接伺服器地址 瀏覽:428
在識貨app上怎麼聯系客服 瀏覽:470
javac數據類型 瀏覽:480
kmp演算法演算法導論 瀏覽:193
單反照片批量壓縮 瀏覽:340
javazip壓縮目錄 瀏覽:712
89c52單片機晶振 瀏覽:206
pdf轉jpgmac 瀏覽:799
65壓縮機多少錢 瀏覽:120
同類型服務app如何脫穎而出 瀏覽:762
mtm月線金叉選股預警公式源碼 瀏覽:227
javasapwebservice 瀏覽:709
程序員老了去做什麼 瀏覽:404
linux小括弧 瀏覽:773
已加密的u盤怎麼清空 瀏覽:433
怎麼拿到伺服器許可權 瀏覽:192
延時攝影app如何保存 瀏覽:195