從這篇開始介紹Hive的一些列的技術點。java
1.只能用Java開發,對於不會Java甚至不會編程的人員來講,這是一個門檻,例如:數據倉庫開發工程師。node
2.須要對Hadoop的底層及API比較瞭解才能開發複雜而高效的代碼,例如:shuffle的過程。mysql
3.開發調試麻煩。linux
能不能想辦法解決以上問題,最好可以用一種通用的方式開發大數據處理的程序,能夠屏蔽掉底層細節,簡化開發測試。sql
爲線上系統提供實時數據,提供完整的增刪改查的能力,具備完整的事務支持,儘可能的避免數據的冗餘、節省存儲空間和提升處理效率。數據庫
離線歷史數據的存儲和處理。爲離線的數據分析提供支持,只能一次寫入屢次查詢,不支持行級別的增刪改,不強調事務特性,人爲的製造冗餘來提升數據查詢的效率。apache
在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.學習成本低,能夠經過類SQL語句快速實現簡單的MapReduce統計,沒必要開發專門的MapReduce應用,十分適合數據倉庫的統計分析。
2.提供了一系列的工具,能夠用來進行數據提取轉化加載(ETL),這是一種能夠存儲、查詢和分析存儲在Hadoop中的大規模數據的機制。
3.Hive定義了簡單的類SQL查詢語言,稱爲HiveQL,它容許熟悉SQL的用戶查詢數據。同時,這個語言也容許熟悉MapReduce開發者的開發自定義的mapper和reducer來處理內建的mapper和reducer沒法完成的複雜的分析工做。
1.Hive不支持在線事務處理。
2.不支持行級的插入和更新和刪除。
3.相對來講速度比較慢。
安裝好JDK而且配置JAVA_HOME環境變量。
須要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的配置信息。
在使用hadoop2.5.x環境下,啓動hive發現報錯:
java.lang.IncompatibleClassChangeError: Found class jline.Terminal, but interface was expected
形成這個錯誤的緣由是由於jline.Terminal這個類有錯誤。
通過檢查發現,在hadoop/share/hadoop/yarn/lib目錄下存在jline-0.9.x.jar。而在hive/lib/目錄下存在jline-2.12.jar。重複的包不兼容形成了此問題。
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庫中建立的表直接會在該目錄下建立對應目錄。
MySQL metastore:元數據庫。
HIVE中除了保存真正的數據之外,還要額外保存用來描述庫、表、列的數據,稱爲HIVE的元數據。
這些元數據又存放在何處呢?
HIVE須要將這些元數據存放在另外的關係型數據庫中。若是不修改配置HIVE默認使用內置的derby數據庫存儲元數據。derby是apache開發的基於java的文件型數據庫。
能夠檢查以前入門案例執行命令的目錄,會發現其中產生了一個metastore.db的文件,這就是derby產生的用來保存元數據的數據庫文件。derby數據庫僅僅能夠用來進行測試,真正使用時會有不少限制。最明顯的問題是不能支持併發。
經測試能夠發現,在同一目錄下使用HIVE,沒法同時開啓多個HIVE,不一樣目錄下能夠同時開啓HIVE可是會各自產生metastore.db文件,形成數據沒法共同訪問。因此真正生產環境中咱們是不會使用默認的derby數據庫保存HIVE的元數據的。
HIVE目前支持derby和mysql兩種數據庫來存儲元數據。
若是以前安裝了MySQL數據庫,能夠正常使用,那麼安裝數據庫的操做就能夠不用進行,若是有問題,能夠參見下面MySQL的相關問題。
將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
此處檢查的是沒有安裝過數據庫,而系統自帶的數據庫。
查看以前是否安裝過mysql,命令以下:
rpm -qa | grep -i mysql
若是安裝過,執行如下代碼,刪除以前安裝過的mysql:
rpm -ev --nodeps mysql-libs-5.1.71-1.el6.x86_64
增長用戶組mysql:
groupadd mysql
增長用戶mysql,加入mysql用戶組:
useradd -r -g mysql 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
修改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
將mysqld加入系統服務,並隨機啓動,命令以下:
cp /usr/share/mysql/mysql.server /etc/init.d/mysqld
啓動mysqld的命令以下:
service mysqld start
首先獲取mysql安裝時root用戶的隨機密碼:
vim /root/.mysql_secret
也可以使用cat命令查看:
cat /root/.mysql_secret
此密碼只能用來修改密碼使用。
必需要修改root用戶的密碼纔可使用mysql,不然只能鏈接不能操做
mysqladmin -u root -p password root
鏈接進入mysql,命令以下:
mysql -u root -p
查看mysql的安裝運行路徑,命令以下:
ps -ef|grep mysql
若是出現沒有權限的問題,在mysql受權(在安裝mysql的機器上執行)
mysql -u root -p
執行下面的語句,進行受權:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION; FLUSH PRIVILEGES;
*.*:全部庫下的全部表。
%:任何IP地址或主機均可以鏈接。若是%配置不生效,就配置具體的主機名稱。
配置hive使用mysql保存元數據信息,須要先刪除默認安裝的元數據信息。
①hdfs中的目錄結構
刪除hdfs中的/user/hive:
hadoop fs -rmr /user/hive
也可使用Eclipse中的視圖模式刪除。
②derby的文件
把使用過HIVE的目錄中,derby數據庫保存元數據的meta_store的文件夾刪掉。
複製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>
因爲HIVE在MySQL中只支持latin1這種字符編碼格式,因此須要手動建立元數據庫。
注意此庫必須是latin1,不然會出現奇怪問題!因此推薦手動建立!而且建立庫以前不能有任意的hive操做,不然自動建立出來的庫表將使用mysql默認的字符集,仍然報錯!
另外一種方法是修改mysql的配置文件,讓mysql默認編碼集就是latin1,這樣hive自動建立的元數據庫就是latin1的了,可是這已修改將會影響整個mysql數據庫,若是mysql中有其餘庫,這種方式並很差。
進入MySQL數據庫,執行以下語句建立數據庫:
create database hive character set latin1;
將mysql的鏈接jar包拷貝到$HIVE_HOME/lib目錄下。
再進入hive命令行,試着建立庫表發現沒有問題。
測試發現開啓多個鏈接沒有問題。
鏈接mysql,發現多了一個hive庫。其中保存有hive的元數據。
HIVE內置了29個表,來記錄HIVE自己的元數據。
存放重要信息的以下:
DBS:數據庫的元數據信息。
TBLS:表信息。
COLUMNS_V2:表中字段信息。
SDS:表對應hdfs目錄。
下一篇:HIVE中的表以及語法