Day03 Hive基本概念与安装

Day03 Hive基本概念与安装

一、Hive基本概念

1. hive简介

Hive:用于解决海量结构化日志的数据统计工具。

Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能。

2. hive本质

其本质是将HQL转化为MapReduce程序:

image-20220312083256229

注:(1)Hive处理的数据存储在HDFS

​ (2)Hive分析数据底层的实现是MapReduce

​ (3)执行程序运行在Yarn上

3. Hive的优点

  1. 操作接口采用类SQL语法,提供快速开发的能力(简单、容易上手)。

  2. 避免了去写MapReduce,减少开发人员的学习成本。

  3. Hive常用于数据分析,对实时性要求不高的场合。

  4. Hive优势在于处理大数据,对于处理小数据没有优势,因为Hive的执行延迟比较高。

  5. Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。

4. Hive架构原理

image-20220312083501155

  1. 解析器:将SQL字符串转换成抽象语法树AST,解析器会对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误。

  2. 编译器:将AST编译生成逻辑执行计划。

  3. 优化器:对逻辑执行计划进行优化。

  4. 执行器:把逻辑执行计划转换成可以运行的物理计划,也就是断定当前MR的执行是否需要基于上一步MR的结果。对于Hive来说,就是MR/Spark。

**Metastore:**hive元数据(表名,表的数据所在目录等)存储,hive中表的数据不在表中,而是在hdfs中,所以表会与hdfs中的数据产生映射关系。

默认存在自带的derby数据库中,但我们用mysql

5. hive的运行机制

HQL -> Hive ->数据库查元数据->确定某表与hdfs中某文件存在关联->hive分析数据

Hive不是数据库!!!只是操作起来比较像,Hive的定义是数仓分析工具!并且数据库不能处理海量数据。

二、Hive安装

1. Mysql安装

为啥需要mysql?原因在于Hive默认使用的元数据库为derby,开启Hive之后就会占用元数据库,且不与其他客户端共享数据,如果想多窗口操作就会报错,操作比较局限。以我们需要将Hive的元数据地址改为MySQL,可支持多窗口操作。

tips:检查当前系统是否安装过Mysql并卸载

查询:rpm -qa | grep mariadb    (CentOS6->mysql   CentOS7 ->mariadb)
卸载:rpm -qa | grep mariadb | xargs -n1 sudo rpm -e –nodeps
  1. 将MySQL的tar包拷贝到/opt/soft目录下

  2. 解压MySQL安装包(不是gz包,所以不用加参数z)

tar -xvf /… -C /opt/module/
  1. 在安装目录下执行rpm安装(按顺序执行)
 rpm -ivh mysql-common…

(1) common

(2) libs

(3) libs-compat

(4) client

(5) server(安装之前注意安装依赖)

如果第(5)步报错且为依赖问题解决方法->依赖下载:yum install -y libaio**(这个centos7中自带有)**

2. 初始化Mysql配置

  1. 初始化数据库

    sudo mysqld --initialize --user=mysql
    
  2. 启动Mysql服务

    sudo systemctl start mysqld
    
  3. 查看初始随机生成的密码

    sudo cat /var/log/mysqld.log
    

image-20220312085322300

  1. 登录Mysql数据库

    mysql -uroot -p 密码
    
  2. 改密码

    set password = password("新密码")
    
  3. mysql数据库基础使用

    显示所有数据库
    show databases;
    使用某个数据库
    use 库名;
    展示所有表
    Show tables;
    看表的结构
    Desc 表名;
    展示部分
    Select ……… from ……;
    
  4. 将用户更改为所有登录

    update user set host = '%' where user = 'root';
    
  5. 刷新权限

    flush privileges;
    

3. hive解压配置环境变量

  1. 上传到/opt/soft中并解压hive的tar包(建议修改一下名字)

    tar -zxvf /…… -C /opt/module
    mv apache-hive-…… hive(改名)
    
  2. 配置环境变量

    vim /etc/profile
    添加HIVE_HOME=/opt/module/hive/
    PATH=$PATH:/HIVE_HOME/bin
    export PATH HIVE_HOME
    
  3. 解决日志jar包冲突,将hive自带的日志jar包删除(slf4j)

    cd /opt/module/hive/lib
    ls | grep slf4j
    rm 出来的结果
    
  4. conf目录中新建一个配置文件,hive-site.xml并添加以下配置

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
    <!-- jdbc连接的URL -->
    <property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://hadoop101:3306/metastore?useSSL=false</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>123456</value>
</property>

    <!-- Hive默认在HDFS的工作目录(存放路径) -->
    <property>
        <name>hive.metastore.warehouse.dir</name>
        <value>/user/hive/warehouse</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>
</configuration>

由于hive要连接mysql是需要通过jdbc的方式,所以需要jdbc的驱动包,hive通过jdbc的方式连接mysql,所以需要将驱动包放到lib目录下hive才能找得着。

这里要将驱动包放入linux目录中。(mysql-connector-java-5.1.37)

4. 完善Hive,初始化元数据库

  1. 登录mysql

  2. 新建Hive元数据库表空间metastore

    create database metastore;
    
  3. 初始化Hive元数据库

    schematool -initSchema -dbType mysql -verbose
    

5. 启动Hive

  1. 使用群起脚本启动(hadoop)

  2. 有两种客户端方式选择进入

    1. 直接敲hive启动普通客户端(格式调整做的很差)
    2. 启动相对高级的jdbc客户端,继续向下
  3. 配置hiveserver2hive-site.xml

    cd到bin目录下,其中有个beeline命令,这个家伙就是基于jdbc协议去操作hive的,但hive正常情况下没有提供jdbc协议让咱们去连接,所以非常时期非常操作,hive提供了第二个服务:hiveserver2,它是一个中间商,它能帮助咱们去操作hive。

    <!-- 指定hiveserver2连接的host -->
        <property>
            <name>hive.server2.thrift.bind.host</name>
            <value>hadoop101</value>
        </property>
    
        <!-- 指定hiveserver2连接的端口号 -->
        <property>
            <name>hive.server2.thrift.port</name>
            <value>10000</value>
        </property>
    
  4. 启动中间商hiveserver2

    hive --service hiveserve2
    

    该方式有个缺陷,会停顿,阻塞,而且不能关闭,关闭的话服务就停了。需要让该服务后台持续进行。

  5. 启动beeline连接中间商

    beeline -u jdbc:hive2://hadoop101:10000 -n tgm
    

    -u (url) -n (name)

6. 脚本相关

  1. 如何让服务在后台不关闭运行且不输出日志信息到前台

前台启动的方式导致需要打开多个shell窗口,可以使用如下方式后台方式启动

nohup: 放在命令开头,表示不挂起,也就是关闭终端进程也继续保持运行状态

0:标准输入

1:标准输出

2:错误输出

2>&1 : 表示将错误重定向到标准输出上

&: 放在命令结尾,表示后台运行

一般会组合使用:

nohup [xxx命令操作]> file 2>&1 &

表示将xxx命令运行的结果输出到file中,并保持命令启动的进程在后台运行。

nohup hive --service hiveserver2 2>&1 &(不要求掌握)

  1. 给出一个后台启动hiveserver的脚本
#!/bin/bash
HIVE_LOG_DIR=$HIVE_HOME/logs
if [ ! -d $HIVE_LOG_DIR ]
then
	mkdir -p $HIVE_LOG_DIR
fi
#检查进程是否运行正常,参数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

给脚本添加执行权限。

chmod +x 脚本名

启动集群后启动hive后台服务

  • hiveserver start
  • hiveserver status
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值