1. 什么是Hive
Hive:由Facebook開源用于解決海量結(jié)構(gòu)化日志的數(shù)據(jù)統(tǒng)計。
Hive是基于Hadoop的一個數(shù)據(jù)倉庫工具,可以將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張表肢预,并提供類SQL查詢功能。
本質(zhì)是:將HQL轉(zhuǎn)化成MapReduce程序
1)Hive處理的數(shù)據(jù)存儲在HDFS
2)Hive分析數(shù)據(jù)底層的實現(xiàn)是MapReduce
3)執(zhí)行程序運行在Yarn上
2. Hive的優(yōu)缺點
- 1 優(yōu)點
- 1)操作接口采用類SQL語法,提供快速開發(fā)的能力(簡單牧嫉、容易上手)。
- 2)避免了去寫MapReduce减途,減少開發(fā)人員的學習成本酣藻。
- 3)Hive的執(zhí)行延遲比較高,因此Hive常用于數(shù)據(jù)分析鳍置,對實時性要求不高的場合辽剧。
- 4)Hive優(yōu)勢在于處理大數(shù)據(jù),對于處理小數(shù)據(jù)沒有優(yōu)勢税产,因為Hive的執(zhí)行延遲比較高怕轿。
- 5)Hive支持用戶自定義函數(shù),用戶可以根據(jù)自己的需求來實現(xiàn)自己的函數(shù)砖第。
- 2 缺點
- 1.Hive的HQL表達能力有限
(1)迭代式算法無法表達
(2)數(shù)據(jù)挖掘方面不擅長撤卢,由于MapReduce數(shù)據(jù)處理流程的限制,效率更高的算法卻無法實現(xiàn)梧兼。 - 2.Hive的效率比較低
(1)Hive自動生成的MapReduce作業(yè)放吩,通常情況下不夠智能化
(2)Hive調(diào)優(yōu)比較困難,粒度較粗
- 1.Hive的HQL表達能力有限
3 .Hive架構(gòu)原理
1.用戶接口:Client
CLI(command-line interface)羽杰、JDBC/ODBC(jdbc訪問hive)渡紫、WEBUI(瀏覽器訪問hive)
2.元數(shù)據(jù):Metastore
元數(shù)據(jù)包括:表名到推、表所屬的數(shù)據(jù)庫(默認是default)、表的擁有者惕澎、列/分區(qū)字段莉测、表的類型(是否是外部表)、表的數(shù)據(jù)所在目錄等唧喉;
默認存儲在自帶的derby數(shù)據(jù)庫中捣卤,推薦使用MySQL存儲Metastore
3.Hadoop
使用HDFS進行存儲,使用MapReduce進行計算八孝。
4.驅(qū)動器:Driver
(1)解析器(SQL Parser):將SQL字符串轉(zhuǎn)換成抽象語法樹AST董朝,這一步一般都用第三方工具庫完成,比如antlr干跛;對AST進行語法分析子姜,比如表是否存在、字段是否存在楼入、SQL語義是否有誤哥捕。
(2)編譯器(Physical Plan):將AST編譯生成邏輯執(zhí)行計劃。
(3)優(yōu)化器(Query Optimizer):對邏輯執(zhí)行計劃進行優(yōu)化嘉熊。
(4)執(zhí)行器(Execution):把邏輯執(zhí)行計劃轉(zhuǎn)換成可以運行的物理計劃遥赚。對于Hive來說,就是MR/Spark记舆。
Hive安裝部署
1.Hive安裝及配置
(1)把apache-hive-1.2.1-bin.tar.gz上傳到linux的/opt/software目錄下
(2)解壓apache-hive-1.2.1-bin.tar.gz到/opt/module/目錄下面
[atguigu@hadoop102 software]$ tar -zxvf apache-hive-1.2.1-bin.tar.gz -C /opt/module/
(3)修改apache-hive-1.2.1-bin.tar.gz的名稱為hive
[atguigu@hadoop102 module]$ mv apache-hive-1.2.1-bin/ hive
(4)修改/opt/module/hive/conf目錄下的hive-env.sh.template名稱為hive-env.sh
[atguigu@hadoop102 conf]$ mv hive-env.sh.template hive-env.sh
(5)配置hive-env.sh文件
(a)配置HADOOP_HOME路徑
export HADOOP_HOME=/opt/module/hadoop-2.7.2
(b)配置HIVE_CONF_DIR路徑
export HIVE_CONF_DIR=/opt/module/hive/conf
2.Hadoop集群配置
(1)必須啟動hdfs和yarn
[atguigu@hadoop102 hadoop-2.7.2]$ sbin/start-dfs.sh
[atguigu@hadoop103 hadoop-2.7.2]$ sbin/start-yarn.sh
(2)在HDFS上創(chuàng)建/tmp和/user/hive/warehouse兩個目錄并修改他們的同組權(quán)限可寫
[atguigu@hadoop102 hadoop-2.7.2]$ bin/hadoop fs -mkdir /tmp
[atguigu@hadoop102 hadoop-2.7.2]$ bin/hadoop fs -mkdir -p /user/hive/warehouse
[atguigu@hadoop102 hadoop-2.7.2]$ bin/hadoop fs -chmod g+w /tmp
[atguigu@hadoop102 hadoop-2.7.2]$ bin/hadoop fs -chmod g+w /user/hive/warehouse
本地數(shù)據(jù)導入hive
(1)刪除已創(chuàng)建的表
hive> drop table xx;
(2)創(chuàng)建xx表, 并聲明文件分隔符’\t’
hive> create table student(id int, name string) ROW FORMAT DELIMITED FIELDS TERMINATED
BY '\t';
(3)加載/opt/module/datas/student.txt 文件到student數(shù)據(jù)庫表中鸽捻。
hive> load data local inpath '/opt/module/datas/student.txt' into table student;
Hive元數(shù)據(jù)配置到MySql
一.驅(qū)動拷貝
1.在/opt/software/mysql-libs目錄下解壓mysql-connector-java-5.1.27.tar.gz驅(qū)動包
[root@hadoop102 mysql-libs]# tar -zxvf mysql-connector-java-5.1.27.tar.gz
2.拷貝/opt/software/mysql-libs/mysql-connector-java-5.1.27目錄下的mysql-connector-java-5.1.27-bin.jar到/opt/module/hive/lib/
[root@hadoop102 mysql-connector-java-5.1.27]# cp mysql-connector-java-5.1.27-bin.jar
/opt/module/hive/lib/
二.配置Metastore到MySql
1.在/opt/module/hive/conf目錄下創(chuàng)建一個hive-site.xml
[atguigu@hadoop102 conf]$ touch hive-site.xml
[atguigu@hadoop102 conf]$ vi hive-site.xml
2.根據(jù)官方文檔配置參數(shù),拷貝數(shù)據(jù)到hive-site.xml文件中
https://cwiki.apache.org/confluence/display/Hive/AdminManual+MetastoreAdmin
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://hadoop102:3306/metastore?createDatabaseIfNotExist=true</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
<description>username to use against metastore database</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>000000</value>
<description>password to use against metastore database</description>
</property>
</configuration>
3.配置完畢后泽腮,如果啟動hive異常御蒲,可以重新啟動虛擬機。(重啟后诊赊,別忘了啟動hadoop集群)
HiveJDBC訪問
1 啟動hiveserver2服務(wù)
[atguigu@hadoop102 hive]$ bin/hiveserver2
- 啟動beeline
[atguigu@hadoop102 hive]$ bin/beeline
Beeline version 1.2.1 by Apache Hive
beeline>
- 連接hiveserver2
beeline> !connect jdbc:hive2://hadoop102:10000(回車)
Connecting to jdbc:hive2://hadoop102:10000
Enter username for jdbc:hive2://hadoop102:10000: atguigu(回車)
Enter password for jdbc:hive2://hadoop102:10000: (直接回車)
Connected to: Apache Hive (version 1.2.1)
Driver: Hive JDBC (version 1.2.1)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://hadoop102:10000> show databases;
+----------------+--+
| database_name |
+----------------+--+
| default |
| hive_db2 |
+----------------+--+
- Hive常用交互命令
[atguigu@hadoop102 hive]$ bin/hive -help
usage: hive
-d,--define <key=value> Variable subsitution to apply to hive
commands. e.g. -d A=B or --define A=B
--database <databasename> Specify the database to use
-e <quoted-query-string> SQL from command line
-f <filename> SQL from files
-H,--help Print help information
--hiveconf <property=value> Use value for given property
--hivevar <key=value> Variable subsitution to apply to hive
commands. e.g. --hivevar A=B
-i <filename> Initialization SQL file
-S,--silent Silent mode in interactive shell
-v,--verbose Verbose mode (echo executed SQL to the console)
1).“-e”不進入hive的交互窗口執(zhí)行sql語句
[atguigu@hadoop102 hive]$ bin/hive -e "select id from student;"
2).“-f”執(zhí)行腳本中sql語句
(1)在/opt/module/datas目錄下創(chuàng)建hivef.sql文件
[atguigu@hadoop102 datas]$ touch hivef.sql
文件中寫入正確的sql語句
select *from student;
(2)執(zhí)行文件中的sql語句
[atguigu@hadoop102 hive]$ bin/hive -f /opt/module/datas/hivef.sql
(3)執(zhí)行文件中的sql語句并將結(jié)果寫入文件中
[atguigu@hadoop102 hive]$ bin/hive -f /opt/module/datas/hivef.sql > /opt/module/datas/hive_result.txt
- Hive其他命令操作
1.退出hive窗口:
hive(default)>exit;
hive(default)>quit;
在新版的hive中沒區(qū)別了厚满,在以前的版本是有的:
exit:先隱性提交數(shù)據(jù),再退出碧磅;
quit:不提交數(shù)據(jù)碘箍,退出;
2.在hive cli命令窗口中如何查看hdfs文件系統(tǒng)
hive(default)>dfs -ls /;
3.在hive cli命令窗口中如何查看本地文件系統(tǒng)
hive(default)>! ls /opt/module/datas;
4.查看在hive中輸入的所有歷史命令
(1)進入到當前用戶的根目錄/root或/home/atguigu
(2)查看. hivehistory文件
[atguigu@hadoop102 ~]$ cat .hivehistory
Hive常見屬性配置
一.Hive數(shù)據(jù)倉庫位置配置
1)Default數(shù)據(jù)倉庫的最原始位置是在hdfs上的:/user/hive/warehouse路徑下鲸郊。
2)在倉庫目錄下丰榴,沒有對默認的數(shù)據(jù)庫default創(chuàng)建文件夾。如果某張表屬于default數(shù)據(jù)庫秆撮,直接在數(shù)據(jù)倉庫目錄下創(chuàng)建一個文件夾四濒。
3)修改default數(shù)據(jù)倉庫原始位置(將hive-default.xml.template如下配置信息拷貝到hive-site.xml文件中)。
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
<description>location of default database for the warehouse</description>
</property>
配置同組用戶有執(zhí)行權(quán)限
bin/hdfs dfs -chmod g+w /user/hive/warehouse
二. 查詢后信息顯示配置
1)在hive-site.xml文件中添加如下配置信息,就可以實現(xiàn)顯示當前數(shù)據(jù)庫盗蟆,以及查詢表的頭信息配置戈二。
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
2)重新啟動hive,對比配置前后差異喳资。
三. Hive運行日志信息配置
1.Hive的log默認存放在/tmp/atguigu/hive.log目錄下(當前用戶名下)
2.修改hive的log存放日志到/opt/module/hive/logs
(1)修改/opt/module/hive/conf/hive-log4j.properties.template文件名稱為
hive-log4j.properties
[atguigu@hadoop102 conf]$ pwd
/opt/module/hive/conf
[atguigu@hadoop102 conf]$ mv hive-log4j.properties.template hive-log4j.properties
(2)在hive-log4j.properties文件中修改log存放位置
hive.log.dir=/opt/module/hive/logs
四. 參數(shù)配置方式
1.查看當前所有的配置信息
hive>set;
2.參數(shù)的配置三種方式
(1)配置文件方式
默認配置文件:hive-default.xml
用戶自定義配置文件:hive-site.xml
注意:用戶自定義配置會覆蓋默認配置觉吭。另外,Hive也會讀入Hadoop的配置仆邓,因為Hive是作為Hadoop的客戶端啟動的鲜滩,Hive的配置會覆蓋Hadoop的配置。配置文件的設(shè)定對本機啟動的所有Hive進程都有效宏赘。
(2)命令行參數(shù)方式
啟動Hive時绒北,可以在命令行添加-hiveconf param=value來設(shè)定參數(shù)黎侈。
例如:
[atguigu@hadoop103 hive]$ bin/hive -hiveconf mapred.reduce.tasks=10;
注意:僅對本次hive啟動有效
查看參數(shù)設(shè)置:
hive (default)> set mapred.reduce.tasks;
(3)參數(shù)聲明方式
可以在HQL中使用SET關(guān)鍵字設(shè)定參數(shù)
例如:
hive (default)> set mapred.reduce.tasks=100;
注意:僅對本次hive啟動有效察署。
查看參數(shù)設(shè)置
hive (default)> set mapred.reduce.tasks;
上述三種設(shè)定方式的優(yōu)先級依次遞增。即配置文件<命令行參數(shù)<參數(shù)聲明峻汉。注意某些系統(tǒng)級的參數(shù)贴汪,例如log4j相關(guān)的設(shè)定,必須用前兩種方式設(shè)定休吠,因為那些參數(shù)的讀取在會話建立以前已經(jīng)完成了扳埂。