hive工作中分享总结
hive分享總結
- 1. 數據家譜:
- 1.1.Hive 是什么?
- 1.2.數據倉庫
- 1.3.Hive與傳統數據庫的區別
- 1.4.Hive的優缺點
- 1.5.Hive使用場景
- 1.6.Hdfs 運行機制
- 1.7.Mapreduce 運行機制
- 1.8.SQL轉化成MapReduce過程
- 1.9.Hive 架構:
- 2.Hive交互方式
- 2.1.Hive交互shell
- 2.2.JDBC交互
- 2.3.第三種交互方式:
- 3.Hive 基礎
- 3.1.hive 支持的基本類型
- 3.2.基本SQL語句
- 3.3.排序
- 3.4.行轉列
- 3.5.列轉行
- 3.6.hive 內連接外連接
- 3.7.Hive 存儲格式
- 3.7.1.行存儲和列存儲
- 3.7.2.textfile 格式:
- 3.7.3.Orc 格式
- 3.7.4.Parquet 存儲格式
- 3.8.內部表/外部表
- 3.9.hive元數據存儲
- 3.10.分區:
- 3.11.分桶:
- 3.12 大數據應用架構
- 3.13 數據倉庫架構
- 4.遇到的問題;
- 4.1.Hive sql 執行的順序與mysql 對比:
- 4.1.1 sql 執行順序
- 4.2.Hive update 需要表設置
- 4.3.Hive腳本中設置變量
- 4.7批量更新
- 4.71 批量更新語法
- 4.5 函數
- 4.6.Hive 自定義udf 函數
- 4.6.1 臨時函數
- 4.6.2 永久函數
- 4.7.Hive 優化:
- 4.7.1.Fetch 抓取
- 4.7.2.本地模式:
- 4.7.3.大表join 小表 mapjoin設置
- 4.7.4.Mapjoin
- 4.7.5.Group by 優化
- 4.7.6.Count(distinct) 去重統計
- 4.7.7.笛卡爾積:
- 4.7.8.行列過濾
- 4.7.9.動態分區
- 4.7.10.數據傾斜
- 4.7.10.1.小文件合并:
- 4.7.10.2.復雜文件增加Map數量
- 4.7.10.3.設置reduce的數量
- 4.7.10.4.并行執行
- 4.7.10.5.Hive 嚴格模式
- 4.7.10.6.Jvm重用
- 4.7.10.7.推測執行
- 4.7.10.8.壓縮見hive格式
- 4.7.10.9.explain
- 5.Sqoop語句如下:
- 6.Hive 高級函數:
- 7 常見的面試題
- 7.1.Left semi join 和left join 的區別
- 7.2.數據庫拉鏈表
- 7.3 抽取數據庫中存在json數據怎么處理
- 7.4 求日環比和月環比
- 7.5 數據倉庫和數據集市
- 8. hadoop-yarn 參數調優
很抱歉最近找房子,hive 分享一直想更新,一直被耽擱
工作中設計到數倉的建設,還有存儲過程到hive 腳本的改造 目前只能整理到第四章
1. 數據家譜:
- 關系型數據庫
- 非關系型數據庫
- 數據倉庫
1.1.Hive 是什么?
? ?Hive 是一個類SQL 能夠操作hdfs 數據的數據倉庫基礎架構
Hive 是一個SQL 的解析引擎,能夠將HSQL翻譯MR在hadoop 中執行。
hive是基于Hadoop的一個數據倉庫工具,可以將結構化的數據文件映射為一張數據庫表,并提供簡單的sql查詢功能,可以將sql語句轉換為MapReduce任務進行運行。 其優點是學習成本低,可以通過類SQL語句快速實現簡單的MapReduce統計,不必開發專門的MapReduce應用,十分適合數據倉庫的統計分析。
總結:
Hive 是一個類SQL 能夠操作hdfs 數據的數據倉庫基礎架構
Hive 是一個SQL 的解析引擎,能夠將HSQL翻譯MR在hadoop 中執行。
1.2.數據倉庫
??數據倉庫,英文名稱為Data Warehouse,可簡寫為DW或DWH。數據倉庫,是為企業所有級別的決策制定過程,提供所有類型數據支持的戰略集合。它是單個數據存儲,出于分析性報告和決策支持目的而創建。 為需要業務智能的企業,提供指導業務流程改進、監視時間、成本、質量以及控制,簡而言之,數據倉庫是用來做查詢分析的數據庫,基本不用來做插入,修改,刪除;
1.3.Hive與傳統數據庫的區別
注意hive讀時模式:Hive在加載數據到表中的時候不會校驗.
(備注 讀模式
數據被加載到數據庫的時候,不對其合法性進行校驗,只在查詢等操作的時候進行校驗,特點:加載速度快,適合大數據的加載
寫模式
數據被加載到數據庫的時候,需對其合法性進行校驗,數據庫中的數據都是合法的數據,特點:加載速度慢,但是查詢速度快。)
寫時模式:Mysql數據庫插入數據到表的時候會進行校驗.
總結:Hive只適合用來做海量離線的數據統計分析,也就是數據倉庫。
1.4.Hive的優缺點
?? 優點:操作接口采用了類SQL語法,提供快速開發的能力,避免了去寫MapReduce;Hive還支持用戶自定義函數,用戶可以根據自己的需求實現自己的函數。
缺點:Hive查詢延遲很嚴重。
1.5.Hive使用場景
- 數據的離線處理;比如:日志分析,海量結構化數據離線分析…
- Hive的執行延遲比較高,因此hive常用于數據分析的,對實時性要求不高的場合;
- Hive優勢在于處理大數據,對于處理小數據沒有優勢,因為Hive的執行延遲比較高。
1.6.Hdfs 運行機制
https://hadoop.apache.org/docs/r1.0.4/cn/hdfs_design.html
1.7.Mapreduce 運行機制
參考博客1
參考博客2
1.8.SQL轉化成MapReduce過程
- Hive是如何將SQL轉化為MapReduce任務的,整個編譯過程分為六個階段:
- 1-Antlr定義SQL的語法規則,完成SQL詞法,語法解析,將SQL轉化為抽象語法樹AST Tree;
- 2-遍歷AST Tree,抽象出查詢的基本組成單元QueryBlock;
- 3-遍歷QueryBlock,翻譯為執行操作樹OperatorTree;
- 4-邏輯層優化器進行OperatorTree變換,合并不必要的ReduceSinkOperator,減少shuffle數據量;
- 5-遍歷OperatorTree,翻譯為MapReduce任務;
- 6-物理層優化器進行MapReduce任務的變換,生成最終的執行計劃。
1.9.Hive 架構:
(1) 用戶接口:CLI(hive shell);JDBC(java訪問Hive);WEBUI(瀏覽器訪問Hive)
? (2)元數據:MetaStore
元數據包括:表名、表所屬的數據庫(默認是default)、表的擁有者、列/分區字段,標的類型(表是否為外部表)、表的數據所在目錄。這是數據默認存儲在Hive自帶的derby數據庫中,推薦使用MySQL數據庫存儲MetaStore。
(3)Hive使用HDFS存儲數據(.Hadoop集群):
使用HDFS進行存儲數據,使用MapReduce進行計算。
(4)Driver:驅動器
解析器(SQL Parser):將SQL字符串換成抽象語法樹AST,對AST進行語法分析,像是表是否存在、字段是否存在、SQL語義是否有誤。
編譯器(Physical Plan):將AST編譯成邏輯執行計劃。
優化器(Query Optimizer):將邏輯計劃進行優化。
執行器(Execution):把執行計劃轉換成可以運行的物理計劃。對于Hive來說默認就是Mapreduce任務。
2.Hive交互方式
2.1.Hive交互shell
./hive 命令方式
bin/hive
2.2.JDBC交互
輸入hiveserver2相當于開啟了一個服務端,查看hivesever2的轉態
輸入netstat –nlp命令查看:
運行hiveserver2相當于開啟了一個服務端,端口號10000,需要開啟一個客戶端進行通信,所以打開另一個窗口,輸入命令beeline.
Example : :
beeline -u jdbc:hive2://192.168.122.1:10000/default -n hive-p hive@12
beeline -u jdbc:hive2://192.168.122.1:10000/default -n hive-p hive@12 -e ‘select * from dual;’
2.3.第三種交互方式:
使用sql語句或者sql腳本進行交互
vim hive.sql
create database if not exists mytest; use mytest; create table stu(id int,name string);
hive -f /export/servers/hive.sql
3.Hive 基礎
3.1.hive 支持的基本類型
3.2.基本SQL語句
insert、delete、update、select
多表查詢與代數運算
內連接
外鏈接
左連接
右鏈接
交叉鏈接
條件查詢
Select where
Select order by
Select group by
Select join
目前使用方式: 將sql 封裝到 sh
例如:/home/hadoop/sh/bet_rr_indicator_1.0.sh
3.3.排序
全局排序:
Order by 全局排序,只有一個reducer
Sort by 每個reducer 內部配置 需要設置reducer 個數:
Distribute by
Cluster by 只能升序排序:
3.4.行轉列
3.5.列轉行
排序函數
Rank() 對應下圖 rand_window_0
Dense_rank() 對應下圖_ dense_rank_window_1
Row_number() 對應下圖 row_number_window_2
3.6.hive 內連接外連接
多表查詢與代數運算
內連接:
外鏈接
右連接:
3.7.Hive 存儲格式
自定義編譯(練習)
Hive 查看存儲格式:
hadoop checknative
Snappy 得添加snappy 的jar 重新編譯hadoop.jar
Map 設置壓縮方式:
驗證: UI界面 任務的history–>configuration
Reduce 輸出壓縮的格式:
檢查是否設置成功:從導入文件中查看文件的格式:
3.7.1.行存儲和列存儲
row layout 表示行存儲
column layout 表示列存儲
Textfile 和sequencefile的存儲格式是基于行存儲的
orc 和parquet 是基于列表存儲的
3.7.2.textfile 格式:
3.7.3.Orc 格式
不是完成的列存儲: 是將按照256M 進行切分 每個256 是一個stripe, stripe 是按照列方式存儲,stripe 是按照256M 橫向切分,因此不是完全列存儲;
3.7.4.Parquet 存儲格式
parquet 是一個二進制存儲格式: (簡單看)
3.8.內部表/外部表
- 內部表
內部表數據由Hive自身管理,數據存儲的位置是hive.metastore.warehouse.dir
刪除內部表會直接刪除元數據(metadata)及存儲數據 - 外部表
外部表數據的存儲位置由自己制定,可以在云端
刪除外部表僅僅會刪除元數據
表結構和數據都將被保存
CREATE EXTERNAL TABLE
test_table(id STRING,
name STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘,’ LOCATION ‘/data/test/test_table’;
– 導入數據到表中(文件會被移動到倉庫目錄/data/test/test_table)
LOAD DATA INPATH ‘/test_tmp_data.txt’ INTO TABLE test_table;
3.9.hive元數據存儲
Hive中metastore(元數據存儲)的三種方式:
Hive將元數據存儲在RDBMS中,有三種模式可以連接到數據庫:
a)內嵌Derby方式
b)Local方式
c)Remote方式
單用戶本地模式:
1、元數據庫內嵌模式:此模式連接到一個In-memory 的數據庫Derby,一般用于Unit Test。
多用戶模式:
2、元數據庫mysql模式:通過網絡連接到一個數據庫中,是最經常使用到的模式。
多用戶遠程模式
3、MetaStoreServe訪問元數據庫模式:用于非Java客戶端訪問元數據庫,在服務器端啟動MetaStoreServer,客戶端利用Thrift協議通過MetaStoreServer訪問元數據庫。
3.10.分區:
就是在系統上建立文件夾,把分類數據放在不同文件夾下面,加快查詢速度
實戰
CREATE TABLE
logs(ts BIGINT,
line string) partitioned BY (dt String,
country string) ROW format delimited fields terminated BY ‘\t’;
load DATA LOCAL inpath ‘/Users/Ginger/Downloads/dirtory/doc/7/data/file1’ INTO
TABLE
logs PARTITION (dt = ‘2001-01-01’,
country = ‘GB’);
show partitions logs;
3.11.分桶:
桶是比分區更細粒度的劃分:就是說分區的基礎上還還可以進行分桶;hive采用對某一列進行分桶的組織;hive采用對列取hash值,然后再和桶值進行取余的方式決定這個列放到哪個桶中;
create table if not exists center( id int comment ‘’ ,
user_id int comment ‘’ ,
cts timestamp comment ‘’ ,
uts timestamp comment ‘’ )
comment ‘’
partitioned by (dt string)
clustered by (id) sorted by(cts) into 10 buckets
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ‘\t’
stored as textfile ;
3.12 大數據應用架構
3.13 數據倉庫架構
4.遇到的問題;
4.1.Hive sql 執行的順序與mysql 對比:
Map階段:
1.執行from加載,進行表的查找與加載
2.執行where過濾,進行條件過濾與篩選
3.執行select查詢:進行輸出項的篩選
4.執行group by分組:描述了分組后需要計算的函數
5.map端文件合并:map端本地溢出寫文件的合并操作,每個map最終形成一個臨時文件。
然后按列映射到對應的reduceReduce階段:
Reduce階段:
1.group by:對map端發送過來的數據進行分組并進行計算。
2.select:最后過濾列用于輸出結果
3.limit排序后進行結果輸出到HDFS文件
FROM … WHERE … SELECT … GROUP BY … HAVING … ORDER BY …
4.1.1 sql 執行順序
參考的博客
- sql語句 執行順序 拆分
參考博客
4.2.Hive update 需要表設置
由于涉及到存儲過程改造,需要更新操作,因此需要開啟update 特性
參考博客
Hive 開啟insert update 配置
Shell 開啟:
Update is allowed for ORC file formats only. Also you have to set few properties before performing the update or delete.
Client Side
set hive.support.concurrency=true;
set hive.enforce.bucketing=true;
set hive.exec.dynamic.partition.mode=nonstrict;
set hive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;
Server Side (Metastore)
set hive.compactor.initiator.on=true;
set hive.compactor.worker.threads=1;
After setting this create the table with required properties
CREATE TABLE test_result
(run_id VARCHAR(100), chnl_txt_map_key INT)
clustered by (run_id) into 1 buckets
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ‘\t’
STORED AS orc tblproperties (“transactional”=“true” );
注意!Hive3.1.2 需要配置hive-site.xml
只是創建時指定"transactional"=“true” 是不能執行insert 和update
參考博客
4.3.Hive腳本中設置變量
由于存儲過程中涉及到變量,兩種方式,一種采用shell 方式,一種采用 hive 提供的設置變量的方式
參考博客
4.7批量更新
存儲過程改造過程,涉及到批量更新的操作,改造過程中遇到,批量更新的問題,幸運的是hive 2.2 已經支持了批量更新的特性
hive2.2 支持merge into 功能實現和mysql批量update 功能 類似的功能
- hive2.2.0及之后的版本支持使用merge into 語法,使用源表數據批量更新目標表的數據。使用該功能還需做如下配置
1、參數配置
set hive.support.concurrency = true;
set hive.enforce.bucketing = true;
set hive.exec.dynamic.partition.mode = nonstrict;
set hive.txn.manager = org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;
set hive.compactor.initiator.on = true;
set hive.compactor.worker.threads = 1;
set hive.auto.convert.join=false;
set hive.merge.cardinality.check=false; – 目標表中出現重復匹配時要設置該參數才行
2、建表要求
Hive對使用Update功能的表有特定的語法要求, 語法要求如下:
(1)要執行Update的表中, 建表時必須帶有buckets(分桶)屬性
(2)要執行Update的表中, 需要指定格式,其余格式目前贊不支持, 如:parquet格式, 目前只支持ORCFileformat和AcidOutputFormat
(3)要執行Update的表中, 建表時必須指定參數(‘transactional’ = true);
4.71 批量更新語法
MERGE INTO AS T USING <source expression/table> AS S
ON <boolean` `expression1> WHEN MATCHED [AND <booleanexpression2>] THEN UPDATE SET
WHEN MATCHED [AND <boolean` `expression3>] THEN DELETE WHEN NOT MATCHED [AND <booleanexpression4>] THEN INSERT VALUES
Example
CREATE DATABASE merge_data;
CREATE TABLE merge_data.transactions(
ID int,
TranValue string,
last_update_user string)
PARTITIONED BY (tran_date string)
CLUSTERED BY (ID) into 5 buckets
STORED AS ORC TBLPROPERTIES (‘transactional’=‘true’);
CREATE TABLE merge_data.merge_source(
ID int,
TranValue string,
tran_date string)
STORED AS ORC;
INSERT INTO merge_data.transactions PARTITION (tran_date) VALUES
(1, ‘value_01’, ‘creation’, ‘20170410’),
(2, ‘value_02’, ‘creation’, ‘20170410’),
(3, ‘value_03’, ‘creation’, ‘20170410’),
(4, ‘value_04’, ‘creation’, ‘20170410’),
(5, ‘value_05’, ‘creation’, ‘20170413’),
(6, ‘value_06’, ‘creation’, ‘20170413’),
(7, ‘value_07’, ‘creation’, ‘20170413’),
(8, ‘value_08’, ‘creation’, ‘20170413’),
(9, ‘value_09’, ‘creation’, ‘20170413’),
(10, ‘value_10’,‘creation’, ‘20170413’);
INSERT INTO merge_data.merge_source VALUES
(1, ‘value_01’, ‘20170410’),
(4, NULL, ‘20170410’),
(7, ‘value_77777’, ‘20170413’),
(8, NULL, ‘20170413’),
(8, ‘value_08’, ‘20170415’),
(11, ‘value_11’, ‘20170415’);
注意執行 merge into 前設置:set hive.auto.convert.join=false; 否則報:ERROR [main] mr.MapredLocalTask: Hive Runtime Error: Map local work failed
注意! update set 語句后面的 字段不用加表別名否則會報錯
示例:SET TranValue = S.TranValue
MERGE INTO merge_data.transactions AS T
USING merge_data.merge_source AS S
ON T.ID = S.ID and T.tran_date = S.tran_date
WHEN MATCHED AND (T.TranValue != S.TranValue AND S.TranValue IS NOT NULL) THEN UPDATE SET TranValue = S.TranValue, last_update_user = ‘merge_update’
WHEN MATCHED AND S.TranValue IS NULL THEN DELETE
WHEN NOT MATCHED THEN INSERT VALUES (S.ID, S.TranValue, ‘merge_insert’, S.tran_date);
參考博客1
參考博客2
4.5 函數
desc function upper;
Desc function extended upper;
4.6.Hive 自定義udf 函數
公司中一般寫UDF比較多:utdf ,
參考的網址:
4.6.1 臨時函數
4.6.2 永久函數
創建永久函數:
hadoop fs -mkdir /lib
hdfs dfs -put /home/hadoop/jar/add_months-1.0-SNAPSHOT.jar /lib
CREATE FUNCTION user_info.add_month AS “com.hivefunction.AddMonths” USING JAR “hdfs://localhost:9000/lib/add_months-1.0-SNAPSHOT.jar”;
參考博客1
參考博客2
4.7.Hive 優化:
參考博客1
4.7.1.Fetch 抓取
Config.xml配置
4.7.2.本地模式:
默認是提交到yarn 上進行執行
測試環境,可以設置為本地模式更快;
4.7.3.大表join 小表 mapjoin設置
過濾掉空key
為了防止數據傾斜:可以給null 賦一個隨機值,
Set mapreduce.job.reduces=5 設置5個reduce 注意!UI 查看reduces 時間,從applicationId -->history—>reducer查看每個reducer 執行從時間
4.7.4.Mapjoin
Set hive.mapjoin.smalltable.filesize=256000000 設置小表的大小,依據機器內存大小設置
4.7.5.Group by 優化
設置map進行聚合:
Combatiner 聚合: hive.map.aggr =true; 注意!添加combatiner組件操作,結果(業務邏輯不會變)不會變時使用
Hive.group by.skewindata=true ;
4.7.6.Count(distinct) 去重統計
Count(disticnt) distinct 是在一個reduce 處理,會出現數據傾斜的情況
Select count(distinct id) from bigtable 會看到 map處理完的數據放在一個reduce 中進行處理;注意!count(id) 最終會放到一個reduce中執行;
優化: 先group by 然后在統計:
Select count(id) from (select id from bigtable group by id) a;
4.7.7.笛卡爾積:
4.7.8.行列過濾
謂詞下推:先過濾 通過子查詢然后在關聯表
4.7.9.動態分區
其實是依據表中的一個字段作為動態分區的字段
每個Mr默認設置分區是1000
首先是將數據導入到靜態分區,然后在導入的動態分區中去:
實例入下圖
總結:分區,分桶,是避免加載數據量過大;
4.7.10.數據傾斜
Map 數量設置
當小文件過多時,合并小文件
當文件大小一定時,字段就兩三個,這樣記錄上億條,需要降低 split.maxsize 增加map的數量;注意!看下面的公式;
當小文件過多時,合并小文件
當文件大小一定時,字段就兩三個,這樣記錄上億條,需要降低 split.maxsize 增加map的數量;注意!看下面的公式;
4.7.10.1.小文件合并:
4.7.10.2.復雜文件增加Map數量
當設置 map,reduce數量是-1時系統才會自動根據設置分片的大小進行動態切片
4.7.10.3.設置reduce的數量
4.7.10.4.并行執行
多個階段執行 并且沒有依賴時打開:(hive中某幾個階段沒有依賴)
4.7.10.5.Hive 嚴格模式
生產環境:肯定是嚴格模式
嚴格模式下,一些不允許的操作:
笛卡爾積是不允許的
分區表查詢,必須帶分區
Order by 時必須帶limit
4.7.10.6.Jvm重用
可以在程序中手動設置: set mapreduce.job.jvm.numtasks=10;
或者在xml 文件中配置;
注意!Jvm 重用是針對同一個job中不同task的jvm重用;
4.7.10.7.推測執行
默認是開啟的;
4.7.10.8.壓縮見hive格式
4.7.10.9.explain
5.Sqoop語句如下:
hive 與mysql 數據類型映射關系
sqoop 命令詳解參考博客
總結 mysql 中的double 有保留值例如double(10,7) 映射成hive 處理為decimal(10,7) 在數值計算過程中,計算結果和存儲過程計算結果沒有出入;
6.Hive 高級函數:
Over 一般跟在聚合函數的后面,指定窗口的大小
Select name,count(*) over() from business where subString(orderdate,1,7)=”2017-04”
group by name ;
Group by name 后over() 函數依據的是分組后的兩行進行計算;
7 常見的面試題
7.1.Left semi join 和left join 的區別
LEFT SEMI JOIN (左半連接)是 IN/EXISTS 子查詢的一種更高效的實現
Left semi join 相當于 in(keyset) 遇到右表重復記錄,會跳過,而join是一直遍歷,join會出現重復結果;
參考博客1
7.2.數據庫拉鏈表
記錄一個食物從開始一直到當前狀態所有的狀態的信息;
適應場景:
數據模型設計中遇到如下問題: 適用拉鏈表
例如一張流水表: ods_account
? Hive 上一張流水記錄表 ods_account_his
? 采用批量增加改變的添加到 ods_account_his
- 拉鏈表的邏輯設計
接下來通過一個實例來簡述一下應該如何設計拉鏈表
首先,針對于某賬戶信息表,在2018年1月1日的信息如下表(為了簡化設計,這里增加了信息變更時間UPDATE_DATE):
UPDATE_DATE):
由此表我們可以得到以下拉鏈表,開始時間和結束時間表示數據的生命周期,結束時間9999-99-99表示此條數據為當前時間的數據:
接下來,在2018年1月2日做數據采集時,采集到了UPDATE_DATE為2018-01-02的以下數據:
通過兩個表的對比可以得出,對于同一個賬戶ID來說,1號賬戶的賬戶余額發生變更變成了600,2號賬戶的余額發生變更變成了100,則我們可以根據這張表和上面的拉鏈表關聯,得到新的拉鏈表:
以此類推,我們可以查詢到2018年1月1日之后的所有生命周期的數據,例如:
o查詢當前所有有效記錄: SELECT * FROM ACCOUNT_HIST WHERE END_DATE = ‘9999-99-99’
o查詢2018年1月1日的歷史快照:SELECT * FROM ACCOUNT_HIST WHERE START_DATE <= ‘2018-01-01’ AND END_DATE >= ‘2018-01-01’
參考博客1
7.3 抽取數據庫中存在json數據怎么處理
推薦處理的函數 get_json_object 、 json_tuple、 regexp_replace
7.4 求日環比和月環比
7.5 數據倉庫和數據集市
數據倉庫和數據集市解釋
8. hadoop-yarn 參數調優
例1:
假設一臺服務器,內存128G,16個pcore,需要安裝DataNode和NodeManager,
具體如何設置參數?
1)裝完CentOS,消耗內存1G;
2)系統預留15%-20%(包含第1點),防止全部使用二導致系統夯住或者OOM機制事件,
或者給未來部署其他組件預留空間。此時余下12880%=102G
3)DataNode設定2G,NodeManager設定4G,則剩余102-2-4=96G;
4)明確兩點:pcore:vcore=1:2 ,故vcore數量為162=32;單個container占用4個vcore
5)確定 memory和vcore
yarn.nodemanager.resource.cpu-vcores --> 32 # 16*2=32
yarn.scheduler.minimum-allocation-vcores --> 1 # 最多有32個container
yarn.scheduler.maximum-allocation-vcores --> 4 # 最少有8個container
yarn.nodemanager.resource.memory-mb --> 96G # RM能使用的最大內存
yarn.scheduler.minimum-allocation-mb --> 1G #
yarn.scheduler.maximum-allocation-mb --> 12G # 極限8個(96/8)
注意:若有spark組件,當spark計算時內存不夠大,
yarn.scheduler.maximum-allocation-mb勢必要調大,
則這種理想化的設置會被打破,以memory為主
yarn參數調優參考博客
總結
以上是生活随笔為你收集整理的hive工作中分享总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软考论文写作攻略,让你轻松拿高分!
- 下一篇: Vivado 2019.1 使用教程