淘先锋技术网

首页 1 2 3 4 5 6 7

1 Hive下载

Hive 官网地址:https://hive.apache.org/

下载地址:http://www.apache.org/dyn/closer.cgi/hive/

2 Hive安装与启动

2.1 Hive安装

  1. 把安装文件apache-hive-3.1.2-bin.tar.gz上传到master节点的/opt/software目

录下,执行以下命令把安装文件解压到/opt/app目录中

cd /export/software
tar -zxvf apache-hive-3.1.2-bin.tar.gz -C /export/server
  1. 进入/opt/app目录,为目录apache-hive-3.1.2-bin建立软件链接

即输入hive就相当于输入apache-hive-3.1.2-bin,方便以后的shell命令

cd /export/server
ln -s apache-hive-3.1.2-bin hive
  1. 用vi命令编辑/etc/profile文件,添加环境变量

#HIVE_HOME
export HIVE_HOME=/export/server/apache-hive-3.1.2-bin
export PATH=$PATH:$HIVE_HOME/bin

运行source命令,让修改后的配置文件生效

source /etc/profile
  1. 解决日志jar包冲突:改名称

mv -T $HIVE_HOME/lib/log4j-slf4j-impl-2.10.0.jar $HIVE_HOME/lib/log4j-slf4j-impl-2.10.0.bak
  1. 初始化元数据库

schematool -dbType derby -initSchema

报以下错误

Exception in thread "main" java.lang.NoSuchMethodError:
com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V

原因是hadoop和hive的两个guava.jar版本不一致,两个jar位置分别位于下面两个目录:

/export/server/hive/lib/guava-19.0.jar
/export/server/hadoop/share/hadoop/common/lib/guava-27.0-jre.jar

解决办法:

删除低版本的那个,将高版本的复制到低版本目录下。

cd /export/server/hive/lib
rm -f guava-19.0.jar
cp /export/server/hadoop-3.1.4/share/hadoop/common/lib/guava-27.0-jre.jar /export/server/hive/lib

再次运行schematool -dbType derby -initSchema,即可成功初始化元数据库。

2.2 Hive启动

2.2.1 启动Hive

在命令窗口中输入以下命令启动hive:

hive

如果发生下面的报错

hive启动时报Exception in thread "main" java.lang.RuntimeException: java.net.ConnectExcepti on: Call From hadoop101/192.168.2.101 to hadoop101:9820 failed on connection exception: java.net.ConnectException: 拒绝连接; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused

额,你忘了启动hadoop集群了,hive的运行是基于hadoop集群的

2.2.2 退出Hive

exit;

2.2.3 查看Hive的启动日志

Hive的日志存放在“/tmp/登录用户名”目录下,以root用户登录,则存放在/tmp/root目录下。

3 元数据库更换为MySQL

默认情况下,Hive 元数据保存在内嵌的 Derby 数据库中,只能允许一个会话连接,只适合简单的测试。实际生产环境中不适用, 为了支持多用户会话,则需要一个独立的元数据库,使用 MySQL 作为元数据库,Hive 内部对 MySQL 提供了很好的支持。内置的derby主要问题是并发性能很差,可以理解为单线程操作。

3.1 检查是否已安装MySQL

rpm -qa|grep mariadb

如果查找到内容则要卸载mariadb,没有查找到内容则可以开始安装mysql。

rpm -e --nodeps mariadb-libs

3.2 安装MySQL

注意一行一行的执行命令

cd /export/software/mysql
yum install -y numactl libaio net-tools
rpm -ivh mysql-community-common-8.0.19-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-8.0.19-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-8.0.19-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-8.0.19-1.el7.x86_64.rpm

3.3 修改MySQL默认密码

输入以命令运行MySQL

systemctl start mysqld.service  # 启动MySQL
systemctl enable mysqld.service # 开机自启动

查找MySQL的默认密码

grep 'temporary password' /var/log/mysqld.log

用查找到的密码登录mysql

mysql -uroot -p'%:D%oc#1r:u.'

mysql登录成功后,执行以下命令修改root用户的登录密码为"%:D%oc#1r:u.",

让密码永不过期,

user 表中的 root 用户允许任意 ip 连接。

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Big_data20';
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Big_data20' PASSWORD EXPIRE NEVER;
update mysql.user set host='%' where user='root';
flush privileges;

3.4 配置Hive元数据保存到MySQL

3.4.1 下载 MySQL JDBC 驱动程序

为了让 Hive 能够连接到 MySQL 数据库,需要下载 MySQL JDBC 驱动程序。可以到MySQL 官网(

http://www.mysql.com/downloads/connector/j)下载mysql_connector-java-8.0.23.tar.gz。

3.4.2 安装JDBC驱动程序

从下载好的压缩包中解压出mysql-connector-java-8.0.23.jar,复制到/exprot/server/hive/lib 目录中。

cd /export/server/mysql
cp mysql-connector-java-8.0.23.jar /export/server/hive/lib

3.4.3 在$HIVE_HOME/conf 目录下新建 hive-site.xml 文件

vi $HIVE_HOME/conf/hive-site.xml

添加如下内容

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl" target="_blank" rel="external nofollow" ?>
<configuration>
    <!-- jdbc 连接的 URL -->
    <property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://node7:3306/metastore?createDatabaseIfNotExist=true&amp;useUnicode=true&amp;characte
        rEncoding=utf8&amp;useSSL=true&amp;serverTimezone=GMT%2B8</value>
    </property>
    <!-- jdbc 连接的 Driver-->
    <property>
        <name>javax.jdo.option.ConnectionDriverName</name>
        <value>com.mysql.jdbc.Driver</value>
    </property>

    <!-- jdbc 连接的 username-->
    <property>
        <name>javax.jdo.option.ConnectionUserName</name>
        <value>root</value>
    </property>

    <!-- jdbc 连接的 password -->
    <property>
        <name>javax.jdo.option.ConnectionPassword</name>
        <value>Big_data20</value>
    </property>

    <!-- Hive 元数据存储版本的验证 -->
    <property>
        <name>hive.metastore.schema.verification</name>
        <value>false</value>
    </property>
    <!--元数据存储授权-->
    <property>
        <name>hive.metastore.event.db.notification.api.auth</name>
        <value>false</value>
    </property>

    <!-- Hive 默认在 HDFS 的工作目录 -->
    <property>
        <name>hive.metastore.warehouse.dir</name>
        <value>/user/hive/warehouse</value>
    </property>
</configuration>

3.4.5登录MySQL

mysql -uroot -p'Big_data20'

解决中文乱码的问题,在/etc/my.cnf的末尾添加发下代码:

character-set-server = utf8
collation-server = utf8_general_ci
init_connect='SET NAMES utf8'

[client]
default-character-set=utf8

若metastore数据库已创建,需要执行发下命令,若未创建可以忽略:

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;

先登入mysql,后然创建Hive元数据库

create database metastore;
quit;

3.4.5 初始化Hive元数据库

schematool -initSchema -dbType mysql -verbose

3.4.6 再次启动Hive

hive

3.4.7测试Hive

在Hive命令行窗口中输入以下命令

create table test (name string);
insert into test values('john');
select * from test;

注意:insert语句执行会很慢,时间可能会有几十秒,这是正常的

在HDFS上查看创建的表

4 使用元数据服务的方式访问 Hive

4.1 metastore三种配置方式

4.1.1内嵌模式

内嵌模式使用的是内嵌的Derby数据库来存储元数据,也不需要额外起Metastore服务。数据库和Metastore服务都嵌入在主Hive Server进程中。这个是默认的,配置简单,但是一次只能有一个进程可以连接到数据库,适用于用来实验,不适用于生产环境。解压hive安装包 bin/hive 启动即可使用

缺点:不同路径启动hive,每一个hive拥有一套自己的元数据,无法共享。

4.1.2本地模式

本地模式采用外部数据库来存储元数据,目前支持的数据库有:MySQL、Postgres、Oracle、MS SQL Server。本地模式不需要单独起metastore服务,用的是跟hive在同一个进程里的metastore服务。也就是说当你启动一个hive 服务,里面默认会帮我们启动一个metastore服务。hive根据hive.metastore.uris 参数值来判断,如果为空,则为本地模式。本地模式下hive的配置主需要指定mysql的相关信息。

缺点:每启动一次hive服务,都内置启动了一个metastore。

4.1.3远程模式

远程模式下,需要单独起metastore服务,然后每个客户端都在配置文件里配置连接到该metastore服务。远程模式的metastore服务和hive运行在不同的进程里。在生产环境中,建议用远程模式来配置Hive Metastore。在这种情况下,其他依赖hive的软件都可以通过Metastore访问hive。远程模式下,需要配置hive.metastore.uris 参数来指定metastore服务运行的机器ip和端口,并且需要单独手动启动metastore服务。

4.2 远程模式部署hive的metastore服务

4.2.1 使用Hive CLI连接metastore服务

4.2.1.1 在 hive-site.xml 文件中添加如下配置信息

<!-- 指定存储元数据要连接的地址 -->
<property>
    <name>hive.metastore.uris</name>
    <value>thrift://node7:9083</value>
</property>

4.2.1.2启动 metastore服务

前台启动:

hive --service metastore

注意: 该启动方式下,进程会一直占用shell终端前台。如果ctrl+c结束进程,则hive metastore服务也会同时关闭。

后台启动:

nohup hive --service metastore &

后台启动的情况下,如果想关闭metastore服务,使用jps查看进程,kill -9 进程号即可。

4.2.1.3启动Hive

前台启动需要打开一个新命令行窗口,后台启动不需要打开一个新的命令行窗口。用hive命令启动hive。

4.2.2 使用BeeLine CLI连接metastore服务

4.2.2.1在 hive-site.xml 文件中添加如下配置信息

<!-- 指定存储元数据要连接的地址 -->
<!-- 指定 hiveserver2 连接的 host -->
<property>
    <name>hive.server2.thrift.bind.host</name>
    <value>node7</value>
</property>

<!-- 指定 hiveserver2 连接的端口号 -->
<property>
    <name>hive.server2.thrift.port</name>
    <value>10000</value>
</property>

4.2.2.2 启动metastore服务

nohup hive --service metastore &

4.2.2.3 启动 hiveserver2

nohup hive --service hiveserver2 &

4.2.2.4 启动 beeline 客户端(需要多等待一会)

beeline -u 'jdbc:hive2://node7:10000' -n root

若出现以下错误

User: root is not allowed to impersonate root (state=08S01,code=0)

在/export/server/hadoop-3.1.4/etc/hadoop/core-site.xml 中添加如下部分,重启服务即可:

<property>
    <name>hadoop.proxyuser.root.hosts</name>
    <value>*</value>
</property>
<property>
    <name>hadoop.proxyuser.root.groups</name>
    <value>*</value>
</property>

重启hadoop、metastore服务、hiveserver2服务,再次启动beeline 客户端就可以连接成功了。

4.2.3 编写Hive启动脚本

以上的方式启动、停止hive比较麻烦,下面编写一个Hive启动/停止脚本hive_script.sh,用于自动启停hive。

cd /export/server/hive/bin
vim hive-script.sh

脚本内容如下:

#!/bin/bash

if [ $# -lt 1 ]
then
    echo "Input No Args!"
    echo "请输入 $(basename $0) start/stop/restart/status"
    exit;
fi

HIVE_LOG_DIR=$HIVE_HOME/logs
if [ ! -d $HIVE_LOG_DIR ]
then
    mkdir -p $HIVE_LOG_DIR
fi

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 &"
    [ -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 3
    hive_start
    ;;
"status")
    check_process HiveMetastore 9083 >/dev/null && echo "Metastore服务运行正常" || echo "Metastore服务运行异常"
    check_process HiveServer2 10000 >/dev/null && echo "HiveServer2 服务运行正常" || echo "HiveServer2服务运行异常"
    ;;
*)
    echo "Input Args Error!"
    echo "请输入 $(basename $0) start/stop/restart/status"
    ;;
esac

保存脚本后,为脚本添加运行权限

chmod +x hive-script.sh

用脚本启动、停止、重启、检测运行状态的命令分别为:

hive-script.sh start
hive-script.sh stop
hive-script.sh restart
hive-script.sh status

注意:hive --service hiveserver2启动较慢,启动后在用hive-script.sh status检测服务状态时要多等一会儿,否则报服务运行异常。

hive-script.sh脚本只是启动了metastore服务和hiveserver2服务,要运行hive命令还需要启beeline 客户端。

beeline -u 'jdbc:hive2://node7:10000' -n root

关于hive异常:Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStor

可能是你使用了metastore的远程模式,但是没有启动metastore服务导致,用通过重启metastore服务解决。

3台虚拟机重启后需要运行以下命令,重启hadoop和hive服务:
1. start-all.sh #启动hadoop服务
2. hive-script.sh start #启动metastore服务和HiveServer2服务
3. hive #启动hive
或运行beeline -u 'jdbc:hive2://node7:10000' -n root启动beeline客户端