安装hive之前需先安装jdk1.7、hadoop2.6.0、mysql-5.6.24。
1.配置hive的元数据库,进入mysql,运行如下命令:
create database hive character set latin1;
注意1:字符集必须指定为latin1,否则在启动hive时,会出现以下异常:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Specified key was too long; max key length is 767 bytes
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask
注意2
当运行HIVE的建表语句的字段注释或表注释(comment语法)存在中文时,需要将相应mysql库表的字段存储编码改为utf-8,否则可能会出现以下报错:
FAILED: Error in metadata: MetaException(message:javax.jdo.JDODataStoreException: Put request failed
运行语句如下:
ALTER TABLE columns_v2 CHANGE `COMMENT` `COMMENT` varchar(256) CHARACTER SET utf8 DEFAULT NULL;
ALTER TABLE table_params CHANGE `PARAM_VALUE` `PARAM_VALUE` varchar(4000) CHARACTER SET utf8 DEFAULT NULL;
2.下载并解压apache-hive-1.0.1-bin.tar.gz,修改~/.bashrc,添加如下内容后执行source ~/.bashrc
export HIVE_HOME=/home/hadoop/apps/hive #hive-env会用到,sqoop会用到 export PATH=$HIVE_HOME/bin:$PATH
3.添加mysql的java驱动包到hive的lib目录下,下载mysql的java驱动包mysql-connector-java-5.1.35.tar.gz,解压把里面的mysql-connector-java-5.1.35-bin.jar包复制到hive主目录的lib目录下。
4.配置conf/hive-env.sh,复制hive-env.sh.template,cp hive-env.sh.template hive-env.sh。
4.1.HADOOP_HOME=。如果在环境变量配置了HADOOP_HOME,则推荐使用默认配置,否则推荐使用如下配置。
export HADOOP_HOME=/home/hadoop/apps/hadoop
配置hadoop的安装目录
4.2.HIVE_CONF_DIR=。如果在环境变量配置了HIVE_HOME,则推荐使用如下配置。
export HIVE_CONF_DIR=$HVIE_HOME/conf
配置hive的配置目录。
5.配置conf/hive-site.xml,复制hive-site.xml,cp hive-default.xml.template hive-site.xml。
5.1.hive.exec.scratchdir=/tmp/hive-${user.name}。此目录为hdfs目录。推荐使用如下配置。
<property> <name>hive.exec.scratchdir</name> <value>/hive/tmp/scratchdir</value> <description>Scratch space for Hive jobs</description> </property>
hive搜索job的零时目录。
5.2.hive.metastore.warehouse.dir=/user/hive/warehouse。此目录为hdfs目录。推荐使用如下配置。
<property> <name>hive.metastore.warehouse.dir</name> <value>/hive/warehouse</value> <description>location of default database for the warehouse</description> </property>
默认的hive数据仓库位置。
5.3.javax.jdo.option.ConnectionURL=jdbc:derby:;databaseName=metastore_db;create=true。如果使用mysql作为元数据数据库,推荐使用如下配置。
<property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://master:3306/hive?createDatabaseIfNotExist=true</value> <description>JDBC connect string for a JDBC metastore</description> </property>
5.4.javax.jdo.option.ConnectionDriverName=org.apache.derby.jdbc.EmbeddedDriver。如果使用mysql作为元数据数据库,推荐使用如下配置。
<property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> <description>Driver class name for a JDBC metastore</description> </property>
5.5.javax.jdo.option.ConnectionUserName=APP。如果使用mysql作为元数据数据库,推荐使用如下配置。
<property> <name>javax.jdo.option.ConnectionUserName</name> <value>root</value> <description>username to use against metastore database</description> </property>
5.6.javax.jdo.option.ConnectionPassword=mine。如果使用mysql作为元数据数据库,推荐使用如下配置。
<property> <name>javax.jdo.option.ConnectionPassword</name> <value>123456</value> <description>password to use against metastore database</description> </property>
5.7.hive.metastore.schema.verification=true。此属性比较特殊。先改为false,等第一次启动后改回true。
该属性是检查metastore的版本号,由于第一次启动metastore服务时,mysql作为数据源的hive数据库内没有生成任何表和数据,所以会出现返回的版本号为空的情况。我们可以暂时在hive.metastore.schema.verification里设置成false,在第一次启动自动生成了数据后,那么就可以将这个配置值再改回true,往后也相关无事了。
注意:如果报Relative path in absolute URI,是因为hive-site.xml文件中加了system就解析不出正确的路径了,将hive-site.xml文件中的所有${system:java.io.tmpdir}和${system:user.name}中的"system:"去掉。${java.io.tmpdir}默认是/tmp,包括hive的日志文件也在此目录下(conf/hive-log4j.properties里定义)。
6.启动两项服务进程,
nohup hive --service metastore & #启动hive的metastorm服务进程,将Hive的元数据保存到一台远端服务器上, nohup hive --service hiveserver2 & #启动hive server服务
metastore将Hive的元数据保存到一台远端服务器上,这样就不用每个客户端都维护一个metastore了。
7.启动hdfs和yarn后,执行hive(hive --service cli)命令(要先启动metastore,否则提示需要启动metastore),即进入hive命令模式,首先执行show tables命令(目的是自动在mysql中建表,这样会生成20张表,否则只会生成4张表)。
8.hive-0.12.0-cdh5.1.0.tar.gz出现的一个问题
Unable to instantiate org.apache.hadoop.hive.metastore.HiveMetaStoreClient,产生问题原因如下:
version information not found in metastore(版本信息找不到):
看过网上的解决方案是在配置文件中将hive-site.xml 里面 hive.metastore.schema.verification 的值改为 false后不会出现问题。
根据错误检查了下ObjectStore.java源代码,该异常会在检查metastore的版本号时,如果从metastore数据源中没有返回版本号,则会根据上面所说的schema.verification来确定是否招抛出这个异常:
由于第一次启动metastore服务时,mysql作为数据源的hive数据库内没有生成任何表和数据,所以会出现返回的版本号为空的情况。我们可以暂时在hive.metastore.schema.verification里设置成false,在第一次启动自动生成了数据后,那么就可以将这个配置值再改回true,往后也相关无事了。在我看来,其实是hive在配置远端metastore的一个小bug。
9.Caused by: org.datanucleus.store.rdbms.exceptions.MissingTableException: Required table missing : "`DBS`" in Catalog "" Schema "". DataNucleus requires this table to perform its persistence operations. Either your MetaData is incorrect, or you need to enable "datanucleus.autoCreateTables"。
这是因为hive的mysql元数据信息没有建全,需要mysql数据库,重新建立mysql库,一共有20个表,严格按照如下步骤,先启动metastore、hiveserver2,然后再启动hive,在hive中执行show tables;让hive框架自动生成那些表。