- Hive將元數據存儲在數據庫中,如mysql、derby。Hive中的元數據包括表的名字,表的列和分區及其屬性,表的屬性(是否爲外部表等),表的數據所在目錄等。
- 解釋器、編譯器、優化器完成HQL查詢語句從詞法分析、語法分析、編譯、優化以及查詢計劃的生成。生成的查詢計劃存儲在HDFS中,並在隨後有MapReduce調用執行。
- Hive的數據存儲在HDFS中,大部分的查詢、計算由MapReduce完成(包含*的查詢,比如select * from tbl不會生成MapRedcue任務)。
Hive的數據類型
- primitive_type:
| array_type
| map_type
| struct_type - primitive_type:
|TINYINT
| SMALLINT
| INT
| BIGINT
| BOOLEAN
| FLOAT
| DOUBLE
| STRING
Hive內部表與外部表的區別
未被external修飾的是內部表(managed table),被external修飾的爲外部表(external table)。
- 內部表數據由Hive自身管理,外部表數據由HDFS管理;
- 內部表數據存儲的位置是hive.metastore.warehouse.dir(默認:/user/hive/warehouse),外部表數據的存儲位置由自己制定;
- 刪除內部表會直接刪除元數據(metadata)及存儲數據;刪除外部表僅僅會刪除元數據,HDFS上的文件並不會被刪除;
對內部表的修改會將修改直接同步給元數據,而對外部表的表結構和分區進行修改,則需要修復(MSCK REPAIR TABLE table_name;)
hive搭建-單用戶模式
- 安裝mysql;
- 上傳apache-hive-3.1.1-bin.tar.gz並解壓到/opt/目錄下
tar -zxvf apache-hive-3.1.1-bin.tar.gz -C /opt/
- 環境配置
vi /etc/profile
export HIVE_HOME=/opt/apache-hive-3.1.1-bin
export PATH=$PATH:$JAVA_HOME/bin:$ZOOKEPPER_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HIVE_HOME/bin
- 修改hive-site.xml
切換到/opt/apache-hive-3.1.1-bin/conf目錄下,將hive-default.xml.template 拷貝一份,並重命名爲hive-site.xml
然後編輯hive-site.xml文件。
cp hive-default.xml.template hive-site.xml
vi hive-site.xml
<!-- 指定HDFS中的hive倉庫地址 -->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/root/hive/warehouse</value>
</property>
<property>
<name>hive.metastore.local</name>
<value>true</value>
</property>
<!-- 指定mysql的連接 -->
<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>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>password</value>
</property>
注: hive-site.xml 文件中的配置過多,配置自己所需的即可,其他的可以刪除。
-
添加數據驅動包
將mysql 的驅動包上傳到 /opt/apache-hive-3.1.1-bin/lib。 -
初始化數據庫
記得先啓動mysql服務
schematool -initSchema -dbType mysql
執行成功之後,可以看到hive數據庫和一堆表已經創建成功了。
-
進入hive
hive的數據存儲在hdfs中,因此要先啓動hdfs,啓動順序如下:-
先在zookeeper節點上啓動zk服務:zkServer.sh start
-
在主namenode上啓動hdfs:start-dfs.sh
-
啓動yarn:start-yarn.sh,通過jps查看是否全部啓動成功;
-
啓動hive:
- 輸入hive進入hive窗口。hive命令默認是啓動client服務,相當於
hive --service cli
此方式不需要啓動server,使用本地的metastore,可以直接做一些簡單的數據操作和測試。
- 使用遠程的metastore,metastore可以和hive客戶端不在一個機器上。
服務器1啓動metastore服務 hive --service metastore
如上啓動,會啓動端口號默認9083的metastore服務,也可以通過-p指定端口號。
hive --service metastore -p 9083
服務器2作爲客戶端做如下配置,可使其連接服務器1的metastore. <property> <name>hive.metastore.local</name> <value>false</value> </property> <property> <name>hive.metastore.uris</name> <value>thrift://node01:9083</value><!-- 此處是服務器1的ip --> </property>
然後服務器2直接輸入 hive 啓動cli即可。此時不需要啓動server,使用遠程的metastore。
-
-
hive基本操作
- 創建庫:
create database db_hive_test;
- 創建表:
create table db_hive_test.student(id int,name string) row format delimited fields terminated by '\t';
說明: terminated by ‘\t’ 表示文本分隔符要使用Tab,行與行之間不能有空格。
- 準備數據文件
vim /home/hive/student.txt 中間的空格符使用Tab建 1001 zhangsan 1002 lisi 1003 wangwu
- 加載數據
load data local inpath '/home/hive/student.txt' into table db_hivetest.student; select * from db_hiveTest.student;
wordcount案例
- 建表
create table docs(line string);
create table wc(word string, num int);
- 加載數據
1、建數據
vi /home/temp/wc
hadoop java
hello lemon hadoop
java lemon
lemon
2、加載數據
load data local inpath '/home/temp/wc' into table docs;
- 統計單詞個數
from (select explode(split(line, ' ')) as word from docs) w
insert into table wc
select word, count(1) as num
group by word
order by word;
- 查詢結果
select * from wc;