Hive是什么
- 我們知道傳統數據存儲都是存儲在關系型數據庫中,它們使用一種SQL(結構化查詢語言)方言來查詢數據庫中的數據。由于大數據的爆發,Hadoop的廣泛使用,當這些數據遷移到Hadoop之后,用戶或者管理員如何對存儲在Hadoop上的數據進行查詢?Hive出現的主要原因就是為了提供一種SQL查詢的方言,來查詢存儲在Hadoop集群種的數據,這個被稱為Hive查詢語言(簡稱HiveQL或HQL)。
- Hive本身并不是一個完整的數據庫,這是由于Hadoop和HDFS本身設計所限制的,比如Hive不支持行級別的更新、插入、刪除操作。同時由于Hive會將查詢轉換為MapReduce作業,而MapReduce本身啟動需要消耗較長的時間(Hadoop是一個面向批處理的系統),所以Hive查詢延時比較嚴重,并且Hive不支持事務。
- Hive更適合數據倉庫應用程序,來維護海量數據。使用Hive進行靜態數據分析,不需要快速響應結果,并且數據本身不會頻繁變化,而且可以對數據進行挖掘。
- 由于Hive不支持OLTP(聯機事務處理)所需的關鍵功能,所以如果想要對大規模數據使用OLTP功能的話,可以使用NoSQL數據庫,比如HBase或Cassandra。
注意:Hive和大多數SQL方言一樣,并不符合ANSI SQL標準,不過HiveQL和Mysql的SQL方言比較接近。
如何使用Hive
在Hive的發行版中有多個模塊可供訪問Hive:CLI、HWI(Hive網頁界面)、JDBC、ODBC、Thrift Server。
所有的命令和查詢都會進入到Driver模塊,通過該模塊對輸入進行編譯、對需求計算進行優化,然后按照指定步驟執行(通常啟動多個MapReduce來執行)。
需要注意的是,啟動MR任務的時候,Hive不會生成Java的MapReduce程序,而是通過一個表示“job執行計劃”的XML文件驅動執行內置的、原生的Mapper和Reducer模塊。
Hive安裝
下載Hive安裝包http://www.apache.org/dyn/closer.cgi/hive/ hive現在有1.x版本和2.x版本,其中1.x可支持Hadoop1和Hadoop2,而2.x版本指支持Hadoop2。因為hive基于Hadoop,所以需要確保Hadoop安裝成功。hive只需要在一個節點安裝即可。
解壓包
tar -zxvf apache-hive-2.1.1-bin.tar.gz添加hive安裝路徑
vim /etc/profile或者~/.bash_profile
export HIVE_HOME=/opt/hadoop/apache-hive-2.1.1-bin
export PATH=PATH
在HDFS創建指定目錄,并給用戶組寫權限
hadoop fs -mkdir /tmp
hadoop fs -mkdir /user/hive
hadoop fs -chmod g+w /tmp
hadoop fs -chmod g+w /user/hivemysql創建hive metastore庫
在上面hive結構中,我們有一個MetaStore是用來存儲hive的元數據信息,一般metastore信息存儲到關系型數據庫中的。如果不配置,hive會默認使用內嵌的Derby數據庫,Derby數據庫本身容量小,并且不支持多客戶端使用,所以一般使用mysql來存儲metastore信息。文件配置
配置hive-env.sh:
添加HADOOP_HOME和HIVE_CONF_DIR配置。
配置hive-site.xml,這個文件如果不存在,則自己創建。
<pre>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://xxx.xxx.xxx.xxx:3306/hive?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>123</value>
<description>password to use against metastore database</description>
</property>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
<description>location of default database for the warehouse</description>
</property>
</configuration>
</pre>添加mysql連結器mysql-connector-java-5.1.42-bin.jar
下載:https://dev.mysql.com/downloads/connector/j/
解壓縮后copy到$HIVE_HOME/lib/里面。hive信息初始化到mysql 中
schematool -dbType mysql -initSchema
<pre>
which: no hbase in (/opt/hadoop/apache-hive-2.1.1-bin/bin:/opt/hadoop/hadoop-2.7.3/bin:/opt/hadoop/hadoop-2.7.3/sbin:/usr/java/jdk1.8.0_131/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/hadoop/apache-hive-2.1.1-bin/lib/log4j-slf4j-impl-2.4.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/hadoop/hadoop-2.7.3/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Metastore connection URL: jdbc:mysql://10.5.234.238:3306/hive?createDatabaseIfNotExist=true
Metastore Connection Driver : com.mysql.jdbc.Driver
Metastore connection User: root
Starting metastore schema initialization to 2.1.0
Initialization script hive-schema-2.1.0.mysql.sql
Initialization script completed
schemaTool completed
</pre>
這時候mysql中會自動創建一個hive庫。進入hive
直接輸入hive命令,測試一下
<pre>
hive> show tables;
OK
Time taken: 1.012 seconds
</pre>
hive命令行
輸入hive - -help
<pre>
Usage ./hive <parameters> --service serviceName <service parameters>
Service List: beeline cleardanglingscratchdir cli hbaseimport hbaseschematool help hiveburninclient hiveserver2 hplsql hwi jar lineage llapdump llap llapstatus metastore metatool orcfiledump rcfilecat schemaTool version
Parameters parsed:
--auxpath : Auxillary jars
--config : Hive configuration directory
--service : Starts specific service/component. cli is default
Parameters used:
HADOOP_HOME or HADOOP_PREFIX : Hadoop install directory
HIVE_OPT : Hive options
For help on a particular service:
./hive --service serviceName --help
Debug help: ./hive --debug —help
</pre>
通過hive --service serviceName來啟動服務,Service List包含了所有的服務。
--auxpath:來指定用冒號分隔的jar包,包含用戶自定義的擴展等。
--config:覆蓋$HIVE_HOME/conf目錄下的配置的
--service:啟動指定服務或組件,默認是cli
如果要查看每個服務如何使用,可以通過./hive --service serviceName --help來查看。
CLI命令行界面
hive --service cli --help
<pre>
usage: hive
-d,--define <key=value> Variable subsitution to apply to hive commands. e.g. -d A=B or --define A=B. 用來定義變量比如:hive -d a=12
--database <databasename> Specify the database to use. 指定所使用的數據庫,默認是default
-e <quoted-query-string> SQL from command line. 不用進入hive,直接在命令行中輸入sql,如 :hive -e "show databases"
-f <filename> SQL from files. 指定一個sql文件執行,如果在CLI中,通過source然后指定文件路徑,也可以執行指定文件的sql。
-H,--help Print help information
--hiveconf <property=value> Use value for given property. 配置hive相關的屬性
--hivevar <key=value> Variable subsitution to apply to hive commands. e.g. --hivevar A=B.用戶定義變量,和-d一樣
-i <filename> Initialization SQL file. 允許用戶指定一個文件,當CLI啟動前會執行這個文件。這個文件以hiverc結尾,一般這個文件用來設置每次用戶啟動CLI的一些配置,比如剛才的:hiveconf hive.cli.print.current.db=true;
-S,--silent Silent mode in interactive shell. 靜默模式,不打印”ok”和“Time take”等信息。
-v,--verbose Verbose mode (echo executed SQL to the
console)
</pre>
在CLI中可以使用set命令顯示和修改變量值,在CLI中也可以看到system和env的屬性變量,但是env的變量是只讀不能更改的。
<pre>
set env:HOME;
env:HOME=/home/hadoop
set;//打印env所有變量
set a;//顯示a的值
set a=13;//修改變量的值
</pre>
在HiveQL中可以直接使用變量,比如:
<pre>
hive -d a = age;
hive>create table user(${hivevar:a} int);
</pre>
hivevar:a中hivevar是可以省略的,hivevar和define使用是一樣的。
--hiveconf用來定義hive的配置,比如:
hive --hiveconf hive.cli.print.current.db=true
開啟這個屬性,在CLI提示符前會打印當前使用的數據庫:
hive (default)>
歷史命令
hive會將最近100條執行命令放到$HOME/.hivehistory中
在CLI中執行shell
在CLI中可以不退出就能執行shell命令,只需要在命令前加!,并且以分號(;)結尾即可。比如
hive> ! ls;
在CLI中執行shell不支持需要用戶輸入的交互式命令、不支持管道功能、不支持文件名自動補齊功能(不支持通配符)。
在CLI中使用Hadoop的dfs命令
在CLI中可以操作HDFS,只需要直接輸入dfs即可,比如:
hive>dfs -help;
hive腳本
hive腳本是以.hql結尾的,在腳本中使用--進行注釋
查詢顯示字段名稱
可以通過設置hive.cli.print.header=true;來打印每次查詢顯示表頭信息。