一、安裝模式介紹:
Hive官網上介紹了Hive的3種安裝方式,分別對應不同的應用場景。
1、內嵌模式(元數據保村在內嵌的derby種,允許一個會話鏈接,嘗試多個會話鏈接時會報錯)
2、本地模式(本地安裝mysql 替代derby存儲元數據)
3、遠程模式(遠程安裝mysql 替代derby存儲元數據)
二、安裝環境以及前提說明:
首先,Hive是依賴於hadoop系統的,因此在運行Hive之前需要保證已經搭建好hadoop集群環境。
本文中使用的hadoop版本為2.5.1,Hive版本為1.2.1版。
OS:Linux Centos 6.5 64位
jdk:java version "1.7.0_79"
假設已經下載了Hive的安裝包,且安裝到了/home/install/hive-1.2.1
在~/.bash_profile中設定HIVE_HOME環境變量:
export HIVE_HOME=/home/install/hive-1.2.1
三、內嵌模式安裝:
這種安裝模式的元數據是內嵌在Derby數據庫中的,只能允許一個會話連接,數據會存放到HDFS上。
1、切換到HIVE_HOME/conf目錄下,執行下面的命令:
cp hive-env.sh.template hive-env.sh vim hive-env.sh
在hive-env.sh中添加以下內容:
HADOOP_HOME=/home/install/hadoop-2.5.1
2、啟動hive,由於已經將HIVE_HOME加入到了環境變量中,所以這里直接在命令行敲hive即可:
然后我們看到在hadoop的HDFS上已經創建了對應的目錄。
注意,只要上面2步即可完成內嵌模式的安裝和啟動,不要畫蛇添足。。。。。。比如下面
================================【下面這段就不要看了】==============================================
(作廢)2、提供一個hive的基礎配置文件,執行如下代碼,就是將conf目錄下自帶的文件修改為配置文件:
cp hive-default.xml.template hive-site.xml
(作廢)3、啟動hive,由於已經將HIVE_HOME加入到了環境變量中,所以這里直接在命令行敲hive即可:
(作廢)結果報錯了,看錯誤日志中提到system:java.io.tmpdir,這個配置項在hive-site.xml中有提到。
(作廢)我們創建一個臨時目錄/opt/tem/hive-1.2.1/iotemp,並修改hive-site.xml中的system:java.io.tmpdir的值:
mkdir -p /opt/tem/hive-1.2.1/iotemp vim hive-site.xml
(作廢)在vim編輯界面輸入如下命令完成替換:
:%s@\${system:java.io.tmpdir}@/opt/tem/hive-1.2.1/iotemp@g
(作廢)4、重新啟動hive:
(作廢)報了這樣一個錯誤:java.lang.IncompatibleClassChangeError: Found class jline.Terminal, but interface was expected。
(作廢)查詢資料說,hadoop目錄下存在老版本jline,替換掉就行了。復制后注意刪除原來版本的jar包。
cp /home/install/hive-1.2.1/lib/jline-2.12.jar /home/install/hadoop-2.5.1/share/hadoop/yarn/lib/
rm -rf /home/install/hadoop-2.5.1/share/hadoop/yarn/lib/jline-0.9.94.jar
(作廢)再次重新啟動,OK了。
四、本地模式安裝:
這種安裝方式和嵌入式的區別在於,不再使用內嵌的Derby作為元數據的存儲介質,而是使用其他數據庫比如MySQL來存儲元數據。
這種方式是一個多用戶的模式,運行多個用戶client連接到一個數據庫中。這種方式一般作為公司內部同時使用Hive。
這里有一個前提,每一個用戶必須要有對MySQL的訪問權利,即每一個客戶端使用者需要知道MySQL的用戶名和密碼才行。
下面開始正式搭建,這里要求hadoop系統已經正常啟動,且MySQL數據庫已經正確安裝。
1、首先登錄MySQL,創建一個數據庫,這里命名為hive,數據庫名是可以隨意定義的。
創建hive用戶,並賦予所有的權限:
CREATE USER 'hive'@'localhost' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON *.* TO hive IDENTIFIED BY '123456' WITH GRANT OPTION;
2、將MySQL的JDBC驅動包拷貝到hive的安裝目錄中,驅動包自行查找下載。
cp mysql-connector-java-5.1.32-bin.jar /home/install/hive-1.2.1/lib/
3、將HIVE_HOME/conf下的hive-default.xml.template拷貝一份:
cp hive-default.xml.template hive-site.xml
4、修改hive-site.xml文件:
該配置文件有3300多行,選擇其中的幾個選項進行修改即可。
A、修改javax.jdo.option.ConnectionURL屬性。
<property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://localhost/hive?createDatabaseIfNotExist=true</value> <description>JDBC connect string for a JDBC metastore</description> </property>
B、修改javax.jdo.option.ConnectionDriverName屬性。
<property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> <description>Driver class name for a JDBC metastore</description> </property>
C、修改javax.jdo.option.ConnectionUserName屬性。即數據庫用戶名。
<property> <name>javax.jdo.option.ConnectionUserName</name> <value>hive</value> <description>Username to use against metastore database</description> </property>
D、修改javax.jdo.option.ConnectionPassword屬性。即數據庫密碼。
<property> <name>javax.jdo.option.ConnectionPassword</name> <value>123456</value> <description>password to use against metastore database</description> </property>
E、添加如下屬性hive.metastore.local:
<property> <name>hive.metastore.local</name> <value>true</value> <description>controls whether to connect to remove metastore server or open a new metastore server in Hive Client JVM</description> </property>
F、修改hive.server2.logging.operation.log.location屬性,因為默認的配置里沒有指定具體的路徑。
<property> <name>hive.server2.logging.operation.log.location</name> <value>/tmp/hive/operation_logs</value> <description>Top level directory where operation logs are stored if logging functionality is enabled</descripti on> </property>
G、修改hive.exec.local.scratchdir屬性。
<property> <name>hive.exec.local.scratchdir</name> <value>/tmp/hive</value> <description>Local scratch space for Hive jobs</description> </property>
H、修改hive.downloaded.resources.dir屬性。
<property> <name>hive.downloaded.resources.dir</name> <value>/tmp/hive/resources</value> <description>Temporary local directory for added resources in the remote file system.</description> </property>
I、修改屬性hive.querylog.location屬性。
<property> <name>hive.querylog.location</name> <value>/tmp/hive/querylog</value> <description>Location of Hive run time structured log file</description> </property>
5、配置hive的log4j配置文件。
cp hive-log4j.properties.template hive-log4j.properties
6、將hive下的jline-2.12.jar替換掉hadoop自帶的包,不然會報錯。
cp /home/install/hive-1.2.1/lib/jline-2.12.jar /home/install/hadoop-2.5.1/share/hadoop/yarn/lib/
rm -rf /home/install/hadoop-2.5.1/share/hadoop/yarn/lib/jline-0.9.94.jar
7、啟動hive,界面如下:

五、遠程模式安裝,即server模式。
這種模式需要使用hive安裝目錄下提供的beeline+hiveserver2配合使用才可以。
其原理就是將metadata作為一個單獨的服務進行啟動。各種客戶端通過beeline來連接,連接之前無需知道數據庫的密碼。
1、首先執行hiveserver2命令:
./hiveserver2 start
啟動后命令行會一直監聽不退出,我們可以看到它監聽了10000端口。
2、新開一個命令行窗口,執行beeline命令:
[root@node5 bin]# beeline
Beeline version 1.2.1 by Apache Hive
beeline> !connect jdbc:hive2://node5:10000
Connecting to jdbc:hive2://node5:10000
Enter username for jdbc:hive2://node5:10000: hive
Enter password for jdbc:hive2://node5:10000: ******
報錯了,錯誤日志如下:
Error: Failed to open new session: java.lang.RuntimeException: java.lang.RuntimeException: org.apache.hadoop.security.AccessControlException: Permission denied: user=hive, access=EXECUTE, inode="/tmp":root:supergroup:drwx------
at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkFsPermission(FSPermissionChecker.java:271)
at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:257)
at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkTraverse(FSPermissionChecker.java:208)
at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:171)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkPermission(FSNamesystem.java:5904)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getFileInfo(FSNamesystem.java:3691)
at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.getFileInfo(NameNodeRpcServer.java:803)
at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.getFileInfo(ClientNamenodeProtocolServerSideTranslatorPB.java:779)
at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java)
at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:585)
at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:928)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2013)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2009)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:415)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1614)
at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2007) (state=,code=0)
0: jdbc:hive2://node5:10000 (closed)>
說是hive用戶對HDFS上的/tmp權限不夠。
這里直接把HDFS的權限設置為最大。
hadoop fs -chmod 777 /tmp
重新連接:成功了。