導航:首頁 > 程序命令 > hive命令參數

hive命令參數

發布時間:2023-02-10 03:23:21

① 數倉--Hive-面試之Hive設置配置參數的方法,列舉8個常用配置

上述三種設定方式的優先順序依次遞增。即參數聲明覆蓋命令行參數,命令行參數覆蓋配置文件設定。

這8個牢牢的背住吧,面試會被問道的

② Hive(五)之Hive-ef參數操作

假設公司讓你定時在凌晨3點執行hive的數據清洗操作,執行完第一個任務緊接著執行第二個任務,如何讓hive定時執行這樣的操作?

主要用於排查邏輯錯誤或者查看常用命令

固定語法:set 屬性名=屬性值
例如:set hive.cli.print.header=false;

集群數據遷移的時候,需要對當前某個目錄下的數據進行遷移,要對數據進行分開管理,這時候就要用到 location 的關鍵字

hive默認創建的是內部表( inner):

顯示指定: external

hive > show tables -> 所展示出來的信息依賴於元數據信息,metastore中有的數據才能夠進行show等操作。

刪除外部表是不會刪除數據本身的,是將metastore中的元數據刪除,只是將數據和欄位的雙射關系刪除(我的理解)。

③ hive 建表方式及參數詳解

   hive中有兩種表:外部表和內部表(managed and external)。可以通過 desc formatted table_name 命令來查看錶的信息,來辨別表是外部表還是內部表。 在hive默認創建到表是內部表,外部表創建需要加 EXTERNAL 命令,如: CREATE EXTERNAL table_name 。
   內部表的文件,元數據和統計信息等由hive進行管理,一般被存儲在 hive.metastore.warehouse.dir 目錄下,當表被刪除或者分區被刪除,相對應的數據和元數據就會被刪除。一般用來當做臨時表。
外部表與內部表相反,可以指定location,可以不基於hive來操作外部表文件。當表被刪除或者分區被刪除時對應的數據還會存在。只是hive刪除了其元信息,表的數據文件依然存在於文件系統中。若是表被刪除,可以重新建這個表,指定location到數據文件處,然後通過msck repair table table_name命令刷新數據的元信息到hive中,也就是恢復了數據。
   msck repair table 的詳細用法就不講了,可以參考 HIVE常用命令之MSCK REPAIR TABLE命令簡述

④ Hive調優參數篇

工作中常用的 hive 參數調優,整理如下。
原則:
• 最少數據
• 最少欄位
• 最少Job數
• 最少讀取次數
• 避免數據傾斜
• 整體最優而不是局部最優
• JVM 內存

這里需要結合集群的資源來合理的設置切片大小。

最小數據
最小數據原則:(map階段,shuffle階段,rece階段)

set hive.optimize.skewjoin=true;

磁碟的頻繁IO也是一種不小的消耗,所以可以通過配置一些參數來減少磁碟的IO

⑤ 如何徹底刪除hive以及配置好的環境變數

Copyright © 1999-2020, CSDN.NET, All Rights Reserved

搜索博文/帖子/用戶
登錄

奇子君
關注
hive 設置環境變數的方法總結 原創
2020-02-19 14:02:47

奇子君

碼齡10年

關注
Hive提供三種可以改變環境變數的方法:

1.配置文件:修改${HIVE_HOME}/conf/hive-site.xml配置文件;

在Hive中,所有的默認配置都在${HIVE_HOME}/conf/hive-default.xml文件中,如果需要對默認的配置進行修改,可以創建一個hive-site.xml文件,放在${HIVE_HOME}/conf目錄下。裡面可以對一些配置進行個性化設定。在hive-site.xml的格式如下:

絕大多少配置都是在xml文件裡面配置的,這里做的配置都全局用戶都生效。用戶自定義配置會覆蓋默認配置。另外,Hive也會讀入Hadoop的配置,因為Hive是作為Hadoop的客戶端啟動的,Hive的配置會覆蓋Hadoop的配置。

2. 命令行參數:在啟動Hive cli的時候進行配置,可以在命令行添加-hiveconf param=value來設定參數,例如:

hive --hiveconf maprece.job.queuename=queue

在Hive中所有MapRece作業都提交到隊列queue中。這一設定對本次啟動的會話有效,下次啟動需要重新配置。

3. 參數申明:在已經進入cli時進行參數聲明,可以在HQL中使用SET關鍵字設定參數,例如:

hive> set maprece.job.queuename=queue;

這種配置也是對本次啟動的會話有效,下次啟動需要重新配置。

上述三種設定方式的優先順序依次遞增。即參數聲明覆蓋命令行參數,命令行參數覆蓋配置文件設定。

⑥ 2060s hivesos設置

有以下5種方法。
_
1.在${HIVE_HOME}/conf/hive-site.xml文件中添加參數設置。
2.在啟動hivecli時,通過_hiveconfkey=value的方式進行設置。
3.在進入到cli之後,通過set命令設置。
4.hive-d。
5.hive參數初始化設置在當前用戶的家目錄下創建**.hiverc**文件,在當前文件中設置hive參數的命令,每次進入hivecli的時候,都會載入.hiverc的文件,執行文件中的命令。

⑦ 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優化之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社區找我們玩~

閱讀全文

與hive命令參數相關的資料

熱點內容
如何截獲手機app連接的ip 瀏覽:330
冰箱壓縮機是否需要電容 瀏覽:344
python列表每一行數據求和 瀏覽:274
自己有一台伺服器可以玩什麼 瀏覽:656
社會學波普諾pdf 瀏覽:584
解壓做食物的小視頻 瀏覽:758
pdf怎麼單獨設置文件夾 瀏覽:474
業務邏輯程序員 瀏覽:659
addto新建文件夾什麼意思 瀏覽:160
有伺服器地址怎麼安裝軟體 瀏覽:659
安卓如何完全清除數據 瀏覽:690
安卓安卓證書怎麼信任 瀏覽:53
伺服器被攻擊如何解決 瀏覽:221
學霸變成程序員 瀏覽:881
c語言編譯錯誤fatalerror 瀏覽:441
ipv4內部伺服器地址怎麼分配 瀏覽:463
java線程安全的方法 瀏覽:951
重復命令畫梯形 瀏覽:164
在疫情就是命令 瀏覽:328
自己搭建一個什麼伺服器好玩 瀏覽:253