hive查詢小文件多的為什麼會慢
『壹』 Hive執行簡單查詢,耗時巨長,是什麼情況
1. 查詢語言。由於 SQL 被廣泛的應用在數據倉庫中,因此,專門針對 Hive 的特性設計了類 SQL 的查詢語言 HQL。熟悉 SQL 開發的開發者可以很方便的使用 Hive 進行開發。 2. 數據存儲位置。Hive 是建立在 Hadoop 之上的,所有 Hive 的數據都是存儲
『貳』 怎樣去找出線上hive或maprece運行慢的原因
先通過Hadoop的WEB監控界面找到Hive或者MapRece對應的Application,然後點進去查看該Application的Map和Rece任務數,哪個階段比較慢,再定位慢的原因。
『叄』 如何解決spark寫hive慢的問題
dataframe.registerTempTable("result")
sql(s"""INSERT OVERWRITE Table $outputTable PARTITION (dt ='$outputDate') select * from result""")
而整個結果數據的產生只需要4分鍾左右的時間,比如以下方式:將結果以textfile存入hdfs:
result.rdd.saveAsTextFile(output_tmp_dir)
由此可見,對hive的寫入操作耗用了大量的時間。
對此現象的優化可以是,將文件存為符合hive table文件的格式,然後使用hive load將產生的結果文件直接move到指定目錄下。代碼如下:
result.rdd.map { r => r.mkString("\001") }.repartition(partitions).saveAsTextFile(output_tmp_dir)
sql(s"""load data inpath '$output_tmp_dir' overwrite into table $output partition (dt='$dt')""")
『肆』 hive 執行查詢語句時間太長 550W數據count出來 需要60多秒 還沒有oracle速度快 那位大神知道問題出現在什
這個機制不一樣。
在oracle中,如果你count某一列,應該是僅僅載入這一列,如果有索引啥的,直接在索引上統計了,當然很快。(如果你count varchar非常大之類的欄位,速度應該會非常慢)
但是hive的cunt是基於hadoop的MR任務的,還是讀取每一行的所有的數據,如果你每行中有類似於clob之類的列的話,IO的開銷可想而知。 另外 MR任務的啟動也是需要時間的。
另外就是和你的hadoop的數據節點多少有關。
『伍』 hadoop分布式計算中,使用Hive查詢Hbase數據慢的問題
首先,節點規模上去,或者硬體配置上去才能讓hadoop引擎轉起來。
配置很低,一看就知道是科技項目,或者小作坊的做法,你的需求是很不合理的。在這配置下是沒優化空間。
另一方面,HIVE原理上只是基本的SQL轉義,換句話說,當你雲計算規模上去後,HIVE優化的本質就是讓你優化SQL,而不是HIVE多強。
『陸』 hive查詢數據一直卡住,最後報錯
然後刪除NEXT_LOCK_ID一條記錄。
NEXT_LOCK_ID 始終有鎖,無法刪除數據。;1、停止hiveserver2,MetaStore 服務;發現還有鎖;2、查看hive應用進程 ps -ef|grep hive,全部殺掉,鎖釋放;3、然後刪除NEXT_LOCK_ID一條記錄;4、重啟hiveserver2,MetaStore;5、查詢hive 恢復正常。
原因可能是多個進程同時操作,導致hive事務上的bug,插進了2條一樣的數據,導致元資料庫被鎖以下幾個hive元數據表跟hive的事務有關:NEXT_LOCK_ID;next_compaction_queue_id;next_txn_id;以上三個表出問題就有可能會報以下錯誤: error in acquiring locks: error communicating with the metastore.hive 卡死的原因很多,這個是其中之一,基本都hive metastore會有一些關系,大家可以按這個方向去定位原因,就能更快速尋找到問題的根源。
『柒』 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執行簡單查詢,耗時巨長,是什麼情況
稈第九源詘裸露咎