hive的操作及優化
阿新 • • 發佈:2018-11-27
hive
hive案例
1、基站掉線率統計 需求 統計出掉線率最高的前10基站 資料 record_time:通話時間 imei:基站編號 cell:手機編號 drop_num:掉話的秒數 duration:通話持續總秒數 步驟 建表 注意欄位型別和rowformat 根據需求生成相應的結果表 load資料 寫sql,找出掉線率最高的基站 2、wordcount 建表 原始表 create table docs(line string); 結果表 create table wc(word string, totalword int); 載入資料 load data local inpath '/tmp/wc' into table docs; 統計資料 查詢結果
hive引數
hive當中的引數、變數,都是以名稱空間開頭 通過${}方式進行引用,其中system、env下的變數必須以字首開頭 hive 引數設定方式 修改配置檔案 載入資料 修改配置檔案 ${HIVE_HOME}/conf/hive-site.xml key-value 啟動hive cli時,通過--hiveconf key=value的方式進行設定 使用set命令 進入cli之後,通過使用set命令設定 hive set命令 在hive CLI控制檯可以通過set對hive中的引數進行查詢、設定 set設定: set hive.cli.print.header=true; set檢視 set hive.cli.print.header hive引數初始化配置 當前使用者家目錄下的.hiverc檔案 如: ~/.hiverc 如果沒有,可直接建立該檔案,將需要設定的引數寫到該檔案中,hive啟動執行時,會載入改檔案中的配置。 hive歷史操作命令集 ~/.hivehistory
動態分割槽
開啟支援動態分割槽 set hive.exec.dynamic.partition=true; 預設:false set hive.exec.dynamic.partition.mode=nostrict; 預設:strict(至少有一個分割槽列是靜態分割槽) 嚴格模式 相關引數 set hive.exec.max.dynamic.partitions.pernode; 每一個執行mr節點上,允許建立的動態分割槽的最大數量(100) set hive.exec.max.dynamic.partitions; 所有執行mr節點上,允許建立的所有動態分割槽的最大數量(1000) set hive.exec.max.created.files; 所有的mr job允許建立的檔案的最大數量(100000) 載入資料 from psn21 insert overwrite table psn22 partition(age, sex) select id, name, likes, address, age, sex distribute by age, sex;
hive分桶
什麼是hive分桶 分桶表是對列值取雜湊值的方式,將不同資料放到不同檔案中儲存。 對於hive中每一個表、分割槽都可以進一步進行分桶。 由列的雜湊值除以桶的個數來決定每條資料劃分在哪個桶中。 適用場景 做資料抽樣 map-join 怎麼用 開啟支援分桶 set hive.enforce.bucketing=true; 注意 一次作業產生的桶(檔案數量)和reduce task個數一致。 往分桶表中載入資料 insert into table bucket_table select columns from tbl; insert overwrite table bucket_table select columns from tbl; 如何進行抽樣查詢 select * from bucket_table tablesample(bucket 1 out of 4 on columns); tablesample語法 TABLESAMPLE(BUCKET x OUT OF y) x:表示從哪個bucket開始抽取資料 y:必須為該表總bucket數的倍數或因子 example 當表總bucket數為32時 TABLESAMPLE(BUCKET 2 OUT OF 16),抽取哪些資料? 共抽取2(32/16)個bucket的資料,抽取第2、第18(16+2)個bucket的資料 TABLESAMPLE(BUCKET 3 OUT OF 256),抽取哪些資料? 第三個桶的1/8個bucket的資料
Lateral View
為什麼要用LV 因為hql不支援一條語句中使用多個UDTF函式 LV的使用 Lateral View用於和UDTF函式(explode、split)結合來使用。 首先通過UDTF函式拆分成多行,再將多行結果組合成一個支援別名的虛擬表。 主要解決在select使用UDTF做查詢過程中,查詢只能包含單個UDTF,不能包含其他欄位、以及多個UDTF的問題 example 統計人員表中共有多少種愛好、多少個城市? select count(distinct(myCol1)), count(distinct(myCol2)) from psn2 LATERAL VIEW explode(likes) myTable1 AS myCol1 LATERAL VIEW explode(address) myTable2 AS myCol2, myCol3;
hive檢視
特點 和關係型資料庫中的普通檢視一樣,hive也支援檢視 不支援物化檢視 oracle有 只能查詢,不能做載入資料操作 檢視的建立,只是儲存一份元資料,查詢檢視時才執行對應的子查詢 view定義中若包含了ORDER BY/LIMIT語句,當查詢檢視時也進行ORDER BY/LIMIT語句操作,view當中定義的優先順序更高 view支援迭代檢視 檢視操作 建立檢視 CREATE VIEW [IF NOT EXISTS] [db_name.]view_name [(column_name [COMMENT column_comment], ...) ] [COMMENT view_comment] [TBLPROPERTIES (property_name = property_value, ...)] AS SELECT ... ; 查詢檢視 select colums from view; 刪除檢視 DROP VIEW [IF EXISTS] [db_name.]view_name;
hive索引
目的 優化查詢以及檢索效能 索引操作 建立索引 指定索引表 create index t1_index on table psn2(name) as 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler' with deferred rebuild in table t1_index_table; 預設索引表 create index t1_index on table psn2(name) as 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler' with deferred rebuild; 查詢索引 show index on psn2; 重建索引 ALTER INDEX t1_index ON psn2 REBUILD; 刪除索引 DROP INDEX IF EXISTS t1_index ON psn2;
hive執行方式
四種執行方式 命令列方式cli:控制檯模式 指令碼執行方式(實際生產環境中用最多) JDBC方式:hiveserver2 web GUI介面 (hwi、hue等) Hive在CLi模式中 與hdfs互動 執行執行dfs命令 例:dfs –ls / 與Linux互動 !開頭 例: !pwd hive指令碼執行方式 hive -e "" hive -e "">aaa 覆蓋重定向 hive -S -e "">aaa 靜默模式 hive -f file hive -i /home/my/hive-init.sql hive> source file (在hive cli中執行)
hive gui介面
下載原始碼包apache-hive-*-src.tar.gz 將hwi war包放在$HIVE_HOME/lib/ 製作方法:將hwi/web/*裡面所有的檔案打成war包 cd apache-hive-1.2.1-src/hwi/web jar -cvf hive-hwi.war * 複製tools.jar(在jdk的lib目錄下)到$HIVE_HOME/lib下 修改hive-site.xml <name>hive.hwi.listen.host</name> <value>0.0.0.0</value> <name>hive.hwi.listen.port</name> <value>9999</value> <name>hive.hwi.war.file</name> <value>lib/hive-hwi.war</value> 啟動hwi服務(埠號9999) hive --service hwi 瀏覽器通過以下連結來訪問 http://node03:9999/hwi/
hive許可權管理
三種許可權模型 基於儲存的授權 可以對Metastore中的元資料進行保護,但是沒有提供更加細粒度的訪問控制(例如:列級別、行級別)。 基於SQL標準的Hive授權 完全相容SQL的授權模型,推薦使用該模式。 除支援對於使用者的授權認證,還支援角色role的授權認證 role可理解為是一組許可權的集合,通過role為使用者授權 一個使用者可以具有一個或多個角色 預設包含另種角色:public、admin hive預設授權 設計目的僅僅只是為了防止使用者產生誤操作,而不是防止惡意使用者訪問未經授權的資料。
hive優化
核心思想 把Hive SQL 當做Mapreduce程式去優化 有些SQL不會轉為mr執行 select僅查詢本表字段 where僅對本表字段做條件過濾 顯示SQL的執行計劃 Explain 顯示執行計劃 EXPLAIN [EXTENDED] query hive的執行方式 本地模式 對於小檔案,處理速度快,避免了許多資源排程環節 開啟本地模式: set hive.exec.mode.local.auto=true; hive.exec.mode.local.auto.inputbytes.max預設值為128M 表示載入檔案的最大值,若大於該配置仍會以叢集方式來執行! 叢集模式 平行計算 通過設定以下引數開啟並行模式 set hive.exec.parallel=true; 注意 hive.exec.parallel.thread.number 一次SQL計算中允許並行執行的job個數的最大值 最大值應根據叢集來確定 並行太多需要叢集的效能越高 注意叢集的承載能力 嚴格模式 通過設定以下引數開啟嚴格模式 set hive.mapred.mode=strict; (預設為:nonstrict非嚴格模式) 防止使用者的誤操作 查詢限制 1、對於分割槽表,必須新增where對於分割槽欄位的條件過濾; 防止全表掃描 2、order by語句必須包含limit輸出限制; order by只有一個reduce 3、限制執行笛卡爾積的查詢。 開發中不常用笛卡爾積 排序 Order By 對於查詢結果做全排序,只允許有一個reduce處理 當資料量較大時,應慎用。嚴格模式下,必須結合limit來使用 Sort By 對於單個reduce的資料進行排序 區域性有序 Distribute By 分割槽排序,經常和Sort By結合使用 兩者結合可以做到全域性有序 Cluster By 相當於 Sort By + Distribute By Cluster By不能通過asc、desc的方式指定排序規則 可通過 distribute by column sort by column asc|desc 的方式 join Join計算時,將小表(驅動表)放在join的左邊 優先將小表載入到記憶體 Map Join SQL方式,在SQL語句中新增MapJoin標記(mapjoin hint) SELECT /*+ MAPJOIN(smallTable) */ smallTable.key, bigTable.value FROM smallTable JOIN bigTable ON smallTable.key = bigTable.key; 開啟自動的MapJoin 自動的mapjoin 通過修改以下配置啟用自動的mapjoin set hive.auto.convert.join = true; 該引數為true時,Hive自動對左邊的表統計量,如果是小表就加入記憶體,即對小表使用Map join 相關配置引數 hive.mapjoin.smalltable.filesize 大表小表判斷的閾值,如果表的大小小於該值則會被載入到記憶體中執行 hive.ignore.mapjoin.hint 預設值:true;是否忽略mapjoin hint 即mapjoin標記 hive.auto.convert.join.noconditionaltask 預設值:true;將普通的join轉化為普通的mapjoin時,是否將多個mapjoin轉化為一個mapjoin hive.auto.convert.join.noconditionaltask.size 將多個mapjoin轉化為一個mapjoin時,其表的最大值 Side聚合 通過設定以下引數開啟在Map端的聚合 set hive.map.aggr=true 相關配置引數 hive.groupby.mapaggr.checkinterval map端group by執行聚合時處理的多少行資料(預設:100000) hive.map.aggr.hash.min.reduction 進行聚合的最小比例(預先對100000條資料做聚合,若聚合之後的資料量/100000的值大於該配置0.5,則不會聚合) hive.map.aggr.hash.percentmemory map端聚合使用的記憶體的最大值 hive.map.aggr.hash.force.flush.memory.threshold map端做聚合操作是hash表的最大可用內容,大於該值則會觸發flush hive.groupby.skewindata 是否對GroupBy產生的資料傾斜做優化,預設為false 控制map及reduce數量 控制map用的較少 mapred.max.split.size 一個split的最大值,即每個map處理檔案的最大值 mapred.min.split.size.per.node 一個節點上split的最小值 mapred.min.split.size.per.rack 一個機架上split的最小值 控制reduce用的較多 mapred.reduce.tasks 強制指定reduce任務的數量 hive.exec.reducers.bytes.per.reducer 每個reduce任務處理的資料量 hive.exec.reducers.max 每個任務最大的reduce數 jvm重用 適用場景 1、小檔案個數過多 2、task個數過多 設定 通過 set mapred.job.reuse.jvm.num.tasks=n; 來設定 缺點 設定開啟之後,task插槽會一直佔用資源,不論是否有task執行,直到所有的task即整個job全部執行完成時,才會釋放所有的task插槽資源!