Hive1.2.2的安装和配置
Hadoop环境搭建笔记整理(四)——Hive1.2.2的安装和配置
一、是什么和做什么
1.什么是Hive?
一个数据仓库工具
Hive 的数据存储在 HDFS 中,大部分的查询由 MapReduce 完成
不可更改和添加数据
Hive 并非为联机事务处理而设计,Hive 并不提供实时的查询和基于行级的数据更新操作。Hive 的最佳使用场合是大数据集的批处理作业
上述的描述是从官方的角度。在学习过程中,对hadoop和hive关系的理解就是hadoop作为一个基本平台包含一些基本功能,hive取其中一个部分,数据从平台传入经过hdfs,由hadoop自带的mapreduce功能调用数据,使得数据进入hive得到处理。
2.在伪分布式集群搭好,mysql环境运行不出问题的基础上安装hive
二、安装过程
1.在mysql端配置hive
a.进入mysql命令行,创建hive用户并赋予所有权限:
mysql -uroot -proot
mysql>set password=password('root');
mysql>create user 'hive' identified by 'hive';
mysql>grant all on *.* TO 'hive'@'%' identified by 'hive' with grant option;
mysql>grant all on *.* TO 'hive'@'localhost' identified by 'hive' with grant option;
mysql>flush privileges;
b.使用hive用户登录,创建hive数据库:
mysql -uhive -phive -h hadoop
mysql>create database hive;
mysql>show databases;
c.解压mysql驱动包(先行解压过hive包之后的操作)
解压该安装包并把该安装包复制到/hive-x.x.x/lib目录中
例如:cp mysql-connector-java-5.1.22-bin.jar /app/hive-1.2.2/lib
2.安装hive
a.下载地址
b.配置文件
(1)使用如下命令打开/etc/profile文件:
sudo vi /etc/profile
设置如下参数:
export HIVE_HOME=/.../hive-1.2.2
export PATH=$PATH:$HIVE_HOME/bin
export CLASSPATH=$CLASSPATH:$HIVE_HOME/bin
使配置文件生效:
source /etc/profile
echo $PATH
(2)
设置hive-env.sh配置文件进入hive-1.2.2/conf目录,复制hive-env.sh.templaete为hive-env.sh:
cd /.../hive-1.2.2/conf
cp hive-env.sh.template hive-env.sh
sudo vi hive-env.sh
分别设置HADOOP_HOME和HIVE_CONF_DIR两个值:
# Set HADOOP_HOME to point to a specific hadoop install directory
export HADOOP_HOME=/.../hadoop-1.2.2
# Hive Configuration Directory can be controlled by:
export HIVE_CONF_DIR=/.../hive-1.2.2/conf
(3)设置hive-site.xml配置文件
复制hive-default.xml.templaete为hive-site.xml
cd /.../hive-1.2.2/conf
cp hive-default.xml.template hive-site.xml
sudo vi hive-site.xml
(4)修改 hive-site.xml
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/.../hive-1.2.2/warehouse</value>
</property>
<property>
<name>hive.exec.scratchdir</name>
<value>/.../hive-1.2.2/scratchdir</value>
</property>
<property>
<name>hive.querylog.location</name>
<value>/.../hive-1.2.2/logs</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>
jdbc:mysql://localhost:3306/hivedb?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>*****(根据自己的用户名填)</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>*****(根据自己的密码填)</value>
</property>
(5)hive默认为derby数据库,需要把相关信息调整为mysql数据库
<property>
<name>hive.metastore.uris</name>
<value>thrift://hadoop:9083</value>(注意修改)
<description>Thrift URI for the remote metastore. ...</description>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://hadoop:3306/hive?=createDatabaseIfNotExist=true</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive(根据自己设置的hive用户名填写)</value>
<description>username to use against metastore database</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>hive(根据自己设置的hive密码填写)</value>
<description>password to use against metastore database</description>
</property>
(由于hive版本不同可能会有个别配置文件的修改有不一样的地方)
c.验证
配置好Hive后,输入hive命令启动时会出现许多INFO和WARN信息。
只要不报错就没什么问题,原因是新的hadoop环境废弃了某些参数。但是可以修改,网上教程我会贴在后面。
d.启动
在使用hive之前需要启动metastore和hiveserver服务,通过如下命令启用:
hive --service metastore &
hive --service hiveserver2 &(版本在centos6.8-6.9请执行hive --service hiveserver)
启动用通过jps命令可以看到两个进行运行在后台
e.操作验证
登录hive,在hive创建表并查看该表,命令如下:
hive
hive>create table test(a string, b int);
hive>show tables;
hive>desc test;
登录mysql,在TBLS表中查看新增test表:
mysql -uhive -phive
mysql>use hive;
mysql>select TBL_ID, CREATE_TIME, DB_ID, OWNER, TBL_NAME,TBL_TYPE from TBLS;
三、注意事项和bug
a.执行hive命令出现INFO和WARN
$HADOOP_HOME/etc/hadoop/log4j.properties中将log4j.logger.org.apache.hadoop.conf.Configuration.deprecation打开。如下:
1. # Uncomment the following line to turn off configuration deprecation warnings.
2. log4j.logger.org.apache.hadoop.conf.Configuration.deprecation=WARN
无需重启Hadoop,只需要重新启动hive就会发现这些INFO都不见了。但是WARN还是会在。
Warn的解决方法: 加入配置项
(1)创建配置文件,直接copy默认配置文件再修改即可,用户自定义配置会覆盖默认配置
cp
$HIVE_HOME/conf/hive-default.xml.template $HIVE_HOME/conf/hive-site.xml
cp
$HIVE_HOME/conf/hive-env.sh.template $HIVE_HOME/conf/hive-env.sh
cp
$HIVE_HOME/conf/hive-exec-log4j.properties.template $HIVE_HOME/conf/hive-exec-log4j.properties
cp
$HIVE_HOME/conf/hive-log4j.properties.template
$HIVE_HOME/conf/hive-log4j.properties
(2)修改 hive-log4j.properties
mkdir $HIVE_HOME/logs
vi
$HIVE_HOME/conf/hive-log4j.properties
hive.log.dir=/opt/hive-1.2.1/logs
b.在hive启动时遇到如下错误
[grid@Hadoop4 hadoop-2.7.2]$ hive
which: no HBase in(/home/grid/hadoop-2.7.2/bin:/usr/jdk1.8.0_91/bin:/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/grid/bin:/usr/local/apache-maven-3.3.9/bin:/home/grid/apache-ant-1.9.7/bin:/home/grid/apache-maven-3.3.9/bin:/home/grid/pig-0.16.0/bin:/home/grid/apache-hive-2.1.0-bin/bin)
SLF4J: Class path contains multiple SLF4Jbindings.
SLF4J: Found binding in[jar:file:/home/grid/apache-hive-2.1.0-bin/lib/log4j-slf4j-impl-2.4.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in[jar:file:/home/grid/hadoop-2.7.2/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: SeeSLF4J Error Codes for an explanation.
SLF4J: Actual binding is of type[org.apache.logging.slf4j.Log4jLoggerFactory]
Logging initialized using configuration injar:file:/home/grid/apache-hive-2.1.0-bin/lib/hive-common-2.1.0.jar!/hive-log4j2.propertiesAsync: true
Exception in thread "main" Java.lang.IllegalArgumentException:java.net.URISyntaxException:
Relative path in absolute
URI:${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D
解决方法:
在hive-site.xml中添加
<property>
<name>system:java.io.tmpdir</name>
<value>/home/grid/apache-hive-2.1.0-bin/tmpdir</value>
</property>
<property>
<name>system:user.name</name>
<value>hive</value>
</property>
c.执行 hive --service hiveserver 命令报错
Exception in thread "main"
java.lang.ClassNotFoundException: org.apache.hadoop.hive.service.HiveServer
at
java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at
java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at
java.security.AccessController.doPrivileged(Native Method)
at
java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at
java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at
java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at
java.lang.Class.forName0(Native Method)
at
java.lang.Class.forName(Class.java:274)
at
org.apache.hadoop.util.RunJar.main(RunJar.java:205)
解决办法: hive --service hiveserver2 使用hiveserver2
(我说过我们使用的环境是centos7,网上会有其他版本的资料,这个问题的主因是语句更新的问题)
d.use hive报错
如图
查自己数据库的表格,输入正确的名字
e.启动hive时,出现CommandNeedRetryException异常
Exception in thread "main" java.lang.NoClassDefFoundError:org/apache/hadoop/hive/ql/CommandNeedRetryException
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:270)
at org.apache.hadoop.util.RunJar.main(RunJar.java:149)
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hive.ql.CommandNeedRetryException
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
由于以前使用hadoop时,修改hadoop-env.sh的HADOOP_CLASSPATH配置项,由以前的:
export HADOOP_CLASSPATH=/app/hadoop-x.x.x/myclass
修改为:
export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/app/hadoop-x.x.x/myclass
五、思考
hive在具体实践当中是什么角色?