* Hive框架基礎(一)
一句話:學習Hive有毛用刺啦?
那么解釋一下 毛用:
* 操作接口采用類SQL語法,提供快速開發(fā)的能力(不會Java也可以玩運算)
* 避免了去寫MapReduce,減少開發(fā)人員的學習成本(MapReduce運算寫斷手)
* 擴展功能很方便
* 數(shù)據(jù)庫不等同于數(shù)據(jù)倉庫
數(shù)據(jù)庫有很多,例如:mysql端辱、oracle、DB2圾浅、sqlserver掠手,但hive并不是數(shù)據(jù)庫。
Hive是FaceBook的開源項目狸捕,Hive是基于Hadoop的一個數(shù)據(jù)倉庫工具喷鸽,可以將結構化的數(shù)據(jù)文件,映射成一張表灸拍,并提供類似SQL查詢功能做祝, hive的HQL語言(類似SQL)可以將任務翻譯成Java語言并直接在MapReduce上運行,支持Yarn資源調度鸡岗。hive一般不會直接接入到業(yè)務中使用混槐,從某種意義上來講呢,相當于一個Hadoop的客戶端轩性,Hive在集群中并不需要每一臺服務器都安裝Hive声登。
** Hive的一些重要特性
* 本質:將HQL轉化成MapReduce任務
* 底層存儲使用HDFS
* 適合離線批量處理,延遲比較大(用于周期性的執(zhí)行分析)揣苏,不適合用于在線的需要實時分析結果的場景
* Hive體系結構
* 用戶接口: Client
* 終端命令行CLI --主要的一種使用方式悯嗓,JDBC的方式一般不使用,比較麻煩卸察。
* 元數(shù)據(jù):metastore
* 默認apache使用的是derby數(shù)據(jù)庫(只能有一個客戶端使用)脯厨,CDH使用postgreDB
* 元數(shù)據(jù)包括:表名、表所屬的數(shù)據(jù)庫(默認是default)坑质、表的擁有者合武、列/分區(qū)字段临梗、表的類型(是否是外部表),表的數(shù)據(jù)所在目錄等稼跳,并沒有存儲Hive表的真實數(shù)據(jù)
* 使用HDFS進行存儲
* 使用MapReduce進行計算
* 解析器: 解析Hql語句
* 編譯器: 把sql語句翻譯成MapReduce程序
* 優(yōu)化器: 優(yōu)化sql語句
* 執(zhí)行器: 在yarn平臺運行MapReduce程序
* Hive在Hadoop中的位置盟庞,如圖:
** Hive部署
* 安裝JDK(此步驟省略,請查看之前內容)
* 安裝Hadoop
此步驟要確保Hadoop可以正常使用岂贩,比如上傳文件茫经,運行jar任務等等
* 安裝Hive
Hive下載地址傳送門:鏈接:http://pan.baidu.com/s/1eSFuTWm 密碼:k5xo
安裝過程涉及命令:
$ tar -zxf apache-hive-0.13.1-bin.tar.gz -C /opt/modules/
進入Hive根目錄下的conf目錄,進行如下操作萎津,到這個階段應該無需解釋了吧?
$ cp -a hive-env.sh.template ?hive-env.sh抹镊,如圖:
$ cp -a hive-default.xml.template ?hive-site.xml锉屈,如圖:
* 修改hive-env.sh
JAVA_HOME=/opt/modules/jdk1.8.0_121
HADOOP_HOME=/opt/modules/hadoop-2.5.0
export HIVE_CONF_DIR=/opt/modules/apache-hive-0.13.1-bin/conf
如圖:
* 安裝mysql,依次涉及命令:
$ su - root
# yum -y install mysql mysql-server mysql-devel
# wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
# rpm -ivh mysql-community-release-el7-5.noarch.rpm
# yum -y install mysql-community-server
* 成功安裝之后啟動mysql服務
# systemctl start ?mysqld.service垮耳,centOS7以下版本使用:# service mysqld start
注意颈渊,初次安裝mysql是root賬戶是沒有密碼的
* 設置密碼
方案一:
# mysqladmin -uroot password '123456'
方案二:
# mysql -uroot -p
mysql> update user set password=password("123456") where user='root';
mysql> flush privileges;
mysql> exit;
* 給用戶授權
# mysql -uroot -p
mysql>grant all on *.* to root@'z01' identified by '123456' ;
mysql> flush privileges;
mysql> exit;
注釋:
(grant 權限1,權限2,…權限n on 數(shù)據(jù)庫名稱.表名稱 to 用戶名@用戶地址 identified by ‘連接口令’;)
* mysql數(shù)據(jù)庫默認只允許root用戶通過localhost/127.0.0.1來登錄使用
* 上面帶有grant的那條語句中:
all:表示所有權限;
*.*:表示數(shù)據(jù)庫.數(shù)據(jù)表终佛;
root:表示授權給哪個用戶俊嗽,用戶名可以任意指定,如果沒有會自動創(chuàng)建铃彰;
'z01' :授權給哪臺主機
'123456':授權給用戶來登錄的密碼
(尖叫提示:如果你需要讓所有的分布式機器都有權限訪問mysql绍豁,在此例子中,還需要執(zhí)行grant all on *.* to root@'z02' identified by '123456' ;以及grant all on *.* to root@'z03' identified by '123456' ;留意@符號后邊的主機名)
* 配置hive-site.xml
打開之后牙捉,該文件中顯示的全部為默認的配置竹揍,其中如下4項做出相應修改:
* 安裝驅動包
涉及命令:
$ tar -zxf mysql-connector-java-5.1.27.tar.gz -C /opt/modules
$ cp mysql-connector-java-5.1.27-bin.jar /opt/modules/apache-hive-0.13.1-bin/lib/
操作如圖所示:
* 修改目錄權限
首先確保HDFS正常運行,之后涉及命令:
$ bin/hadoop fs -chmod g+w /tmp
$ bin/hadoop fs -chmod g+w /user/hive/warehouse
(注意:/tmp存放臨時文件邪铲;/user/hive/warehouse ?具體的Hive倉庫目錄)
* 啟動Hive客戶端
$ bin/hive,如圖:
* 中場小結:hive带到、hadoop的關系昧碉、mysql三者之間的關系
* hive數(shù)據(jù)存儲在HDFS的/user/hive/warehouse目錄中,我們通過查看hive-site.xml中的hive.metastore.warehouse.dir屬性即可發(fā)現(xiàn)如圖:
* Hive基本操作
* 顯示所有數(shù)據(jù)庫
hive> show databases;
* 創(chuàng)建數(shù)據(jù)庫
語法:?
hive (default)> create database 數(shù)據(jù)庫名稱 ;
例如:
創(chuàng)建一個數(shù)據(jù)庫d1:
hive> create databases d1;
* 刪除數(shù)據(jù)庫
hive (default)> drop database 數(shù)據(jù)庫名稱 ;
* 進入d1數(shù)據(jù)庫
hive> use d1;
* 創(chuàng)建表
語法:
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
[(col_name data_type? ...)]
[PARTITIONED BY (col_name data_type , ...)]
[ROW FORMAT row_format]
[LOCATION hdfs_path]
[AS select_statement];
例如:
在當前數(shù)據(jù)庫中創(chuàng)建表staff揽惹,其中包含字段:id被饿,name,sex
hive> create table staff(id int, name string, sex string) row format delimited fields terminated by '\t';
(注意:最后那一句英文表明數(shù)據(jù)字段之間用table制表符分割)
* 格式化輸出表staff的結構
hive> desc formatted staff;
如圖:
* 向表中插入數(shù)據(jù)
語法:
load data local inpath '文件路徑' [overwrite] into table 數(shù)據(jù)庫名.表名 ;
解釋:
** local 表示加載本地文件
** 文件加載模式:append 追加(默認使用)或?overwrite 覆蓋
** load data加載只是進行了簡單的位置轉移(如果load一個HDFS上的數(shù)據(jù)永丝,比如從HDFS中的一個位置移動到HDFS中的另一個位置锹漱,會發(fā)生數(shù)據(jù)轉移,轉移之后慕嚷,原來目錄的數(shù)據(jù)就沒有了哥牍,如果是從local到HDFS毕泌,則不會刪除原來的數(shù)據(jù))
** 加載數(shù)據(jù)過程中不會去判斷字段分隔符是否正確,只有在用戶查詢數(shù)據(jù)的時候,會發(fā)現(xiàn)錯誤
例如:
首先嗅辣,在hive的本地安裝目錄下撼泛,創(chuàng)建文件staff.txt,該文件內容如下:
接著澡谭,將本地文件中的數(shù)據(jù)導入到table中愿题,使用命令:
hive> load data local inpath 'staff.txt' into table staff;
最后查看導入后的效果
hive> select * from staff;
如圖:
* 修改Hive日志信息
** 重命名配置文件
$ mv hive-log4j.properties.template hive-log4j.properties
** 創(chuàng)建文件夾
$ mkdir logs
** 編輯hive-log4j.properties文件,并修改日志存儲目錄
hive.log.dir=/opt/modules/apache-hive-0.13.1-bin/logs
如圖:
* 設置hive在操作時是否顯示數(shù)據(jù)庫名稱和列名
如圖:
* Hive任務
hive任務有兩種:
走mapreduce:
hive (default)> select name from d1.staff;
如圖:
不走mapreduce:
hive (default)> select * from d1.staff;
如圖:
* Hive的調試
在調試Hive任務時蛙奖,一般會加入如下參數(shù):
$ bin/hive --hiveconf hive.root.logger=DEBUG,console
* mysql數(shù)據(jù)庫備份與還原
備份與還原的數(shù)據(jù)庫名稱均為:metastore潘酗,如圖:
** 備份:
$ mysqldump -uroot -p metastore > metastore.sql
如圖:
** 還原:
方案1:
$ mysql -uroot -p metastore < metastore.sql
如圖:
方案2:
$ mysql -uroot -p
mysql>? source /path/metastore.sql ;
* 拓展:mysql存儲中innodb和MYISAM區(qū)別
InnoDB和MyISAM是許多人在使用MySQL時最常用的兩個表類型,這兩個表類型各有優(yōu)劣雁仲,視具體應用而定仔夺。基本的差別為:MyISAM類型不支持事務處理等高級處理攒砖,而InnoDB類型支持缸兔。MyISAM類型的表強調的是性能,其執(zhí)行數(shù)度比InnoDB類型更快吹艇,但是不提供事務支持惰蜜,而InnoDB提供事務支持以及外部鍵等高級數(shù)據(jù)庫功能。
** innodb?
新版本5.5+中默認使用受神;
.frm 結構文件抛猖;
.ibdata1 數(shù)據(jù)文件;
** MYISAM
/var/lib/mysql路克;
.frm 結構文件樟结;
.MYI 索引文件;
.MYD 數(shù)據(jù)文件精算;
* Hive命令兩個重要參數(shù)
執(zhí)行sql語句:-e
$ bin/hive -e "select * from d1.staff"瓢宦,如圖:
執(zhí)行sql語句文件:-f
首先創(chuàng)建一個帶有sql語句的文件p1.hql,如圖:
$ bin/hive -f p1.hql灰羽,如圖:
* Hive 歷史命令的存放
存放位置:~/.hivehistory
查看該文件驮履,如圖:
* Hive中臨時設置配置并生效
例如:hive > set hive.cli.print.current.db=true;
(注意,此方式為臨時生效)
* 總結
本節(jié)主要講解如何配置并使用Hive廉嚼,并觀察hive任務在mapreduce中的運行以及結果的輸出玫镐。
個人微博:http://weibo.com/seal13
QQ大數(shù)據(jù)技術交流群(廣告勿入):476966007