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

1、安裝模式介紹:

    Hive官網上介紹了Hive的3種安裝方式,分別對應不一樣的應用場景。java

    一、內嵌模式(元數據保村在內嵌的derby種,容許一個會話連接,嘗試多個會話連接時會報錯)node

    二、本地模式(本地安裝mysql 替代derby存儲元數據)mysql

    三、遠程模式(遠程安裝mysql 替代derby存儲元數據)sql


2、安裝環境以及前提說明:

    首先,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

3、內嵌模式安裝:

這種安裝模式的元數據是內嵌在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便可:

image

而後咱們看到在hadoop的HDFS上已經建立了對應的目錄。

image

注意,只要上面2步便可完成內嵌模式的安裝和啓動,不要多此一舉。。。。。。好比下面

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

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

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

做廢)三、啓動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

做廢)四、從新啓動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


4、本地模式安裝:

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

這種方式是一個多用戶的模式,運行多個用戶client鏈接到一個數據庫中。這種方式通常做爲公司內部同時使用Hive。

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

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

一、首先登陸MySQL,建立一個數據庫,這裏命名爲hive,數據庫名是能夠隨意定義的。

image

建立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,界面以下:

image


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

這種模式須要使用hive安裝目錄下提供的beeline+hiveserver2配合使用才能夠。

其原理就是將metadata做爲一個單獨的服務進行啓動。各類客戶端經過beeline來鏈接,鏈接以前無需知道數據庫的密碼。

一、首先執行hiveserver2命令:

./hiveserver2 start

啓動後命令行會一直監聽不退出,咱們能夠看到它監聽了10000端口。

image

二、新開一個命令行窗口,執行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

相關文章
相關標籤/搜索