大資料學習筆記()
1、Hive是什麼
Hive是一個基於Hadoop的資料倉庫工具,可以將結構化的資料對映為一張資料庫表。 Hive本身並不提供儲存服務,使用HDFS做資料儲存。Hive本身並不提供分散式計算功能,而是基於MapReduce計算框架。Hive本身也並不提供資源排程系統,而是使用Hadoop的Yarn叢集排程。Hive執行時,元資料儲存在關係型資料庫裡面。
2、Hive和Hadoop的關係
Hive利用HDFS進行資料儲存、利用MapReduce查詢資料、利用Yarn進行資源排程。
3、Hive架構
1、使用者介面主要有三個:CLI、Client、WUI。其中最常用的是CLI,CLI啟動的時候會同時生成一個Hive副本。Client是Hive的客戶端,使用者連線至Hive Server。在啟動 Client模式的時候,需要指出Hive Server所在節點,並且在該節點啟動Hive Server。 WUI是通過瀏覽器訪問Hive。 2、Hive將元資料儲存在資料庫中,如mysql、derby。 3、直譯器、編譯器、優化器完成HQL查詢,語句從詞法分析、語法分析、編譯、優化以及查詢計劃的生成。生成的查詢計劃儲存在HDFS中,並在隨後有MapReduce呼叫執行。 4、Hive的資料儲存在HDFS中,大部分的查詢、計算由MapReduce完成。
4、Hive三種搭建方式
1)、基於derby的本地模式
此模式使用預設資料庫derby,一般用作測試環境。(單使用者模式) 這種方式是最簡單的儲存方式,只需要在hive-site.xml做如下配置便可
<configuration> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:derby:;databaseName=metastore_db;create=true</value> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>org.apache.derby.jdbc.EmbeddedDriver</value> </property> <property> <name>hive.metastore.local</name> <value>true</value> </property> <property> <name>hive.metastore.warehouse.dir</name> <value>/user/hive/warehouse</value> </property> </configuration>
注意:將hive/lib目錄下的jline jar包拷貝到hadoop的yarn lib下
2)、基於mysql的本地模式
這種模式需要在本地執行一個mysql伺服器。(多使用者模式) 這種儲存方式需要在本地執行一個mysql伺服器,並作如下配置(下面兩種使用mysql的方式,需要將mysql的jar包拷貝到$HIVE_HOME/lib目錄下)。
<configuration> <property> <name>hive.metastore.warehouse.dir</name> <value>/user/hive_remote/warehouse</value> </property> <property> <name>hive.metastore.local</name> <value>true</value> </property> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://localhost/hive_remote?createDatabaseIfNotExist=true</value> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>hive</value> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>password</value> </property> </configuration>
注意一個坑: 許可權,雖然hive使用者對hive_meta資料庫是由操作許可權的,但是這個資料庫如果不存在,hive使用者也是沒有許可權建立這個資料庫,所以需要提前建立好hive_remote資料庫
3)、基於mysql的遠端模式
這種儲存方式需要在伺服器端啟動MetaStoreServer,客戶端利用Thrift協議通過MetaStoreServer訪問元資料庫 。(多使用者模式) 將hive-site.xml配置檔案拆為如下兩部分 1)、服務端配置檔案 <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://192.168.57.6:3306/hive?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
</property>
</configuration>
2)、客戶端配置檔案
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<property>
<name>hive.metastore.local</name>
<value>false</value>
</property>
<property>
<name>hive.metastore.uris</name>
<value>thrift://192.168.57.5:9083</value>
</property>
</configuration>
啟動hive服務端程式 hive --service metastore
客戶端直接使用hive命令即可 [email protected]:~$ hive
5、Hive表的種類
(如需對Hive的各種操作示例,請看:Hive操作示例大全)
1)、內部表(受控表) 完全被Hive控制,刪除內部表的時候,元資料和源資料都會一同被刪除。
2)、外部表 不是完全受Hive控制,源資料可以在任何的目錄下,刪除外部表,源資料不會被刪除,只是刪除元資料。
3)、臨時表 生命週期是一次會話,會話結束後自動刪除該表,儲存在HDFS的tmp目錄下,主要用於測試。
4)、分割槽表 將源資料分到不同的Hive工作目錄中儲存,一個分割槽對應一個目錄,防止暴力掃描全表導致效率下降。分割槽表又可以細分為靜態分割槽表和動態分割槽表。
①靜態分割槽表 靜態分割槽表中,一個檔案資料只能匯入到某一個分割槽中,並且分割槽是使用者指定的,這種方式不夠靈活,業務場景比較侷限。 載入資料的方式有五種:可以使用insert單條插入的方式、load批量插入的方式、查詢已有表的資料插入到新表的方式、建立空分割槽後向HDFS目錄下上傳資料的方式和建立分割槽並且指定資料位置的方式來記載資料。
②動態分割槽表 動態分割槽可以根據資料本身的特徵自動來劃分分割槽,比如我們可以指定按照資料中的年齡、性別來動態分割槽。 我們之前使用load data往分割槽表匯入資料的時候,都是要指定partition分割槽的,這樣他才會知道將資料上傳到HDFS的哪一個分割槽。但是如果我們還是採用load data指定分割槽的話,那就不是動態分割槽表,還依然是靜態分割槽表。所以得采用 from insert的方式插入資料。
5)、分桶表 按照資料的hash值與桶的個數取模,根據取模得到的值進行分桶。這種方式有利於join的合併與隨機抽樣。對於hive中每一個表、分割槽都可以進一步進行分桶。
6、檢視
檢視的概念:檢視不儲存資料,只儲存計算該資料的邏輯。檢視的建立,只是儲存一份元資料,查詢檢視時才執行對應的子查詢。 檢視的特點: 1)、不支援物化檢視。 2)、只能查詢,不能做載入資料操作。 3)、檢視的建立,只是儲存一份元資料,查詢檢視時才執行對應的子查詢。 4)、view定義中若包含了ORDER BY/LIMIT語句,當查詢檢視時也進行ORDER BY/LIMIT語句操作,view當中定義的優先順序更高。 5)、view支援迭代檢視。 6)、一旦建立成功,無法修改。
7、索引
索引就類似目錄,來優化查詢效能。 建立索引首先要建立索引庫,用於存放索引(索引庫中只是儲存一些元資料,比如 對哪個欄位建立索引,對哪個表建立索引等):create index t2_index on table psnbucket_partition(age) as ‘org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler’ with deferred rebuild in table t2_index_table; 建立好索引庫之後呼叫alter index t2_index on psnbucket_partition rebuild;。這一步是真正的建立索引資訊,並且儲存到索引庫中,若資料庫有新增資料,也可以使用以上語句重建索引。 建立成功之後可以對索引進行操作了,如查詢索引:show index on psnbucket_partition;和刪除索引:drop index t2_index on psnbucket_partition;,只不過刪除索引的同時 索引庫也會被刪除。