主頁 >  其他 > Apache Hive基礎知識

Apache Hive基礎知識

2021-05-07 10:44:48 其他

我的hive學習筆記

一、簡介

Apache Hive是一個提供訪問HDFS上存盤資料的SQL介面的資料倉庫,適合存盤資料不會頻繁變化,且不需要快速回應給出結果的場景,Hive2.1.0暫不支持記錄級別的更新、洗掉,

二、架構

在這里插入圖片描述

JobTracker負責分配任務和資源管理
TaskTracker負責具體執行
Driver負責SQL編譯、優化、執行
MetaStore存盤元資料

1 Hive陳述句的執行程序

  1. 客戶端接收到客戶端的SQL
  2. 呼叫Driver,
    1. 從MetaStore讀取元資料
    2. 轉換成運算子
    3. 呼叫Hadoop或其他執行引擎執行
  3. client回傳查詢結果

2 元資料的三種模式

	1 單用戶模式(不建議使用此模式)
		此模式連接到一個In-memory的資料庫Derby,同一時間只允許一個用戶連接
	2 多用戶模式(推薦使用此模式)
		通過網路連接遠程資料庫,允許多個用戶連接
	3 遠程服務模式
		多了一層封裝,可以提供用戶通過Thrift協議呼叫服務來訪問元資料

三、客戶端命令列工具

Hive Cli

Hive Cli是一個客戶端命令列界面,是和Hive互動的最常用的方式,使用Cli,用戶可以建表、匯入資料、查詢等等,

注意:Hive1.0.0 后 Hive Cli不推薦使用,推薦的是Beeline Cli

案例:·

# 切換到hdfs用戶
su hdfs
# 啟動Hive Cli
hive
# 查看所有資料庫
show Databases;
# 使用default資料庫
use default;
# 查看所有的表
show tables;

Hive Cli 官方參考檔案:
https://cwiki.apache.org/confluence/display/Hive/GettingStarted#GettingStarted-RunningHiveCLI

Beeline Cli

Hive 1.0.0后推薦使用Beeline Cli

案例:

# 切換到hdfs用戶
su hdfs
# 啟動beeline
beeline 
# 連接指定ip,port和用戶名密碼的HiveServer2
!connect jdbc:hive2://localhost:10000 username passward
# 查看所有資料庫
show databases;
# 使用default;
use default;
# 查看所有表
show tables;

Beeline 官方參考檔案:
https://cwiki.apache.org/confluence/display/Hive/HiveServer2+Clients#HiveServer2Clients-Beeline%E2%80%93NewCommandLineShell

四、資料型別

基本資料型別

型別描述示例
tinyint1個位元組有符號整數1
smallint2個位元組有符號整數2
int4個位元組有符號整數3
bigint8個位元組有符號整數4
flout4個位元組單精度浮點數1.0
double8個位元組雙精度浮點數1.0
boolean布林值true
string字串,無長度限制“hello”

復合資料型別

型別描述示例
ARRAY有序串列,欄位型別必須相同array(1,2,3)
MAP無序key-value映射,key的型別必須為基本型別,value可以是任意型別,同一個MAP中key的型別必須相同,value的型別也必須相同map(“a”:1,“b”:2,“c”:3)
struct可以包含不同資料型別的元素,多個欄位為一組struct(“zhangsan”,23,3000)

資料型別 官方參考檔案:
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types#LanguageManualTypes-Overview

五、語法

這里只詳細記錄常用的,冷門操作可以看官方檔案

1 DDL

資料庫定義語言

DDL 官方檔案:
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-Overview

  • CREATE DATABASE/SCHEMA, TABLE, VIEW, FUNCTION, INDEX
  • DROP DATABASE/SCHEMA, TABLE, VIEW, INDEX
  • TRUNCATE TABLE
  • ALTER DATABASE/SCHEMA, TABLE, VIEW
  • MSCK REPAIR TABLE (or ALTER TABLE RECOVER PARTITIONS)
  • SHOW DATABASES/SCHEMAS, TABLES, TBLPROPERTIES, VIEWS, PARTITIONS, FUNCTIONS, INDEX[ES], COLUMNS, CREATE TABLE
  • DESCRIBE DATABASE/SCHEMA, table_name, view_name, materialized_view_name

1.1 Create/Drop/Alter/Use Database

資料庫的創建、洗掉、修改、使用操作

1.1.1 Create Database

創建資料庫

語法:

CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name
  [COMMENT database_comment]
  [LOCATION hdfs_path]
  [MANAGEDLOCATION hdfs_path]
  [WITH DBPROPERTIES (property_name=property_value, ...)];
  • DATABASE和SCHEMA是一個意思,類似Mysql里的Database
  • COMMENT 備注,添加備注后,查看庫的時資訊可以看到
  • LOCATION 默認庫的路徑,創建內部表后,內部表的默認父路徑
  • MANAGEDLOCATION 默認的管理庫的路徑,創建外部表后,外部表的默認父路徑
  • DBPROPERTIES 自定義設定一些屬性,比如可以指定username=zhangsan,create_time=2021-12-12 12:12:12

示例:

create database if not exists test_db_1 
comment "test database"  
with dbproperties (create_user=zhangsan);

1.1.2 Use Database

使用資料庫

語法:

USE database_name;

示例:

use test_db_1 ;

1.1.3 Drop Database

洗掉資料庫

語法:

DROP (DATABASE|SCHEMA) [IF EXISTS] database_name [RESTRICT|CASCADE];
  • CASCADE 假如資料庫里有表,默認洗掉時會提示無法洗掉,此時加上CASCADE 即可強制洗掉(慎用)

案例:

# 強制洗掉資料庫,即使有表存在也會一起洗掉
drop database if exists test_db_1 cascade;

1.2 Create/Drop/Truncate Table

表的創建、洗掉、截斷操作

1.2.1 Create Table

語法:

-- 語法1-直接建表
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name    -- (Note: TEMPORARY available in Hive 0.14.0 and later)
  [(col_name data_type [column_constraint_specification] [COMMENT col_comment], ... [constraint_specification])]
  [COMMENT table_comment]
  [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
  [CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]
  [SKEWED BY (col_name, col_name, ...)                  -- (Note: Available in Hive 0.10.0 and later)]
     ON ((col_value, col_value, ...), (col_value, col_value, ...), ...)
     [STORED AS DIRECTORIES]
  [
   [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]
  [TBLPROPERTIES (property_name=property_value, ...)]   -- (Note: Available in Hive 0.6.0 and later)
  [AS select_statement];   -- (Note: Available in Hive 0.5.0 and later; not supported for external tables)

-- 語法2-使用現有表建表
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
  LIKE existing_table_or_view_name
  [LOCATION hdfs_path];

關鍵詞解釋

  • TEMPORARY 建表時添加這個關鍵字建好的表是臨時表,當前會話退出后表就會被洗掉,用的較少
  • EXTERNAL 建表時指定external的表是外部表,什么是外部表下面有介紹
  • IF NOT EXISTS 如果表不存在則創建,存在則正常退出
  • db_name. 指定要創建的表位于哪個資料庫
  • table_name 指定表名
  • col_name data_type COMMENT col_comment 欄位名和欄位對應的型別,COMMENT的意思是申明欄位的備注,備注內容為col_comment;可以有多個
  • COMMENT table_comment 申明表的備注,備注內容為table_comment
  • PARTITIONED BY (col_name data_type [COMMENT col_comment], …) 指定根據哪些欄位磁區,col_name data_type COMMENT col_comment 指定磁區欄位名和欄位型別、備注和備注內容;可以有多個
  • CLUSTERED BY (col_name, col_name, …) [SORTED BY (col_name [ASC|DESC], …)] INTO num_buckets BUCKETS
    CLUSTERED BY申明分桶,根據型別為欄位名為col_name等一個或多個欄位分桶,SORTED BY根據列名為col_name的欄位進行排序,asc是順序,desc是倒序,INTO num_buckets BUCKETS指定分幾個桶,桶的數量是num_buckets
  • SKEWED BY (col_name, col_name, …) 指定資料傾斜列,可以提高有資料傾斜列時的查詢性能
  • ON ((col_value, col_value, …) 指定具體的傾斜列的傾斜的值
  • STORED AS DIRECTORIES 指定使用串列桶,為傾斜的欄位的值創建子目錄,查詢時提高性能
  • ROW FORMAT row_format 指定欄位、array、map、行按照什么規則切分,切分規則如下
    row_format
    : DELIMITED [FIELDS TERMINATED BY char [ESCAPED BY char]] [COLLECTION ITEMS TERMINATED BY char]
    [MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char]
    [NULL DEFINED AS char] – (Note: Available in Hive 0.13 and later)
    | SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, …)]
  • STORED AS file_format 指定檔案格式,支持TEXTFILE(默認)、SEQUENCEFILE、RCFILE、ORC、PARQUET、AVRO、JSONFILE(Hive4.0.0后支持的型別,其他型別都是1.0.0版本之前就支持的型別)
  • LOCATION hdfs_path 指定表在HDFS上的存盤路徑
  • TBLPROPERTIES (property_name=property_value, …) 指定表的自定義屬性,既可以修改預先定義好的屬性也可以自定義添加新屬性,這里類似資料庫的自定義屬性
  • AS select_statement 以查詢結果作為表結構

Hive表有四種,內部表,外部表,磁區表,分桶表

  • 內部表是不指定external和temporary時默認的建表方式,這種方式創建的表被洗掉時,資料也會被一起洗掉,表定義和資料強關聯
  • 外部表是指定external的表,這種方式創建的表被洗掉時,資料不會被一起洗掉,表定義和資料弱關聯
  • 磁區表就是有磁區的表,磁區就是把資料安裝某個或多個欄位分別存在不同的目錄下,在查詢時可以根據磁區篩選資料,減少讀取的資料量
  • 分桶表

案例:

-- 內部表
create table if not exists default.test_tb_1(
	user_id int "user's id",
	user_name string "user's name"
);
-- 外部表
CREATE EXTERNAL TABLE page_view(viewTime INT, userid BIGINT,
     page_url STRING, referrer_url STRING,
     ip STRING COMMENT 'IP Address of the User',
     country STRING COMMENT 'country of origination')
 COMMENT 'This is the staging page view table'
 ROW FORMAT DELIMITED FIELDS TERMINATED BY '\054'
 STORED AS TEXTFILE
 LOCATION '<hdfs_location>';
-- 磁區表
create external table if not exists default.test_tb_2(
	user_id int "user's id",
	user_name string "user's name"
)partitioned by (create_date string,org_num int);
-- 分桶表
CREATE TABLE page_view(viewTime INT, userid BIGINT,
     page_url STRING, referrer_url STRING,
     ip STRING COMMENT 'IP Address of the User')
 COMMENT 'This is the page view table'
 PARTITIONED BY(dt STRING, country STRING)
 CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS
 ROW FORMAT DELIMITED
   FIELDS TERMINATED BY '\001'
   COLLECTION ITEMS TERMINATED BY '\002'
   MAP KEYS TERMINATED BY '\003'
 STORED AS SEQUENCEFILE;

1.2.2 Drop Table

洗掉表

語法:

DROP TABLE [IF EXISTS] table_name [PURGE]; 

關鍵字解釋

  • PURGE 跳過回收站,在不指定purge的默認情況下,資料會進入HDFS的.Trash/Current路徑下同時表定義會被完全洗掉,誤刪后可以通過次項找回,但指定purge后,資料將被跳過回收站直接洗掉(慎用)

案例:

drop table if exists default.test_tb_1;

1.2.3 Truncate Table

清空表,只能清空內部表或內部表磁區的資料
語法:

TRUNCATE TABLE table_name [PARTITION partition_spec];

關鍵字解釋:

  • table_name 要清空的表名
  • PARTITION partition_spec 要清空具體磁區

案例:

truncate table default.test_tb_1;

1.2.3 Alter Table/Partition/Column

修改表、磁區、列
內容較多,常用的不多,建議直接查看官方檔案

此部分內容的官方檔案:
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-AlterTable

2 DML

資料處理語言

2.1 將資料匯入表

注意

  • 多個磁區欄位是有先后順序的;
  • 動態插入磁區表時需要開啟動態磁區(set hive.exec.dynamic.partition=true; set hive.exec.dynamic.partition.mode=nonstrict;);
  • 匯入磁區表或動態插入磁區表時,磁區欄位必須按順序排到所有非磁區欄位后

2.1.1 Loading files into tables

將檔案匯入到表

語法:

LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]

關鍵詞意思

  • LOCAL 指定檔案存放在本地檔案系統,不指定LOCAL默認為HDFS檔案系統;從本地匯入時是復制,匯入表后原有資料仍舊存在;從HDFS匯入時,是移動,匯入后原路徑資料會消失;
  • filepath 檔案的路徑
  • OVERWRITE 指定清空表再匯入新資料,默認為append(追加)
  • tablename 要匯入的表
  • PARTITION (partcol1=val1, partcol2=val2 …) 如果上面的表是磁區表,那么需要指定要匯入的磁區;有多個磁區需要指定多個磁區

案例:

# 匯入本地的資料到非磁區表,追加匯入
LOAD DATA LOCAL INPATH '/home/admin/test/test.txt' INTO TABLE test_1;
# 匯入本地的資料到磁區表的指定磁區,追加匯入
LOAD DATA LOCAL INPATH '/home/admin/test/test.txt' INTO TABLE test_1 PARTITIO(pt='20200101');

# 匯入HDFS的資料到非磁區表,覆寫原有資料
LOAD DATA INPATH '/home/admin/test/test.txt' OVERWRITE  INTO TABLE test_2;
# 匯入HDFS的資料到磁區表的指定磁區,覆寫原有資料
LOAD DATA INPATH '/home/admin/test/test.txt' OVERWRITE INTO TABLE test_1 PARTITIO(pt='20200101');

2.1.2 Inserting data into Hive Tables from queries

從查詢插入資料到hive表

語法:

# 標準語法
	#覆寫原有資料
	INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...) [IF NOT EXISTS]] select_statement1 FROM from_statement;
	# 追加插入
	INSERT INTO TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement;

# 動態磁區插入
INSERT OVERWRITE|INTO TABLE tablename PARTITION (partcol1[=val1], partcol2[=val2] ...) select_statement FROM from_statement;

案例:

# 插入非磁區表,覆寫原有資料
insert overwrite table tablename1 select a, b, c from test_1;
# 插入非磁區表,覆寫原有資料
insert overwrite table tablename1 select a, b, c from test_1;
# 插入磁區表,以追加的方式
insert into table tablename1 partition (create_date='20210101',org='1') select a, b, c from test_1;

# 一個靜態磁區,一個動態磁區,插入磁區表
insert overwrite table page_view partition (dt='2008-06-08', country) select pvs.user_id, pvs.user_name from page_view_stg pvs;
# 動態插入磁區表,2個動態磁區,不包括靜態磁區
insert overwrite table test_1(create_date, org) select user_id, user_name,create_date,org from tablename1;

動態磁區需要注意調整的引數

引數名默認值意思
hive.exec.dynamic.partitiontrue設定為true,表示開啟動態磁區
hive.exec.dynamic.partition.modestrict當處于strict模式時,用戶至少需要指定一個靜態磁區;在nonstrict 模式時,允許磁區都是動態磁區
hive.exec.max.dynamic.partitions.pernode100每個mapper/reducer被允許創建的動態磁區數的最大值
hive.exec.max.dynamic.partitions1000允許創建的動態磁區數的最大值
hive.exec.max.created.files100000hive任務的mapper/reducer創建的檔案數的個數
hive.error.on.empty.partitionfalse動態磁區插入產生空結果時是否拋出例外

2.1.3 Writing data into the filesystem from queries

將查詢出的資料匯出到檔案系統

語法:

INSERT OVERWRITE [LOCAL] DIRECTORY directory1
  [ROW FORMAT row_format] [STORED AS file_format] (Note: Only available starting with Hive 0.11.0)
  SELECT ... FROM ...

row_format
  : DELIMITED [FIELDS TERMINATED BY char [ESCAPED BY char]] [COLLECTION ITEMS TERMINATED BY char]
        [MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char]
        [NULL DEFINED AS char] (Note: Only available starting with Hive 0.13)

案例:

# 將表資料匯出到本地檔案系統,分割符為逗號
insert OVERWRITE LOCAL DIRECTORY '/home/hadoop/local_test_output' ROW FORMAT DELIMITED FIELDS TERMINATED by ',' select * from test_1;
# 將表資料匯出到HDFS檔案系統,分隔符為逗號
insert OVERWRITE DIRECTORY '/home/hadoop/hdfs_test_output' ROW FORMAT DELIMITED FIELDS TERMINATED by ',' select * from test_1;

注意匯出到檔案系統時,啟動用戶要有輸出目錄的寫權限,

DML 官方檔案:
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML

3 DQL

資料查詢語言

語法:

[WITH CommonTableExpression (, CommonTableExpression)*]    (Note: Only available starting with Hive 0.13.0)
SELECT [ALL | DISTINCT] select_expr, select_expr, ...
  FROM table_reference
  [WHERE where_condition]
  [GROUP BY col_list]
  [HAVING having_condition]
  [ORDER BY col_list]
  [CLUSTER BY col_list
    | [DISTRIBUTE BY col_list] [SORT BY col_list]
  ]
 [LIMIT [offset,] rows]

關鍵字解釋:

  • WITH CommonTableExpression (, CommonTableExpression)*
    定義CTE(公共表運算式),定義好后,一個查詢里可以多次參考定義好的公共表
  • SELECT [ALL | DISTINCT] select_expr, select_expr, …
    DISTINCT指定時,查詢回傳去重后的結果,不指定默認為ALL,回傳所有資料
    select_expr 查詢的列或者運算式,例如user_id,max(user_id)
  • FROM table_reference
    table_reference 表名
  • WHERE where_condition
    where_condition 篩選條件,對select到的列的值進行篩選,保留滿足條件的
  • GROUP BY col_list
    col_list 分組依據的列
  • HAVING having_condition
    having_condition 分組后,組內資料的篩選條件,保留滿足條件的
  • ORDER BY col_list
    col_list 根據指定的欄位排序,全域排序;order by 是在一個reduce里執行,所以資料量大時,速度很慢,可以通過嵌套排序加快速度
  • CLUSTER BY col_list | [DISTRIBUTE BY col_list] [SORT BY col_list
    CLUSTER BY col_list 根據指定的列排序,全域排序,只能降序
    DISTRIBUTE BY col_list 根據指定的欄位磁區,同一個欄位的同一個值落在一個磁區里
    SORT BY col_list 每個reducer里排序,非全域排序
  • LIMIT [offset,] rows
    限制回傳的條數,offset表示回傳的資料從第幾行開始,rows表示回傳幾行

案例:

# 定義公共表,查詢公共表
with 
t1 as select * from test_1
select * from t1;

# 查詢
select org,sum(age)
from t_user
where user_id > 1
group by org
having avg(age) > 35
order by org;

3.1 陳述句執行順序

Hive SQL執行順序

-- 正常SQL順序
selectfromwheregroup byhavingorder bylimit-- 真正執行順序
fromwhereselectgroup byhavingorder bylimit

我的理解:

  1. from 找到從哪個或哪幾個表找資料
  2. where 根據where條件留下符合條件的資料,這個是過濾不需要的行
  3. select 留下要查詢的欄位,這個是過濾不需要的列
  4. group by 根據哪些欄位分組
  5. having 組內過濾
  6. order by 排序
  7. 限制回傳行數

3.2 運算子和用戶自定義函式

此部分內容較多,且官方檔案就很容易理解,直接看官方檔案即可

官方檔案:
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF

六、元資料

元資料詳解:
https://www.cnblogs.com/qingyunzong/p/8710356.html

元資料統計資訊收集思路:
https://blog.csdn.net/songjifei/article/details/104706737

元資料詳細資訊收集思路:
https://blog.csdn.net/sanbudeyu_008/article/details/102800508

七、Hive優化

1 設定合理的map/reduce 數量

1.1 調整map數量

目的就是讓單個map處理合適資料量的資料,

1.1.1 資料量小,減少map數

當有幾百個小檔案時,可以通過調整引數合并檔案,減少檔案數

設定如下引數:

# 設定map任務的檔案切割大小為100MB
set mapred.max.split.size=100000000;
# 設定每個節點的檔案切割大小為100MB
set mapred.min.split.size.per.node=100000000;
# 設定每個機架的檔案切割大小為100MB
set mapred.min.split.size.per.rack=100000000;
# 設定執行map前先合并檔案
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;

前面三個引數確定合并檔案塊的大小,大于檔案塊大小128m的,按照128m來分隔,
小于128m,大于100m的,按照100m來分隔,把那些小于100m的(包括小檔案和分隔大檔案剩下的)進行合并,

1.1.2 資料量大,增加map數

當檔案很大,只用1個map去處理很費時間,此時可以增加map數量(按自己集群情況調整),

設定如下引數:

set mapred.map.tasks=10;

1.2 調整reduce數量

如果設定了mapred.reduce.tasks/mapreduce.job.reduces引數,那么Hive會直接使用它的值作為Reduce的個數;如果mapred.reduce.tasks/mapreduce.job.reduces的值沒有設定(也就是-1),那么Hive會根據輸入檔案的大小估算出Reduce的個數,根據輸入檔案估算Reduce的個數可能未必很準確,因為Reduce的輸入是Map的輸出,而Map的輸出可能會比輸入要小,所以最準確的數根據Map的輸出估算Reduce的個數,

reduce個數的設定極大影響任務執行效率,不指定reduce個數的情況下,Hive會猜測確定一個reduce個數,基于以下兩個設定:

hive.exec.reducers.bytes.per.reducer(每個reduce任務處理的資料量,默認為1000^3=1G)
hive.exec.reducers.max(每個任務最大的reduce數,默認為999)

計算reducer數的公式 N=min(引數2,總輸入資料量/引數1)
如果reduce的輸入(map的輸出)總大小不超過1G,那么只會有一個reduce任務;

1.2.1 方法1

調整如下引數

# 設定每個reduce處理的檔案大小設定為500MB
set hive.exec.reducers.bytes.per.reducer=500000000;

1.2.2 方法2

調整如下引數

# 設定reduce的數量為15
set mapred.reduce.tasks=15;

2 小檔案優化

小檔案產生可能的原因:

1 動態磁區插入資料,產生大量的小檔案,從而導致map數量劇增;
2 reduce數量越多,小檔案也越多(reduce的個數和輸出檔案是對應的);
3 資料源本身就包含大量的小檔案

小檔案的影響:

  1. 從Hive的角度看,小檔案會開很多map,一個map開一個JVM去執行,所以這些任務的初始化,啟動,執行會浪費大量的資源,嚴重影響性能,
  2. 在HDFS中,每個小檔案物件約占150byte,如果小檔案過多會占用大量記憶體,這樣NameNode記憶體容量嚴重制約了集群的擴展,

源頭解決思路:

1 減少reduce的數量(可以使用引數進行控制);
2 少用動態磁區,用時記得按distribute by磁區;

已有小檔案解決思路:

1 使用hadoop archive命令把小檔案進行歸檔;
2 重建表,建表時減少reduce數量;
3 通過引數進行調節,設定map/reduce端的相關引數

可調整的map/reduce引數:

# 每個Map最大輸入大小(這個值決定了合并后檔案的數量)  
set mapred.max.split.size=100000000;
# 一個節點上split的至少的大小(這個值決定了多個DataNode上的檔案是否需要合并)
set mapred.min.split.size.per.node=100000000; 
# 一個交換機下split的至少的大小(這個值決定了多個交換機上的檔案是否需要合并)    
set mapred.min.split.size.per.rack=100000000;  
# 執行Map前進行小檔案合并  
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; 

# 設定map端輸出進行合并,默認為true  
set hive.merge.mapfiles = true  
# 設定reduce端輸出進行合并,默認為false  
set hive.merge.mapredfiles = true  
# 設定合并檔案的大小  
set hive.merge.size.per.task = 256*1000*1000  
# 當輸出檔案的平均大小小于該值時,啟動一個獨立的MapReduce任務進行檔案merge,  
set hive.merge.smallfiles.avgsize=16000000 

3 SQL優化

優化思路:

  1. 盡早盡量過濾資料,減少每個階段的資料量
  2. 減少job數
  3. 減少掃描的檔案數或磁區數

案例表

# t_order 訂單表
create table t_order(
	order_id int "訂單編號",
	user_id int "用戶編號",
	create_date string "訂單創建時間"
);
# t_user 用戶表
create table t_user(
	user_id int "用戶編號",
	user_name string "用戶名",
	create_date string "創建時間"
);

3.1 列剪裁

一個表中有多個欄位,查詢時只查詢需要的列

# 優化前
select * from t_user;
# 優化后
select user_id from t_user;

3.2 磁區剪裁

資料量大的表必須是磁區表,查詢時where里必須指定磁區的篩選條件

# 優化前
select * from tablename;
# 優化后
select order_id,order_name from t_order where create_date>='2020-01-01';

3.3 避免笛卡爾積

關聯查詢時必須加關聯條件

# 優化前
select order_id,user_name from t_order, t_user;

select order_id,user_name from t_order inner join t_user;
# 優化后
select order_id,user_name from t_order, t_user where t_order.user_id = t_user.user_id;

select order_id,user_name from t_order inner join t_user on t_order.user_id=t_user.user_id;

3.4 join前過濾無用資料

# 優化前
select o.order_id,u.user_name  
from t_order o 
join t_user u on (o,user_id=u.user_id)  
where o.create_date = '2020-01-01' and u.create_date='2020-01-01';
# 優化后
select o2.order_id,u2.user_name from (select o.order_id,o.user_id from t_order o where o.create_date = '2020-01-01') o2 join (select user_id,user_name from t_user u where u.create_date='2020-01-01') u2 on o2.user_id = u2.user_id;

3.5 join時小表在前大表在右

在Reduce階段,位于join運算子左邊的表會先被加載到記憶體,載入條目較少的表可以有效的防止記憶體溢位(OOM),

# 優化前
select o.order_id,o.user_name from t_order o join t_user u on o.user_id=u.user_id;
# 優化后
select o.order_id,o.user_name from t_user u join  t_order o on u.user_id=o.user_id;

3.6 mapjoin

join有兩種,一種是map join,一種是reduce join,當小表和大表進行join時,盡量采用mapjoin;如果把join的操作先在map join,到reduce后接收到的資料會更少,同時可以避免小表和大表join產生的資料傾斜;

注意:一般行數小于2000行,大小小于1M(擴容后可以適當放大)的表才能使用

有2種使用方式
1 自動mapjoin默認是已開啟的,只需要小表放左邊即可
2 顯示指定mapjoin

# 方式1

set hive.auto.convert.join = true;# 開啟自動mapjoin
set hive.mapjoin.smalltable.filesize = 6250000;# 設定小表存盤的檔案大小
 
select * from t_user
join t_order 
on t_user.user_id=t_order.user_id;

# 方式2

set hive.ignore.mapjoin.hint=true;
 
select /*+ mapjoin(t_user) */   * 
from t_user
join t_order 
on t_user.user_id=t_order.user_id;

如果是mapjoin會有如下日志
在這里插入圖片描述

3.7 避免distinct

distinct使用一個reduce效率很慢,建議使用group by替代

# 優化前
select distinct user_id from t_order;
# 優化后
select user_id  from t_order group by user_id;

3.8 explain查看hive查詢的執行計劃

可以根據執行計劃的情況,調整sql

語法:

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

關鍵字:

  • EXTENDED 查看詳細資訊
  • CBO 查看Calcite優化器生成的執行計劃,還可以查看每個操作花費的資源(cpu,io)
  • AST 查看抽象語法樹
  • DEPENDENCY 查看本次輸入的額外資訊,包括表或其他的一些屬性
  • AUTHORIZATION 查看查詢權限
  • LOCKS 查看本次查詢所需要的鎖
  • VECTORIZATION 查看本次查詢不是向量化執行的原因
  • ANALYZE 查看計劃和實際行數

案例:

EXPLAIN
FROM src INSERT OVERWRITE TABLE dest_g1 SELECT src.key, sum(substr(src.value,4)) GROUP BY src.key;

依賴圖:

STAGE DEPENDENCIES:
  Stage-1 is a root stage
  Stage-2 depends on stages: Stage-1
  Stage-0 depends on stages: Stage-2

Stage-1是根步驟,Stage-2在Stage-2執行完之后執行,Stage-0在Stage-2執行完后執行,

STAGE PLANS:
  Stage: Stage-1
    Map Reduce
      Alias -> Map Operator Tree:
        src
            Reduce Output Operator
              key expressions:
                    expr: key
                    type: string
              sort order: +
              Map-reduce partition columns:
                    expr: rand()
                    type: double
              tag: -1
              value expressions:
                    expr: substr(value, 4)
                    type: string
      Reduce Operator Tree:
        Group By Operator
          aggregations:
                expr: sum(UDFToDouble(VALUE.0))
          keys:
                expr: KEY.0
                type: string
          mode: partial1
          File Output Operator
            compressed: false
            table:
                input format: org.apache.hadoop.mapred.SequenceFileInputFormat
                output format: org.apache.hadoop.mapred.SequenceFileOutputFormat
                name: binary_table
 
  Stage: Stage-2
    Map Reduce
      Alias -> Map Operator Tree:
        /tmp/hive-zshao/67494501/106593589.10001
          Reduce Output Operator
            key expressions:
                  expr: 0
                  type: string
            sort order: +
            Map-reduce partition columns:
                  expr: 0
                  type: string
            tag: -1
            value expressions:
                  expr: 1
                  type: double
      Reduce Operator Tree:
        Group By Operator
          aggregations:
                expr: sum(VALUE.0)
          keys:
                expr: KEY.0
                type: string
          mode: final
          Select Operator
            expressions:
                  expr: 0
                  type: string
                  expr: 1
                  type: double
            Select Operator
              expressions:
                    expr: UDFToInteger(0)
                    type: int
                    expr: 1
                    type: double
              File Output Operator
                compressed: false
                table:
                    input format: org.apache.hadoop.mapred.TextInputFormat
                    output format: org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat
                    serde: org.apache.hadoop.hive.serde2.dynamic_type.DynamicSerDe
                    name: dest_g1
 
  Stage: Stage-0
    Move Operator
      tables:
            replace: true
            table:
                input format: org.apache.hadoop.mapred.TextInputFormat
                output format: org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat
                serde: org.apache.hadoop.hive.serde2.dynamic_type.DynamicSerDe
                name: dest_g1

這個例子里有2個map/reduce步驟和1個檔案系統相關的步驟,Stage-1是讀取src表的資料并做一些轉換;Stage-2做分組聚合;Stage-0最后將資料移動到表相關的目錄里,

explain 官方檔案:
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Explain#LanguageManualExplain-EXPLAINSyntax

參考資料

Hive官方網站
《hive編程指南》
Hive優化(整理版)

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/283198.html

標籤:其他

上一篇:HDFS入門(四)—— HDFS的讀寫流程(圖文詳解步驟2021)

下一篇:2021年大資料常用語言Scala(七):基礎語法學習 條件運算式

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more