2020.9.28(Hive檢視、索引、許可權管理)
回顧:上節課講了hive的引數設定,hive的執行方式,hive的動態分割槽,分桶,lateral view這五個知識點。遺留了兩個問題:
1.看一下hive的原始碼,現在面試中,hive的原始碼還從來沒有被問到過。在hive這個環節不會浪費太多時間,把原始碼講清楚,沒有必要。
但是雖然不講原始碼的詳細知識點,但是會告訴你,如果拿到一個陌生框架之後,應該怎麼去找原始碼,或者怎麼去看原始碼。有同學把原始碼下載回來了一臉懵逼,連入口都找不到。今天講一下入口該怎麼找:
大部分 不管是hadoop、hive、hbase、spark,大概都是這樣一個尋找流程:
如果想看原始碼的話,給一個建議:在看原始碼過程中,千萬不要每一個方法都點進去!原始碼是別人寫的,寫的層次可能非常非常深,如果一層一層往裡面點的話,點到最後可能看明白了,回頭一想,我剛剛是從哪個地方點進來的,一臉懵逼。如果那一行裡面有註釋、或者看到方法名稱,一些類的名稱能大概猜到它是什麼意思,沒必要往下看了,先遺留下來,之後有時間了可以再慢慢看。
2.在hive2.x的時候已經沒有hwi這個web頁面了。但在1.x的時候還是有的,現在看一下。
hive --service hwi
hwi就是webUI的介面,開啟瀏覽器:node01:9999/hwi
change user info 改變使用者資訊,這裡寫使用者和組,但在hive裡面沒有使用者這個概念,所有隨便寫,寫什麼都行。點提交authorization is complete 認證授權已經完成。
怎麼寫sql語句和執行過程?
create session->隨便取個名稱,submit
任何結果都沒有,必須要把start query選擇成yes
,這時候在result bucket裡面可以看到對應的結果。
再回來,點選list session->點manager
這時候又回到這個頁面了,重新再次提交SQL語句,這時候再去檢視,會發現是兩遍對應的結果?
為什麼?
上面是第一次查詢的結果,而下面是第二次查詢的結果。每次查詢的時候,並不會把上一次查詢的結果消失掉。而是會保留每一次執行的過程。非常不好用。
稍微看一下就完事了,無論用什麼版本,這個功能基本上都不會用的,這也是為什麼2.x的時候hwi被淘汰掉的原因。
雖然被淘汰掉了,但他提供了一種平臺化和視覺化的思路。以後所做的專案都應該叫平臺
如何檢視hive原始碼?入口在什麼地方?
每次在黑視窗裡執行的都是hive的指令碼,所以找入口,一定要從指令碼里面進行查詢。
cd /opt/bigdata/hive-2.3.4/bin
ls
beeline ext hive hive-config.sh hiveserver2 hplsql metatool schematool
vi hive
366行,大部分同學都沒有耐心看下去,所有從裡面開始找東西,找自己想要的,第一次輸入hive的時候,相當於輸入了hive --service cli
預設執行的是命令列的命令,有一堆引數的判斷 ,如果什麼都不寫會預設判斷為cli
只要去對應的目錄裡面,找cli.sh檔案
cat cli.sh
hive也是用Java寫的,所有隻要找主類就可以了,一個main函式程式入口
執行這個run()方法,裡面會有一些引數判斷,告訴我應該怎麼解析,哪些初始化操作,然後慢慢完成相應操作,這地方就是整個程式的入口操作,當把它啟動好之後,意味著命令列已經準備好了。提交sql語句的時候,會有服務進行接收,接收完之後進行解析,轉化,執行的過程。
hive檢視
只要接觸關係型資料庫,一定會用對應檢視的。用的非常非常多。
檢視主要用在什麼場合?有什麼樣的用途?在公司裡怎麼用的?
如果寫的sql語句非常簡單,只是幾張表的關聯,這個東西完全沒必要,如果語句非常非常複雜,比如說要寫一個好幾十行的sql語句,這裡麵包含了N多個子查詢,並且有很多子查詢都是重複的sql語句,這時候,就必須把它定義成一個檢視。這個時候直接寫檢視就可以了,可以減少整個sql語句的複雜度。
第二種情況,定義一個檢視,把它定義成多張表join之後結果表。檢視非常簡單,就是一個sql語句,每次在使用檢視的時候,都會把sql語句提前進行執行。把結果暫存成檢視,比如有三張表,每張表裡面取一個欄位,把這三個欄位當成一個檢視,檢視完成之後可以成一張中間表。用的時候直接拿檢視進行執行就可以了。而不需要每次都進行一個join的程式碼編寫。但執行的時候,一定會執行的。
hive裡面也支援了對應的檢視操作。
hive View檢視
– 和關係型資料庫中的普通檢視一樣,hive也支援檢視
– 特點:
▪ 不支援物化檢視:檢視是虛擬表,虛擬表表示不是實實在在存在資料的表,物理表表示實實在在存在資料檔案的,比如在資料庫裡看到的那些表都是物理表。檢視每次在做的時候,都需要優先先執行sql語句,然後把結果當成虛擬檢視。素有檢視也可以被當成表。物化檢視的概念:MySQL裡面是不支援物化檢視的,只有在Oracle裡面是支援的,物化檢視是什麼意思?比如現在有個t1 t2 t3每次從裡面取c1 c2 c3三個欄位,這時候,這三個欄位也要被當成一張物理表,進行一個實實在在的儲存。這叫物化檢視。如果把這三個表進行join操作,把這個結果也快取了一下,這時候如果t1 t2 t3改變了,物化檢視會重新整理,這其實分了兩種策略,一種叫uncommit,一種叫undemand,一種是隻要t1 t2 t3發生改變,物化檢視也跟著變,第二種是每次查詢的時候才會把資料進行更新。不查詢就不更新了。有這麼兩種方式,現在在公司企業裡面,Oracle已經不像以前那麼流行了。以前在阿里有一個去IOE的概念,o就表示Oracle
▪ 只能查詢,不能做載入資料操作:MySQL裡面定義的檢視,可以往裡面插入資料麼?如果只是操作一張表是可以往檢視裡面更新資料的,但多表的時候是有問題的。但hive裡面是都不可以的。
▪ 檢視的建立,只是儲存一份後設資料,查詢檢視時才執行對應的子查詢:檢視就是一個sql語句,每次在執行的檢視的時候,會優先把檢視的sql語句先執行,再執行自己定義的SQL語句
▪ view定義中若包含了ORDER BY/LIMIT語句,當查詢檢視時也進行ORDER BY/LIMIT語句操作,view當中定義的優先順序更高:每次定義的時候,檢視裡面的東西會優先執行,檢視執行完成之後,外面的才會執行
▪ view支援迭代檢視:檢視裡面可以巢狀檢視
可以在MySQL裡面檢視
mysql -uroot -pok
mysql> use hive_remote
select * from TBLS;
裡面的欄位不是managered_table就是external_table。不是內部表就是外部表,沒有檢視概念,建立一個新的檢視
Create/Drop/Alter 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 ...;
hive> create view v_psn as select * from psn where id > 5
show tables;
show views; // 在2.x中是有這樣的操作的,但是在1.x的時候沒有,所有不要這樣查
檢視也是一張虛擬表,所有去MySQL裡面進行檢視
mysql> select * from TBLS;
可以看到最後一行多了一個VIRTUAL_VIEW
,
hive> select * from psn;
可以查詢對應的檢視,有對應的結果了。查詢的是檢視裡的資料,而不是對應表裡的資料。
注意:現在只有單表,所有看不出來有什麼效果,如果有多表的話,可以把中間的結果進行快取,這是檢視最基本的應用。
hive的索引
經常會聽到一級索引、二級索引。索引是做什麼用的?
是為了幫助我們提高檢索的效率用的。
MySQL裡面的索引是自動建立的麼?
主鍵可以拆開了說,唯一且非空。建索引是唯一鍵,而不是對應的主鍵。
對應hive而言,和MySQL就不太一樣了。它並不會自動幫助我們來建立索引。索引的目的,優化查詢以及對應的檢索效能。
建立索引的語句:
Create/Drop/Alter Index
CREATE INDEX index_name
ON TABLE base_table_name (col_name, ...)
AS index_type
[WITH DEFERRED REBUILD]
[IDXPROPERTIES (property_name=property_value, ...)]
[IN TABLE index_table_name]
[
[ ROW FORMAT ...] STORED AS ...
| STORED BY ...
]
[LOCATION hdfs_path]
[TBLPROPERTIES (...)]
[COMMENT "index comment"];
選擇哪張表base_table_name ,對錶裡的哪個列col_name 建立索引
[IN TABLE index_table_name]
如果是你來設計資料庫的話,你覺得索引應該儲存什麼資訊?
現在有一個非常大的檔案,想從裡面獲取到單詞該怎麼獲取?
有一個非常重要的點:偏移量
想建立索引,儲存的是那個列對應的偏移量的資訊。而對應到hdfs裡面,也是某個檔案的偏移量。同時,因為一張表可能對應的是多個檔案,所以要儲存檔案所在的儲存目錄,以及對應的偏移量。
offset也好,檔案也好,都是資料。意味著這個資料也要進行儲存,要使用表來存,所以在建的時候,要儲存索引資訊到某一張固定的表裡面,index_table_name
是表的的名稱,索引資訊的這張表。而不是後設資料表。
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;
一旦是單引號引起來的,一定是表示的我們jar包的對應的某一個類,也就是有對應的索引處理列,來幫助我們記錄對應的offset資訊,以及對應的資料檔案的資訊。由對應的類來完成對應的工作。
as:指定索引器,可以自己寫jar包替換;
in table:指定索引表,若不指定預設生成在default__psn2_t1_index__表中
如果公司技術實力比較強,不可能直接免費用這些開源的東西,一定是在開源的基礎之上做二次開發。如果需要做二次開發,一定要對原始碼足夠了解,同時要知道什麼時候能去修改。理論上什麼都可以修改,實際一些核心的元件沒必要修改。
create index t1_index on table psn2(name)
as 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler' with deferred rebuild;
這個語句和剛才的語句差不多,只不過少了in table 儲存的是索引資訊所存在的那張表,沒寫意味著有個預設表,會預設幫我們建立`default__psn2_t1_index__``
show tables;
這兩張表都建立好了,這兩張表裡有沒有資料?
沒有。我現在就9行資料,如果想給他建立對應的索引,意味著必須要把整個檔案先讀進來,讀進來之後找到對應的列,記錄下那個列所在的值所在的偏移量,意味著必然對這個檔案進行處理了,在檔案處理的過程中,剛剛建立索引的時候用了1秒鐘,這麼短的時間內,有可能把所有的資料檔案優先讀進來麼?連讀取的時間都沒有。
select * from t1_index_table;
會發現這裡面沒有任何一條記錄。沒有所有
hive裡面有索引的知識點,但是hive並不會預設幫我們建立對應的索引。需要自己來完成。
自己需要手動來建立索引,需要MR來執行所有的構建過程
ALTER INDEX t1_index ON psn REBUILD;
應該申請對應的資源來進行執行,如果MapReduce沒有開始執行,說明整個資源一定是有問題的,怎麼判斷?
開啟對應的resourcemanager的webUI
node03:8088 重新整理不出來說明沒有啟動,啟動resourcemanager, 如果還沒有資源,檢查nodemanager有沒有啟動
yarn-deman.sh start resourcemanager
start-yarn.sh
現在有資源立馬開始執行了。
要把對應的資料結果放到t1_index_table這張表裡。
select * from t1_index_table
現在有資料了,儲存的是表的列名,來自哪個檔案,偏移量,把資料對應成功了。
資料增加了,還需要重新構建索引,
load data local inpath '/root/data/data' into table psn;
意味著又要重新進行構建了,是非常麻煩的。所以在企業裡面,索引這個點幾乎不用,但是每次在進行查詢的時候,hive是資料倉儲,儲存歷史時刻的每一個狀態,比如說今天的資料到凌晨12點的時候執行完了,當一天的資料都執行完了,我對這張表裡所有的資料都來一次構建索引的過程。知乎再來的資料是另一天的資料,不屬於當前資料了,這沒問題了。分需求,有時候會用,有時候不會用,一般情況下比較少。
只存偏移量怎麼讓查詢加快,查詢條件不是要挨個進行過濾麼?
在進行查詢的時候也一樣,既然設定索引了,一定當where條件裡包含這個欄位的時候才會加快。在遍歷某一個檔案裡資料的時候,一定有一個類似於指標的東西,一般叫Cursor 翻譯過來叫遊標,遊標有個seek方法,它可以直接挪動對應的位置。比如讀10個字元,讀完之後想跨10個再讀,這時候可以移動seek指標,就是對應的偏移量的值,根據偏移量來定位讀取,速度一定是快的。
在資料量比較小的時候會發現,建了索引了沒有不建索引速度快。能解釋為什麼麼?每次在進行查詢的時候,如果資料量比較小的話,第一次要先遍歷這張索引表的資料,第二次再找對應的資料表。這涉及到MySQL裡面的東西了,MySQL裡面有索引,為什麼MySQL索引比較快,它是在記憶體裡進行讀取的,記憶體裡結構叫B+樹。B+樹這個資料結構先不管,什麼叫樹,一個節點後面有N多個分支,假如我現在存的資料首字母是從a到z這樣,在進行操作的時候可以挨個進行排列,當我在查詢的時候,一定找的是記憶體。不是磁碟。而無論記憶體還是磁碟都有一個4k的空間,(在裝固態的時候要求4k對齊,光碟有磁軌,裡面是一個個對應的小格子,每個小格子都是4k這樣的大小,頁大小,是最小的空間,每次最小要佔4k的大小)記憶體裡也一樣的,每次只儲存4k資料,載入一堆4k連續塊,記憶體讀取索引檔案是非常快的,在MySQL裡面整體索引是非常快的。
相關文章
- 如何用 Vue 實現前端許可權控制(路由許可權 + 檢視許可權 + 請求許可權)Vue前端路由
- 如何檢視postgresql使用者許可權SQL
- HIVE的許可權控制和超級管理員的實現Hive
- 4、許可權管理
- sql許可權管理SQL
- RBAC許可權管理
- MySQL許可權管理MySql
- 許可權管理策略
- PostgreSQL:許可權管理SQL
- Odoo許可權管理Odoo
- 特殊許可權管理
- django開發之許可權管理(一)——許可權管理詳解(許可權管理原理以及方案)、不使用許可權框架的原始授權方式詳解Django框架
- postgresql關於訪問檢視需要的許可權SQL
- Security 10:許可權管理
- casbin-許可權管理
- 【自然框架】許可權的視訊演示(二):許可權到欄位、許可權到記錄框架
- Android6.0------許可權申請管理(單個許可權和多個許可權申請)Android
- MongoDB 4.0檢視,更新和回收角色許可權步驟MongoDB
- linux的常用操作——檢視和修改檔案許可權Linux
- 檢視、儲存過程以及許可權控制練習儲存過程
- DRF內建許可權元件之自定義許可權管理類元件
- 賬號和許可權管理
- 關於mysql許可權管理MySql
- Linux 下許可權的管理Linux
- 1.6.1. 管理員許可權
- Linux 中的許可權管理Linux
- ThinkPHP5+許可權管理PHP
- ubuntu 許可權管理設定Ubuntu
- fastadmin的許可權管理authAST
- MySQL許可權管理實戰MySql
- Confluence6對比系統管理員許可權和Confluence管理員許可權
- 雲開發資料庫的核心能力與實踐:許可權管理、索引管理……資料庫索引
- 『學了就忘』Linux許可權管理 — 55、檔案特殊許可權Linux
- UserService 查詢使用者沒許可權的索引,增加臨時許可權queryIndicesNoPermission分析索引
- odoo提示你沒有檢視此類文件的許可權Odoo
- 如何獲取最高管理員許可權 win10教育版最高管理員許可權Win10
- Vue2.0 + ElementUI 手寫許可權管理系統後臺模板(二)——許可權管理VueUI
- 許可權之選單許可權