Hive_Hive企業使用高級優化/調優

概述

網上關於Hive調優的視頻、博客等相當多,但是也很雜。本文總結記錄Hive企業使用時常見的優化策略。

FetchTask

爲什麼有的sql執行mapreduce,而有的卻不?比如執行select * 的時候不會跑MR,這其實就是優化,屬於FetchTask。

  • 默認配置
    在hive.default.xml.template中,搜索hive.fetch.task.conversion
<property>
  <name>hive.fetch.task.conversion</name>
  <value>minimal</value>
  <description>
    Some select queries can be converted to single FETCH task minimizing latency.
    Currently the query should be single sourced not having any subquery and should not have
    any aggregations or distincts (which incurs RS), lateral views and joins.
    1. minimal : SELECT STAR, FILTER on partition columns, LIMIT only
    2. more    : SELECT, FILTER, LIMIT only (TABLESAMPLE, virtual columns)
  </description>
</property>

該配置的描述:某些選擇查詢可以轉換爲單個FETCH任務,從而最大程度地減少延遲。
默認參數:minimal,表示對select *、分區字段過濾、limit語法,不使用MR。改爲more的話,會支持更多的FetchTask。

  • 修改配置
    將以上配置複製並粘貼到hive-site.xml,minimal改爲more。

爲大表創建子表

  • 理解
    有些表的字段特別多,但是不同業務可能只會用到其中的不同字段,因此爲大表創建子表能提高效率。
  • 方式

子查詢:將子查詢的結構賦予一張新的表;用於分表。

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
# 中間是對錶的設置,如:
  [
   [ROW FORMAT row_format] 
   [STORED AS file_format]
     | STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...)]  -- (Note: Available in Hive 0.6.0 and later)
  ]
  [LOCATION hdfs_path]
 #
[AS select_statement]; 

外部表和分區表

外部表

  • 概念:外部表和內部表(又叫管理表或託管表)。管理表刪除的時候是刪除元數據和表的對應文件夾,外部表刪除的時候只刪除元數據。
  • 使用場景:多個部門共用一個數據時,先創建管理表,然後可以創建多個外部表,因爲刪除外部表時,只刪除對應的元數據,數據文件保留。
  • 創建:創建外部表,對HDFS 已經存在的數據文件,通過location 指定文件位置。
舉例:
create EXTERNAL table dept_ext( # 加EXTERBAL
deptno int,
dname string,
loc string
)
row format delimited fields terminated by '\t'
LOCATION '/user/hive/warehouse/db_emp.db/dept';	# LOCATION指定位置
  • 作用:保證數據的安全性。

分區表

  • 概念:分區表實際上就是對應一個HDFS文件系統上的獨立的文件夾,該文件夾下是該分區所有的數據文件Hive中的分區就是分目錄,把一個大的數據集根據業務需要分割成更下的數據集。在查詢時通過WHERE子句中的表達式來選擇查詢所需要的指定的分區,這樣的查詢效率會提高很多。
  • 使用場景:按年、按月、按日分區,一般二級分區就夠了。
  • 創建:
    CREATE EXTERNAL TABLE [IF NOT EXISTS] [db_name.]table_name    
    [(col_name data_type [COMMENT col_comment], ...)]
    [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
    [ROW FORMAT row_format] 
    舉例:
    create table emp_part(
    empno int,
    ename string,
    job string,
    mgr int,
    hiredate string,
    sal double,
    comm double,
    deptno int
    )
    PARTITIONED BY (event_month string,hour string)
    row format delimited fields terminated by '\t';
    load data local inpath '/opt/datas/emp.txt' into table emp_part PARTITION(date='20191212',hour='12');
    load data local inpath '/opt/datas/emp.txt' into table emp_part PARTITION(date='20191212',hour='13');
    
  • 作用:提高查詢檢索的效率

注意

分區表建立完成後,用dfs -put 方法加載數據文件之後,會發現查不到數據。原因在於存儲元數據的數據庫裏,沒有元數據信息。有兩種修復方式如下,企業中常用第二種。

  • 第一種方式:msck repair table table_name;

  • 第二種方式:alter table table_nameadd partition(分區條件);

  • 舉例如下:

    dfs -mkdir -p /user/hive/warehouse/dept_part/day=20191212;
    dfs -put /opt/datas/dept.txt /user/hive/warehouse/dept_part/day=20191212;
    第一種方式:
    hive(default)>msck repair table dept_part;
    第二種方式
    alter table dept_part add partition(day='20191212');
    

外部表和分區表使用方式:結合使用,多級分區

數據

  • 存儲格式(textfile/orc/parquet)
  • 數據壓縮(snappy)

對於這一塊,可以參照本人另一篇文章Hive數據格式

Join優化

分類

  • Common/Shuffle/Reduce Join
  • Map Join
  • SMB Join

Common/Shuffle/Reduce Join

定義:Join發生在Reduce Task階段
使用場景:大表對大表,每個表的數據都是從文件中讀取的。
在這裏插入圖片描述

Map Join

定義:Join發生在Map Task階段
使用場景:小表對大表,大表的數據從文件中讀取,小表的數據放在每個節點的內存中。由DistributionCache類實現。
在這裏插入圖片描述

SMB Join

  • 定義:Sort-Merge-Bucket Join,SMB Join是對Reduce Join的優化。
    在這裏插入圖片描述
SMB Join的流程:先對兩個大表按某個字段進行排序,對於上圖而言,自然應該是customer.id和order.cid;排序完之後將表分成若干個“桶”,如下示例的3 bucket,每個對應的bucket之間進行Join。
customer
	3 bucket
	1st
		1001  -  1101
	2nd 
		1201  -  1401
	3rd
		1501  -  1901

order
	1st
		1001  -  1101
	2nd 
		1201  -  1401
	3rd
		1501  -  1901

配置

  • Map Join
    Hive會自動判斷是“小表對大表”還是“大表對大表”,啓動只需要通過set hive.auto.convert.join=true;

在這裏插入圖片描述

  • SMB Join
    如下圖所示三個配置內容
    在這裏插入圖片描述

查看hql執行計劃

官網Explain描述

EXPLAIN [EXTENDED|CBO|AST|DEPENDENCY|AUTHORIZATION|LOCKS|VECTORIZATION|ANALYZE] query

在這裏插入圖片描述在這裏插入圖片描述加上EXTENDED可以知道更多細節
在這裏插入圖片描述

並行執行

  • 概念

針對有些互相沒有依賴關係的獨立的job,可以選擇併發的執行job。

如一個語句裏有多個job
	job1:a join b,結果:ab
	job2:c join d,結果:cd
	job3:ab join cd

job1和job2之間沒有依賴關係,可以並行執行。

  • 配置
    hive.exec.parallel
    -》是否開啓並行執行的功能
    hive.exec.parallel.thread.number
    -》設置並行執行的線程個數
    一般在工作中會選擇去開啓該功能,根據實際的集羣的狀況和服務器的性能合理的設置線程數目,一般在10到20之間。

JVM重用

  • JVM 開啓和關閉都會佔資源,也需要時間
  • JVM重用即JVM 一次性運行多個任務
  • 配置:mapreduce.job.jvm.numtasks
  • 通過合理的測試,設置一個合理的數目,不能過大

Map和Reduce數目

Map

  • Hadoop裏Map的數目主要由塊決定
  • 因此也要根據實際塊的大小進行設置
  • 配置:hive.merge.size.per.task
  • 額外一提:Hadoop源碼中有一個計算公式:min(max_split_size,max(min_split_size,block_size))
其中,min_split_size默認值0(最小分片大小);
max取的時候取的是block_size,block_size默認是128;
max_split_size默認值256(最大分片大小);
這個公式決定了map的個數。

一般在實際的生產環境中HDFS一旦format格式化之後,block_size大小不會去修改的。
所以不能直接去修改HDFS的block_size,我們通過修改max_split_size和min_split_size來影響map的個數

Reduce

  • 配置:mapreduce.job.reduces
  • 沒有固定的值,最好的經驗就是拿業務進行測試。設置不同的Reduce數目,執行時間也會不同,趨勢服從正太分佈

推測執行

  • 概念:當某個任務出現遲遲不結束的情況,那麼會考慮開啓推測執行,開啓另一個任務去完成。兩個任務誰先完成,就會kill掉另一個。分爲map端的推測和reduce端的推測。
  • 弊端:過多的消耗資源/ 額外消耗節點資源;可能會出現重複寫入的情況,產生異常
  • 配置:下面三個都要設置爲false
mapreduce.map.speculative
mapreduce.reduce.speculative
hive.mapred.reduce.tasks.speculative.execution(這個也要設爲false,曾經因爲沒有改,推測執行還保持存在)

在這裏插入圖片描述

動態分區調整

  • 場景演示
公司的日誌源表:company_log_src
	
假設有三個業務,對應三個表。表類型:外部表(技術部、銷售部、產品部都要用),分區表(month,day)
table1:company_log_ip  與ip相關
	/month=2019-12/day=12(company_log_ip目錄下可以看到二級分區)
table2:company_log_page	與用戶訪問的網頁有關
table3:company_log_refer	與用戶怎麼過來的有關

關於前端數據入庫的方式
* 對於src表
	load data ....
* 對應company_log_xx表
	load data path '' into table company_log_ip partition(month='2019-12',day='12') ;
分區目錄要手動創建,對於month每月創建可以接受,但是每天都要創建day分區,會很麻煩,所以要設置動態分區。
  • 配置內容
    在這裏插入圖片描述

Strict Mode

  • 概念:在Strict Mode下,對分區表查詢時,在where子句中沒有加分區過濾的話,會報錯。具體細節如下圖。
    在這裏插入圖片描述生產環境下建議開啓Strict Mode,因爲它會檢查我們寫的SQL,如果出問題,可以趕緊修改。

  • 備註

設置是:set hive.mapred.mode=strict;
查看是:set hive.mapred.mode;

Hive本地模式

業務場景:處理小數據集的時候,速度會更快一些
配置:hive.exec.mode.local.auto
本地模式的限制:數據的輸入大小不能超過128MB
本地模式的限制:map數不能超過4個
本地模式的限制:reduce的個數不能超過1個

數據傾斜常見問題及調優方案

正在整理中

發佈了9 篇原創文章 · 獲贊 6 · 訪問量 2376
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章