hive安装配置

本文详细介绍了Hive的安装配置过程,包括版本信息、元数据配置、Hive堆内存调整、日志目录修改、解决日志jar冲突、初始化元数据、通过元数据和JDBC访问Hive、不进入控制台执行SQL以及设置用户名密码等关键步骤。同时,还解决了Hive注释乱码问题并提供了重新编译Hive的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一.版本信息

二.配制

1. 用户组配置

2. 配置hive元数据 (无密码)

3. 修改Hive堆内存 /conf

4. 修改hive日志目录

5. 处理hive中日日志jar与hadoop日志jar冲突

6. 初始化hive元数据(只能初始化一次)

7. 使用元数据的方式访问hive(访问方式7和8选一个)

7.1. 简单启动 

7.2. 携带参数启动

8. 使用JDBC方式访问Hive

8.1 启动hiveserver2服务 

8.2.JDBC连接

8.2.1 通过beeline使用hiveserver2服务 

8.2.2 使用beeline携带参数连接

8.2.3 使用第三方工具连接hive 例如 DBeaver

8.2.4 使用java连接

8.2.4.1 pom

8.2.4.2 java代码

8.2.4.3 运行结果

9. 不进入hive控制台执行sql语句(可以设置调度定时任务)

10. 设置用户名密码

三. Hive注释乱码修改

四. 重新编译Hive


一.版本信息

jdk-1.8

hadoop-3.1.3

mysql-5.7

hive-3.1.2

信息内容
主机版本centos7
机器数量3台
安装包解压路径/home/tools/hadoop/
主机ip地址对应主机host
192.168.57.188node1
192.168.57.189node2
192.168.57.190node3

二.配制

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&amp;useSSL=false&amp;useUnicode=true&amp;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_V2COMMENT表字段注解
TABLE_PARAMSPARAM_VALUE表注解
PARTITION_PARAMSPARAM_VALUE分区字段注解
PARTITION_KEYSPKEY_COMMENT分区字段注解
INDEX_PARAMSPARAM_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
```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小钻风巡山

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值