2022-02-09大数据学习日志——Hadoop离线阶段——Hive窗口函数、性能调优
學(xué)習(xí)目標(biāo)
掌握窗口函數(shù)的使用 知道Hive數(shù)據(jù)壓縮、文件存儲(chǔ)格式 掌握Hive通用調(diào)優(yōu)(重要的見下述大綱)內(nèi)容大綱
#Hive窗口函數(shù)(Window function)開窗函數(shù)分組TopN級(jí)聯(lián)累加問題連續(xù)登陸 #Hive的性能調(diào)優(yōu)hive的數(shù)據(jù)文件格式 數(shù)據(jù)壓縮行式存儲(chǔ) 列式存儲(chǔ)(ORC parquet)hive通用調(diào)優(yōu) *join優(yōu)化*group by數(shù)據(jù)傾斜優(yōu)化*task并行度問題其他通用調(diào)優(yōu)01_Apache Hive 窗口函數(shù) 快速理解與語法
1.1 快速理解窗口函數(shù)功能
-
window function 窗口函數(shù)、開窗函數(shù)、olap分析函數(shù)。
-
窗口:可以理解為操作數(shù)據(jù)的范圍,窗口有大有小,本窗口中操作的數(shù)據(jù)有多有少。
-
可以簡單地解釋為類似于聚合函數(shù)的計(jì)算函數(shù),但是通過GROUP BY子句組合的常規(guī)聚合會(huì)隱藏正在聚合的各個(gè)行,最終輸出一行;而窗口函數(shù)聚合后還可以訪問當(dāng)中的各個(gè)行,并且可以將這些行中的某些屬性添加到結(jié)果集中。
1.2 窗口函數(shù)語法
具有OVER語句的函數(shù)叫做窗口函數(shù)。
Function(arg1,..., argn) OVER ([PARTITION BY <...>] [ORDER BY <....>] [<window_expression>])--其中Function(arg1,..., argn) 可以是下面分類中的任意一個(gè)--聚合函數(shù):比如sum max avg等--排序函數(shù):比如rank row_number等--分析函數(shù):比如lead lag first_value等--OVER [PARTITION BY <...>] 類似于group by 用于指定分組 每個(gè)分組你可以把它叫做窗口 --如果沒有PARTITION BY 那么整張表的所有行就是一組--[ORDER BY <....>] 用于指定每個(gè)分組內(nèi)的數(shù)據(jù)排序規(guī)則 支持ASC、DESC--[<window_expression>] 用于指定每個(gè)窗口中 操作的數(shù)據(jù)范圍 默認(rèn)是窗口中所有行- 建表加載數(shù)據(jù) 后續(xù)練習(xí)使用
02_Apache Hive 窗口函數(shù) 聚合函數(shù)和窗口表達(dá)式
2.1 聚合函數(shù)
-
語法
sum|max|min|avg OVER ([PARTITION BY <...>] [ORDER BY <....>] [<window_expression>]) -
重點(diǎn):有PARTITION BY 沒有PARTITION BY的區(qū)別;有ORDER BY沒有ORDER BY的區(qū)別。
- 有沒有partition by 影響的是全局聚合 還是分組之后 每個(gè)組內(nèi)聚合。
- 有沒有order by的區(qū)別:
- 沒有order by,聚合的時(shí)候是組內(nèi)所有的數(shù)據(jù)聚合再一起 全局聚合
- 如果有order by,聚合的時(shí)候是累加聚合,默認(rèn)是第一行聚合到當(dāng)前行。
-
栗子
--1、求出每個(gè)用戶總pv數(shù) sum+group by普通常規(guī)聚合操作 select cookieid,sum(pv) as total_pv from website_pv_info group by cookieid; +-----------+-----------+ | cookieid | total_pv | +-----------+-----------+ | cookie1 | 26 | | cookie2 | 35 | +-----------+-----------+--2、sum+窗口函數(shù) 總共有四種用法 注意是整體聚合 還是累積聚合 --sum(...) over( )對(duì)表所有行求和 --sum(...) over( order by ... ) 連續(xù)累積求和 --sum(...) over( partition by... ) 同組內(nèi)所行求和 --sum(...) over( partition by... order by ... ) 在每個(gè)分組內(nèi),連續(xù)累積求和--需求:求出網(wǎng)站總的pv數(shù) 所有用戶所有訪問加起來 --sum(...) over( )對(duì)表所有行求和 select cookieid,createtime,pv,sum(pv) over() as total_pv from website_pv_info;--需求:求出每個(gè)用戶總pv數(shù) --sum(...) over( partition by... ),同組內(nèi)所行求和 select cookieid,createtime,pv,sum(pv) over(partition by cookieid) as total_pv from website_pv_info;--需求:求出每個(gè)用戶截止到當(dāng)天,累積的總pv數(shù) --sum(...) over( partition by... order by ... ),在每個(gè)分組內(nèi),連續(xù)累積求和 select cookieid,createtime,pv,sum(pv) over(partition by cookieid order by createtime) as current_total_pv from website_pv_info; +-----------+-------------+-----+-------------------+ | cookieid | createtime | pv | current_total_pv | +-----------+-------------+-----+-------------------+ | cookie1 | 2018-04-10 | 1 | 1 | | cookie1 | 2018-04-11 | 5 | 6 | | cookie1 | 2018-04-12 | 7 | 13 | | cookie1 | 2018-04-13 | 3 | 16 | | cookie1 | 2018-04-14 | 2 | 18 | | cookie1 | 2018-04-15 | 4 | 22 | | cookie1 | 2018-04-16 | 4 | 26 | | cookie2 | 2018-04-10 | 2 | 2 | | cookie2 | 2018-04-11 | 3 | 5 | | cookie2 | 2018-04-12 | 5 | 10 | | cookie2 | 2018-04-13 | 6 | 16 | | cookie2 | 2018-04-14 | 3 | 19 | | cookie2 | 2018-04-15 | 9 | 28 | | cookie2 | 2018-04-16 | 7 | 35 | +-----------+-------------+-----+-------------------+
2.2 窗口表達(dá)式 window_expression
直譯叫做window表達(dá)式 ,通俗叫法稱之為window子句。
-
功能:控制窗口操作的范圍。
-
語法
rows between- preceding:往前- following:往后- current row:當(dāng)前行- unbounded:起點(diǎn)- unbounded preceding 表示從前面的起點(diǎn) 第一行- unbounded following:表示到后面的終點(diǎn) 最后一行 -
栗子
--默認(rèn)從第一行到當(dāng)前行 select cookieid,createtime,pv,sum(pv) over(partition by cookieid order by createtime) as pv1 from website_pv_info;--第一行到當(dāng)前行 等效于rows between不寫 默認(rèn)就是第一行到當(dāng)前行 select cookieid,createtime,pv,sum(pv) over(partition by cookieid order by createtime rows between unbounded preceding and current row) as pv2 from website_pv_info;--向前3行至當(dāng)前行 select cookieid,createtime,pv,sum(pv) over(partition by cookieid order by createtime rows between 3 preceding and current row) as pv4 from website_pv_info;--向前3行 向后1行 select cookieid,createtime,pv,sum(pv) over(partition by cookieid order by createtime rows between 3 preceding and 1 following) as pv5 from website_pv_info;--當(dāng)前行至最后一行 select cookieid,createtime,pv,sum(pv) over(partition by cookieid order by createtime rows between current row and unbounded following) as pv6 from website_pv_info;--第一行到最后一行 也就是分組內(nèi)的所有行 select cookieid,createtime,pv,sum(pv) over(partition by cookieid order by createtime rows between unbounded preceding and unbounded following) as pv6 from website_pv_info;
03_Apache Hive 窗口函數(shù) 排序函數(shù)(row_number等)
-
功能:主要對(duì)數(shù)據(jù)分組排序之后,組內(nèi)順序標(biāo)號(hào)。
-
核心函數(shù):row_number、rank、dense_rank
-
適合場景:分組TopN問題(注意哦 不是全局topN)
-
栗子
SELECTcookieid,createtime,pv,RANK() OVER(PARTITION BY cookieid ORDER BY pv desc) AS rn1,DENSE_RANK() OVER(PARTITION BY cookieid ORDER BY pv desc) AS rn2,ROW_NUMBER() OVER(PARTITION BY cookieid ORDER BY pv DESC) AS rn3 FROM website_pv_info;--需求:找出每個(gè)用戶訪問pv最多的Top3 重復(fù)并列的不考慮 SELECT * from (SELECTcookieid,createtime,pv,ROW_NUMBER() OVER(PARTITION BY cookieid ORDER BY pv DESC) AS seq FROM website_pv_info) tmp where tmp.seq <4; -
ntile函數(shù)
-
功能:將分組排序之后的數(shù)據(jù)分成指定的若干個(gè)部分(若干個(gè)桶)
-
規(guī)則:盡量平均分配 ,優(yōu)先滿足最小的桶,彼此最多不相差1個(gè)。
-
栗子
--把每個(gè)分組內(nèi)的數(shù)據(jù)分為3桶 SELECTcookieid,createtime,pv,NTILE(3) OVER(PARTITION BY cookieid ORDER BY createtime) AS rn2 FROM website_pv_info ORDER BY cookieid,createtime;--需求:統(tǒng)計(jì)每個(gè)用戶pv數(shù)最多的前3分之1天。 --理解:將數(shù)據(jù)根據(jù)cookieid分 根據(jù)pv倒序排序 排序之后分為3個(gè)部分 取第一部分 SELECT * from (SELECTcookieid,createtime,pv,NTILE(3) OVER(PARTITION BY cookieid ORDER BY pv DESC) AS rnFROM website_pv_info) tmp where rn =1;
-
04_Apache Hive 窗口函數(shù) lag、lead函數(shù)
--LAG 用于統(tǒng)計(jì)窗口內(nèi)往上第n行值 SELECT cookieid,createtime,url,ROW_NUMBER() OVER(PARTITION BY cookieid ORDER BY createtime) AS rn,LAG(createtime,1,'1970-01-01 00:00:00') OVER(PARTITION BY cookieid ORDER BY createtime) AS last_1_time,LAG(createtime,2) OVER(PARTITION BY cookieid ORDER BY createtime) AS last_2_time FROM website_url_info;--LEAD 用于統(tǒng)計(jì)窗口內(nèi)往下第n行值 SELECT cookieid,createtime,url,ROW_NUMBER() OVER(PARTITION BY cookieid ORDER BY createtime) AS rn,LEAD(createtime,1,'1970-01-01 00:00:00') OVER(PARTITION BY cookieid ORDER BY createtime) AS next_1_time,LEAD(createtime,2) OVER(PARTITION BY cookieid ORDER BY createtime) AS next_2_time FROM website_url_info;--FIRST_VALUE 取分組內(nèi)排序后,截止到當(dāng)前行,第一個(gè)值 SELECT cookieid,createtime,url,ROW_NUMBER() OVER(PARTITION BY cookieid ORDER BY createtime) AS rn,FIRST_VALUE(url) OVER(PARTITION BY cookieid ORDER BY createtime) AS first1 FROM website_url_info;--LAST_VALUE 取分組內(nèi)排序后,截止到當(dāng)前行,最后一個(gè)值 SELECT cookieid,createtime,url,ROW_NUMBER() OVER(PARTITION BY cookieid ORDER BY createtime) AS rn,LAST_VALUE(url) OVER(PARTITION BY cookieid ORDER BY createtime) AS last1 FROM website_url_info;05_Apache Hive 文件存儲(chǔ)格式(text、ORC、parquet)
-
列式存儲(chǔ)、行式存儲(chǔ)
- 數(shù)據(jù)最終在文件中底層以什么樣的形成保存。
-
Hive中表的數(shù)據(jù)存儲(chǔ)格式,不是只支持text文本格式,還支持其他很多格式。
-
hive表的文件格式是如何指定的呢? 建表的時(shí)候通過STORED AS 語法指定。如果沒有指定默認(rèn)都是textfile。
-
Hive中主流的幾種文件格式。
-
textfile 文件格式
-
ORC、Parquet 列式存儲(chǔ)格式。
都是列式存儲(chǔ)格式,底層是以二進(jìn)制形式存儲(chǔ)。數(shù)據(jù)存儲(chǔ)效率極高,對(duì)于查詢賊方便。 二進(jìn)制意味著肉眼無法直接解析,hive可以自解析。 -
栗子
分別使用3種不同格式存儲(chǔ)數(shù)據(jù),去HDFS上查看底層文件存儲(chǔ)空間的差異。
--1、創(chuàng)建表,存儲(chǔ)數(shù)據(jù)格式為TEXTFILE create table log_text ( track_time string, url string, session_id string, referer string, ip string, end_user_id string, city_id string ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS TEXTFILE; --如果不寫stored as textfile 默認(rèn)就是textfile--加載數(shù)據(jù) load data local inpath '/root/hivedata/log.data' into table log_text;--2、創(chuàng)建表,存儲(chǔ)數(shù)據(jù)格式為ORC create table log_orc( track_time string, url string, session_id string, referer string, ip string, end_user_id string, city_id string ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS orc ;--向表中插入數(shù)據(jù) 思考為什么不能使用load命令加載? 因?yàn)閘oad是純復(fù)制移動(dòng)操作 不會(huì)調(diào)整文件格式。 insert into table log_orc select * from log_text;--3、創(chuàng)建表,存儲(chǔ)數(shù)據(jù)格式為parquet create table log_parquet( track_time string, url string, session_id string, referer string, ip string, end_user_id string, city_id string ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS PARQUET ;--向表中插入數(shù)據(jù) insert into table log_parquet select * from log_text ;
-
06_Apache Hive 數(shù)據(jù)壓縮和文件格式搭配(ORC+snappy)
-
Hive的默認(rèn)執(zhí)行引擎是MapReduce,因此通常所說的Hive壓縮指的是MapReduce的壓縮。
-
壓縮是指通過算法對(duì)數(shù)據(jù)進(jìn)行重新編排,降低存儲(chǔ)空間。無損壓縮。
-
MapReduce可以在兩個(gè)階段進(jìn)行數(shù)據(jù)壓縮
- map的輸出
- 減少shuffle的數(shù)據(jù)量 提高shuffle時(shí)網(wǎng)絡(luò)IO的效率
- reduce的輸出
- 減少輸出文件的大小 降低磁盤的存儲(chǔ)空間
- map的輸出
-
壓縮的弊端
- 浪費(fèi)時(shí)間
- 消耗CPU、內(nèi)存
- 某些優(yōu)秀的壓縮算法需要錢
-
壓縮的算法(推薦使用snappy)
Snappy org.apache.hadoop.io.compress.SnappyCodec -
Hive中壓縮的設(shè)置:注意 本質(zhì)還是指的是MapReduce的壓縮
--設(shè)置Hive的中間壓縮 也就是map的輸出壓縮 1)開啟 hive 中間傳輸數(shù)據(jù)壓縮功能 set hive.exec.compress.intermediate=true; 2)開啟 mapreduce 中 map 輸出壓縮功能 set mapreduce.map.output.compress=true; 3)設(shè)置 mapreduce 中 map 輸出數(shù)據(jù)的壓縮方式 set mapreduce.map.output.compress.codec = org.apache.hadoop.io.compress.SnappyCodec;--設(shè)置Hive的最終輸出壓縮,也就是Reduce輸出壓縮 1)開啟 hive 最終輸出數(shù)據(jù)壓縮功能 set hive.exec.compress.output=true; 2)開啟 mapreduce 最終輸出數(shù)據(jù)壓縮 set mapreduce.output.fileoutputformat.compress=true; 3)設(shè)置 mapreduce 最終數(shù)據(jù)輸出壓縮方式 set mapreduce.output.fileoutputformat.compress.codec =org.apache.hadoop.io.compress.SnappyCodec; 4)設(shè)置 mapreduce 最終數(shù)據(jù)輸出壓縮為塊壓縮 還可以指定RECORD set mapreduce.output.fileoutputformat.compress.type=BLOCK; --設(shè)置完畢之后 只有當(dāng)HiveSQL底層通過MapReduce程序執(zhí)行 才會(huì)涉及壓縮。 --已有普通格式的表 select * from student_hdfs;--ctas語句 create table student_snappy as select * from student_hdfs ; -
在實(shí)際開發(fā)中,可以根據(jù)需求選擇不同的文件格式并且搭配不同的壓縮算法。可以得到更好的存儲(chǔ)效果。
--不指定壓縮格式 代表什么呢? --orc 存儲(chǔ)文件默認(rèn)采用ZLIB 壓縮。比 snappy 壓縮的小 STORED AS orc; --2.78M--以O(shè)RC格式存儲(chǔ) 不壓縮 STORED AS orc tblproperties ("orc.compress"="NONE"); --7.69M--以O(shè)RC格式存儲(chǔ) 使用snappy壓縮 STORED AS orc tblproperties ("orc.compress"="SNAPPY"); --3.78M
07_Apache Hive 通用調(diào)優(yōu) fetch抓取機(jī)制、MR本地模式
7.1 Fetch抓取機(jī)制
-
功能:在執(zhí)行sql的時(shí)候,能不走M(jìn)apReduce程序處理就盡量不走M(jìn)apReduce程序處理。
-
盡量直接去操作數(shù)據(jù)文件。
-
官方描述
Currently the query should be single sourced not having any subquery and should not have any aggregations or distincts (which incur RS – ReduceSinkOperator, requiring a MapReduce task), lateral views and joins.應(yīng)該是單一數(shù)據(jù)源 沒有子查詢 沒有聚合操作 沒有去重操作 沒有側(cè)視圖 沒有join -
設(shè)置: hive.fetch.task.conversion= more。
--在下述3種情況下 sql不走mr程序--全局查找 select * from student; --字段查找 列裁剪 select num,name from student; --limit 限制查找 select num,name from student limit 2;
7.2 mapreduce本地模式
-
功能:如果非要執(zhí)行MapReduce程序,能夠本地執(zhí)行的,盡量不提交yarn上執(zhí)行。
-
默認(rèn)是關(guān)閉的。意味著只要走M(jìn)apReduce就提交yarn執(zhí)行。
mapreduce.framework.name = local 本地模式 mapreduce.framework.name = yarn 集群模式 -
Hive提供了一個(gè)參數(shù),自動(dòng)切換MapReduce程序?yàn)楸镜啬J?#xff0c;如果不滿足條件,就執(zhí)行yarn模式。
set hive.exec.mode.local.auto = true;--3個(gè)條件必須都滿足 自動(dòng)切換本地模式 The total input size of the job is lower than: hive.exec.mode.local.auto.inputbytes.max (128MB by default) --數(shù)據(jù)量小于128MThe total number of map-tasks is less than: hive.exec.mode.local.auto.tasks.max (4 by default) --maptask個(gè)數(shù)少于4個(gè)The total number of reduce tasks required is 1 or 0. --reducetask個(gè)數(shù)是0 或者 1 -
切換Hive的執(zhí)行引擎
WARNING: Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.如果針對(duì)Hive的調(diào)優(yōu)依然無法滿足你的需求 還是效率低, 嘗試使用spark計(jì)算引擎 或者Tez.
08_Apache Hive 通用調(diào)優(yōu) join優(yōu)化
底層還是MapReduce的join優(yōu)化
8.1 map join
適合于小表join大表或者小表Join小表
#是否開啟自動(dòng)轉(zhuǎn)為mapjoin 在滿足條件的情況下 默認(rèn)true hive.auto.convert.join=trueHive老版本 #如果參與的一個(gè)表大小滿足條件 轉(zhuǎn)換為map join hive.mapjoin.smalltable.filesize=25000000 Hive2.0之后版本 #是否啟用基于輸入文件的大小,將reduce join轉(zhuǎn)化為Map join的優(yōu)化機(jī)制。 hive.auto.convert.join.noconditionaltask=true #如果上述參數(shù)為true,假設(shè)參與join的表(或分區(qū))有N個(gè),并且有N-1個(gè)表(或分區(qū))的大小總和小于下述參數(shù)指定的值,那么會(huì)直接轉(zhuǎn)為Map join。 hive.auto.convert.join.noconditionaltask.size=10000000 默認(rèn)10M8.2 reduce join
適合于大表Join大表
如果不滿足map端join,那么就只能走reduce端join了,在hive中也把reduce端join叫做common join.8.3 bucket join
適合于大表Join大表
-
方式1:Bucktet Map Join
將表進(jìn)行分桶,每次join時(shí)分桶參與而不是整張表參與,相當(dāng)于小表join了。
語法: clustered by colName(參與join的字段) 參數(shù): set hive.optimize.bucketmapjoin = true 要求: 分桶字段 = Join字段 ,分桶的個(gè)數(shù)相等或者成倍數(shù),必須是在map join中 -
方式2:Sort Merge Bucket Join(SMB)
基于有序的數(shù)據(jù)Join 語法:clustered by colName sorted by (colName) 參數(shù)set hive.optimize.bucketmapjoin = true;set hive.auto.convert.sortmerge.join=true;set hive.optimize.bucketmapjoin.sortedmerge = true;set hive.auto.convert.sortmerge.join.noconditionaltask=true;要求: 分桶字段 = Join字段 = 排序字段,分桶的個(gè)數(shù)相等或者成倍數(shù)
09_Apache Hive 通用調(diào)優(yōu) 數(shù)據(jù)傾斜優(yōu)化
9.1 group by數(shù)據(jù)傾斜
-
方案一:開啟Map端聚合
hive.map.aggr=true; #是否在Hive Group By 查詢中使用map端聚合。 #這個(gè)設(shè)置可以將頂層的部分聚合操作放在Map階段執(zhí)行,從而減輕清洗階段數(shù)據(jù)傳輸和Reduce階段的執(zhí)行時(shí)間,提升總體性能。但是指標(biāo)不治本。 -
方案二:實(shí)現(xiàn)隨機(jī)分區(qū)
select * from table distribute by rand(); -
方案三:數(shù)據(jù)傾斜時(shí)自動(dòng)負(fù)載均衡
9.2 join數(shù)據(jù)傾斜
-
方案一:提前過濾(比如分區(qū)裁剪),將大表數(shù)據(jù)變成小表數(shù)據(jù),爭取實(shí)現(xiàn)Map Join
-
方案二:使用Bucket Join
-
方案三:使用Skew Join
#Skew Join原理:將Map Join和Reduce Join進(jìn)行合并使用。 如果某個(gè)值出現(xiàn)了數(shù)據(jù)傾斜,就會(huì)將產(chǎn)生數(shù)據(jù)傾斜的數(shù)據(jù)單獨(dú)使用Map Join來實(shí)現(xiàn),如果不是傾斜的,則按正常的reduce端join流程進(jìn)行。其他沒有產(chǎn)生數(shù)據(jù)傾斜的數(shù)據(jù)由Reduce Join來實(shí)現(xiàn),這樣就避免了Reduce Join中產(chǎn)生數(shù)據(jù)傾斜的問題最終將Map Join的結(jié)果和Reduce Join的結(jié)果進(jìn)行Union合并#開啟運(yùn)行過程中skewjoin set hive.optimize.skewjoin=true; #如果這個(gè)key的出現(xiàn)的次數(shù)超過這個(gè)范圍 set hive.skewjoin.key=100000; #在編譯時(shí)判斷是否會(huì)產(chǎn)生數(shù)據(jù)傾斜 set hive.optimize.skewjoin.compiletime=true; set hive.optimize.union.remove=true; #如果Hive的底層走的是MapReduce,必須開啟這個(gè)屬性,才能實(shí)現(xiàn)不合并 set mapreduce.input.fileinputformat.input.dir.recursive=true;
10_Apache Hive 通用調(diào)優(yōu) MR程序task個(gè)數(shù)調(diào)整
10.1 maptask個(gè)數(shù)
-
如果是在MapReduce中 maptask是通過邏輯切片機(jī)制決定的。
-
但是在hive中,影響的因素很多。比如邏輯切片機(jī)制,文件是否壓縮、壓縮之后是否支持切割。
-
因此在Hive中,調(diào)整MapTask的個(gè)數(shù),直接去HDFS調(diào)整文件的大小和個(gè)數(shù),效率較高。
如果小文件多,就進(jìn)行小文件的合并 合并的大小最好=block size 如果大文件多,就調(diào)整blocl size
10.2 reducetask個(gè)數(shù)
-
如果在MapReduce中,通過代碼可以直接指定 job.setNumReduceTasks(N)
-
在Hive中,reducetask個(gè)數(shù)受以下幾個(gè)條件控制的
(1)每個(gè) Reduce 處理的數(shù)據(jù)量默認(rèn)是 256MB hive.exec.reducers.bytes.per.reducer=256000000 (2)每個(gè)任務(wù)最大的 reduce 數(shù),默認(rèn)為 1009 hive.exec.reducsers.max=1009 (3)mapreduce.job.reduces 該值默認(rèn)為-1,由 hive 自己根據(jù)任務(wù)情況進(jìn)行判斷。--如果用戶用戶不設(shè)置 hive將會(huì)根據(jù)數(shù)據(jù)量或者sql需求自己評(píng)估reducetask個(gè)數(shù)。 --用戶可以自己通過參數(shù)設(shè)置reducetask的個(gè)數(shù)set mapreduce.job.reduces = N --用戶設(shè)置的不一定生效,如果用戶設(shè)置的和sql執(zhí)行邏輯有沖突,比如order by,在sql編譯期間,hive又會(huì)將reducetask設(shè)置為合理的個(gè)數(shù)。 Number of reduce tasks determined at compile time: 1
11_Apache Hive 通用調(diào)優(yōu) 執(zhí)行計(jì)劃
-
通過執(zhí)行計(jì)劃可以看出hive接下來是如何打算執(zhí)行這條sql的。
-
語法格式:explain + sql語句
-
栗子
explain select * from student;+----------------------------------------------------+ | Explain | +----------------------------------------------------+ | STAGE DEPENDENCIES: | | Stage-0 is a root stage | | | | STAGE PLANS: | | Stage: Stage-0 | | Fetch Operator | | limit: -1 | | Processor Tree: | | TableScan | | alias: student | | Statistics: Num rows: 1 Data size: 5260 Basic stats: COMPLETE Column stats: NONE | | Select Operator | | expressions: num (type: int), name (type: string), sex (type: string), age (type: int), dept (type: string) | | outputColumnNames: _col0, _col1, _col2, _col3, _col4 | | Statistics: Num rows: 1 Data size: 5260 Basic stats: COMPLETE Column stats: NONE | | ListSink | | | +----------------------------------------------------+
12_Apache Hive 通用調(diào)優(yōu) 并行機(jī)制、推測執(zhí)行機(jī)制
12.1 并行執(zhí)行機(jī)制
-
如果hivesql的底層某些stage階段可以并行執(zhí)行,就可以提高執(zhí)行效率。
-
前提是stage之間沒有依賴 并行的弊端是瞬時(shí)服務(wù)器壓力變大。
-
參數(shù)
set hive.exec.parallel=true; --是否并行執(zhí)行作業(yè)。適用于可以并行運(yùn)行的 MapReduce 作業(yè),例如在多次插入期間移動(dòng)文件以插入目標(biāo) set hive.exec.parallel.thread.number=16; --最多可以并行執(zhí)行多少個(gè)作業(yè)。默認(rèn)為8。
12.2 Hive的嚴(yán)格模式
-
注意。不要和動(dòng)態(tài)分區(qū)的嚴(yán)格模式搞混淆。
-
這里的嚴(yán)格模式指的是開啟之后 hive會(huì)禁止一些用戶都影響不到的錯(cuò)誤包括效率低下的操作,不允許運(yùn)行一些有風(fēng)險(xiǎn)的查詢。
-
設(shè)置
set hive.mapred.mode = strict --默認(rèn)是嚴(yán)格模式 nonstrict -
解釋
1、如果是分區(qū)表,沒有where進(jìn)行分區(qū)裁剪 禁止執(zhí)行 2、order by語句必須+limit限制
12.3 推測執(zhí)行機(jī)制
- MapReduce中task的一個(gè)機(jī)制。
- 功能:
- 一個(gè)job底層可能有多個(gè)task執(zhí)行,如果某些拖后腿的task執(zhí)行慢,可能會(huì)導(dǎo)致最終job失敗。
- 所謂的推測執(zhí)行機(jī)制就是通過算法找出拖后腿的task,為其啟動(dòng)備份的task。
- 兩個(gè)task同時(shí)處理一份數(shù)據(jù),誰先處理完,誰的結(jié)果作為最終結(jié)果。
- 推測執(zhí)行機(jī)制默認(rèn)是開啟的,但是在企業(yè)生產(chǎn)環(huán)境中建議關(guān)閉。
總結(jié)
以上是生活随笔為你收集整理的2022-02-09大数据学习日志——Hadoop离线阶段——Hive窗口函数、性能调优的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Knoll Light Factory
- 下一篇: 西北农林科技大学研究生学位论文“参考文献