安装hive前提是要先安装hadoop集群,并且hive只需要在NameNode节点集群中安装即可,可以不在DataNode节点的机器上安装。另外还需要说明的是,虽然修改配置文件并不需要你已经把hadoop跑起来,但是本文中用到了hadoop命令,在执行这些命令前你必须确保hadoop是在正常跑着的,而且启动hive的前提也是需要hadoop在正常跑着,所以建议你先将hadoop跑起来在按照本文操作。
1.前提环境
这里需要提前安装好mysql数据库,将mysql数据库作为hive的元数据库。
hive数据仓库的下载地址:hive-2.3.2/
2.Hive的安装和配置
2.1配置环境变量
编辑/etc/profile 文件,添加hive的环境变量
image.png
执行以下命令让配置生效:source /etc/profile
2.2使用mysql作为默认的元数据库
将mysql-connector-java-5.1.32-bin.jar 驱动包上载Hive的lib目录下:/usr/local/hadoop/apache-hive-2.3.2-bin/lib/
用hive/lib/jline-2.12.jar 替换$HADOOP_HOME/share/hadoop/yarm/lib/ ,如果没有替换,运行./bin/hive 命令会出错。
cp jline-2.12.jar /usr/local/hadoop/hadoop-2.8.2/share/hadoop/yarn/lib/
3.配置hive-site.xml文件
3.1新建hive-site.xml(建议使用touch)
在/usr/local/hadoop/apache-hive-2.3.2-bin/conf 目录下新建hive-site.xml,执行下面命令将hive-default.xml.template 复制到hive-site.xml
cp hive-default.xml.template hive-site.xml
3.2使用hadoop新建HDFS目录
因为在hive-site.xml中有这样的配置
hive.metastore.warehouse.dir
/user/hive/warehouse
hive.exec.scratchdir
/tmp/hive
所以要在hadoop集群新建/user/hive/warehouse目录,执行命令
cd $HADOOP_HOME #进入Hadoop主目录
bin/hadoop fs -mkdir -p /user/hive/warehouse #创建目录
bin/hadoop fs -chmod -R 777 /user/hive/warehouse #新建的目录赋予读写权限
bin/hadoop fs -mkdir -p /tmp/hive/#新建/tmp/hive/目录
bin/hadoop fs -chmod -R 777 /tmp/hive #目录赋予读写权限
#用以下命令检查目录是否创建成功
bin/hadoop fs -ls /user/hive
bin/hadoop fs -ls /tmp/hive
3.3修改hive-site.xml数据库相关的配置
将下面的配置信息添加到hive-site.xml文件中:
javax.jdo.option.ConnectionURL
jdbc:mysql://59.68.29.105:3306/hive?createDatabaseIfNotExist=true
JDBC connect string for a JDBC metastore
javax.jdo.option.ConnectionDriverName
com.mysql.jdbc.Driver
Driver class name for a JDBC metastore
javax.jdo.option.ConnectionUserName
//数据库的登录名
root
username to use against metastore database
javax.jdo.option.ConnectionPassword
//数据库的密码
hive
password to use against metastore database
3.4修改hive-site.xml临时目录
1、将hive-site.xml文件中的${system:java.io.tmpdir}替换为hive的临时目录例如:/usr/local/apache-hive-2.3.2-bin/bin/tmp/,该目录如果不存在则要自己手工创建,并且赋予读写权限chmod -R 777 tmp/。
2、将${system:user.name}都替换为root。
image.png
注意:将该配置文件中的所有${system:java.io.tmpdir},${system:user.name} 全部替换掉。
3.修改hive-env.sh文件
同样将hive-env.sh.template 复制到hive-env.sh,添加hadoop的安装目录:
cp hive-env.sh.template hive-env.sh
# Set HADOOP_HOME to point to a specific hadoop install directory
# HADOOP_HOME=${bin}/../../hadoop
HADOOP_HOME=/usr/local/hadoop/hadoop-2.8.2
# Hive Configuration Directory can be controlled by:
# export HIVE_CONF_DIR=
export HIVE_CONF_DIR=/usr/local/apache-hive-2.3.2-bin/conf
# Folder containing extra libraries required for hive compilation/execution can be controlled by:
# export HIVE_AUX_JARS_PATH=
export HIVE_AUX_JARS_PATH=/usr/local/apache-hive-2.3.2-bin/lib
4.启动和测试
4.1.对mysql数据库进行初始化
进入到hive的bin 目录,对数据库进行初始化,执行命令:(默认情况下,Hive元数据保存在内嵌的Derby数据库中,只能允许一个会话连接,只适合简单的测试,在实际生产环境中选择mysql作为元数据存储)
schematool -initSchema -dbType mysql
如果出现以下错误的情况:
image.png
上面的是将hive-default.xml.template 的内容复制到hive-default.xml ,现在解决这个问题的方法是直接新建这个hive-default.xml 这个文件,然后将关于mysql的相关配置复制上去即可。
image.png
4.2启动hive
进入hive的bin目录下执行hive的启动脚本命令:./hive
image.png
如果输入SQL语句出现下面错误
image.png
则执行./hive --service metastore &,出现下面页面则表示启动成功:
image.png
启动mysql之后会出现hive数据库(这里不知道会不会出现hive表,我这里是手动创建的Hive数据库
mysql>create database hive;
grant all on *.* to root@localhost identified by '密码'; 这里的root和密码是和上面的mysql配置是一致的。
flush privileges;
image.png
用数据库客户端查看hive数据库中表;
image.png
创建数据库
create database db_hive_test;
use db_hive_test;
image.png
创建测试表
create table student(id int,name string) row format delimited fields terminated by '\t';
image.png
加载数据到表中
在/home/hadoop 目录下新建student.txt文件,在该文件中写入数据(id,name 按tab键分隔)
image.png
load data local inpath '/home/hadoop/student.txt' into table db_hive_test.student;
image.png
通过UI页面查看创建的数据的位置:
http://59.68.29.105:50070/explorer.html#/user/hive/warehouse/db_hive_test.db
image.png
通过mysql查看创建的表:
select * from TBLS;
image.png
5.Spark SQL整合Hive
5.1新建hive-site.xml文件
在Spark的安装包下的conf下创建一个文件 hive-site.xml,不需要更新到其他的节点,只需要在Master节点有一份hive-site.xml就可以了。
javax.jdo.option.ConnectionURL
jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true
JDBC connect string for a JDBC metastore
javax.jdo.option.ConnectionDriverName
com.mysql.jdbc.Driver
Driver class name for a JDBC metastore
javax.jdo.option.ConnectionUserName
root
username to use against metastore database
javax.jdo.option.ConnectionPassword
NewThread506/
password to use against metastore database
hive.metastore.schema.verification
false
//使用Hive的MetaStore,因此需要在Spark中添加其uris
hive.metastore.uris
thrift://master:9083
Thrift URI for remote metastore.Used by metastore client to connect to remote metastore
5.2开启Hive的MetaStore服务
在使用Spark SQL CLI之前需要启动Hive的MetaStore。如果数据存放在HDFS文件系统中,还需要启动Hadoop的HDFS服务。使用下面命令可启动hive的MetaStore并在后台运行。
nohup hive --service metastore > metastore.log 2>&1 &
5.3启动spark-shell
启动spark-shell之前,先spark集群start-all.sh 。
import org.apache.spark.sql.hive.HiveContext
val hc = new HiveContext(sc)
hc.sql("show databases").show
image.png
hc.sql("use db_hive_test")
hc.sql("select * from student").show
image.png
6.参考资料