Hadoop入門進階課程8--Hive介紹和安裝部署

本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,博主爲石山園,博客地址爲 http://www.cnblogs.com/shishanyuan  。該系列課程是應邀實驗樓整理編寫的,這裏須要贊一下實驗樓提供了學習的新方式,能夠邊看博客邊上機實驗,課程地址爲 https://www.shiyanlou.com/courses/237html

【注】該系列所使用到安裝包、測試數據和代碼都可在百度網盤下載,具體地址爲 http://pan.baidu.com/s/10PnDs,下載該PDF文件java

1搭建環境

部署節點操做系統爲CentOS,防火牆和SElinux禁用,建立了一個shiyanlou用戶並在系統根目錄下建立/app目錄,用於存放Hadoop等組件運行包。由於該目錄用於安裝hadoop等組件程序,用戶對shiyanlou必須賦予rwx權限(通常作法是root用戶在根目錄下建立/app目錄,並修改該目錄擁有者爲shiyanlou(chown R shiyanlou:shiyanlou /app)。node

Hadoop搭建環境:mysql

l  虛擬機操做系統: CentOS6.6  64位,單核,1G內存linux

l  JDK1.7.0_55 64web

l  Hadoop1.1.2sql

2Hive介紹

HiveFacebook開發的構建於Hadoop集羣之上的數據倉庫應用,它提供了相似於SQL語法的HQL語句做爲數據訪問接口,這使得普通分析人員的應用Hadoop的學習曲線變小,Hive有以下特性:數據庫

lHive是基於Hadoop的一個數據倉庫工具,能夠將結構化的數據文件映射爲一張數據庫表,並使用sql語句轉換爲MapReduce任務進行運行。其優勢是學習成本低,能夠經過類SQL語句快速實現簡單的MapReduce統計,沒必要開發專門的MapReduce應用,十分適合數據倉庫的統計分析;apache

lHive是創建在 Hadoop 上的數據倉庫基礎構架。它提供了一系列的工具,能夠用來進行數據提取轉化加載(ETL),這是一種能夠存儲、查詢和分析存儲在 Hadoop 中的大規模數據的機制。Hive 定義了簡單的類 SQL 查詢語言,稱爲 HQL,它容許熟悉 SQL 的用戶查詢數據。同時,這個語言也容許熟悉 MapReduce 開發者的開發自定義的 Mapper Reducer 來處理內建的Mapper Reducer 沒法完成的複雜的分析工做。編程

2.1 Hive與關係數據庫的區別

使用Hive的命令行接口很像操做關係數據庫,可是Hive和關係數據庫仍是有很大的不一樣, Hive與關係數據庫的區別具體以下:

1. Hive和關係數據庫存儲文件的系統不一樣,Hive使用的是HadoopHDFSHadoop的分佈式文件系統),關係數據庫則是服務器本地的文件系統;

2. Hive使用的計算模型是Mapreduce,而關係數據庫則是自身的計算模型;

3.關係數據庫都是爲實時查詢的業務進行設計的,而Hive則是爲海量數據作數據挖掘設計的,實時性不好;實時性的區別致使Hive的應用場景和關係數據庫有很大的不一樣;

4. Hive很容易擴展本身的存儲能力和計算能力,這個是繼承Hadoop的,而關係數據庫在這個方面要比數據庫差不少。

2.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服務。

 

3搭建Hive環境

3.1 安裝MySql數據庫

3.1.1 下載mysql安裝文件

下載地址:http://dev.mysql.com/downloads/mysql/#downloads,使用系統爲CentOS選擇 Red Hat Enterprise Linux/Oracle系列,也能夠在/home/shiyanlou/install-pack目錄中找到這些安裝包:

clip_image004

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

clip_image006

clip_image008

clip_image010

下載在本地目錄以下圖:

clip_image012

3.1.2 安裝mysql

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

sudo rpm -qa | grep -i mysql

能夠看到以下圖的所示:

clip_image014

說明以前安裝了mysql,能夠參考4.1進行卸載舊的mysql。若是之前沒有安裝mysql則進入安裝文件的目錄,安裝mysql服務端

cd /home/shiyanlou/install-pack

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

clip_image016

出現異常,經過分析缺乏libaio依賴包,使用以下命令進行安裝:

sudo yum install libaio

clip_image018

再次安裝mysql,並安裝mysql客戶端、mysql-devel

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

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_image020

3.1.3 啓動mysql服務

經過下面查看mysql服務狀態:

sudo service mysql status

若是mysql沒有啓動,經過以下命令進行啓動:

sudo service mysql start

clip_image022

3.1.4 設置root密碼

CentOS6.5操做系統使用以下命令給mysql設置root密碼時,出現以下錯誤:

/usr/bin/mysqladmin -u root password 'root';

clip_image024

/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

(2) 跳過驗證啓動mysql

使用以下命令驗證啓動mysql,因爲&結尾是後臺運行進程,運行該命令能夠再打開命令窗口或者Ctr+C繼續進行下步操做:

sudo mysqld_safe --skip-grant-tables &

sudo service mysql status

clip_image026

(3) 跳過驗證啓動MySQL

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

mysql -u root

mysql>use mysql;

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

mysql>flush privileges;

clip_image028

(4) 跳過驗證啓動MySQL

重啓mysql服務並查看狀態

sudo service mysql restart

sudo service mysql status

clip_image030

3.1.5 設置Hive用戶

進入mysql命令行,建立hive用戶並賦予全部權限:

mysql -uroot -proot

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

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

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

mysql>grant all on *.* TO 'hive'@'localhost' identified by 'hive' with grant option;

mysql>flush privileges;

clip_image032

(注意:若是是root第一次登陸數據庫,須要從新設置一下密碼,所報異常信息以下:ERROR 1820 (HY000): You must SET PASSWORD before executing this statement

3.1.6 建立hive數據庫

使用hive用戶登陸,建立hive數據庫:

mysql -uhive -phive -h hadoop

mysql>create database hive;

mysql>show databases;

clip_image034

3.2 安裝Hive

3.2.1 解壓並移動Hive安裝包

能夠到Apache基金hive官網http://hive.apache.org/downloads.html,選擇鏡像下載地址:http://mirrors.cnnic.cn/apache/hive/下載一個穩定版本,以下圖所示:

clip_image036

也能夠在/home/shiyanlou/install-pack目錄中找到該安裝包,解壓該安裝包並把該安裝包複製到/app目錄中

cd /home/shiyanlou/install-pack

tar -xzf hive-0.12.0-bin.tar.gz

mv hive-0.12.0-bin /app/hive-0.12.0

clip_image038

3.2.2 解壓並移動MySql驅動包

mysql官網進入下載頁面:http://dev.mysql.com/downloads/connector/j/ ,選擇所須要的版本進行下載,這裏下載的zip格式的文件

clip_image040

 

也能夠在/home/shiyanlou/install-pack目錄中找到該安裝包,解壓該安裝包並把該安裝包複製到/app/lib目錄中

cd /home/shiyanlou/install-pack

cp mysql-connector-java-5.1.22-bin.jar /app/hive-0.12.0/lib

clip_image042

3.2.3 配置/etc/profile環境變量

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

sudo vi /etc/profile

設置以下參數:

export HIVE_HOME=/app/hive-0.12.0

export PATH=$PATH:$HIVE_HOME/bin

export CLASSPATH=$CLASSPATH:$HIVE_HOME/bin

clip_image044

使配置文件生效:

source /etc/profile

echo $PATH

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

進入hive-0.12.0/conf目錄,複製hive-env.sh.templaetehive-env.sh

cd /app/hive-0.12.0/conf

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

sudo vi hive-env.sh

clip_image046

分別設置HADOOP_HOMEHIVE_CONF_DIR兩個值:

# Set HADOOP_HOME to point to a specific hadoop install directory

export HADOOP_HOME=/app/hadoop-1.1.2

# Hive Configuration Directory can be controlled by:

export HIVE_CONF_DIR=/app/hive-0.12.0/conf

clip_image048

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

複製hive-default.xml.templaetehive-site.xml

cd /app/hive-0.12.0/conf

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

sudo vi hive-site.xml

clip_image050

(1) 加入配置項

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

<property>

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

  <value>false</value>

</property>

clip_image052

(2) 修改配置項

hive默認爲derby數據庫,須要把相關信息調整爲mysql數據庫

<property>

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

  <value>thrift://hadoop:9083</value>

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

</property>

<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>

<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_image054

clip_image056

(3) 訂正錯誤項

在配置文件2000行左右配置項hive.server2.thrift.sasl.qop原來爲<value>auth</auth>,按照以下進行修改:

<property>

  <name>hive.server2.thrift.sasl.qop</name>

  <value>auth</value>

  <des.....

</property>

clip_image058

並把hive.metastore.schema.verification配置項值修改成false

<property>

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

  <value>false</value>

   <desc....>

</property>

clip_image060

3.3 驗證部署

3.3.1 啓動metastorehiveserver

在使用hive以前須要啓動metastorehiveserver服務,經過以下命令啓用:

hive --service metastore &

hive --service hiveserver &

clip_image062

啓動用經過jps命令能夠看到兩個進行運行在後臺

clip_image064

3.3.2 hive中操做

登陸hive,在hive建立表並查看該表,命令以下:

hive

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

hive>show tables;

hive>desc test;

clip_image066

登陸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_image068

4問題解決

4.1 卸載舊的mysql

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

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

sudo rpm -qa | grep -i mysql

能夠看到以下圖的所示:

clip_image014[1]

說明以前安裝了:

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

若是沒有結果,能夠進行跳到3.1.3步驟的mysql數據庫安裝

(2)  中止mysql服務、刪除以前安裝的mysql

中止mysql服務、刪除以前安裝的mysql刪除命令:rpm -ev 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_image070

若是存在CentOS自帶mysql-libs-5.6.21-1.el6.x86_64使用下面的命令卸載便可

sudo rpm -ev --nodeps mysql-libs-5.6.21-1.el6.x86_64

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

sudo find / -name mysql

clip_image072

刪除對應的mysql目錄

sudo rm -rf /usr/lib64/mysql

sudo rm -rf /var/lib/mysql

clip_image074

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

sudo rpm -qa | grep -i mysql

無結果,說明已經卸載完全、接下來直接安裝mysql便可

clip_image076

4.2 Hive啓動,報CommandNeedRetryException異常

啓動hive時,出現CommandNeedRetryException異常,具體信息以下:

clip_image078

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=/app/hadoop-1.1.2/myclass

修改成:

export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/app/hadoop-1.1.2/myclass

clip_image080

 

clip_image082

4.3 Hive中使用操做語言

啓動hive後,使用Hql出現異常,須要啓動metastorehiveserver

clip_image084

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_image086

啓動用經過jps命令能夠看到兩個進行運行在後臺

clip_image064[1]

相關文章
相關標籤/搜索