Hive僞分佈模式安裝

1、安裝和配置
可以通過下載壓縮包來安裝一個穩定版的Hive,也可以下載源碼進行編譯。
1.1 運行HiveServer2和Beeline
1.2要求
java1.7+,官網推薦1.8
Hadoop2.x
1.3安裝Hive的穩定版
解壓縮,並重命名
tar -zxvf hive-2.1.0-bin.tar.gz
mv apache-hive-2.1.0-bin hive-2.1.0
在/etc/profile或者~/.bashrc中設置HIVE_HOME變量的值,使其指向Hive的安裝目錄:
export HIVE_HOME=/opt/hive/hive-2.1.0
export PATH=$PATH:$HIVE_HOME/bin:$HIVE_HOME/conf
使配置立即生效:
source /etc/profile
修改Hive配置文檔(不修改則使用默認文檔),兩種安裝方式使用Derby數據庫、使用其他數據庫(如mysql):
使用Derby數據庫的安裝方式
Apache Derby是一個完全用java編寫的數據庫,所以可以跨平臺,但需要在JVM中運行數據庫,即將元數據存儲在Derby數據庫中,存儲瞭如表的模式和分區信息等元數據信息
是Hive默認的安裝方式
創建hive-env.sh文件
cp hive-env.sh.template hive-env.sh
在hive-env.sh中添加:
# Set HADOOP_HOME to point to a specific hadoop install directory
export HADOOP_HOME=/opt/hadoop/hadoop-2.7.2
# Hive Configuration Directory can be controlled by
export HIVE_CONF_DIR=/opt/hive/hive-2.1.0/conf
創建hive-site.xml
cd /opt/hive/hive-2.1.0/conf
cp hive-default.xml.template hive-site.xml
配置 hive-site.xml文件:
參數hive-metastore.warehourse.dir指定存儲Hive表中數據的存儲目錄指定的是HDFS上的位置,默認值爲/user/hive/warehouse(好像沒有這個參數,我自己加的)
參數hive.exec.scratchdir指定Hive的數據臨時文件目錄,默認位置爲/tmp/hive-${user.name}。這裏配置爲/tmp/hive
連接數據庫配置說明:
參數javax.jdo.option.ConnectionURL
jdbc:derby:;databaseName=metastore_db;create=true
參數javax.jdo.option.ConnectionDriverName指定驅動的類入口名稱:org.apache.derby.jdbc.EmbeddedDriver
參數javax.jdo.option.ConnectionUserName指定數據庫的用戶名:APP
參數javax.jdo.option.ConnectionPassword指定數據庫的密碼:mime
Derby數據庫驅動在目錄$HIVE_HOME/lib/下,derby-10.10.2.0.jar
<property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:derby:;databaseName=metastore_db;create=true</value>
    <description>
     告訴hive如何連接metastore server,默認情況下使用當前目錄作爲屬性值字符串中的databaseName部分,這樣會造成用戶每當切換工作目錄下時,Derby就會忘記在前一個目錄下的元數據存儲信息!我們可以使用databaseName=/opt/hive/hive-2.1.0/metastore_db作爲絕對路徑,即metastore_db目錄所在路徑,這樣設置可以解決每次開啓一個新的hive會話時,Hive自動刪除工作目錄下的metastore_db目錄的問題。現在我們不管在哪個目錄下工作都可以訪問到所有的元數據。
    </description>
  </property>
<property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>org.apache.derby.jdbc.EmbeddedDriver</value>
    <description>Driver class name for a JDBC metastore</description>
  </property>
<property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>APP</value>
    <description>Username to use against metastore database</description>
  </property>
<property>
  <name>javax.jdo.option.ConnectionPassword</name>
  <value>mine</value>
  <description>password to use against metastore database</description>
</property>
啓動Hive
命令行鍵入hive
顯示出錯:
Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: org.apache.hadoop.hive.ql.metadata.HiveException: MetaException(message:Hive metastore database is not initialized. Please use schematool (e.g. ./schematool -initSchema -dbType ...) to create the schema. If needed, don't forget to include the option to auto-create the underlying database in your JDBC connection string (e.g. ?createDatabaseIfNotExist=true for mysql))
根據錯誤提示,應該是metastore數據庫沒有初始化的原因造成的。
按照提示執行命令“schematool -initSchema -dbType derby”對metastore進行初始化。
但此時可能仍會報錯誤:Error: FUNCTION ‘NUCLEUS_ASCII’ already exists. (state=X0Y68,code=30000)
這是因爲之前已經生成了metastore_db文件夾。需要將當前工作目錄下的metastore_db文件夾刪除,rm -r metastore_db
然後重新運行“schematool -initSchema -dbType derby”命令。
之後執行hive,又出現錯:
java.lang.IllegalArgumentException:java.net.URISyntaxException: Relative path in absolute URI:${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D
解決方法:
在hive安裝目錄下創建臨時io的tmp文件夾:
mkdir iotmp
然後,將這個iotmp的絕對路徑替換hive-site.xml文件中的${system:java.io.tmpdir}
再執行hive,啓動成功!
在Hive建表之前,(在默認配置文檔下)創建 /tmp 和/user/hive/warehouse文件目錄,並在HDFS中設置它們chmod g+w這一步可以不要,會自動新建
$ $HADOOP_HOME/bin/hadoop fs -mkdir /tmp/hive
$ $HADOOP_HOME/bin/hadoop fs -mkdir /user/hive/warehouse
$ $HADOOP_HOME/bin/hadoop fs -chmod g+w /tmp/hive
$ $HADOOP_HOME/bin/hadoop fs -chmod g+w /user/hive/warehouse
測試:
建立測試表test:create table test (key string);
show tables;
使用mysql數據庫的安裝方式
使用mysql數據庫存儲元數據,存儲瞭如表的模式和分區信息等元數據信息
ubuntu採用sudo apt-get install mysql-server安裝
建立數據庫hive :
create database hive
創建hive用戶,並授權:
grant all on hive.* to hive@'%' identified by 'hive';第一個hive是數據庫,第二個是用戶名,第三個是密碼。
強制寫入:flush privileges;
創建hive-env.sh文件
cp hive-env.sh.template hive-env.sh
在hive-env.sh中添加:
# Set HADOOP_HOME to point to a specific hadoop install directory
export HADOOP_HOME=/opt/hadoop/hadoop-2.7.2
# Hive Configuration Directory can be controlled by
export HIVE_CONF_DIR=/opt/hive/hive-2.1.0/conf
創建hive-site.xml
cd /opt/hive/hive-2.1.0/conf
cp hive-default.xml.template hive-site.xml
配置 hive-site.xml文件:
參數hive-metastore.warehourse.dir指定Hive的數據存儲目錄指定的是HDFS上的位置,默認值爲/user/hive/warehouse(好像沒有這個參數,我自己加的)
參數hive.exec.scratchdir指定Hive的數據臨時文件目錄,默認位置爲/tmp/hive-${user.name}。這裏配置爲/tmp/hive
修改hive-site.xml
<property> 
   <name>javax.jdo.option.ConnectionURL </name> 
   <value>jdbc:mysql://localhost:3306/hive</value> 
</property> 
 
<property> 
   <name>javax.jdo.option.ConnectionDriverName </name> 
   <value>com.mysql.jdbc.Driver </value> 
</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><span style="color:#ff0000;">hive</span></value>
  <description>password to use against metastore database</description>
 </property>
<property> 
   <name>hive.hwi.listen.port </name> 
   <value>9999 </value> 
   <description>This is the port the Hive Web Interface will listen on </descript ion> 
</property> 
<property> 
   <name>datanucleus.autoCreateSchema </name> 
   <value>false </value> 
</property> 
 
<property> 
   <name>datanucleus.fixedDatastore </name> 
   <value>true </value> 
</property> 
<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>
運行hive
發生錯誤:
Caused by: MetaException(message:Hive metastore database is not initialized. Please use schematool (e.g. ./schematool -initSchema -dbType ...) to create the schema. If needed, don't forget to include the option to auto-create the underlying database in your JDBC connection string (e.g. ?createDatabaseIfNotExist=true for mysql))
然後我執行$HIVE_HOME/bin/schematool -initSchema -dbTypederby
又出錯:
Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"APP"."NUCLEUS_ASCII"(C CHAR(1)) RETURNS INTEGER LANGUAGE JAVA PARAMETER STYLE ' at line 1 (state=42000,code=1064)
我才發現,原來在初始化時用了derby,這裏應該是mysql
所以就執行$HIVE_HOME/bin/schematool -initSchema -dbType mysql
執行hive,成功!
1.4遇到的問題:
(1)Hive metastore database is not initialized.
解決方法:按照提示執行命令“schematool -initSchema -dbType derby”對metastore進行初始化。但此時可能仍會報錯誤:Error: FUNCTION ‘NUCLEUS_ASCII’ already exists. (state=X0Y68,code=30000) 。這是因爲之前已經生成了metastore_db文件夾。需要將當前工作目錄下的metastore_db文件夾刪除,然後重新運行“schematool -initSchema -dbType derby”命令。
之後hive就可以以本地內嵌derby數據庫爲metastore正常啓動了。
(2)Caused by: org.datanucleus.store.rdbms.connectionpool.DatastoreDriverNotFoundException: The specified datastore driver("com.mysql.jdbc.Driver") was not foundin the CLASSPATH.
沒有 mysql-connector-java-*.*.*.tar.gz
下載mysql-connector-java-5.1.39.tar.gz
解壓縮後將mysql-connector-java-5.1.39-bin.jar放到$HIVE_HOME/lib。
發佈了71 篇原創文章 · 獲贊 322 · 訪問量 55萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章