Hive的三種安裝方式(內嵌模式,本地模式遠程模式)


一、安裝模式介紹:

    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即可:

image

然后我們看到在hadoop的HDFS上已經創建了對應的目錄。

image

注意,只要上面2步即可完成內嵌模式的安裝和啟動,不要畫蛇添足。。。。。。比如下面

================================【下面這段就不要看了】==============================================

作廢)2、提供一個hive的基礎配置文件,執行如下代碼,就是將conf目錄下自帶的文件修改為配置文件:

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

作廢)3、啟動hive,由於已經將HIVE_HOME加入到了環境變量中,所以這里直接在命令行敲hive即可:

image

作廢)結果報錯了,看錯誤日志中提到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:

image

作廢)報了這樣一個錯誤: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了。

image


四、本地模式安裝:

這種安裝方式和嵌入式的區別在於,不再使用內嵌的Derby作為元數據的存儲介質,而是使用其他數據庫比如MySQL來存儲元數據。

這種方式是一個多用戶的模式,運行多個用戶client連接到一個數據庫中。這種方式一般作為公司內部同時使用Hive。

這里有一個前提,每一個用戶必須要有對MySQL的訪問權利,即每一個客戶端使用者需要知道MySQL的用戶名和密碼才行。

下面開始正式搭建,這里要求hadoop系統已經正常啟動,且MySQL數據庫已經正確安裝。

1、首先登錄MySQL,創建一個數據庫,這里命名為hive,數據庫名是可以隨意定義的。

image

創建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,界面如下:

image


五、遠程模式安裝,即server模式。

這種模式需要使用hive安裝目錄下提供的beeline+hiveserver2配合使用才可以。

其原理就是將metadata作為一個單獨的服務進行啟動。各種客戶端通過beeline來連接,連接之前無需知道數據庫的密碼。

1、首先執行hiveserver2命令:

./hiveserver2 start

啟動后命令行會一直監聽不退出,我們可以看到它監聽了10000端口。

image

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

重新連接:成功了。

image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM