Hive官網上介紹了Hive的3種安裝方式,分別對應不一樣的應用場景。java
一、內嵌模式(元數據保村在內嵌的derby種,容許一個會話連接,嘗試多個會話連接時會報錯)node
二、本地模式(本地安裝mysql 替代derby存儲元數據)mysql
三、遠程模式(遠程安裝mysql 替代derby存儲元數據)sql
首先,Hive是依賴於hadoop系統的,所以在運行Hive以前須要保證已經搭建好hadoop集羣環境。數據庫
本文中使用的hadoop版本爲2.5.1,Hive版本爲1.2.1版。apache
OS:Linux Centos 6.5 64位vim
jdk:java version "1.7.0_79"bash
假設已經下載了Hive的安裝包,且安裝到了/home/install/hive-1.2.1
在~/.bash_profile中設定HIVE_HOME環境變量:session
export HIVE_HOME=/home/install/hive-1.2.1
這種安裝模式的元數據是內嵌在Derby數據庫中的,只能容許一個會話鏈接,數據會存放到HDFS上。ide
一、切換到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
二、啓動hive,因爲已經將HIVE_HOME加入到了環境變量中,因此這裏直接在命令行敲hive便可:
而後咱們看到在hadoop的HDFS上已經建立了對應的目錄。
注意,只要上面2步便可完成內嵌模式的安裝和啓動,不要多此一舉。。。。。。好比下面
================================【下面這段就不要看了】==============================================
(做廢)二、提供一個hive的基礎配置文件,執行以下代碼,就是將conf目錄下自帶的文件修改成配置文件:
cp hive-default.xml.template hive-site.xml
(做廢)三、啓動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
(做廢)四、從新啓動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數據庫已經正確安裝。
一、首先登陸MySQL,建立一個數據庫,這裏命名爲hive,數據庫名是能夠隨意定義的。
建立hive用戶,並賦予全部的權限:
CREATE USER 'hive'@'localhost' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON *.* TO hive IDENTIFIED BY '123456' WITH GRANT OPTION;
二、將MySQL的JDBC驅動包拷貝到hive的安裝目錄中,驅動包自行查找下載。
cp mysql-connector-java-5.1.32-bin.jar /home/install/hive-1.2.1/lib/
三、將HIVE_HOME/conf下的hive-default.xml.template拷貝一份:
cp hive-default.xml.template hive-site.xml
四、修改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>
五、配置hive的log4j配置文件。
cp hive-log4j.properties.template hive-log4j.properties
六、將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
七、啓動hive,界面以下:
這種模式須要使用hive安裝目錄下提供的beeline+hiveserver2配合使用才能夠。
其原理就是將metadata做爲一個單獨的服務進行啓動。各類客戶端經過beeline來鏈接,鏈接以前無需知道數據庫的密碼。
一、首先執行hiveserver2命令:
./hiveserver2 start
啓動後命令行會一直監聽不退出,咱們能夠看到它監聽了10000端口。
二、新開一個命令行窗口,執行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
從新鏈接:成功了。