Spark入門實戰系列--5.Hive(上)--Hive介紹及部署


【注】該系列文章以及使用到安裝包/測試數據 可以在傾情大奉送--Spark入門實戰系列獲取

1Hive介紹

1.1 Hive介紹

Hive是一個基於Hadoop的開源數據倉庫工具,用於存儲和處理海量結構化數據。它是Facebook 20088月開源的一個數據倉庫框架,提供了類似於SQL語法的HQL語句作為數據訪問接口,Hive有如下優缺點:

l  優點:

1.Hive 使用類SQL 查詢語法, 最大限度的實現了和SQL標准的兼容,大大降低了傳統數據分析人員學習的曲線;

2.使用JDBC 接口/ODBC接口,開發人員更易開發應用;

3.MR 作為計算引擎、HDFS 作為存儲系統,為超大數據集設計的計算/ 擴展能力;

4.統一的元數據管理(DerbyMySql等),並可與Pig Presto 等共享;

l  缺點:

1.Hive HQL 表達的能力有限,有些復雜運算用HQL 不易表達;

2.由於Hive自動生成MapReduce 作業, HQL 調優困難;

3.粒度較粗,可控性差

1.2  Hive運行架構

clip_image002

由上圖可知,HadoopMapReduceHive架構的根基。Hive架構包括如下組件:CLICommand Line Interface)、JDBC/ODBCThrift ServerWEB GUIMetastoreDriver(ComplierOptimizerExecutor),這些組件分為兩大類:服務端組件和客戶端組件。

服務端組件:

lDriver組件:該組件包括ComplierOptimizerExecutor,它的作用是將HiveQL(類SQL)語句進行解析、編譯優化,生成執行計划,然后調用底層的MapReduce計算框架;

lMetastore組件:元數據服務組件,這個組件存儲Hive的元數據,Hive的元數據存儲在關系數據庫里,Hive支持的關系數據庫有DerbyMysql。元數據對於Hive十分重要,因此Hive支持把Metastore服務獨立出來,安裝到遠程的服務器集群里,從而解耦Hive服務和Metastore服務,保證Hive運行的健壯性;

lThrift服務:ThriftFacebook開發的一個軟件框架,它用來進行可擴展且跨語言的服務的開發,Hive集成了該服務,能讓不同的編程語言調用Hive的接口。

 

客戶端組件:

lCLICommand Line Interface,命令行接口。

lThrift客戶端:上面的架構圖里沒有寫上Thrift客戶端,但是Hive架構的許多客戶端接口是建立在Thrift客戶端之上,包括JDBCODBC接口。

lWEBGUIHive客戶端提供了一種通過網頁的方式訪問Hive所提供的服務。這個接口對應HiveHWI組件(Hive Web Interface),使用前要啟動HWI服務。

 

Hive的執行流程

clip_image004

 

三種部署模式

1.單用戶模式 此模式連接到一個In-Memory 的數據庫Derby,一般用於Unit Test

clip_image006

2.多用戶模式 通過網絡連接到一個數據庫中,是最經常使用到的模式。

clip_image008

3.  遠程服務器模式 用於非Java客戶端訪問元數據庫,在服務器端啟動MetaStoreServer,客戶端利用Thrift協議通過MetaStoreServer訪問元數據庫。

clip_image010

1.3 Hive數據模型

Hive沒有專門的數據存儲格式,用戶可以自由的組織Hive中的表,只需要在創建表的時候告訴Hive數據中的列分隔符和行分隔符,Hive就可以解析數據。Hive中所有的數據都存儲在HDFS中,存儲結構主要包括數據庫、文件、表和視圖。Hive中包含以下數據模型:Table內部表,External Table外部表,Partition分區,Bucket桶。Hive默認可以直接加載文本文件,還支持sequence file RCFile

    1.Hive數據庫

類似傳統數據庫的DataBase,在第三方數據庫里實際是一張表

簡單示例命令行: create database test_database;

    2.內部表

Hive的內部表與數據庫中的Table在概念上是類似。每一個TableHive中都有一個相應的目錄存儲數據。例如一個表tbInner,它在HDFS中的路徑為/user/hive/warehouse/tbInner,其中/user/hive/warehouse是在hive-site.xml中由${hive.metastore.warehouse.dir} 指定的數據倉庫的目錄,所有的Table數據(不包括External Table)都保存在這個目錄中。內部表刪除時,元數據與數據都會被刪除。

內部表簡單示例:

創建數據文件:test_inner_table.txt

創建表:create table test_inner_table (key string);

加載數據:LOAD DATA LOCAL INPATH 'filepath' INTO TABLE test_inner_table;

查看數據:select * from test_inner_table;

刪除表:drop table test_inner_table;

     3. 外部表

外部表指向已經在HDFS中存在的數據,並可以創建Partition。它和內部表在元數據的組織上是相同的,而實際數據的存儲則有較大的差異。內部表的創建過程和數據加載過程這兩個過程可以分別獨立完成,也可以在同一個語句中完成,在加載數據的過程中,實際數據會被移動到數據倉庫目錄中;之后對數據對訪問將會直接在數據倉庫目錄中完成。刪除表時,表中的數據和元數據將會被同時刪除。而外部表只有一個過程,加載數據和創建表同時完成(CREATE EXTERNAL TABLE ……LOCATION),實際數據是存儲在LOCATION后面指定的 HDFS 路徑中,並不會移動到數據倉庫目錄中。當刪除一個External Table時,僅刪除該鏈接。

外部表簡單示例:

創建數據文件:test_external_table.txt

創建表:create external table test_external_table (key string);

加載數據:LOAD DATA INPATH filepath INTO TABLE test_inner_table;

查看數據:select * from test_external_table;

刪除表:drop table test_external_table;

    4.分區

Partition對應於數據庫中的Partition列的密集索引,但是HivePartition的組織方式和數據庫中的很不相同。在Hive中,表中的一個Partition對應於表下的一個目錄,所有的Partition的數據都存儲在對應的目錄中。例如pvs表中包含dscity兩個Partition,則對應於ds = 20090801, ctry = US HDFS子目錄為/user/hive/warehouse/pvs/ds=20090801/ctry=US;對應於 ds = 20090801, ctry = CA HDFS子目錄為/user/hive/warehouse/pvs/ds=20090801/ctry=CA

分區表簡單示例:

創建數據文件:test_partition_table.txt

創建表:create table test_partition_table (key string) partitioned by (dt string);

加載數據:LOAD DATA INPATH filepath INTO TABLE test_partition_table partition (dt=2006);

查看數據:select * from test_partition_table;

刪除表:drop table test_partition_table;

    5.

Buckets是將表的列通過Hash算法進一步分解成不同的文件存儲。它對指定列計算Hash,根據Hash值切分數據,目的是為了並行,每一個Bucket對應一個文件。例如將user列分散至32bucket,首先對user列的值計算Hash,對應Hash值為0HDFS目錄為/user/hive/warehouse/pvs/ds=20090801/ctry=US/part-00000Hash值為20HDFS目錄為/user/hive/warehouse/pvs/ds=20090801/ctry=US/part-00020。如果想應用很多的Map任務這樣是不錯的選擇。

    桶的簡單示例:

    創建數據文件:test_bucket_table.txt

創建表:create table test_bucket_table (key string) clustered by (key) into 20 buckets

    加載數據:LOAD DATA INPATH filepath INTO TABLE test_bucket_table

    查看數據:select * from test_bucket_table;  set hive.enforce.bucketing = true;

    6.Hive的視圖

視圖與傳統數據庫的視圖類似。視圖是只讀的,它基於的基本表,如果改變,數據增加不會影響視圖的呈現;如果刪除,會出現問題。如果不指定視圖的列,會根據select語句后的生成。

    示例:create view test_view as select * from test

1.4 Hive數據類型

Hive支持兩種數據類型,一類叫原子數據類型,一類叫復雜數據類型。

l  原子數據類型包括數值型、布爾型和字符串類型,具體如下表所示:

基本數據類型

類型

描述

示例

TINYINT

1個字節(8位)有符號整數

1

SMALLINT

2字節(16位)有符號整數

1

INT

4字節(32位)有符號整數

1

BIGINT

8字節(64位)有符號整數

1

FLOAT

4字節(32位)單精度浮點數

1.0

DOUBLE

8字節(64位)雙精度浮點數

1.0

BOOLEAN

true/false

true

STRING

字符串

‘xia’,”xia”

由上表我們看到Hive不支持日期類型,在Hive里日期都是用字符串來表示的,而常用的日期格式轉化操作則是通過自定義函數進行操作。

Hive是用Java開發的,Hive里的基本數據類型和java的基本數據類型也是一一對應的,除了String類型。有符號的整數類型:TINYINTSMALLINTINTBIGINT分別等價於JavaByteShortIntLong原子類型,它們分別為1字節、2字節、4字節和8字節有符號整數。Hive的浮點數據類型FLOATDOUBLE,對應於Java的基本類型FloatDouble類型。而HiveBOOLEAN類型相當於Java的基本數據類型Boolean。對於HiveString類型相當於數據庫的Varchar類型,該類型是一個可變的字符串,不過它不能聲明其中最多能存儲多少個字符,理論上它可以存儲2GB的字符數。

l  復雜數據類型包括數組(ARRAY)、映射(MAP)和結構體(STRUCT),具體如下所示:

clip_image012

1.5 Hive與關系數據庫的區別

由於Hive采用了SQL的查詢語言HQL,因此很容易將Hive理解為數據庫。其實從結構上來看,Hive和數據庫除了擁有類似的查詢語言,再無類似之處。數據庫可以用在Online的應用中,但是Hive是為數據倉庫而設計的,清楚這一點,有助於從應用角度理解Hive的特性。

    Hive和數據庫的比較如下表:

 

Hive

RDBMS

查詢語言 

HQL

SQL

數據存儲 

HDFS

Raw Device or Local FS

數據格式

用戶定義

系統決定

數據更新

不支持

支持

索引 

執行 

MapReduce

Executor

執行延遲 

處理數據規模 

可擴展性

2Hive搭建過程

2.1 安裝MySql數據庫

2.1.1 下載MySql安裝文件

下載地址:http://dev.mysql.com/downloads/mysql/#downloads,使用系統為CentOS選擇 Red Hat Enterprise Linux/Oracle系列:

clip_image014

操作系統為64位,選擇對應安裝包進行下載:

clip_image016

clip_image018

clip_image020

下載在本地目錄如下圖:

clip_image022

2.1.2 上傳MySql安裝文件

把下載的mysql安裝包,使用SSH Secure File Transfer工具(參見《Spark編譯與部署(上)--基礎環境搭建》1.3.1介紹)上傳到/home/hadoop/upload 目錄下,如下圖所示:

clip_image024

2.1.3 卸載舊的MySql

(1)查找以前是否安裝有mysql

使用命令查看是否已經安裝過mysql

$rpm -qa | grep -i mysql

可以看到如下圖的所示:

clip_image026

說明之前安裝了:

MySQL-client-5.6.21-1.el6.x86_64

MySQL-server-5.6.21-1.el6.x86_64

MySQL-devel-5.6.21-1.el6.x86_64

如果沒有結果,可以進行mysql數據庫安裝

(2)停止mysql服務、刪除之前安裝的mysql

停止mysql服務、刪除之前安裝的mysql刪除命令:rpm -e nodeps 包名

$sudo rpm -ev MySQL-server-5.6.21-1.el6.x86_64

$sudo rpm -ev MySQL-devel-5.6.21-1.el6.x86_64

$sudo rpm -ev MySQL-client-5.6.21-1.el6.x86_64

clip_image028

如果存在CentOS自帶mysql-libs-5.1.71-1.el6.x86_64使用下面的命令卸載即可

$sudo rpm -ev --nodeps mysql-libs-5.1.71-1.el6.x86_64

clip_image030

(3)查找之前老版本mysql的目錄並且刪除老版本mysql的文件和庫

$sudo find / -name mysql

clip_image032

刪除對應的mysql目錄

$sudo rm -rf /usr/lib64/mysql

$sudo rm -rf /var/lib/mysql

clip_image034

(4)再次查找機器是否安裝mysql

$sudo rpm -qa | grep -i mysql

無結果,說明已經卸載徹底、接下來直接安裝mysql即可

clip_image036

2.1.4 安裝MySql

進入安裝文件的目錄,安裝mysql服務端

$cd /home/hadoop/upload

$sudo rpm -ivh MySQL-server-5.6.21-1.el6.x86_64.rpm

clip_image038

安裝mysql客戶端、mysql-devel

$sudo rpm -ivh MySQL-client-5.6.21-1.el6.x86_64.rpm

$sudo rpm -ivh MySQL-devel-5.6.21-1.el6.x86_64.rpm

clip_image040

2.1.5 設置root密碼

CentOS6.5下安裝mysql設置root密碼時,出現如下錯誤:

clip_image042

/usr/bin/mysqladmin: connect to server at 'localhost' failed

error: 'Access denied for user 'root'@'localhost' (using password: NO)'

可以進入安全模式進行設置root密碼

(1)停止mysql服務

使用如下命令停止mysql服務:

$sudo service mysql stop

$sudo service mysql status

clip_image044

(2)跳過驗證啟動mysql

使用如下命令驗證啟動mysql,由於&結尾是后台運行進程,運行該命令可以再打開命令窗口或者Ctr+C繼續進行下步操作,由於mysql啟動時間會長點,需要等待幾分鍾再查看啟動狀態:

$sudo mysqld_safe --skip-grant-tables &

$sudo service mysql status

clip_image046

(3)跳過驗證啟動MySQL

驗證mysql服務已經在后台運行后,執行如下語句,其中后面三條命令是在mysql語句:

mysql -u root

mysql>use mysql;

mysql>update user set password = password('root') where user = 'root';

mysql>flush privileges;

mysql>quit;

clip_image048

(4)跳過驗證啟動MySQL

重啟mysql服務並查看狀態

$sudo service mysql stop

$sudo service mysql start

$sudo service mysql status

clip_image050

2.1.6 設置Hive用戶

進入mysql命令行,創建Hive用戶並賦予所有權限:

mysql -uroot -proot

mysql>set password=password('root');

mysql>create user 'hive' identified by 'hive';

mysql>grant all on *.* TO 'hive'@'%' with grant option;

mysql>flush privileges;

mysql>quit;

clip_image052

(注意:如果是root第一次登錄數據庫,需要重新設置一下密碼,所報異常信息如下:ERROR 1820 (HY000): You must SET PASSWORD before executing this statement

2.1.7 創建Hive數據庫

使用hive用戶登錄,創建Hive數據庫:

mysql -uhive -phive

mysql>create database hive;

mysql>show databases;

clip_image054

2.2 安裝Hive

2.2.1 下載Hive安裝文件

可以到Apache基金hive官網http://hive.apache.org/downloads.html,選擇鏡像下載地址:http://mirrors.cnnic.cn/apache/hive/下載一個穩定版本,這里選擇下載apache-hive-0.13.1-bin.tar.gz文件,如下圖所示:

clip_image056

2.2.2 下載MySql驅動

mysql官網進入下載頁面:http://dev.mysql.com/downloads/connector/j/,默認情況下是Windows安裝包,這里需要選擇Platform Independent版本下載zip格式的文件

clip_image058

2.2.3 上傳Hive安裝文件和MySql驅動

把下載的hive安裝包和mysql驅動包,使用SSH Secure File Transfer工具(參見《Spark編譯與部署(上)--基礎環境搭建》1.3.1介紹)上傳到/home/hadoop/upload 目錄下,如下圖所示:

clip_image060

2.2.4 解壓縮

到上傳目錄下,用如下命令解壓縮hive安裝文件:

cd /home/hadoop/upload

tar -zxf hive-0.13.1-bin.tar.gz

clip_image062

改名並遷移到/app/hadoop目錄下:

sudo mv apache-hive-0.13.1-bin /app/hadoop/hive-0.13.1

ll /app/hadoop

clip_image064

2.2.5 MySql驅動放到Hivelib目錄下

把下載的hive安裝包和mysql驅動包,使用

cd /home/hadoop/upload

cp mysql-connector-java-5.1.34-bin.jar /app/hadoop/hive-0.13.1/lib

clip_image066

2.2.6 配置/etc/profile環境變量

使用如下命令打開/etc/profile文件:

sudo vi /etc/profile

clip_image068

設置如下參數:

export HIVE_HOME=/app/hadoop/hive-0.13.1

export PATH=$PATH:$HIVE_HOME/bin

export CLASSPATH=$CLASSPATH:$HIVE_HOME/bin

clip_image070

使配置文件生效:

source /etc/profile

clip_image072

2.2.7 設置hive-env.sh配置文件

進入hive-0.13.1/conf目錄,復制hive-env.sh.templaetehive-env.sh

cd /app/hadoop/hive-0.13.1/conf

cp hive-env.sh.template hive-env.sh

ls

clip_image074

使用如下命令邊界配置文件

sudo vi hive-env.sh

分別設置HADOOP_HOMEHIVE_CONF_DIR兩個值:

# Set HADOOP_HOME to point to a specific hadoop install directory

export HADOOP_HOME=/app/hadoop/hadoop-2.2.0

 

# Hive Configuration Directory can be controlled by:

export HIVE_CONF_DIR=/app/hadoop/hive-0.13.1/conf

clip_image076

2.2.8 設置hive-site.xml配置文件

復制hive-default.xml.templaetehive-site.xml

cp hive-default.xml.template hive-site.xml

sudo vi hive-site.xml

clip_image078

(1)加入配置項

默認metastore在本地,添加配置改為非本地

<property>

  <name>hive.metastore.local</name>

  <value>false</value>

</property>

clip_image080

(2)修改配置項

hive默認為derby數據庫,derby數據只運行單個用戶進行連接,這里需要調整為mysql數據庫

<property>

  <name>hive.metastore.uris</name>

  <value>thrift://hadoop1:9083</value>

  <description>Thrift URI for the remote metastore. ...</description>

</property>

<property>

  <name>javax.jdo.option.ConnectionURL</name>

  <value>jdbc:mysql://hadoop1: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>hive</value>

  <description>username to use against metastore database</description>

</property>

<property>

  <name>javax.jdo.option.ConnectionPassword</name>

  <value>hive</value>

  <description>password to use against metastore database</description>

</property>

clip_image082

clip_image084

hive.metastore.schema.verification配置項值修改為false

<property>

  <name>hive.metastore.schema.verification</name>

  <value>false</value>

   <desc....>

</property>

clip_image086

2.3 啟動並驗證Hive

2.3.1 啟動Hive

實際使用時,一般通過后台啟動metastorehiveserver實現服務,命令如下:

hive --service metastore &

hive --service hiveserver &

clip_image088

啟動用通過jps命令可以看到兩個進行運行在后台

clip_image090

2.3.2 Hive中操作

登錄hive,在hive創建表並查看該表,命令如下:

hive

hive>create table test(a string, b int);

hive>show tables;

hive>desc test;

clip_image092

登錄mysql,在TBLS表中查看新增test表:

mysql -uhive -phive

mysql>use hive;

mysql>select TBL_ID, CREATE_TIME, DB_ID, OWNER, TBL_NAME,TBL_TYPE from TBLS;

clip_image094

3問題解決

3.1 設置MySql數據庫root用戶密碼報錯

CentOS6.5下安裝mysql設置root密碼時,出現如下錯誤:

clip_image042[1]

/usr/bin/mysqladmin: connect to server at 'localhost' failed

error: 'Access denied for user 'root'@'localhost' (using password: NO)'

(1)停止mysql服務

使用如下命令停止mysql服務:

sudo service mysql stop

sudo service mysql status

clip_image044[1]

(2)跳過驗證啟動mysql

使用如下命令驗證啟動mysql,由於&結尾是后台運行進程,運行該命令可以再打開命令窗口或者Ctr+C繼續進行下步操作:

mysqld_safe --skip-grant-tables &

sudo service mysql status

clip_image046[1]

(3)跳過驗證啟動MySQL

驗證mysql服務已經在后台運行后,執行如下語句,其中后面三條命令是在mysql語句:

mysql -u root

mysql>use mysql;

mysql>update user set password = password('root') where user = 'root';

mysql>flush privileges;

clip_image048[1]

(4)跳過驗證啟動MySQL

重啟mysql服務並查看狀態

sudo service mysql stop

sudo service mysql start

sudo service mysql status

clip_image050[1]

3.2 Hive啟動,報CommandNeedRetryException異常

啟動Hive時,出現CommandNeedRetryException異常,具體信息如下:

clip_image096

Exception in thread "main" java.lang.NoClassDefFoundError:org/apache/hadoop/hive/ql/CommandNeedRetryException

        at java.lang.Class.forName0(Native Method)

        at java.lang.Class.forName(Class.java:270)

        at org.apache.hadoop.util.RunJar.main(RunJar.java:149)

Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hive.ql.CommandNeedRetryException

        at java.net.URLClassLoader$1.run(URLClassLoader.java:366)

        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)

        at java.security.AccessController.doPrivileged(Native Method)

        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)

        at java.lang.ClassLoader.loadClass(ClassLoader.java:425)

        at java.lang.ClassLoader.loadClass(ClassLoader.java:358)

由於以前使用hadoop時,修改hadoop-env.shHADOOP_CLASSPATH配置項,由以前的:

export HADOOP_CLASSPATH=/usr/local/hadoop-1.1.2/myclass

修改為:

export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/usr/local/hadoop-1.1.2/myclass

clip_image098

 

clip_image100

3.3 Hive中使用操作語言

啟動Hive后,使用HSQL出現異常,需要啟動metastorehiveserver

clip_image102

FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.metastore.HiveMetaStoreClient

在使用hive之前需要啟動metastorehiveserver服務,通過如下命令啟用:

hive --service metastore &

hive --service hiveserver &

clip_image104

啟動用通過jps命令可以看到兩個進行運行在后台

clip_image106

 

參考資料:

(1)Hive體系結構》 http://blog.csdn.net/zhoudaxia/article/details/8855937

(2)《大數據時代的技術hivehive的數據類型和數據模型》http://www.cnblogs.com/sharpxiajun/archive/2013/06/03/3114560.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM