在虚拟机或Docker中搭建大数据伪分布式集群(三):添加Hive
系列文章:
在虚拟机或Docker中搭建大数据伪分布式集群系列(一):hadoop基础功能——hdfs 与 yarn
在虚拟机或Docker中搭建大数据伪分布式集群(二):集群添加zookeeper与HBase
目录
在虚拟机或Docker中搭建大数据伪分布式集群(三):添加Hive
前面一路从hadoop、zookeeper、HBase等集群搭建而来,大数据生态环境已经初步形成,接下来搭建大数据生态中很重要的Hive。
注意先安装mysql 数据库,并开启远程连接权限。请参考:
这里我直接启用docker生成mysql容器
# 拉取并查看镜像
docker pull mysql:latest
docker images
# 运行容器
docker run -itd --name mysql-hive -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
# -p 3306:3306 将宿主机的3306映射到容器的3306端口,外部主机可以直接通过 宿主机ip:3306 访问到 MySQL 的服务。
# MYSQL_ROOT_PASSWORD=123456:设置 MySQL 服务 root 用户的密码
这里我就直接使用 root 用户了,如果使用其他用户,记得在 hive-site.xml 中的 javax.jdo.option.ConnectionDriverName 参数配置中使用 该用户名
注意:生产上不会直接使用MySQL的 root 用户,一般会创建一个普通用户,并且授权(最小授权原则:用什么才给什么,无授权即禁止)
# 进入容器或服务器中,开启mysql客户端,并在客户端中执行
mysql> CREATE USER 'hive'@'%' IDENTIFIED BY '123456';
mysql> GRANT ALL PRIVILEGES ON hivedb.* TO 'hive'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;
一、Hive 安装与配置
1、Hive 安装
Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的 SQL 查询功能,将类 SQL 语句转换为 MapReduce 任务执行。因为只是映射和转换工具,并不需要考虑多集群模式,所以Hive只需在一个节点(最好是master)上安装即可。
软件:
apache-hive-3.1.2-bin.tar.gz (可直接从国内的清华大学等镜像网站下载,地址:清华大学开源软件镜像站 | Tsinghua Open Source Mirror)
mysql-connector-java-8.0.22.jar (可从maven中央仓库https://mvnrepository.com/或阿里仓库仓库服务下载,最好是8.x版本)
上传解压改名
# 虚拟机使用rz,docker 使用docker cp
docker cp /Volumes/Linux/apache-hive-3.1.2-bin.tar.gz hadoop-master:/opt/
docker cp /Volumes/Linux/mysql-connector-java-8.0.22.jar hadoop-master:/opt/
进入虚拟机或容器后,解压改名
tar -xzvf apache-hive-3.1.2-bin.tar.gz
mv apache-hive-3.1.2-bin hive
配置环境变量
vi /etc/profile
在文件尾部添加配置
export HIVE_HOME=/opt/hive
export PATH=$HIVE_HOME/bin:$PATH
退出保存,再使配置生效
source /etc/profile
# 有hive的版本显现,安装成功!
hive --version
注意:需要把mysql的驱动包copy到hive的安装目录下的 $HIVE_HOME/lib 中
mv mysql-connector-java-8.0.22.jar $HIVE_HOME/lib/
2、修改配置
进入安装目录的 conf/
目录下,拷贝配置样本并进行修改
(1)hive-env.sh文件
cd $HIVE_HOME/conf
cp hive-env.sh.template hive-env.sh
vi hive-env.sh
# 在文件尾部添加
source /etc/profile
export JAVA_HOME=$JAVA_HOME
export HADOOP_HOME=$HADOOP_HOME
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HIVE_HOME=$HIVE_HOME
export HIVE_CONF_DIR=$HIVE_HOME/conf
export HIVE_AUX_JARS_PATH=$HIVE_HOME/lib
# 保存退出
(2)hive-site.xml 文件
cp hive-default.xml.template hive-site.xml
vim hive-site.xml
关于Metastore的三种配置:内嵌配置,本地配置,远程配置。
1. 默认情况下,metastore服务和Hive的服务运行在同一个JVM中,包含了一个内嵌的以本地磁盘作为存储的Derby(Hive自带的数据库)数据库实例。同时,这种配置也被称为内嵌配置。但是这种方式的不好之处就在于每次只有一个内嵌的Derby数据库可以访问某个磁盘上的数据文件,也就是说一次只能为每个metastore打开一个hive会话。如果尝试连接多个,会报错。这样效率很低。
2.如果要支持多会话,或者多用户的话,需要使用一个独立的数据库(比如mysql,比较常用),这种配置方式称为本地metastore配置。虽然这种方式Hvie服务和Metastore服务仍然在一个JVM进程中,但连接的却是另外一个进程中运行的数据库,在同一台机器上或者远程机器上。任何JDBC兼容的数据库都可以通过javax.jdo.option.*配置属性来供metastore使用。
3.还有一种配置时远程metastore配置,这种配置情况下,一个或多个metastore服务器和Hive服务运行在不同的进程中。这样一来,数据库层可以 完全置于防火墙后,客户端则不需要数据库凭证(密码账号),从而提供了更好的可管理性和安全。可以通过hive.metastore.uris设置 为metastore服务器你URI(如果有多个服务器,可以用'逗号'分割),把hive服务设为使用远程metastore.metastore服务器的URI的格式为:thrift://host:port.
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl" ?>
<configuration>
<!-- 记录Hive中的元数据信息 记录在mysql中 -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://192.168.78.1:3306/hive?createDatabaseIfNotExist=true&useSSL=false&serverTimezone=GMT&allowPublicKeyRetrieval=true</value>
</property>
<!-- mysql的驱动 -->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.cj.jdbc.Driver</value>
</property>
<!-- mysql的用户名和密码,请自定义 -->
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
</property>
<!-- 设置hive仓库的HDFS上的位置 -->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/hive/warehouse</value>
</property>
<!-- 添加元数据服务配置 -->
<property>
<name>hive.metastore.local</name>
<value>false</value>
</property>
<!-- 属性为空,则默认为本地模式,否则为远程模式 -->
<property>
<name>hive.metastore.uris</name>
<value>thrift://hadoop-master:9083</value>
<description>IP address (or fully-qualified domain name) and port of the metastore host</description>
</property>
<!-- 元数据 schema 检查 -->
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>
<!-- 显示当前数据库的信息 -->
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>
<!-- 显示查询表的行头信息 -->
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
<!--设置资源临时文件存放位置 -->
<property>
<name>hive.exec.scratchdir</name>
<value>/hive/tmp</value>
</property>
<!--设置查询日志在HDFS上的位置 -->
<property>
<name>hive.querylog.location</name>
<value>/hive/log</value>
</property>
<!-- 客户端远程连接的host -->
<property>
<name>hive.server2.thrift.bind.host</name>
<value>0.0.0.0</value>
</property>
<!-- 客户端远程连接的端口 -->
<property>
<name>hive.server2.thrift.port</name>
<value>10000</value>
</property>
<!-- hive远程服务的页面的host -->
<property>
<name>hive.server2.webui.host</name>
<value>0.0.0.0</value>
</property>
<!-- hive远程服务的页面的端口 -->
<property>
<name>hive.server2.webui.port</name>
<value>10002</value>
</property>
<!-- hive远程服务的连接超时设置 -->
<property>
<name>hive.server2.long.polling.timeout</name>
<value>5000</value>
</property>
<!-- hive远程服务模拟连接的用户,默认为true,HiveServer2以提交查询的用户身份执行查询处理;
为false,查询将以运行hiveserver2进程的用户身份运行,即yarn作业获取到的hiveserver2用户都为hive用户 -->
<property>
<name>hive.server2.enable.doAs</name>
<value>true</value>
</property>
<!-- 设置 权限 -->
<property>
<name>hive.scratch.dir.permission</name>
<value>777</value>
</property>
<!-- 在不存在时是否自动创建必要的schema(数据库和表) -->
<property>
<name>datanucleus.autoCreateSchema</name>
<value>false</value>
</property>
<!-- 开启数据核固定数据存储模式 -->
<property>
<name>datanucleus.fixedDatastore</name>
<value>true</value>
</property>
<!-- 根据输入文件的大小决定是否将普通join转换为mapjoin的一种优化,默认不开启false -->
<property>
<name>hive.auto.convert.join</name>
<value>false</value>
</property>
<!-- Hive计算引擎:mr=>mapreduce(默认);spark=>spark -->
<property>
<name>hive.execution.engine</name>
<value>mapreduce</value>
</property>
</configuration>
当然,配置可以简单一点(针对hive新版本-非生产环境)
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://node1:3306/hive?createDatabaseIfNotExist=true&useSSL=false&serverTimezone=GMT&allowPublicKeyRetrieval=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>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>rzm1991</value>
</property>
(3)修改 hadoop 中的 core-site.xml
vi $HADOOP_HOME/etc/hadoop/core-site.xml
添加如下配置:
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
3、启动
(1)重启hadoop
$HADOOP_HOME/sbin/stop-dsf.sh
$HADOOP_HOME/sbin/start-dfs.sh
(2)第一次启动需要初始化
schematool -dbType mysql -initSchema
注意:初始化时可能出现的问题
问题一:com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V
原因:hadoop和hive的两个guava.jar版本不一致
两个位置分别位于下面两个目录:
$HIVE_HOME/lib/
$HADOOP_HOME/share/hadoop/common/lib/
解决办法:删除低版本的那个,将高版本的复制到低版本目录下
问题二:java.sql.SQLException: Unable to load authentication plugin ‘caching_sha2_password‘
主要原因8.x版本的验证模块和之前版本不同:
5.x版本是:default_authentication_plugin=mysql_native_password
8.x版本就是:default_authentication_plugin=caching_sha2_password
解决方案:更新mysql驱动的jar版本,最好修改为8.x版本
(3)启动
服务端启动
# 前台启动, 默认监听端口是:9083
hive --service metastore [-p 9083]
# 后台启动
hive --service metastore & [-p 9083]
netstat -nltp | grep 9083
# 关闭: pid为上述查询的进程id
kill -9 pid
注意客户端中的端口配置需要和启动监听的端口一致。服务端启动正常后,客户端就可以执行hive操作了。
客户端本地连接
hive
注意:hive启动问题汇总
问题一: java.net.ConnectException: Connection refused
大概率是 hadoop 集群没开启 或 hive-sit.xml 中的 hadoop 配置错误。
问题二:Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.hdfs.server.namenode.SafeModeException): Cannot create directory /opt/hive/tmp. Name node is in safe mode
没有关闭安全模式,直接强制离开安全模式就行了:
hdfs dfsadmin -safemode leave
(4)测试
hive> show databases;
OK
default
Time taken: 2.529 seconds, Fetched: 1 row(s)
hive> show tables;
OK
Time taken: 0.225 seconds
hive> create table employee (id bigint,name string) row format delimited fields terminated by '\t';
OK
Time taken: 2.264 seconds
hive> select * from employee;
OK
Time taken: 3.812 seconds
(5)远程连接
远程服务器启动
# 前台启动
hive --service hiveserver2
# 后台启动
hive --service hiveserver2 &
netstat -nltp | grep 10000
# 关闭: pid为上述查询的进程id
kill -9 pid
客户端连接
beeline
!connect jdbc:hive2://hadoop-master:10000
# 或者
beeline -u jdbc:hive2://hadoop-master:10000 -n root
web页面