1. 程式人生 > >Hive框架基礎(一)

Hive框架基礎(一)

type hist 沒有 dfs gem java view 在線的 history

* 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框架基礎(一)