国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - 編程技術(shù) - 面試 | 不可不知的十大 Hive 調(diào)優(yōu)技巧優(yōu)秀實踐

面試 | 不可不知的十大 Hive 調(diào)優(yōu)技巧優(yōu)秀實踐

2021-12-30 21:47大數(shù)據(jù)技術(shù)與數(shù)倉西貝 編程技術(shù)

Apache Hive是建立在Apache Hadoop之上的數(shù)據(jù)倉庫軟件項目,用于提供數(shù)據(jù)查詢和分析。Hive是Hadoop在HDFS上的SQL接口,它提供了類似于SQL的接口來查詢存儲在與Hadoop集成的各種數(shù)據(jù)庫和文件系統(tǒng)中的數(shù)據(jù)。

面試 | 不可不知的十大 Hive 調(diào)優(yōu)技巧優(yōu)秀實踐

Apache Hive是建立在Apache Hadoop之上的數(shù)據(jù)倉庫軟件項目,用于提供數(shù)據(jù)查詢和分析。Hive是Hadoop在HDFS上的SQL接口,它提供了類似于SQL的接口來查詢存儲在與Hadoop集成的各種數(shù)據(jù)庫和文件系統(tǒng)中的數(shù)據(jù)。可以說從事數(shù)據(jù)開發(fā)工作,無論是在平時的工作中,還是在面試中,Hive具有舉足輕重的地位,尤其是Hive的性能調(diào)優(yōu)方面,不僅能夠在工作中提升效率而且還可以在面試中脫穎而出。在本文中,我將分享十個性能優(yōu)化技術(shù),全文如下。

1.多次INSERT單次掃描表

默認(rèn)情況下,Hive會執(zhí)行多次表掃描。因此,如果要在某張hive表中執(zhí)行多個操作,建議使用一次掃描并使用該掃描來執(zhí)行多個操作。

比如將一張表的數(shù)據(jù)多次查詢出來裝載到另外一張表中。如下面的示例,表my_table是一個分區(qū)表,分區(qū)字段為dt,如果需要在表中查詢2個特定的分區(qū)日期數(shù)據(jù),并將記錄裝載到2個不同的表中。

  1. INSERT INTO temp_table_20201115 SELECT * FROM my_table WHERE dt ='2020-11-15';
  2. INSERT INTO temp_table_20201116 SELECT * FROM my_table WHERE dt ='2020-11-16';

在以上查詢中,Hive將掃描表2次,為了避免這種情況,我們可以使用下面的方式:

  1. FROM my_table
  2. INSERT INTO temp_table_20201115 SELECT * WHERE dt ='2020-11-15'
  3. INSERT INTO temp_table_20201116 SELECT * WHERE dt ='2020-11-16'

這樣可以確保只對my_table表執(zhí)行一次掃描,從而可以大大減少執(zhí)行的時間和資源。

2.分區(qū)表

對于一張比較大的表,將其設(shè)計成分區(qū)表可以提升查詢的性能,對于一個特定分區(qū)的查詢,只會加載對應(yīng)分區(qū)路徑的文件數(shù)據(jù),因此,當(dāng)用戶使用特定分區(qū)列值執(zhí)行選擇查詢時,將僅針對該特定分區(qū)執(zhí)行查詢,由于將針對較少的數(shù)據(jù)量進行掃描,所以可以提供更好的性能。值得注意的是,分區(qū)字段的選擇是影響查詢性能的重要因素,盡量避免層級較深的分區(qū),這樣會造成太多的子文件夾。

現(xiàn)在問題來了,該使用哪些列進行分區(qū)呢?一條基本的法則是:選擇低基數(shù)屬性作為“分區(qū)鍵”,比如“地區(qū)”或“日期”等。

一些常見的分區(qū)字段可以是:

  • 日期或者時間

比如year、month、day或者hour,當(dāng)表中存在時間或者日期字段時,可以使用些字段。

  • 地理位置

比如國家、省份、城市等

  • 業(yè)務(wù)邏輯

比如部門、銷售區(qū)域、客戶等等

  1. CREATE TABLE table_name (
  2. col1 data_type,
  3. col2 data_type)
  4. PARTITIONED BY (partition1 data_type, partition2 data_type,….);

3.分桶表

通常,當(dāng)很難在列上創(chuàng)建分區(qū)時,我們會使用分桶,比如某個經(jīng)常被篩選的字段,如果將其作為分區(qū)字段,會造成大量的分區(qū)。在Hive中,會對分桶字段進行哈希,從而提供了中額外的數(shù)據(jù)結(jié)構(gòu),進行提升查詢效率。

與分區(qū)表類似,分桶表的組織方式是將HDFS上的文件分割成多個文件。分桶可以加快數(shù)據(jù)采樣,也可以提升join的性能(join的字段是分桶字段),因為分桶可以確保某個key對應(yīng)的數(shù)據(jù)在一個特定的桶內(nèi)(文件),所以巧妙地選擇分桶字段可以大幅度提升join的性能。通常情況下,分桶字段可以選擇經(jīng)常用在過濾操作或者join操作的字段。

我們可以使用set.hive.enforce.bucketing = true啟用分桶設(shè)置。

當(dāng)使用分桶表時,最好將bucketmapjoin標(biāo)志設(shè)置為true,具體配置參數(shù)為:

  1. CREATE TABLE table_name
  2. PARTITIONED BY (partition1 data_type, partition2 data_type,….) CLUSTERED BY (column_name1, column_name2, …)
  3. SORTED BY (column_name [ASC|DESC], …)]
  4. INTO num_buckets BUCKETS;

4.對中間數(shù)據(jù)啟用壓縮

復(fù)雜的Hive查詢通常會轉(zhuǎn)換為一系列多階段的MapReduce作業(yè),并且這些作業(yè)將由Hive引擎鏈接起來以完成整個查詢。因此,此處的“中間輸出”是指上一個MapReduce作業(yè)的輸出,它將用作下一個MapReduce作業(yè)的輸入數(shù)據(jù)。

壓縮可以顯著減少中間數(shù)據(jù)量,從而在內(nèi)部減少了Map和Reduce之間的數(shù)據(jù)傳輸量。

我們可以使用以下屬性在中間輸出上啟用壓縮。

  1. set hive.exec.compress.intermediate=true;
  2. set hive.intermediate.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
  3. set hive.intermediate.compression.type=BLOCK;

為了將最終輸出到HDFS的數(shù)據(jù)進行壓縮,可以使用以下屬性:

  1. set hive.exec.compress.output=true;

下面是一些可以使用的壓縮編解碼器

  1. org.apache.hadoop.io.compress.DefaultCodec
  2. org.apache.hadoop.io.compress.GzipCodec
  3. org.apache.hadoop.io.compress.BZip2Codec
  4. com.hadoop.compression.lzo.LzopCodec
  5. org.apache.hadoop.io.compress.Lz4Codec
  6. org.apache.hadoop.io.compress.SnappyCodec

5.Map端JOIN

map端join適用于當(dāng)一張表很小(可以存在內(nèi)存中)的情況,即可以將小表加載至內(nèi)存。Hive從0.7開始支持自動轉(zhuǎn)為map端join,具體配置如下:

  1. SET hive.auto.convert.join=true; -- hivev0.11.0之后默認(rèn)true
  2. SET hive.mapjoin.smalltable.filesize=600000000; -- 默認(rèn) 25m
  3. SET hive.auto.convert.join.noconditionaltask=true; -- 默認(rèn)true,所以不需要指定map join hint
  4. SET hive.auto.convert.join.noconditionaltask.size=10000000; -- 控制加載到內(nèi)存的表的大小

一旦開啟map端join配置,Hive會自動檢查小表是否大于hive.mapjoin.smalltable.filesize配置的大小,如果大于則轉(zhuǎn)為普通的join,如果小于則轉(zhuǎn)為map端join。

關(guān)于map端join的原理,如下圖所示:

面試 | 不可不知的十大 Hive 調(diào)優(yōu)技巧優(yōu)秀實踐

首先,Task A(客戶端本地執(zhí)行的task)負(fù)責(zé)讀取小表a,并將其轉(zhuǎn)成一個HashTable的數(shù)據(jù)結(jié)構(gòu),寫入到本地文件,之后將其加載至分布式緩存。

然后,Task B任務(wù)會啟動map任務(wù)讀取大表b,在Map階段,根據(jù)每條記錄與分布式緩存中的a表對應(yīng)的hashtable關(guān)聯(lián),并輸出結(jié)果

注意:map端join沒有reduce任務(wù),所以map直接輸出結(jié)果,即有多少個map任務(wù)就會產(chǎn)生多少個結(jié)果文件。

6.向量化

Hive中的向量化查詢執(zhí)行大大減少了典型查詢操作(如掃描,過濾器,聚合和連接)的CPU使用率。

標(biāo)準(zhǔn)查詢執(zhí)行系統(tǒng)一次處理一行,在處理下一行之前,單行數(shù)據(jù)會被查詢中的所有運算符進行處理,導(dǎo)致CPU使用效率非常低。在向量化查詢執(zhí)行中,數(shù)據(jù)行被批處理在一起(默認(rèn)=> 1024行),表示為一組列向量。

要使用向量化查詢執(zhí)行,必須以O(shè)RC格式(CDH 5)存儲數(shù)據(jù),并設(shè)置以下變量。

  1. SET hive.vectorized.execution.enabled=true

在CDH 6中默認(rèn)啟用Hive查詢向量化,啟用查詢向量化后,還可以設(shè)置其他屬性來調(diào)整查詢向量化的方式,具體可以參考cloudera官網(wǎng)。

7.謂詞下推

默認(rèn)生成的執(zhí)行計劃會在可見的位置執(zhí)行過濾器,但在某些情況下,某些過濾器表達式可以被推到更接近首次看到此特定數(shù)據(jù)的運算符的位置。

比如下面的查詢:

  1. select
  2. a.*,
  3. b.*
  4. from
  5. a join b on (a.col1 = b.col1)
  6. where a.col1 > 15 and b.col2 > 16

如果沒有謂詞下推,則在完成JOIN處理之后將執(zhí)行過濾條件**(a.col1> 15和b.col2> 16)**。因此,在這種情況下,JOIN將首先發(fā)生,并且可能產(chǎn)生更多的行,然后在進行過濾操作。

使用謂詞下推,這兩個謂詞**(a.col1> 15和b.col2> 16)**將在JOIN之前被處理,因此它可能會從a和b中過濾掉連接中較早處理的大部分?jǐn)?shù)據(jù)行,因此,建議啟用謂詞下推。

通過將hive.optimize.ppd設(shè)置為true可以啟用謂詞下推。

  1. SET hive.optimize.ppd=true

8.輸入格式選擇

Hive支持TEXTFILE, SEQUENCEFILE, AVRO, RCFILE, ORC,以及PARQUET文件格式,可以通過兩種方式指定表的文件格式:

  • CREATE TABLE … STORE AS :即在建表時指定文件格式,默認(rèn)是TEXTFILE
  • ALTER TABLE … [PARTITION partition_spec] SET FILEFORMAT :修改具體表的文件格式

如果未指定文件存儲格式,則默認(rèn)使用的是參數(shù)hive.default.fileformat設(shè)定的格式。

如果數(shù)據(jù)存儲在小于塊大小的小文件中,則可以使用SEQUENCE文件格式。如果要以減少存儲空間并提高性能的優(yōu)化方式存儲數(shù)據(jù),則可以使用ORC文件格式,而當(dāng)列中嵌套的數(shù)據(jù)過多時,Parquet格式會很有用。因此,需要根據(jù)擁有的數(shù)據(jù)確定輸入文件格式。

9.啟動嚴(yán)格模式

如果要查詢分區(qū)的Hive表,但不提供分區(qū)謂詞(分區(qū)列條件),則在這種情況下,將針對該表的所有分區(qū)發(fā)出查詢,這可能會非常耗時且占用資源。因此,我們將下面的屬性定義為strict,以指示在分區(qū)表上未提供分區(qū)謂詞的情況下編譯器將引發(fā)錯誤。

  1. SET hive.partition.pruning=strict

10.基于成本的優(yōu)化

Hive在提交最終執(zhí)行之前會優(yōu)化每個查詢的邏輯和物理執(zhí)行計劃。基于成本的優(yōu)化會根據(jù)查詢成本進行進一步的優(yōu)化,從而可能產(chǎn)生不同的決策:比如如何決定JOIN的順序,執(zhí)行哪種類型的JOIN以及并行度等。

可以通過設(shè)置以下參數(shù)來啟用基于成本的優(yōu)化。

  1. set hive.cbo.enable=true;
  2. set hive.compute.query.using.stats=true;
  3. set hive.stats.fetch.column.stats=true;
  4. set hive.stats.fetch.partition.stats=true;

可以使用統(tǒng)計信息來優(yōu)化查詢以提高性能。基于成本的優(yōu)化器(CBO)還使用統(tǒng)計信息來比較查詢計劃并選擇最佳計劃。通過查看統(tǒng)計信息而不是運行查詢,效率會很高。

收集表的列統(tǒng)計信息:

  1. ANALYZE TABLE mytable COMPUTE STATISTICS FOR COLUMNS;

查看my_db數(shù)據(jù)庫中my_table中my_id列的列統(tǒng)計信息:

  1. DESCRIBE FORMATTED my_db.my_table my_id

結(jié)論

本文主要分享了10個Hive優(yōu)化的基本技巧,希望能夠為你優(yōu)化Hive查詢提供一個基本的思路。再次感謝你的閱讀,希望本文對你有所幫助。

原文鏈接:https://mp.weixin.qq.com/s/VgedjANBQKlNf2f5V1IBvg

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲视频一区在线 | 精品自拍视频 | 日韩国伦理久久一区 | av色伊人久久综合一区二区 | 欧美在线视频一区 | 亚洲国产精品一区二区第一页 | 亚洲小视频网站 | 免费看日本黄色片 | 中文字幕亚洲欧美 | 亚洲一区二区三区高清 | 成人片网址 | 久久亚洲一区二区三区明星换脸 | 91在线看黄| 亚洲国产精品尤物yw在线观看 | 欧美午夜一区二区福利视频 | 在线亚洲一区 | 国产在线a | av电影免费 | 欧美黄色网视频 | 九九在线精品视频 | 国产黄色网址在线观看 | 国产精品69毛片高清亚洲 | 色综合久久久久 | 亚洲精品日韩精品 | 成人午夜精品久久久久久久3d | 欧美麻豆| 欧美一区二区公司 | 欧美视频三区 | 伊人3| 欧美国产另类 | 精品亚洲综合 | 中国大陆高清aⅴ毛片 | 成人三级视频 | 日韩欧美一区二区在线视频 | 国产精品久久久久久久久免费桃花 | 国产精品久久久久久久久久久久久 | 超碰伊人网 | 草草浮力影院 | 青娱乐国产视频 | 91午夜理伦私人影院 | 国产日韩一区二区 |