1、安裝和配置 可以通過下載壓縮包來安裝一個穩定版的Hive,也可以下載源碼進行編譯。
1.1 運行HiveServer2和Beeline 1.2要求 java1.7+,官網推薦1.8 Hadoop2.x
1.3安裝Hive的穩定版 下載當前穩定版 http://mirrors.cnnic.cn/apache/hive/hive-2.1.0/。 解壓縮,並重新命名 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 -dbType
derby 又出錯: Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to us e 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 http://cdn.mysql.com//Downloads/Connector-J/mysql-connector-java-5.1.39.tar.gz 解壓縮後將mysql-connector-java-5.1.39-bin.jar放到$HIVE_HOME/lib。