0%

Hive数据仓库

  • Hive介绍
  • Hive技术架构
  • Hive实操

Hive介绍

Hive是什么

Hive是建立在Hadoop上的数据仓库基础构架,它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的极致,它允许熟悉SQL的用户查询数据

  • 由facebook开源,最初用于解决海量结构化的日志数据统计问题
  • 构建在Hadoop之上的数据仓库
  • Hive定义了一种类SQL查询语言:HQL
  • 通常用于离线数据处理(采用MapReduce)
  • 可认为是一个HQL->MR的语言翻译器

为什么使用Hive

  • 简单,容易上手
  • 为超大数据集设计的计算/扩展能力
    • MR作为计算引擎,HDFS作为存储系统
  • 统一的元数据管理(HCalalog)

Hive局限性

  • Hive的HQL表达能力有限
    • 迭代式算法无法表达
    • 有些复杂运算用HQL不易表达
  • Hive效率较低
    • Hive自动生成MR作业,通常不够智能
    • HQL调优困难,力度较粗
    • 可控性差

Hive技术架构

  • 用户接口(CLI,JDBC/ODBC,WebUI)
  • 元数据存储(默认:derby,线上一般:MySQL)
  • 驱动器(解释器、编译器、优化器、执行器)
  • Hadoop(用MapReduce进行计算,用HDFS进行存储)

Hive部署架构

  • 客户端(beeline(JDB实现),JDBC,Python)
  • Metastore(使用MySQL作为元数据库)
  • Hiveserver2(用于接受用户请求,解析SQL,执行SQL并返回结果)

Hive特点

  • 支持提供类似于SQL的查询语言(HQL),基于用户使用
  • 支持针对海量数据的高性能查询和分析
  • 支持高扩展性,通过增加节点提高计算性能,性能线性扩展,支持在线扩展
  • 支持众多计算框架,如MapReduce、Tez、Spark等
  • 支持灵活的扩展数据类型,自定义函数(UDF)和脚本
查询语言 HQL SQL
数据存储位置 HDFS Raw Device或者Local FS
数据格式 用户定义 系统决定
数据更新 不支持 支持
索引
执行 MapReduce Executor
执行延迟
可扩展性
数据规模

Hive应用场景

  • 日志分析
    • 统计网站一个时间段内的pv、uv
    • 多维度数据分析
    • 大部分互联网公司使用Hive进行日志分析,包括百度、淘宝等
  • 其他场景
    • 海量结构化数据离线分析
    • 低成本进行数据分析(不直接编写MR)

Hive实操

Hive数据模型

Hive数据类型

DDL(数据库定义语言)

默认分隔符:/001 ->SOH

DML

Hive配置

IP 主机名 作用
192.168.80.132 e3base01 QuorumPeerMain、Namenode、datanode、zkfc、journalnode、resourcemanager、nodemanager
192.168.80.133 e3base02 QuorumPeerMain、Namenode、datanode、zkfc、journalnode、resourcemanager、nodemanager
192.168.80.134 e3base03 QuorumPeerMain、datanode、journalnode、nodemanager、metastore、hiveserver2
192.168.80.131 mysql01 mysql

1、安装包解压配置

将安装程序apache-hive-2.3.3-bin-e3base3.0.0.tar.gz拷贝到对应的一台主机如e3base01的/e3base/cdh5140/目录下

使用tar zxvf apache-hive-2.3.3-bin-e3base3.0.0.tar.gz命令进行解压

创建软连接ln -s /e3base/cdh5140/hive-1.1.0-cdh5.14.0-e3base3.0.0/ /e3base/hive

创建/e3base/cdh5140/e3-info/hive/logs目录 mkdir -p /e3base/hive/logs

2、配置环境变量

1
2
3
4
export HIVE_HOME=$IN_HOME/hive
export PATH=$HIVE_HOME/bin:$PATH

source .bash_profile

3、修改hive-env.sh文件(/e3base/hive/conf/hive-env.sh)

请注意修改这些参数中的-Xms -Xms -Xmn值符合当前主机环境,如堆内存值配置过大超过系统可用内存,会导致服务启动失败

4、修改hive-site.sh文件(/e3base/hive/conf/hive-site.sh)

在mysql对应的主机上创建hivedb数据库,hive用户,密码hive123,并授权:

1
2
3
4
5
6
create database hivedb;
show databases;
create user hive@'%' identified by 'polaris6g';
grant all on hivedb.* to hive@'%';
flush privileges;
select user,host from mysql.user;

hive-site.sh:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<configuration>
<property>
<name>hive.zookeeper.quorum</name>
<value>e3base01,e3base02,e3base03</value>
</property>
<property>
<name>hive.zookeeper.client.port</name>
<value>11001</value>
</property>
<property>
<name>hive.metastore.uris</name>
<value>thrift://192.168.229.134:15001</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://192.168.229.131:3306/hivedb?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>polaris6g</value>
</property>
</configuration>

5、修改hive-log4j.properties

hive.log.dir=/e3base/e3-info/hive/logs hive运行日志路径

6、Hive启停

(1)初始化hive元数据库

使用mysql作为hive元数据数据库,执行

1
schematool -initSchema -dbType mysql

初始化成功后会在mysql数据库中生成相应的元数据库及表,在mysql中给常用的元数据表加索引,以保证其性能。

1
2
3
4
5
6
create index ind_part_name_tbl_id on partitions(part_name,tbl_id);
create index ind_tbl_name on tbls (tbl_name);
create index ind_tbl_id on partitions (tbl_id);
create index ind_tbl_integer_idx on partition_keys (tbl_id,integer_idx);
create index ind_cd_integer_idx on columns_v2 (cd_id,integer_idx);
create index ind_name on dbs (name);

检查新增索引是否添加

1
2
3
4
5
6
7
8
9
show index from partitions;

show index from tbls;

show index from partition_keys;

show index from columns_v2;

show index from dbs;

(2)启动hive服务

确定hivedb库已初始化成功

启动metastore服务:(metastore需启动在15001端口)->通过metastore建立元数据与MySQL的映射关系

1
nohup hive --service metastore -p 15001 2>&1 >> $E3_INFO_HOME/hive/logs/metastore.log &

启动hiveserver2服务:

1
nohup hive --service hiveserver2 2>&1 >> $E3_INFO_HOME/hive/logs/hiveserver2.log &

验证是否启动:

1
2
ps -ef | grep hive
netstat -anp |grep port

(3)停止hive服务

使用ps -ef | grep hive找到hive相关的进程,使用kill指令后接进程号杀掉进程

(4)进程查看

使用ps -ef| grep hive找到hive相关的进程号(pid),输入jps后有相应的pid的RunJar则进程正常。

(5)连接hive

方式一:Hive Cli客户端验证

1
hive

方式二:Hive Beeline客户端验证(推荐)

1
beeline -u jdbc:hive2://e3base03:15002/default -n e3base

(6)应用示例:

1>创建库test

1
0: jdbc:hive2://e3base03:15002/default> create database test;

2>创建表

1
2
3
create table test.events(
number STRING, country STRING, client STRING, action STRING
) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

3>创建本地数据文件到/e3base/cdh5140

1
2
3
4
5
6
7
vi /e3base/events.csv

10123,US,android,createNote
10200,FR,windows,updateNote
10123,US,android,updateNote
10200,FR,ios,createNote
1015,US,windows,updateTag

4>向表events导入数据

1
0: jdbc:hive2://e3base03:15002/default> LOAD DATA LOCAL INPATH '/e3base/events.csv' overwrite into table test.events;

5>show语法:

1
2
3
4
5
6
7
8
9
show databases;

show schemas;

use test; show tables;

show tables in test;

desc formated tablename; --查看一张表的元数据信息

5>统计各系统使用情况

1
SELECT client,count(*) FROM test.events GROUP BY client;

(7)退出hive模式

1
!quit
1
2
3
4
5
6
7
CREATE TABLE cardb.cars(
ID INT COMMENT '编号',
NUMBER VARCHAR(10) COMMENT '车牌号',
BRAND STRING COMMENT '品牌',
IF_RENTED BOOLEAN COMMENT '是否租出',
TIMES INT COMMENT '已租出次数'
)ROW FORMAT DELIMITED FIELDS TERMINATED BY ','