目录
5. 处理hive中日日志jar与hadoop日志jar冲突
8.2.1 通过beeline使用hiveserver2服务
8.2.3 使用第三方工具连接hive 例如 DBeaver
9. 不进入hive控制台执行sql语句(可以设置调度定时任务)
一.版本信息
jdk-1.8
hadoop-3.1.3
mysql-5.7
hive-3.1.2
信息 | 内容 |
主机版本 | centos7 |
机器数量 | 3台 |
安装包解压路径 | /home/tools/hadoop/ |
主机ip地址 | 对应主机host |
192.168.57.188 | node1 |
192.168.57.189 | node2 |
192.168.57.190 | node3 |
二.配制
hive依赖hadoop,安装hive之前需要先安装hadoop,和mysql
1. 用户组配置
配置文件$HADOOP_HOME/etc/hadoop/core-site.xml 添加配置项(已经配置过的内容不要重复配置)
<configuration>
<!--用户权限配置-->
<property><!--设置该myuser用户允许通过代理访问的主机节点-->
<name>hadoop.proxyuser.myuser.hosts</name>
<value>*</value>
</property>
<property><!--设置该myuser用户允许通过代理用户所属组-->
<name>hadoop.proxyuser.myuser.groups</name>
<value>*</value>
</property>
<property><!--配置myuser允许通过代理的用户 hive-->
<name>hadoop.proxyuser.myuser.users</name>
<value>*</value>
</property>
</configuration>
2. 配置hive元数据 (无密码)
$HIVE_HOME/conf/hive-site.xml
<configuration>
<!--工作目录配置-->
<property><!--hive在HDFS上的工作目录-->
<name>hive.metastore.warehouse.dir</name>
<value>/hive/warehouse</value>
</property>
<!--元数据配置-->
<property><!--元数据保存地址-->
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://node1:3306/hivedb?createDatabaseIfNotExist=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8</value>
</property>
<property><!--JDBC驱动-->
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property><!--mysql用户名-->
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property><!--mysql密码-->
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
</property>
<!--
<property>
<name>hive.metastore.uris</name>
<value>thrift://node1:9083</value>
<description>使用元数据服务的方式访问Hive配置,与使用JDBC方式访问Hive的方式冲突,只能二选一</description>
</property>
-->
<!--使用JDBC方式访问Hive 与元数据访问方式的配置二选一-->
<property><!--指定HiveServer2连接的host-->
<name>hive.server2.thrift.bind.host</name>
<value>node2</value>
</property>
<property><!--指定HiveServer2连接的端口-->
<name>hive.server2.thrift.port</name>
<value>10000</value>
</property>
<property><!--HiveServer2的高可用参数,开启可以提高访问速度-->
<name>hive.server2.active.passive.ha.enable</name>
<value>true</value>
</property>
<!--Hive显示配置-->
<property><!--Hive显示当前库-->
<name>hive.cli.print.header</name>
<value>true</value>
</property>
<property><!--Hive显示当表头-->
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
<!--Hive on spark 依赖Spark包的存储hdfs路径-->
<property><!--spark的纯净包(without)jar包到hdfs路径,hive on spark必须配制-->
<name>spark.yarn.jars</name>
<value>hdfs://mycluster/hadoop/spark_jars/*</value>
</property>
<!--Hive 执行引擎配制-->
<property><!--执行动态分区-->
<name>hive.execution.engine</name>
<value>nonstrict</value>
</property>
<property><!--设置匿名用户为超级管理员有最高权限-->
<name>hive.users.in.admin.role</name>
<value>anonymous</value>
</property>
</configuration>
拷贝驱动到$HIVE_HOME/lib目录下,推荐mysql-connector-java-5.1.49 下载 mvnrepository.com
如果不配置元数据,这时创建数据库与表,(没有配置元数据,元数据使 用默认的derby内嵌的方式),会在当前启动目录下创建metastore_db目录作为元数据目录,退出hive之后进入另一个目录再一次启动hive,会生成新的元数据目录,之前创建的数据库与表不能被正常读取(即不显示这张表)
3. 修改Hive堆内存 $HIVE_HOME/conf
cp hive-env.sh.template hive-env.sh
export HADOOP_HEAPSIZE=1024
4. 修改hive日志目录
cd hive-log4j2.properties.template hive-log4j2.properties
property.hive.log.dir = /home/tools/hive/apache-hive-3.1.2-bin/logs
5. 处理hive中日日志jar与hadoop日志jar冲突
mv /home/tools/hive/apache-hive-3.1.2-bin/lib/log4j-slf4j-impl-2.10.0.jar /home/tools/hive/apache-hive-3.1.2-bin/lib/log4j-slf4j-impl-2.10.0.jar.back
6. 初始化hive元数据(只能初始化一次)
在mysql中创建一个hivedb数据库创建之后初始化元数据
$HIVE_HOME/bin/schematool -initSchema -verbose -dbType mysql
7. 使用元数据的方式访问hive(访问方式7和8选一个)
7.1. 简单启动
$HIVE_HOME/bin/hive --service metastore
7.2. 携带参数启动
$HIVE_HOME/bin/hive -hiveconf mapreduce.job.reduces=10;
再开一个窗口使用hive直接访问
8. 使用JDBC方式访问Hive
8.1 启动hiveserver2服务
$HIVE_HOME/bin/hive --service hiveserver2
一件启动脚本hiveservice.sh 使用方式 hiveservice.sh start/stop/status/restart
#!/bin/bash
# 日志存储配制
HIVE_LOG_DIR=$HIVE_HOME/logs
mkdir -p $HIVE_LOG_DIR
#检查进程是否运行正常,参数1为进程名,参数2为进程端口
function check_process()
{
pid=$(ps -ef 2>/dev/null | grep -v grep | grep -i $1 | awk '{print $2}')
ppid=$(netstat -nltp 2>/dev/null | grep $2 | awk '{print $7}' | cut -d '/' -f 1)
echo $pid
[[ "$pid" =~ "$ppid" ]] && [ "$ppid" ] && return 0 || return 1
}
function hive_start()
{
metapid=$(check_process HiveMetastore 9083)
cmd="nohup hive --service metastore >$HIVE_LOG_DIR/metastore.log 2>&1 &"
cmd=$cmd" sleep 4; hdfs dfsadmin -safemode wait >/dev/null 2>&1"
[ -z "$metapid" ] && eval $cmd || echo "Metastroe服务已启动"
server2pid=$(check_process HiveServer2 10000)
cmd="nohup hive --service hiveserver2 >$HIVE_LOG_DIR/hiveServer2.log 2>&1 &"
[ -z "$server2pid" ] && eval $cmd || echo "HiveServer2服务已启动"
}
function hive_stop()
{
metapid=$(check_process HiveMetastore 9083)
[ "$metapid" ] && kill $metapid || echo "Metastore服务未启动"
server2pid=$(check_process HiveServer2 10000)
[ "$server2pid" ] && kill $server2pid || echo "HiveServer2服务未启动"
}
case $1 in
"start")
hive_start
;;
"stop")
hive_stop
;;
"restart")
hive_stop
sleep 2
hive_start
;;
"status")
check_process HiveMetastore 9083 >/dev/null && echo "Metastore服务运行正常" || echo "Metastore服务运行异常"
check_process HiveServer2 10000 >/dev/null && echo "HiveServer2服务运行正常" || echo "HiveServer2服务运行异常"
;;
*)
echo Invalid Args!
echo 'Usage: '$(basename $0)' start|stop|restart|status'
;;
esac
8.2.JDBC连接
8.2.1 通过beeline使用hiveserver2服务
$HIVE_HOME/bin/beeline -u jdbc:hive2://node1:10000 -n myuser
8.2.2 使用beeline携带参数连接
$HIVE_HOME/bin/beeline -u jdbc:hive2://node1:10000 -n myuser -hiveconf mapreduce.job.reduces=10;
8.2.3 使用第三方工具连接hive 例如 DBeaver
8.2.4 使用java连接
8.2.4.1 pom
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.12</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-hive_2.12</artifactId>
<version>3.0.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>3.1.2</version>
</dependency>
8.2.4.2 java代码
import java.sql.*;
import java.util.ArrayList;
public class SparkTestJava {
public static void main(String[] args) throws Exception {
Class.forName("org.apache.hive.jdbc.HiveDriver");//连接驱动
// System.setProperty("HADOOP_USER_NAME=","myuser");
Connection connection = DriverManager.getConnection("jdbc:hive2://node1:10000","myuser","");//重构方法可以传递用户名与密码
// connection.prepareStatement("use default").execute();//选择数据库
PreparedStatement stmt = connection.prepareStatement("select * from student limit 20");
ResultSet rs = stmt.executeQuery();//结果集
ResultSetMetaData metaData = rs.getMetaData();//字段信息
ArrayList<String> keys = new ArrayList<>(metaData.getColumnCount());
for (int i = 0; i < metaData.getColumnCount(); i++) {
keys.add(metaData.getColumnName(i + 1));//获取字段从1开始
}
while (rs.next()) {
for (String key : keys) {
String value = rs.getString(key);
System.out.print(key + ":" + value + ", ");
}
System.out.println();
}
rs.close();//注意异常捕获
stmt.close();
connection.close();
}
}
8.2.4.3 运行结果
9. 不进入hive控制台执行sql语句(可以设置调度定时任务)
$HIVE_HOME/bin/hive -e "select * from student"
10. 设置用户名密码
参考文章 点击跳转
三. Hive注释乱码修改
hive元数据存储在mysql中,默认使用latin1编码,所以中文会乱码
修改注释存储的编码,注释存储在如下列表
表名称 | 字段名称 | 字段解释 |
COLUMNS_V2 | COMMENT | 表字段注解 |
TABLE_PARAMS | PARAM_VALUE | 表注解 |
PARTITION_PARAMS | PARAM_VALUE | 分区字段注解 |
PARTITION_KEYS | PKEY_COMMENT | 分区字段注解 |
INDEX_PARAMS | PARAM_VALUE | 索引注解 |
修改编码sql语句
alter table COLUMNS_V2 modify column COMMENT varchar(256) character set utf8;
alter table TABLE_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
alter table PARTITION_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
alter table PARTITION_KEYS modify column PKEY_COMMENT varchar(4000) character set utf8;
alter table INDEX_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
检查hive-site中的数据库连接是否设置useUnicode=true&characterEncoding=UTF-8
四. 重新编译Hive
# 一、从Github拉取源码并重新编译Tez(Centos7环境)
## 1. 必要的环境准备
- git
```bash
sudo yum install -y epel-release
sudo yum install -y git
```
- maven
首先从maven官网下载最新maven的tar包,并上传到/opt/software
```bash
MAVTAR=$(ls /opt/software/apache-maven*)
tar -xf $MAVTAR -C /opt/module
mv /opt/module/$(basename $MVNTAR | cut -d - -f 1,2,3) /opt/module/maven
```
配置maven的环境变量
```bash
sudo vim /etc/profile.d/my_env.sh
```
添加如下配置
```bash
#MAVEN_HOME
export MAVEN_HOME=/opt/module/maven
export PATH=$PATH:$MAVEN_HOME/bin
```
然后重启XShell连接
- protobuf
```
sudo yum install -y protobuf protobuf-static protobuf-devel
```
## 2. 从Github拉取源码
```bash
cd /home/atguigu
mkdir git
cd git
git clone https://github.com/apache/tez.git
```
## 3. 查看Building.txt
## 4. 编译
```bash
cd tez
mvn clean package -Dhadoop.version=3.1.3 -Phadoop28 -P\!hadoop27 -DskipTests -Dmaven.javadoc.skip=true
```
然后等待编译完成。期间可能需要从Maven下载Jar包,需要有好的网络环境。编译完成的Tar包在tez-dist/target目录下。
# 二、修改Hive源码解决其和Hadoop的Jar包冲突并重新编译
## 1. 环境准备
- maven,见tez编译过程
## 2. 下载源码并导入Idea
从hive官网下载最新的hive 3.1.2源码,解压并导入idea
## 3. 修改Hive的pom.xml
在Idae中打开hive的pom.xml,搜索guava.version,将版本号改为
```xml
<guava.version>27.0-jre</guava.version>
```
并重新导入依赖
## 4. 修改Hive源码,兼容新版本Guava依赖
由于guava依赖升级后,兼容性遭到破坏,我们需要修改hive源码使之能能兼容新版本guava依赖
双击shift,搜索
```
com.google.common.util.concurrent.Futures
```
在类中定位addCallback方法,点击该方法,找到hive中所有的调用,挨个修改使之兼容,由于修改的地方较多且较相似,这里不赘述。
## 5. 修改standalone-metastore模块的Guava依赖
找到该模块,打开其pom.xml,搜索guava.version,将版本号改为
```xml
<guava.version>27.0-jre</guava.version>
```
## 6. 重新将源码打包并上传到Linux
## 7. 编译
进入源码文件夹,执行
```bash
mvn clean package -Pdist -DskipTests -Dmaven.javadoc.skip=true
```