Hive安装部署(Ver3.1.2)

一、课前准备

  1. 安装好对应版本的hadoop集群,并启动hadoop的HDFS以及YARN服务
  2. 安装了MySQL服务,并启动MySQL的服务

二、课堂主题

  1. hive安装部署

三、课堂目标

  1. 掌握hive的安装部署

四、知识要点

1. Hive的安装部署(10分钟)

注意hive就是一个构建数据仓库的工具,只需要在一台服务器上安装就可以了,不需要在多台服务器上安装。

此处以安装到node03为例;请大家保持统一

使用hadoop普通用户操作

1.1 先决条件

  • 搭建好三节点Hadoop集群;
  • node03上先安装好MySQL服务;
  • 参考文档:《CentOS 7安装MySQL5.7版本》

1.2 准备安装包

1.3 解压

  • 解压安装包到指定的规划目录/kkb/install

    [hadoop@node03 ~]$ cd /kkb/soft/
    [hadoop@node03 soft]$ tar -xzvf apache-hive-3.1.2-bin.tar.gz -C /kkb/install

1.4 修改配置文件

  1. 进入hive安装目录
[hadoop@node03 install]$ cd /kkb/install/
  1. 重新命名hive目录
[hadoop@node03 install]$ mv apache-hive-3.1.2-bin/ apache-hive-3.1.2
  1. 修改/kkb/install/conf目录下的hive-site.xml, 默认没有该文件, 需要手动创建
[hadoop@node03 install]$ cd /kkb/install/apache-hive-3.1.2/conf/
[hadoop@node03 conf]$ vim hive-site.xml
  1. 进入编辑模式, 文件内容如下
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
        <property>
                <name>javax.jdo.option.ConnectionURL</name>
                <value>jdbc:mysql://node03:3306/metastore?useSSL=false</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>hive.metastore.warehouse.dir</name>
                <value>/user/hive/warehouse</value>
        </property>
        <property>
                <name>javax.jdo.option.ConnectionPassword</name>
                <value>123456</value>
        </property>
        <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>
         <property>
                <name>hive.cli.print.current.db</name>
                <value>true</value>
        </property>
         <property>
                <name>hive.cli.print.header</name>
                <value>true</value>
        </property>
        <property>
                <name>hive.server2.thrift.bind.host</name>
                <value>node03</value>
        </property>
        <property>
                <name>hive.server2.thrift.port</name>
                <value>10000</value>
        </property>
</configuration>
  1. 修改日志配置文件hive-log4j.properties
  • 创建hive日志存储目录
[hadoop@node03 conf]$ mkdir -p /kkb/install/apache-hive-3.1.2/logs/
  • 重命名生成文件hive-log4j.properties
[hadoop@node03 conf]$ pwd
/kkb/install/apache-hive-3.1.2/conf
[hadoop@node03 conf]$ mv hive-log4j2.properties.template hive-log4j2.properties
[hadoop@node03 conf]$ vim hive-log4j2.properties # 修改文件
  • 修改此文件的hive.log.dir属性的值
#更改以下内容,设置我们的hive的日志文件存放的路径,便于排查问题
property.hive.log.dir=/kkb/install/apache-hive-3.1.2/logs/

image-20201111101836343

1.5 拷贝mysql驱动包

  • 上传mysql驱动包,如mysql-connector-java-5.1.38.jar/kkb/soft目录中
  • 由于运行hive时,需要向mysql数据库中读写元数据,所以==需要将mysql的驱动包上传到hive的lib目录下==
[hadoop@node03 ~]$ cd /kkb/soft/
[hadoop@node03 soft]$ cp mysql-connector-java-5.1.38.jar /kkb/install/apache-hive-3.1.2/lib/

1.6 解决日志Jar包冲突

# 进入lib目录
[hadoop@node03 conf]$ cd /kkb/install/apache-hive-3.1.2/lib/
# 重新命名 或者直接删除
[hadoop@node03 lib]$ mv log4j-slf4j-impl-2.10.0.jar log4j-slf4j-impl-2.10.0.jar.bak

1.6 配置Hive环境变量

  • 切换到root用户下
[hadoop@node03 soft]$ su root
Password:
  • 打开/etc/profile文件
[root@node03 soft]# vim /etc/profile
  • 末尾添加如下内容
export HIVE_HOME=/kkb/install/apache-hive-3.1.2
export PATH=$PATH:$HIVE_HOME/bin
  • 切换回hadoop用户,并source
[root@node03 soft]# su hadoop
[hadoop@node03 soft]$ source /etc/profile

1.7 初始化元数据库

  1. 新建一个node03连接, 登录MySQL
# 连接MySQL, 用户名root, 密码123456
[hadoop@node03 ~]$ mysql -uroot -p123456
  1. 创建hive元数据, 需要和hive-site.xml中配置的一致
-- 创建数据库, 数据库名为: metastore
create database metastore;
show databases;
  1. 退出mysql
exit
  1. 初始化元数据库
[hadoop@node03 ~]$ schematool -initSchema -dbType mysql -verbose

image-20201104145352060

看到schemaTool completed 表示初始化成功

1.7 验证安装

  • ==hadoop集群已启动==
  • ==mysql服务已启动==
  • 在node03上任意目录启动hive cli命令行客户端
[hadoop@node03 ~]$ hive  
# 启动成功之后, 警告信息可以忽略
  • 查看有哪些数据库
show databases;

image-20201104154118088

  • 说明hive安装成功
  • 退出cli
quit;

1.8 通过beeline连接代理服务器hiveserver2 操作hive

后期课堂中主要使用这种方式操作hive

  1. node01修改hadoop的core-site.xml文件
[hadoop@node03 ~]$ cd /kkb/install/hadoop-3.1.4/etc/hadoop
[hadoop@node03 hadoop]$ vim core-site.xml 
  1. 在core-site.xml中添加以下配置信息
    1. 配置信息hadoop.proxyuser.hadoop.hostshadoop.proxyuser.hadoop.groups中的hadoop用户需要修改为自己的用户名
    2. image-20210416113542602
 <property>
         <name>hadoop.proxyuser.hadoop.hosts</name>
        <value>*</value>
    </property>
    <property>
        <name>hadoop.proxyuser.hadoop.groups</name>
        <value>*</value>
    </property>
  1. 将core-site.xml文件同步到node02和node03
scp /kkb/install/hadoop-3.1.4/etc/hadoop/core-site.xml node02:/kkb/install/hadoop-3.1.4/etc/hadoop/

scp /kkb/install/hadoop-3.1.4/etc/hadoop/core-site.xml node03:/kkb/install/hadoop-3.1.4/etc/hadoop/
  1. 启动hiveserver2
[hadoop@node03 hive]$ cd /kkb/install/hive/
[hadoop@node03 hive]$ bin/hiveserver2  # 启动警告信息可以忽略

image-20201104152847036

  1. 新建node03连接, 连接hiveserver2
[hadoop@node03 hive]$ cd /kkb/install/hive/
[hadoop@node03 hive]$ bin/beeline --color=true

image-20201104153110962

  1. 通过jdbc方式连接hiveserver2, 输入用户名和密码
beeline> !connect jdbc:hive2://node03:10000
  1. 输入用户名: hadoop、密码: 123456
Enter username for jdbc:hive2://node03:10000: hadoop
Enter password for jdbc:hive2://node03:10000: 123456
  1. 测试
0: jdbc:hive2://node03:10000> show databases;

image-20201104153645880

创建启停脚本

hive-services.sh

#!/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

HiveServer2启动异常处理

一般hiverServer2的启动比较花时间,需等待5分钟左右才能启动,如果长时间还没有启动需要查看日志寻找失败原因:

异常1

Safe mode is ON. The reported blocks 3 needs additional 2 blocks to reach the threshold 0.9990 of total blocks 5. The number of live datanodes 2 has reached the minimum number 0. Safe mode will be turned off automatically once the thresholds have been reached.

说明我们的损坏的文件比例超过了阈值, 这个阈值配置在hdfs中, 也就是说不允许任何一个块损坏掉. 如果我们配置成99%应该就不会触发safemode了.
由于系统断电,内存不足等原因导致dataNode丢失超过设置的丢失百分比,系统自动进入安全模式

解决办法

执行命令退出安全模式:

hadoop dfsadmin -safemode leave`

执行健康检查,删除损坏掉的block
hdfs fsck  /  -delete

运行后如果出现下面提示,表示修复完毕

The filesystem under path '/' is HEALTHY

如果没有修复则可以多执行一次hdfs fsck命令

异常2

java.lang.NoClassDefFoundError: org/apache/tez/dag/api/TezConfiguration

Views: 86

Hive的概念

1 Hive的概念

Hive是基于Hadoop的一个数据仓库工具

  • 可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。

  • 其本质是将SQL转换为MapReduce的任务进行运算,底层由HDFS来提供数据的存储支持,说白了hive可以理解为一个将SQL转换为MapReduce任务的工具,甚至更进一步可以说hive就是一个MapReduce的客户端

2 Hive与数据库的区别

Hive 具有 SQL 数据库的外表,但应用场景完全不同。

Hive 只适合用来做海量离线数据统计分析,也就是数据仓库。

3 Hive的优缺点

优点

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

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

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

缺点

  • Hive 的查询延迟很严重

  • hadoop jar xxxx.jar xxx.class /input /output

    • 进行任务的划分,然后进行计算资源的申请

    • map 0% reduce 0%

    • map 10% reduce 0%

  • Hive 不支持事务

4 Hive架构原理

1、用户接口:Client

- CLI(hive shell)
  • JDBC/ODBC(java访问hive)

  • WEBUI(浏览器访问hive)

2、元数据:Metastore

  • 元数据包括:表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等;
  • 默认存储在自带的derby数据库中,推荐使用MySQL存储Metastore

3、Hadoop集群

  • 使用HDFS进行存储,使用MapReduce进行计算。

4、Driver:驱动器

  • 解析器(SQL Parser)
    将SQL字符串转换成抽象语法树AST
    对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误

  • 编译器(Physical Plan):将AST编译生成逻辑执行计划

  • 优化器(Query Optimizer):对逻辑执行计划进行优化

  • 执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。对于Hive来说默认就是mapreduce任务

hive1

Views: 45

数据仓库概念

1.1 数据仓库的基本概念

  • 数据仓库的英文名称为Data Warehouse,可简写为DW或DWH。

  • 数据仓库的目的是构建面向分析的集成化数据环境,为企业提供决策支持(Decision Support)。它出于分析性报告和决策支持的目的而创建。

  • 数据仓库本身并不“生产”任何数据,同时自身也不需要“消费”任何的数据,数据来源于外部,并且开放给外部应用,这也是为什么叫“仓库”,而不叫“工厂”的原因。

1.2 数据仓库的主要特征

  • 数据仓库是面向主题的(Subject-Oriented)、集成的(Integrated)、非易失的(Non-Volatile)和时变的(Time-Variant )数据集合,用以支持管理决策。

image-20201012101029922

1.3 数据仓库与数据库区别

  • 数据库与数据仓库的区别实际讲的是OLTP 与 OLAP 的区别。
  • 操作型处理,叫联机事务处理 OLTP(On-Line Transaction Processing),也可以称面向交易的处理系统,它是针对具体业务在数据库联机的日常操作,通常对少数记录进行查询、修改。用户较为关心操作的响应时间、数据的安全性、完整性和并发支持的用户数等问题。传统的数据库系统作为数据管理的主要手段,主要用于操作型处理OLTP。
  • 分析型处理,叫联机分析处理 OLAP(On-Line Analytical Processing),一般针对某些主题的历史数据进行分析,支持管理决策。
  • 首先要明白,数据仓库的出现,并不是要取代数据库。
  • 数据库是面向事务的设计,数据仓库是面向主题设计的。

    • 数据库一般存储业务数据,数据仓库存储的一般是历史数据。

    • 数据库设计是尽量避免冗余,一般针对某一业务应用进行设计;比如一张简单的User表,记录用户名、密码等简单数据即可,符合业务应用,但是不符合分析;数据仓库在设计是有意引入冗余,依照分析需求,分析维度、分析指标进行设计。

    • 数据库是为捕获数据而设计,数据仓库是为分析数据而设计。

    • 以银行业务为例。数据库是事务系统的数据平台,客户在银行做的每笔交易都会写入数据库,被记录下来,这里,可以简单地理解为用数据库记账。数据仓库是分析系统的数据平台,它从事务系统获取数据,并做汇总、加工,为决策者提供决策的依据。比如,某银行某分行一个月发生多少交易,该分行当前存款余额是多少。如果存款又多,消费交易又多,那么该地区就有必要设立ATM了。

    • 显然,银行的交易量是巨大的,通常以百万甚至千万次来计算。事务系统是实时的,这就要求时效性,客户存一笔钱需要几十秒是无法忍受的,这就要求数据库只能存储很短一段时间的数据。而分析系统是事后的,它要提供关注时间段内所有的有效数据。这些数据是海量的,汇总计算起来也要慢一些,但是,只要能够提供有效的分析数据就达到目的了。

    • 数据仓库,是在数据库已经大量存在的情况下,为了进一步挖掘数据资源、为了决策需要而产生的,它决不是所谓的“大型数据库”。

1.4 数据仓库分层架构

  • 按照数据流入流出的过程,数据仓库架构可分为三层——源数据层数据仓库层数据应用层。

  • 数据仓库的数据来源于不同的源数据,并提供多样的数据应用,数据自下而上流入数据仓库后向上层开放应用,而数据仓库只是中间集成化数据管理的一个平台。

  • 源数据层(ODS):此层数据无任何更改,直接沿用外围系统数据结构和数据,不对外开放;为临时存储层,是接口数据的临时存储区域,为后一步的数据处理做准备。

  • 数据仓库层(DW):也称为细节层,DW层的数据应该是一致的、准确的、干净的数据,即对源系统数据进行了清洗(去除了杂质)后的数据。

  • 数据应用层(DA或APP):前端应用直接读取的数据源;根据报表、专题分析需求而计算生成的数据。

  • 数据仓库从各数据源获取数据及在数据仓库内的数据转换和流动都可以认为是ETL(抽取Extra, 转化Transfer, 装载Load)的过程,ETL是数据仓库的流水线,也可以认为是数据仓库的血液,它维系着数据仓库中数据的新陈代谢,而数据仓库日常的管理和维护工作的大部分精力就是保持ETL的正常和稳定。

  • 为什么要对数据仓库分层?

    • 用空间换时间,通过大量的预处理来提升应用系统的用户体验(效率),因此数据仓库会存在大量冗余的数据;
    • 不分层的话,如果源业务系统的业务规则发生变化将会影响整个数据清洗过程,工作量巨大。
    • 通过数据分层管理可以简化数据清洗的过程,因为把原来一步的工作分到了多个步骤去完成,相当于把一个复杂的工作拆成了多个简单的工作,把一个大的黑盒变成了一个白盒,每一层的处理逻辑都相对简单和容易理解,这样我们比较容易保证每一个步骤的正确性,当数据发生错误的时候,往往我们只需要局部调整某个步骤即可。

    image-20201012101134818

Views: 48

Hive(1.2.2) Installation

MySQL的Hive安装

安装MySQL(可以在不同机器上, 但网络要可以互访)

在里面创建一个允许远程访问的MySQL账号

CREATE USER 'hive'@'%' IDENTIFIED BY 'hive1234';
GRANT ALL PRIVILEGES ON hive.* TO 'hive'@'%' WITH GRANT OPTION;
CREATE USER 'hive'@'localhost' IDENTIFIED BY 'hive1234';
GRANT ALL PRIVILEGES ON hive.* TO 'hive'@'localhost' WITH GRANT OPTION;
  • 在虚拟机测试能否远程连接MySQL服务
    • 有MySQL客户端的情况下
      • mysql -uhive -h <mysql所在机器的ip> -p
      • 输出密码回车, 如果能进入mysql>命令行界面说明连接成功
    • 没有MySQL客户端也可以直接ping一下mysql所在机器的ip

下载hive, 这里选择1.2.2版本

解压到 ~/app下, 可以视你的情况更改, 但要保证有读写权限,

编辑~/.bash_profile 添加环境变量, 红色高亮处要根据你的实际情况修改

export HIVE_HOME=/home/hadoop/app/hive-1.2.2(替换为hive实际解压位置)

export PATH=$HIVE_HOME/bin:$PATH

输入source ~/.bash_profile 使其生效

终端输入hiv按tab键, 如果能自动补全为hive说明环境变量ok

进入hive解压目录的conf文件夹下面, hive-env.sh 和 hive-site.xml 两个文件

    • 创建 hive-env.sh, 并添加下面配置
HADOOP_HOME=/home/hadoop/app/hadoop-2.6.0-cdh5.15.1(换成你hadoop所在目录)
    • 创建hive-site.xml, 参照示例修改
 <?xml version="1.0"?>
 <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
 <configuration>
 <property>
   <name>javax.jdo.option.ConnectionURL</name>
     <value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true&amp;useSSL=false(如果MySQL和hive在一个机器上可以使用localhost, 否则需要填写MySQL所在机器的实际IP)</value>
 </property>
 <property>
   <name>javax.jdo.option.ConnectionDriverName</name>
   <value>com.mysql.jdbc.Driver</value>
 </property>
 <property>
   <name>javax.jdo.option.ConnectionUserName</name>
   <value>hive(换成你实际使用的MySQL账户)</value>
 </property>
 <property>
   <name>javax.jdo.option.ConnectionPassword</name>
   <value>hive1234(换成你使用MySQL账户的实际密码)</value>
 </property>
 </configuration>

下载mysql-connector--java-5.1.xx.bin.jar 放在 ${HIVE_HOME}/lib 下面

启动dfs 和 yarn

 [hadoop@hadoop000 conf]$ jps
 11602 NameNode
 12212 ResourceManager
 11863 SecondaryNameNode
 11706 DataNode
 12315 NodeManager
 48207 Jps

 等待几分钟后, 避开安全模式, 启动 hive客户端

[hadoop@hadoop000 ~]$ hive
PS:
如果MysQL服务器部署在其他机器上, 则URL中要改成IP或主机名的访问方式
如: jdbc:mysql://192.168.1.142:3306/hive?createDatabaseIfNotExist=true&amp;useSSL=false
这种情况下所使用的账户必须要开启远程访问权限 hive@%

Hive快速入门

hive sql 语法 https://cwiki.apache.org/confluence/display/Hive/LanguageManual

hive的hql语句和sql极其类似

[hadoop@hadoop000 ~]$ hive
which: no hbase in (/home/hadoop/app/hive-1.1.0-cdh5.15.1/bin:/home/hadoop/app/hadoop-2.6.0-cdh5.15.1/bin:/home/hadoop/app/hadoop-2.6.0-cdh5.15.1/sbin:/home/hadoop/app/jdk1.8.0_91/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/hadoop/.local/bin:/home/hadoop/bin)

Logging initialized using configuration in jar:file:/home/hadoop/app/hive-1.1.0-cdh5.15.1/lib/hive-common-1.1.0-cdh5.15.1.jar!/hive-log4j.properties
WARNING: Hive CLI is deprecated and migration to Beeline is recommended.
hive> 
hive> show databases;
OK
default
Time taken: 22.65 seconds, Fetched: 1 row(s)
hive> create database hive;
OK
Time taken: 0.372 seconds
hive> use hive;
OK
Time taken: 0.069 seconds
hive> show tables;
OK
Time taken: 0.074 seconds
hive>

这时登录hive用户登录mysql中查看, 会发现自动创建了hive数据库, 并且里面出现了26张表(这些就是用来保存元数据的)

mysql> use hive;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+---------------------------+
| Tables_in_hive            |
+---------------------------+
| BUCKETING_COLS            |
| CDS                       |
| COLUMNS_V2                |
| DATABASE_PARAMS           |
| DBS                       |
| FUNCS                     |
| FUNC_RU                   |
| GLOBAL_PRIVS              |
| PARTITIONS                |
| PARTITION_KEYS            |
| PARTITION_KEY_VALS        |
| PARTITION_PARAMS          |
| PART_COL_STATS            |
| ROLES                     |
| SDS                       |
| SD_PARAMS                 |
| SEQUENCE_TABLE            |
| SERDES                    |
| SERDE_PARAMS              |
| SKEWED_COL_NAMES          |
| SKEWED_COL_VALUE_LOC_MAP  |
| SKEWED_STRING_LIST        |
| SKEWED_STRING_LIST_VALUES |
| SKEWED_VALUES             |
| SORT_COLS                 |
| TABLE_PARAMS              |
| TAB_COL_STATS             |
| TBLS                      |
| VERSION                   |
+---------------------------+
29 rows in set (0.00 sec)

其中DBS那张表中保存的就是数据库的相关信息

mysql> select * from DBS \G
*************************** 1. row ***************************
          DB_ID: 1
           DESC: Default Hive database
DB_LOCATION_URI: hdfs://hadoop000:8020/user/hive/warehouse
           NAME: default
     OWNER_NAME: public
     OWNER_TYPE: ROLE
*************************** 2. row ***************************
          DB_ID: 2
           DESC: NULL
DB_LOCATION_URI: hdfs://hadoop000:8020/user/hive/warehouse/hive.db
           NAME: hive
     OWNER_NAME: hadoop
     OWNER_TYPE: USER
2 rows in set (0.00 sec)

Views: 24