什么是Hive
Hive是基于Hadoop的一個(gè)數(shù)據(jù)倉庫工具渤闷,可以將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張數(shù)據(jù)庫表,并提供類SQL查詢功能脖镀。
Hive架構(gòu)
基本組成
用戶接口:包括CLI飒箭、JDBC/ODBC、WebGUI。其中弦蹂,CLI(command line interface)為shell命令行肩碟;JDBC/ODBC是Hive的JAVA實(shí)現(xiàn),與傳統(tǒng)數(shù)據(jù)庫JDBC類似凸椿;WebGUI是通過瀏覽器訪問Hive削祈。
元數(shù)據(jù)存儲(chǔ):通常是存儲(chǔ)在關(guān)系數(shù)據(jù)庫如mysql/derby中。Hive 將元數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫中脑漫。Hive 中的元數(shù)據(jù)包括表的名字髓抑,表的列和分區(qū)及其屬性,表的屬性(是否為外部表等)优幸,表的數(shù)據(jù)所在目錄等吨拍。
解釋器、編譯器网杆、優(yōu)化器羹饰、執(zhí)行器:完成HQL 查詢語句從詞法分析、語法分析跛璧、編譯严里、優(yōu)化以及查詢計(jì)劃的生成。生成的查詢計(jì)劃存儲(chǔ)在HDFS 中追城,并在隨后有MapReduce 調(diào)用執(zhí)行
Hive與傳統(tǒng)數(shù)據(jù)庫對(duì)比
總結(jié):hive具有sql數(shù)據(jù)庫的外表,但應(yīng)用場(chǎng)景完全不同燥撞,hive只適合用來做批量數(shù)據(jù)統(tǒng)計(jì)分析
[a1]查詢語言座柱。由于 SQL 被廣泛的應(yīng)用在數(shù)據(jù)倉庫中,因此物舒,專門針對(duì) Hive 的特性設(shè)計(jì)了類 SQL 的查詢語言 HQL色洞。熟悉 SQL 開發(fā)的開發(fā)者可以很方便的使用 Hive 進(jìn)行開發(fā)。
數(shù)據(jù)存儲(chǔ)位置冠胯。Hive 是建立在 Hadoop 之上的火诸,所有 Hive 的數(shù)據(jù)都是存儲(chǔ)在 HDFS 中的。而數(shù)據(jù)庫則可以將數(shù)據(jù)保存在塊設(shè)備或者本地文件系統(tǒng)中荠察。
數(shù)據(jù)格式置蜀。Hive 中沒有定義專門的數(shù)據(jù)格式,數(shù)據(jù)格式可以由用戶指定悉盆,用戶定義數(shù)據(jù)格式需要指定三個(gè)屬性:列分隔符(通常為空格盯荤、”\t”、”\x001″)焕盟、行分隔符(”\n”)以及讀取文件數(shù)據(jù)的方法(Hive 中默認(rèn)有三個(gè)文件格式 TextFile秋秤,SequenceFile 以及 RCFile)。由于在加載數(shù)據(jù)的過程中,不需要從用戶數(shù)據(jù)格式到 Hive 定義的數(shù)據(jù)格式的轉(zhuǎn)換灼卢,因此绍哎,Hive 在加載的過程中不會(huì)對(duì)數(shù)據(jù)本身進(jìn)行任何修改,而只是將數(shù)據(jù)內(nèi)容復(fù)制或者移動(dòng)到相應(yīng)的 HDFS 目錄中鞋真。而在數(shù)據(jù)庫中蛇摸,不同的數(shù)據(jù)庫有不同的存儲(chǔ)引擎,定義了自己的數(shù)據(jù)格式灿巧。所有數(shù)據(jù)都會(huì)按照一定的組織存儲(chǔ)赶袄,因此,數(shù)據(jù)庫加載數(shù)據(jù)的過程會(huì)比較耗時(shí)抠藕。
數(shù)據(jù)更新饿肺。由于 Hive 是針對(duì)數(shù)據(jù)倉庫應(yīng)用設(shè)計(jì)的,而數(shù)據(jù)倉庫的內(nèi)容是讀多寫少的盾似。因此敬辣,Hive 中不支持對(duì)數(shù)據(jù)的改寫和添加,所有的數(shù)據(jù)都是在加載的時(shí)候中確定好的零院。而數(shù)據(jù)庫中的數(shù)據(jù)通常是需要經(jīng)常進(jìn)行修改的溉跃,因此可以使用 INSERT INTO ... VALUES 添加數(shù)據(jù),使用 UPDATE ... SET 修改數(shù)據(jù)告抄。
索引撰茎。之前已經(jīng)說過,Hive 在加載數(shù)據(jù)的過程中不會(huì)對(duì)數(shù)據(jù)進(jìn)行任何處理打洼,甚至不會(huì)對(duì)數(shù)據(jù)進(jìn)行掃描龄糊,因此也沒有對(duì)數(shù)據(jù)中的某些 Key 建立索引。Hive 要訪問數(shù)據(jù)中滿足條件的特定值時(shí)募疮,需要暴力掃描整個(gè)數(shù)據(jù)炫惩,因此訪問延遲較高。由于 MapReduce 的引入阿浓, Hive 可以并行訪問數(shù)據(jù)他嚷,因此即使沒有索引,對(duì)于大數(shù)據(jù)量的訪問芭毙,Hive 仍然可以體現(xiàn)出優(yōu)勢(shì)筋蓖。數(shù)據(jù)庫中,通常會(huì)針對(duì)一個(gè)或者幾個(gè)列建立索引稿蹲,因此對(duì)于少量的特定條件的數(shù)據(jù)的訪問扭勉,數(shù)據(jù)庫可以有很高的效率,較低的延遲苛聘。由于數(shù)據(jù)的訪問延遲較高涂炎,決定了 Hive 不適合在線數(shù)據(jù)查詢忠聚。
執(zhí)行。Hive 中大多數(shù)查詢的執(zhí)行是通過 Hadoop 提供的 MapReduce 來實(shí)現(xiàn)的唱捣,而數(shù)據(jù)庫通常有自己的執(zhí)行引擎两蟀。
執(zhí)行延遲。之前提到震缭,Hive 在查詢數(shù)據(jù)的時(shí)候赂毯,由于沒有索引,需要掃描整個(gè)表拣宰,因此延遲較高党涕。另外一個(gè)導(dǎo)致 Hive 執(zhí)行延遲高的因素是 MapReduce 框架。由于 MapReduce 本身具有較高的延遲巡社,因此在利用 MapReduce 執(zhí)行 Hive 查詢時(shí)膛堤,也會(huì)有較高的延遲。相對(duì)的晌该,數(shù)據(jù)庫的執(zhí)行延遲較低肥荔。當(dāng)然,這個(gè)低是有條件的朝群,即數(shù)據(jù)規(guī)模較小燕耿,當(dāng)數(shù)據(jù)規(guī)模大到超過數(shù)據(jù)庫的處理能力的時(shí)候,Hive 的并行計(jì)算顯然能體現(xiàn)出優(yōu)勢(shì)姜胖。
可擴(kuò)展性誉帅。由于 Hive 是建立在 Hadoop 之上的,因此 Hive 的可擴(kuò)展性是和 Hadoop 的可擴(kuò)展性是一致的(世界上最大的 Hadoop 集群在 Yahoo!谭期,2009年的規(guī)模在 4000 臺(tái)節(jié)點(diǎn)左右)堵第。而數(shù)據(jù)庫由于 ACID 語義的嚴(yán)格限制,擴(kuò)展行非常有限隧出。目前最先進(jìn)的并行數(shù)據(jù)庫 Oracle 在理論上的擴(kuò)展能力也只有 100 臺(tái)左右。
數(shù)據(jù)規(guī)模阀捅。由于 Hive 建立在集群上并可以利用 MapReduce 進(jìn)行并行計(jì)算胀瞪,因此可以支持很大規(guī)模的數(shù)據(jù);對(duì)應(yīng)的饲鄙,數(shù)據(jù)庫可以支持的數(shù)據(jù)規(guī)模較小凄诞。
安裝
derby版hive直接使用:
1、解壓hive
cd /export/softwares
tar -zxvf hive-1.1.0-cdh5.14.0.tar.gz -C ../servers/
2忍级、 直接啟動(dòng) bin/hive
bin/hive
hive> create database mytest;
缺點(diǎn):多個(gè)地方安裝hive后帆谍,每一個(gè)hive是擁有一套自己的元數(shù)據(jù),大家的庫轴咱、表就不統(tǒng)一拓哟;
使用mysql共享hive元數(shù)據(jù)
mysql安裝省略。袒哥。荆秦。
- 開啟mysql遠(yuǎn)程連接
grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;
flush privileges;
2.修改hive的配置文件
修改hive-env.sh
添加我們的hadoop的環(huán)境變量
cd /export/servers/hive-1.1.0-cdh5.14.0/conf
cp hive-env.sh.template hive-env.sh
vim hive-env.sh
#加入
HADOOP_HOME=/export/servers/hadoop-2.6.0-cdh5.14.0
# Hive Configuration Directory can be controlled by:
export HIVE_CONF_DIR=/export/servers/hive-1.1.0-cdh5.14.0/conf
修改hive-site.xml
cd /export/servers/hive-1.1.0-cdh5.14.0/conf
vim hive-site.xml
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://node03.hadoop.com: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>
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>
<property>
<name>hive.server2.thrift.bind.host</name>
<value>node03.hadoop.com</value>
</property>
<!--
<property>
<name>hive.metastore.uris</name>
<value>thrift://node03.hadoop.com:9083</value>
</property>
-->
</configuration>
上傳mysql的lib驅(qū)動(dòng)包
將mysql的lib驅(qū)動(dòng)包上傳到hive的lib目錄下
cd /export/servers/hive-1.1.0-cdh5.14.0/lib
將mysql-connector-java-5.1.38.jar 上傳到這個(gè)目錄下
使用方式
第一種交互方式:Hive交互shell
bin/hive
查看所有的數(shù)據(jù)庫
hive (default)> show databases;
創(chuàng)建一個(gè)數(shù)據(jù)庫
hive (default)> create database myhive;
使用該數(shù)據(jù)庫并創(chuàng)建數(shù)據(jù)庫表
hive (default)> use myhive;
hive (myhive)> create table test(id int,name string);
第二種交互方式:Hive JDBC服務(wù)
啟動(dòng)hiveserver2服務(wù)
#前臺(tái)啟動(dòng)
bin/hive --service hiveserver2
#后臺(tái)啟動(dòng)
nohup bin/hive --service hiveserver2 &
beeline連接hiveserver2
bin/beeline
beeline> !connect jdbc:hive2://node03.hadoop.com:10000
注意:如果使用beeline方式連接hiveserver2,一定要保證hive在mysql當(dāng)中的元數(shù)據(jù)庫已經(jīng)創(chuàng)建成功辑舷,不然就會(huì)拒絕連接
第三種交互方式:Hive命令
使用 –e 參數(shù)來直接執(zhí)行hql的語句
bin/hive -e "use myhive;select * from test;"
使用 –f 參數(shù)通過指定文本文件來執(zhí)行hql的語句
vim hive.sql
use myhive;select * from test;
bin/hive -f hive.sql
更多參數(shù)參考以下