Hive框架基礎(一)
* Hive框架基礎(一)
一句話:學習Hive有毛用?
那麽解釋一下 毛用:
* 操作接口采用類SQL語法,提供快速開發的能力(不會Java也可以玩運算)
* 避免了去寫MapReduce,減少開發人員的學習成本(MapReduce運算寫斷手)
* 擴展功能很方便
* 數據庫不等同於數據倉庫
數據庫有很多,例如:mysql、oracle、DB2、sqlserver,但hive並不是數據庫。
Hive是FaceBook的開源項目,Hive是基於Hadoop的一個數據倉庫工具,可以將結構化的數據文件,映射成一張表,並提供類似SQL查詢功能, hive的HQL語言(類似SQL)可以將任務翻譯成Java語言並直接在MapReduce上運行,支持Yarn資源調度。hive一般不會直接接入到業務中使用,從某種意義上來講呢,相當於一個Hadoop的客戶端,Hive在集群中並不需要每一臺服務器都安裝Hive。
** Hive的一些重要特性
* 本質:將HQL轉化成MapReduce任務
* 底層存儲使用HDFS
* 適合離線批量處理,延遲比較大(用於周期性的執行分析),不適合用於在線的需要實時分析結果的場景
* Hive體系結構
* 用戶接口: Client
* 終端命令行CLI --主要的一種使用方式,JDBC的方式一般不使用,比較麻煩。
* 元數據:metastore
* 默認apache使用的是derby數據庫(只能有一個客戶端使用),CDH使用postgreDB
* 元數據包括:表名、表所屬的數據庫(默認是default)、表的擁有者、列/分區字段、表的類型(是否是外部表),表的數據所在目錄等,並沒有存儲Hive表的真實數據
* 使用HDFS進行存儲
* 使用MapReduce進行計算
* 解析器: 解析Hql語句
* 編譯器: 把sql語句翻譯成MapReduce程序
* 優化器: 優化sql語句
* 執行器: 在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 數據庫名稱.表名稱 to 用戶名@用戶地址 identified by ‘連接口令’;)
* mysql數據庫默認只允許root用戶通過localhost/127.0.0.1來登錄使用
* 上面帶有grant的那條語句中:
all:表示所有權限;
*.*:表示數據庫.數據表;
root:表示授權給哪個用戶,用戶名可以任意指定,如果沒有會自動創建;
‘z01‘ :授權給哪臺主機
‘123456‘:授權給用戶來登錄的密碼
(尖叫提示:如果你需要讓所有的分布式機器都有權限訪問mysql,在此例子中,還需要執行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數據存儲在HDFS的/user/hive/warehouse目錄中,我們通過查看hive-site.xml中的hive.metastore.warehouse.dir屬性即可發現如圖:
* Hive基本操作
* 顯示所有數據庫
hive> show databases;
* 創建數據庫
語法:
hive (default)> create database 數據庫名稱 ;
例如:
創建一個數據庫d1:
hive> create databases d1;
* 刪除數據庫
hive (default)> drop database 數據庫名稱 ;
* 進入d1數據庫
hive> use d1;
* 創建表
語法:
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];
例如:
在當前數據庫中創建表staff,其中包含字段:id,name,sex
hive> create table staff(id int, name string, sex string) row format delimited fields terminated by ‘\t‘;
(註意:最後那一句英文表明數據字段之間用table制表符分割)
* 格式化輸出表staff的結構
hive> desc formatted staff;
如圖:
* 向表中插入數據
語法:
load data local inpath ‘文件路徑‘ [overwrite] into table 數據庫名.表名 ;
解釋:
** local 表示加載本地文件
** 文件加載模式:append 追加(默認使用)或 overwrite 覆蓋
** load data加載只是進行了簡單的位置轉移(如果load一個HDFS上的數據,比如從HDFS中的一個位置移動到HDFS中的另一個位置,會發生數據轉移,轉移之後,原來目錄的數據就沒有了,如果是從local到HDFS,則不會刪除原來的數據)
** 加載數據過程中不會去判斷字段分隔符是否正確,只有在用戶查詢數據的時候,會發現錯誤
例如:
首先,在hive的本地安裝目錄下,創建文件staff.txt,該文件內容如下:
接著,將本地文件中的數據導入到table中,使用命令:
hive> load data local inpath ‘staff.txt‘ into table staff;
最後查看導入後的效果
hive> select * from staff;
如圖:
* 修改Hive日誌信息
** 重命名配置文件
$ mv hive-log4j.properties.template hive-log4j.properties
** 創建文件夾
$ mkdir logs
** 編輯hive-log4j.properties文件,並修改日誌存儲目錄
hive.log.dir=/opt/modules/apache-hive-0.13.1-bin/logs
如圖:
* 設置hive在操作時是否顯示數據庫名稱和列名
如圖:
改為true即可* Hive任務
hive任務有兩種:
走mapreduce:
hive (default)> select name from d1.staff;
如圖:
不走mapreduce:
hive (default)> select * from d1.staff;
如圖:
* Hive的調試
在調試Hive任務時,一般會加入如下參數:
$ bin/hive --hiveconf hive.root.logger=DEBUG,console
* mysql數據庫備份與還原
備份與還原的數據庫名稱均為: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區別
InnoDB和MyISAM是許多人在使用MySQL時最常用的兩個表類型,這兩個表類型各有優劣,視具體應用而定。基本的差別為:MyISAM類型不支持事務處理等高級處理,而InnoDB類型支持。MyISAM類型的表強調的是性能,其執行數度比InnoDB類型更快,但是不提供事務支持,而InnoDB提供事務支持以及外部鍵等高級數據庫功能。
** innodb
新版本5.5+中默認使用;
.frm 結構文件;
.ibdata1 數據文件;
** MYISAM
/var/lib/mysql;
.frm 結構文件;
.MYI 索引文件;
.MYD 數據文件;
* Hive命令兩個重要參數
執行sql語句:-e
$ bin/hive -e "select * from d1.staff",如圖:
執行sql語句文件:-f
首先創建一個帶有sql語句的文件p1.hql,如圖:
$ bin/hive -f p1.hql,如圖:
* Hive 歷史命令的存放
存放位置:~/.hivehistory
查看該文件,如圖:
* Hive中臨時設置配置並生效
例如:hive > set hive.cli.print.current.db=true;
(註意,此方式為臨時生效)
* 總結
本節主要講解如何配置並使用Hive,並觀察hive任務在mapreduce中的運行以及結果的輸出。
個人微博:http://weibo.com/seal13
QQ大數據技術交流群(廣告勿入):476966007
作者:Z盡際
鏈接:https://www.jianshu.com/p/76c0897cbd09
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。
Hive框架基礎(一)