本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,博主為石山園,博客地址為 http://www.cnblogs.com/shishanyuan 。該系列課程是應邀實驗樓整理編寫的,這里需要贊一下實驗樓提供了學習的新方式,可以邊看博客邊上機實驗,課程地址為 https://www.shiyanlou.com/courses/237
【注】該系列所使用到安裝包、測試數據和代碼均可在百度網盤下載,具體地址為 http://pan.baidu.com/s/10PnDs,下載該PDF文件
1、搭建環境
部署節點操作系統為CentOS,防火牆和SElinux禁用,創建了一個shiyanlou用戶並在系統根目錄下創建/app目錄,用於存放Hadoop等組件運行包。因為該目錄用於安裝hadoop等組件程序,用戶對shiyanlou必須賦予rwx權限(一般做法是root用戶在根目錄下創建/app目錄,並修改該目錄擁有者為shiyanlou(chown –R shiyanlou:shiyanlou /app)。
Hadoop搭建環境:
l 虛擬機操作系統: CentOS6.6 64位,單核,1G內存
l JDK:1.7.0_55 64位
l Hadoop:1.1.2
2、Hive介紹
Hive是Facebook開發的構建於Hadoop集群之上的數據倉庫應用,它提供了類似於SQL語法的HQL語句作為數據訪問接口,這使得普通分析人員的應用Hadoop的學習曲線變小,Hive有如下特性:
lHive是基於Hadoop的一個數據倉庫工具,可以將結構化的數據文件映射為一張數據庫表,並使用sql語句轉換為MapReduce任務進行運行。其優點是學習成本低,可以通過類SQL語句快速實現簡單的MapReduce統計,不必開發專門的MapReduce應用,十分適合數據倉庫的統計分析;
lHive是建立在 Hadoop 上的數據倉庫基礎構架。它提供了一系列的工具,可以用來進行數據提取轉化加載(ETL),這是一種可以存儲、查詢和分析存儲在 Hadoop 中的大規模數據的機制。Hive 定義了簡單的類 SQL 查詢語言,稱為 HQL,它允許熟悉 SQL 的用戶查詢數據。同時,這個語言也允許熟悉 MapReduce 開發者的開發自定義的 Mapper 和 Reducer 來處理內建的Mapper 和Reducer 無法完成的復雜的分析工作。
2.1 Hive與關系數據庫的區別
使用Hive的命令行接口很像操作關系數據庫,但是Hive和關系數據庫還是有很大的不同, Hive與關系數據庫的區別具體如下:
1. Hive和關系數據庫存儲文件的系統不同,Hive使用的是Hadoop的HDFS(Hadoop的分布式文件系統),關系數據庫則是服務器本地的文件系統;
2. Hive使用的計算模型是Mapreduce,而關系數據庫則是自身的計算模型;
3.關系數據庫都是為實時查詢的業務進行設計的,而Hive則是為海量數據做數據挖掘設計的,實時性很差;實時性的區別導致Hive的應用場景和關系數據庫有很大的不同;
4. Hive很容易擴展自己的存儲能力和計算能力,這個是繼承Hadoop的,而關系數據庫在這個方面要比數據庫差很多。
2.2 Hive架構
由上圖可知,Hadoop的mapreduce是Hive架構的根基。Hive架構包括如下組件:CLI(command line interface)、JDBC/ODBC、Thrift Server、WEB GUI、metastore和Driver(Complier、Optimizer和Executor),這些組件分為兩大類:服務端組件和客戶端組件。
服務端組件:
lDriver組件:該組件包括Complier、Optimizer和Executor,它的作用是將HiveQL(類SQL)語句進行解析、編譯優化,生成執行計划,然后調用底層的mapreduce計算框架;
lMetastore組件:元數據服務組件,這個組件存儲Hive的元數據,Hive的元數據存儲在關系數據庫里,Hive支持的關系數據庫有derby和mysql。元數據對於Hive十分重要,因此Hive支持把metastore服務獨立出來,安裝到遠程的服務器集群里,從而解耦Hive服務和metastore服務,保證Hive運行的健壯性;
lThrift服務:thrift是facebook開發的一個軟件框架,它用來進行可擴展且跨語言的服務的開發,Hive集成了該服務,能讓不同的編程語言調用hive的接口。
客戶端組件:
lCLI:command line interface,命令行接口。
lThrift客戶端:上面的架構圖里沒有寫上Thrift客戶端,但是Hive架構的許多客戶端接口是建立在thrift客戶端之上,包括JDBC和ODBC接口。
lWEBGUI:Hive客戶端提供了一種通過網頁的方式訪問hive所提供的服務。這個接口對應Hive的hwi組件(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目錄中找到這些安裝包:
操作系統為64位,選擇對應安裝包進行下載:
下載在本地目錄如下圖:
3.1.2 安裝mysql
使用命令查看是否已經安裝過mysql:
sudo rpm -qa | grep -i mysql
可以看到如下圖的所示:
說明之前安裝了mysql,可以參考4.1進行卸載舊的mysql。如果以前沒有安裝mysql則進入安裝文件的目錄,安裝mysql服務端
cd /home/shiyanlou/install-pack
sudo rpm -ivh MySQL-server-5.6.21-1.el6.x86_64.rpm
出現異常,通過分析缺少libaio依賴包,使用如下命令進行安裝:
sudo yum install libaio
再次安裝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
3.1.3 啟動mysql服務
通過下面查看mysql服務狀態:
sudo service mysql status
如果mysql沒有啟動,通過如下命令進行啟動:
sudo service mysql start
3.1.4 設置root密碼
在CentOS6.5操作系統使用如下命令給mysql設置root密碼時,出現如下錯誤:
/usr/bin/mysqladmin -u root password 'root';
/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
(3) 跳過驗證啟動MySQL
驗證mysql服務已經在后台運行后,執行如下語句,其中后面三條命令是在mysql語句:
mysql -u root
mysql>use mysql;
mysql>update user set password = password('root') where user = 'root';
mysql>flush privileges;
(4) 跳過驗證啟動MySQL
重啟mysql服務並查看狀態
sudo service mysql restart
sudo service mysql status
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;
(注意:如果是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;
3.2 安裝Hive
3.2.1 解壓並移動Hive安裝包
可以到Apache基金hive官網http://hive.apache.org/downloads.html,選擇鏡像下載地址:http://mirrors.cnnic.cn/apache/hive/下載一個穩定版本,如下圖所示:
也可以在/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
3.2.2 解壓並移動MySql驅動包
到mysql官網進入下載頁面:http://dev.mysql.com/downloads/connector/j/ ,選擇所需要的版本進行下載,這里下載的zip格式的文件
也可以在/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
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
使配置文件生效:
source /etc/profile
echo $PATH
3.2.4 設置hive-env.sh配置文件
進入hive-0.12.0/conf目錄,復制hive-env.sh.templaete為hive-env.sh:
cd /app/hive-0.12.0/conf
cp hive-env.sh.template hive-env.sh
sudo vi hive-env.sh
分別設置HADOOP_HOME和HIVE_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
3.2.5 設置hive-site.xml配置文件
復制hive-default.xml.templaete為hive-site.xml
cd /app/hive-0.12.0/conf
cp hive-default.xml.template hive-site.xml
sudo vi hive-site.xml
(1) 加入配置項
默認metastore在本地,添加配置改為非本地
<property>
<name>hive.metastore.local</name>
<value>false</value>
</property>
(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>
(3) 訂正錯誤項
在配置文件2000行左右配置項hive.server2.thrift.sasl.qop原來為<value>auth</auth>,按照如下進行修改:
<property>
<name>hive.server2.thrift.sasl.qop</name>
<value>auth</value>
<des.....
</property>
並把hive.metastore.schema.verification配置項值修改為false
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
<desc....>
</property>
3.3 驗證部署
3.3.1 啟動metastore和hiveserver
在使用hive之前需要啟動metastore和hiveserver服務,通過如下命令啟用:
hive --service metastore &
hive --service hiveserver &
啟動用通過jps命令可以看到兩個進行運行在后台
3.3.2 在hive中操作
登錄hive,在hive創建表並查看該表,命令如下:
hive
hive>create table test(a string, b int);
hive>show tables;
hive>desc test;
登錄mysql,在TBLS表中查看新增test表:
mysql -uhive -phive
mysql>use hive;
mysql>select TBL_ID, CREATE_TIME, DB_ID, OWNER, TBL_NAME,TBL_TYPE from TBLS;
4、問題解決
4.1 卸載舊的mysql
(1) 查找以前是否安裝有mysql
使用命令查看是否已經安裝過mysql:
sudo rpm -qa | grep -i mysql
可以看到如下圖的所示:
說明之前安裝了:
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
如果存在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
刪除對應的mysql目錄
sudo rm -rf /usr/lib64/mysql
sudo rm -rf /var/lib/mysql
(4) 再次查找機器是否安裝mysql
sudo rpm -qa | grep -i mysql
無結果,說明已經卸載徹底、接下來直接安裝mysql即可
4.2 Hive啟動,報CommandNeedRetryException異常
啟動hive時,出現CommandNeedRetryException異常,具體信息如下:
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.sh的HADOOP_CLASSPATH配置項,由以前的:
export HADOOP_CLASSPATH=/app/hadoop-1.1.2/myclass
修改為:
export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/app/hadoop-1.1.2/myclass
4.3 在Hive中使用操作語言
啟動hive后,使用Hql出現異常,需要啟動metastore和hiveserver
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之前需要啟動metastore和hiveserver服務,通過如下命令啟用:
hive --service metastore &
hive --service hiveserver &
啟動用通過jps命令可以看到兩個進行運行在后台