HIVE簡介

HIVE簡介

    從這篇開始介紹Hive的一些列的技術點。java

1、概述

一、MapReduce的問題

    1.只能用Java開發,對於不會Java甚至不會編程的人員來講,這是一個門檻,例如:數據倉庫開發工程師。node

    2.須要對Hadoop的底層及API比較瞭解才能開發複雜而高效的代碼,例如:shuffle的過程。mysql

    3.開發調試麻煩。linux

    能不能想辦法解決以上問題,最好可以用一種通用的方式開發大數據處理的程序,能夠屏蔽掉底層細節,簡化開發測試。sql

二、HIVE的本質

1.數據庫

    爲線上系統提供實時數據,提供完整的增刪改查的能力,具備完整的事務支持,儘可能的避免數據的冗餘、節省存儲空間和提升處理效率。數據庫

2.數據倉庫

    離線歷史數據的存儲和處理。爲離線的數據分析提供支持,只能一次寫入屢次查詢,不支持行級別的增刪改,不強調事務特性,人爲的製造冗餘來提升數據查詢的效率。apache

3.HIVE

    在Hadoop的基礎上架設了一層SQL操做的接口,使咱們能夠經過類SQL的HQL來操做HIVE。由HIVE將這些HQL語句翻譯成mapreduce來處理海量數據。編程

    HIVE基於HQL來操做海量數據,可不可認爲它是基於Hadoop的數據庫?不能夠!vim

    HIVE並非基於Hadoop的數據庫工具,而是一種基於Hadoop的數據倉庫工具。bash

    HIVE將結構化的數據文件映射爲一張數據庫表,並提供完整的SQL查詢能力。可是隻能一次寫入屢次查詢,不支持行級別的增刪改(Hadoop2.0後能夠追加了),這是受限於底層的HDFS。本質上只是在Hadoop的基礎上加了一層SQL的殼,仍然是一種離線數據分析工具。不支持事務的特性。一般會經過製造冗餘來提升數據的查詢能力。

    HIVE是基於Hadoop的一個數據倉庫工具。

三、優缺點

1.優勢

    1.學習成本低,能夠經過類SQL語句快速實現簡單的MapReduce統計,沒必要開發專門的MapReduce應用,十分適合數據倉庫的統計分析。

    2.提供了一系列的工具,能夠用來進行數據提取轉化加載(ETL),這是一種能夠存儲、查詢和分析存儲在Hadoop中的大規模數據的機制。

    3.Hive定義了簡單的類SQL查詢語言,稱爲HiveQL,它容許熟悉SQL的用戶查詢數據。同時,這個語言也容許熟悉MapReduce開發者的開發自定義的mapper和reducer來處理內建的mapper和reducer沒法完成的複雜的分析工做。

2.缺點

    1.Hive不支持在線事務處理。

    2.不支持行級的插入和更新和刪除。

    3.相對來講速度比較慢。

2、HIVE的安裝配置

一、前提條件

1.JDK

    安裝好JDK而且配置JAVA_HOME環境變量。

2.Hadoop

    須要hadoop的支持,安裝好hadoop並配置HADOOP_HOME環境變量。

    Hadoop的安裝能夠參見:Hadoop僞分佈式模式搭建Hadoop徹底分佈式集羣搭建

二、下載

    從apache官網下載新版本hive,要注意和hadoop版本的匹配。

    這裏我用的版本分別是:Hadoop2.7.1,Hive1.2.0。

三、安裝

    將下載好的hive安裝包上傳到linux中。

    解壓:

tar -zxvf apache-hive-1.2.0-bin.tar.gz

 

四、啓動

    進入hive/bin目錄,直接運行hive命令,便可進入hive提示符。

./hive

    hive不須要任何配置就能夠運行,由於它能夠經過HADOOP_HOME環境變量獲知hadoop的配置信息。

五、安裝衝突

1.問題描述

    在使用hadoop2.5.x環境下,啓動hive發現報錯:

    java.lang.IncompatibleClassChangeError: Found class jline.Terminal, but interface was expected

2.問題分析

    形成這個錯誤的緣由是由於jline.Terminal這個類有錯誤。

    通過檢查發現,在hadoop/share/hadoop/yarn/lib目錄下存在jline-0.9.x.jar。而在hive/lib/目錄下存在jline-2.12.jar。重複的包不兼容形成了此問題。

3.解決方法

    1.複製hive/lib/jline-2.12.jar替換hadoop/share/hadoop/yarn/lib中的jline-0.9.x.jar,重啓hadoop和hive便可。

    2.直接將hadoop升級到更高版本,如2.7.x中已經解決此問題。

六、入門案例

    查看數據庫:

show databases;

    執行後發現默認有一個庫default。

show tables;

    發現沒有任何表,證實不use其餘庫時,默認就是default庫。

create database school;

    發如今hdfs中多出了/user/hive/warehouse/tedu.db目錄

    結論1:hive中的數據庫對應hdfs中/user/hive/warehouse目錄下以.db結尾的目錄。

use school;
create table student (id int,name string);
show tables;
desc student;
show create table student;

    發現正確建立出來了表。

    發如今hdfs中多出了/user/hive/warehouse/tedu.db/sutdent目錄。

    結論2:hive中的表對應hdfs/user/hive/warehouse/[db目錄]中的一個目錄。

load data local inpath '../mydata/student.txt' into table student;

    發現/user/hive/warehouse/tedu.db/sutdent下多出了文件。

select * from student;

    發現查出的數據不正確,緣由是建表時沒有指定分隔符。默認的分隔符是空格。

create table student2 (id int,name string) row format delimited fields terminated by '\t';
load data local inpath '../mydata/student.txt' into table student2;
select * from student2;

    發現正確查詢出了數據。

    結論3:hive中的數據對應當前hive表對應的hdfs目錄中的文件中的數據。

select count(*) from student;

    發現執行了mapreduce做業,最終現實告終果

    結論4:hive會將命令轉換爲mapreduce執行。

use default;
create table teacher(id int,name string);

    發如今hive對應的目錄下多出了tedu.db文件夾,其中包含user文件夾。

    結論5:hive默認的default數據庫直接對應/user/hive/warehouse目錄,在default庫中建立的表直接會在該目錄下建立對應目錄。

3、mysql metastore

    MySQL metastore:元數據庫。

    HIVE中除了保存真正的數據之外,還要額外保存用來描述庫、表、列的數據,稱爲HIVE的元數據。

    這些元數據又存放在何處呢?

    HIVE須要將這些元數據存放在另外的關係型數據庫中。若是不修改配置HIVE默認使用內置的derby數據庫存儲元數據。derby是apache開發的基於java的文件型數據庫。

    能夠檢查以前入門案例執行命令的目錄,會發現其中產生了一個metastore.db的文件,這就是derby產生的用來保存元數據的數據庫文件。derby數據庫僅僅能夠用來進行測試,真正使用時會有不少限制。最明顯的問題是不能支持併發。

    經測試能夠發現,在同一目錄下使用HIVE,沒法同時開啓多個HIVE,不一樣目錄下能夠同時開啓HIVE可是會各自產生metastore.db文件,形成數據沒法共同訪問。因此真正生產環境中咱們是不會使用默認的derby數據庫保存HIVE的元數據的。

    HIVE目前支持derby和mysql兩種數據庫來存儲元數據。

一、更改元數據庫

1.安裝MySQL

    若是以前安裝了MySQL數據庫,能夠正常使用,那麼安裝數據庫的操做就能夠不用進行,若是有問題,能夠參見下面MySQL的相關問題。

1>上傳安裝包

    將rpm包上傳到本身的管理目錄(也能夠是其餘目錄)。

    MySQL有不少版本,這裏使用的是以下這樣的cs架構的數據庫。

    MySQL-server-5.6.29-1.linux_glibc2.5.x86_64.rpm

    MySQL-client-5.6.29-1.linux_glibc2.5.x86_64.rpm

2>檢查安裝

    此處檢查的是沒有安裝過數據庫,而系統自帶的數據庫。

    查看以前是否安裝過mysql,命令以下:

rpm -qa | grep -i mysql

    若是安裝過,執行如下代碼,刪除以前安裝過的mysql:

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

3>增長用戶和用戶組

    增長用戶組mysql:

groupadd mysql

    增長用戶mysql,加入mysql用戶組:

useradd -r -g mysql mysql

4>安裝MySQL

    安裝server:

rpm -ivh MySQL-server-5.6.29-1.linux_glibc2.5.x86_64.rpm

    安裝client:

rpm -ivh MySQL-client-5.6.29-1.linux_glibc2.5.x86_64.rpm

    mysql5.6安裝後所在的目錄:

    Directory Contents of Directory

    /usr/bin Client programs and scripts

    /usr/sbin The mysqld server

    /var/lib/mysql Log files, databases

    /usr/share/info MySQL manual in Info format

    /usr/share/man Unix manual pages

    /usr/include/mysql Include (header) files

    /usr/lib/mysql Libraries

    /usr/share/mysql Miscellaneous support files, including error messages, character set files, sample configuration files, SQL for database installation

    /usr/share/sql-bench Benchmarks

5>修改配置文件

    修改my.cnf,默認在/usr/my.cnf。

vim /usr/my.cnf

    在配置文件[mysql]的位置增長以下內容,替換[mysql],以下內容主要配置MySQL的字符編碼格式:

[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
character_set_server=utf8

6>添加隨機啓動

    將mysqld加入系統服務,並隨機啓動,命令以下:

cp /usr/share/mysql/mysql.server /etc/init.d/mysqld

7>啓動MySQL

    啓動mysqld的命令以下:

service mysqld start

8>修改密碼

    首先獲取mysql安裝時root用戶的隨機密碼:

vim /root/.mysql_secret

    也可以使用cat命令查看:

cat /root/.mysql_secret

    此密碼只能用來修改密碼使用。

    必需要修改root用戶的密碼纔可使用mysql,不然只能鏈接不能操做

mysqladmin -u root -p  password root

9>測試

    鏈接進入mysql,命令以下:

mysql -u root -p

    查看mysql的安裝運行路徑,命令以下:

ps -ef|grep mysql

10>MySQL相關問題

    若是出現沒有權限的問題,在mysql受權(在安裝mysql的機器上執行)

mysql -u root -p

執行下面的語句,進行受權:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;
FLUSH PRIVILEGES;

    *.*:全部庫下的全部表。

    %:任何IP地址或主機均可以鏈接。若是%配置不生效,就配置具體的主機名稱。

2.配置HIVE

1>刪除信息

    配置hive使用mysql保存元數據信息,須要先刪除默認安裝的元數據信息。

hdfs中的目錄結構

    刪除hdfs中的/user/hive:

hadoop fs -rmr /user/hive

    也可使用Eclipse中的視圖模式刪除。

derby的文件

    把使用過HIVE的目錄中,derby數據庫保存元數據的meta_store的文件夾刪掉。

2>配置文件

    複製hive/conf/hive-default.xml.template爲hive-site.xml。

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

    文件名必定要按上述格式進行修改,不然配置不會生效。

    編輯hive-site.xml文件:

vim hive-site.xml

    在<configuration>中進行配置,將標籤中原有的配置信息所有刪除,把如下配置信息填入便可,基本上是jdbc的配置信息:

<!--要使用的數據-->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://hadoop:3306/hive?createDatabaseIfNotExist=true</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
<!--jdbc驅動-->
<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>root</value>
<description>username to use against metastore database</description>
</property>
<!--數據庫密碼-->
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>root</value>
<description>password to use against metastore database</description>
</property>

3.建立元數據庫

    因爲HIVE在MySQL中只支持latin1這種字符編碼格式,因此須要手動建立元數據庫。

    注意此庫必須是latin1,不然會出現奇怪問題!因此推薦手動建立!而且建立庫以前不能有任意的hive操做,不然自動建立出來的庫表將使用mysql默認的字符集,仍然報錯!

    另外一種方法是修改mysql的配置文件,讓mysql默認編碼集就是latin1,這樣hive自動建立的元數據庫就是latin1的了,可是這已修改將會影響整個mysql數據庫,若是mysql中有其餘庫,這種方式並很差。

    進入MySQL數據庫,執行以下語句建立數據庫:

create database hive character set latin1;

4.拷貝jar包

    將mysql的鏈接jar包拷貝到$HIVE_HOME/lib目錄下。

5.啓動測試

    再進入hive命令行,試着建立庫表發現沒有問題。

    測試發現開啓多個鏈接沒有問題。

    鏈接mysql,發現多了一個hive庫。其中保存有hive的元數據。

    HIVE內置了29個表,來記錄HIVE自己的元數據。

    存放重要信息的以下:

    DBS:數據庫的元數據信息。

    TBLS:表信息。

    COLUMNS_V2:表中字段信息。

    SDS:表對應hdfs目錄。

 

下一篇:HIVE中的表以及語法

相關文章
相關標籤/搜索