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
javax.jdo.option.ConnectionURL
jdbc:derby:;databaseName=metastore_db;create=true
告诉hive如何连接metastore server,默认情况下使用当前目录作为属性值字符串中的databaseName部分,这样会造成用户每当切换工作目录下时,Derby就会忘记在前一个目录下的元数据存储信息!我们可以使用databaseName=/opt/hive/hive-2.1.0/metastore_db作为绝对路径,即metastore_db目录所在路径,这样设置可以解决每次开启一个新的hive会话时,Hive自动删除工作目录下的metastore_db目录的问题。现在我们不管在哪个目录下工作都可以访问到所有的元数据。
javax.jdo.option.ConnectionDriverName
org.apache.derby.jdbc.EmbeddedDriver
Driver class name for a JDBC metastore
javax.jdo.option.ConnectionUserName
APP
Username to use against metastore database
javax.jdo.option.ConnectionPassword
mine
password to use against metastore database
启动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
javax.jdo.option.ConnectionURL
jdbc:mysql://localhost:3306/hive
javax.jdo.option.ConnectionDriverName
com.mysql.jdbc.Driver
javax.jdo.option.ConnectionUserName
hive
username to use against metastore database
javax.jdo.option.ConnectionPassword
hive
password to use against metastore database
hive.hwi.listen.port
9999
This is the port the Hive Web Interface will listen on
datanucleus.autoCreateSchema
false
datanucleus.fixedDatastore
true
hive.metastore.local
true
controls whether to connect to remove metastore server or open a new metastore server in Hive Client JVM
运行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。