赞
踩
数据仓库(Data Warehouse)是一个面向主题的(Subject Oriented)、集成(Integrated)、相对稳定的(Non-Volatile)、反映历史变化(Time Variant)的数据集合,用于支持管理决策。
图1 数据仓库的体系结构
Hive具有的特点非常适用于数据仓库:
1.采用批处理方式处理海量数据
2.提供适合数据仓库操作的工具
图2 Hadoop生态系统
对比项目 | Hive | 传统数据库 |
---|---|---|
数据插入 | 支持批量导入 | 支持单条和批量导入 |
数据更新 | 不支持 | 支持 |
索引 | 支持 | 支持 |
分区 | 支持 | 支持 |
执行延迟 | 高 | 低 |
拓展性 | 好 | 有限 |
1. Hive在企业大数据分析平台中的应用
图3 企业中一种常见的大数据分析平台部署框架
2.Hive在Facebook公司中的应用
图4 Facebook的数据仓库架构
图5 Hive系统架构
1.join的实现原理
图6 join过程
2. group by的实现原理
存在一个分组(Group By)操作,其功能是把表Score的不同片段按照rank和level的组合值进行合并,计算不同rank和level的组合值分别有几条记录:
select rank, level ,count(*) as value
from score
group by rank, level
图7 group by过程
当用户向Hive输入一段命令或查询时,Hive需要与Hadoop交互工作来完成该操作:
图8 SQL查询转换成MapReduce过程
第1步:由Hive驱动模块中的编译器对用户输入的SQL语言进行词法和语法解析,将SQL语句转化为抽象语法树的形式
第2步:抽象语法树的结构仍很复杂,不方便直接翻译为MapReduce算法程序,因此,把抽象语法书转化为查询块
第3步:把查询块转换成逻辑查询计划,里面包含了许多逻辑操作符
第4步:重写逻辑查询计划,进行优化,合并多余操作,减少MapReduce任务数量
第5步:将逻辑操作符转换成需要执行的具体MapReduce任务
第6步:对生成的MapReduce任务进行优化,生成最终的MapReduce任务执行计划
第7步:由Hive驱动模块中的执行器,对最终的MapReduce任务进行执行输出
几点说明:
问题:在实际应用中,Hive也暴露出不稳定的问题
解决方案:Hive HA(High Availability)
图9 Hive HA基本原理
图10 Impala与其他组件关系
图11 Impala系统架构
Impala主要由Impalad,State Store和CLI三部分组成
说明:Impala中的元数据直接存储在Hive中。Impala采用与Hive相同的元数据、SQL语法、ODBC驱动程序和用户接口,从而使得在一个Hadoop平台上,可以统一部署Hive和Impala等分析工具,同时支持批处理和实时查询
图12 Impala查询过程图
Impala执行查询的具体过程:
第0步,当用户提交查询前,Impala先创建一个负责协调客户端提交的查询的Impalad进程,该进程会向Impala State Store提交注册订阅信息,State Store会创建一个statestored进程,statestored进程通过创建多个线程来处理Impalad的注册订阅信息。
第1步,用户通过CLI客户端提交一个查询到impalad进程,Impalad的
Query Planner对SQL语句进行解析,生成解析树;然后,Planner把这个查询的解析树变成若干PlanFragment,发送到Query Coordinator
第2步,Coordinator通过从MySQL元数据库中获取元数据,从HDFS的名称节点中获取数据地址,以得到存储这个查询相关数据的所有数据节点。
第3步,Coordinator初始化相应impalad上的任务执行,即把查询任务分配给所有存储这个查询相关数据的数据节点。
第4步,Query Executor通过流式交换中间输出,并由Query Coordinator汇聚来自各个impalad的结果。
第5步,Coordinator把汇总后的结果返回给CLI客户端。
图13 Impala与Hive的对比
Hive与Impala的不同点总结如下:
Hive适合于长时间的批处理查询分析,而Impala适合于实时交互式SQL查询
Hive依赖于MapReduce计算框架,Impala把执行计划表现为一棵完整的执行计划树,直接分发执行计划到各个Impalad执行查询
Hive在执行过程中,如果内存放不下所有数据,则会使用外存,以保证查询能顺序执行完成,而Impala在遇到内存放不下数据时,不会利用外存,所以Impala目前处理查询时会受到一定的限制
总结
1. Hive安装
安装Hive之前需要安装jdk1.6以上版本以及启动Hadoop
下载安装包apache-hive-1.2.1-bin.tar.gz
下载地址:http://www.apache.org/dyn/closer.cgi/hive/
解压安装包apache-hive-1.2.1-bin.tar.gz至路径 /usr/local
配置系统环境,将hive下的bin目录添加到系统的path中
2. Hive配置
Hive有三种运行模式,单机模式、伪分布式模式、分布式模式。均是通过修改hive-site.xml文件实现,如果 hive-site.xml文件不存在,我们可以参考$HIVE_HOME/conf目录下的hive-default.xml.template文件新建。
类型 | 描述 | 示例 |
---|---|---|
TINYINT | 1个字节(8位)有符号整数 | 1 |
SMALLINT | 2个字节(16位)有符号整数 1 | 1 |
INT | 4个字节(32位)有符号整数 1 | 1 |
BIGINT | 8个字节(64位)有符号整数 1 | 1 |
FLOAT | 4个字节(32位)单精度浮点数 1.0 | 1.0 |
DOUBLE | 8个字节(64位)双精度浮点数 1.0 | 1.0 |
BOOLEAN | 布尔类型,true/false true | true |
STRING | 字符串,可以指定字符集 “xmu” | “xmu” |
TIMESTAMP | 整数、浮点数或者字符串 1327882394(Unix新纪元秒) | 1327882394(Unix新纪元秒) |
BINARY | 字节数组 [0,1,0,1,0,1,0,1] | [0,1,0,1,0,1,0,1] |
ARRAY | 一组有序字段,字段的类型必须相同 | Array(1,2) |
MAP | 一组无序的键/值对,键的类型必须是原子的,值可以是任何数据类型,同一个映射的键和值的类型必须相同 | Map(‘a’,1,’b’,2) |
STRUCT | 一组命名的字段,字段类型可以不同 | Struct(‘a’,1,1,0) |
表14 Hive的集合数据类型
1. create: 创建数据库、表、视图
①.创建数据库hive
hive> create database hive;
②创建数据库hive。因为hive已经存在,所以会抛出异常,加上if not exists关键字,则不会抛出异常
hive> create database if not exists hive;
①.在hive数据库中,创建表usr,含三个属性id,name,age
hive> use hive;
hive>create table if not exists usr(id bigint,name string,age int);
②.在hive数据库中,创建表usr,含三个属性id,name,age,存储路径为“/usr/local/hive/warehouse/hive/usr”
hive>create table if not exists hive.usr(id bigint,name string,age int)
>location ‘/usr/local/hive/warehouse/hive/usr’;
①.创建视图little_usr,只包含usr表中id,age属性
hive>create view little_usr as select id,age from usr;
2. show:查看数据库、表、视图
① 查看Hive中包含的所有数据库
hive> show databases;
② 查看Hive中以h开头的所有数据库
hive>show databases like ‘h.*’;
① 查看数据库hive中所有表和视图
hive> use hive;
hive> show tables;
② 查看数据库hive中以u开头的所有表和视图
hive> show tables in hive like ‘u.*’;
3. load:向表中装载数据
① 把目录’/usr/local/data’下的数据文件中的数据装载进usr表并覆盖原有数据
hive> load data local inpath ‘/usr/local/data’ overwrite into table usr;
② 把目录’/usr/local/data’下的数据文件中的数据装载进usr表不覆盖原有数据
hive> load data local inpath ‘/usr/local/data’ into table usr;
③ 把分布式文件系统目录’hdfs://master_server/usr/local/data’下的数据文件数
据装载进usr表并覆盖原有数据
hive> load data inpath ‘hdfs://master_server/usr/local/data’
>overwrite into table usr;
4. insert:向表中插入数据或从表中导出数据
①向表usr1中插入来自usr表的数据并覆盖原有数据
hive> insert overwrite table usr1
> select * from usr where age=10;
②向表usr1中插入来自usr表的数据并追加在原有数据后
hive> insert into table usr1
> select * from usr
> where age=10;
词频统计任务要求:
首先,需要创建一个需要分析的输入数据文件
然后,编写HiveQL语句实现WordCount算法
具体步骤如下:
(1)创建input目录,其中input为输入目录。命令如下:
$ cd /usr/local/hadoop
$ mkdir input
(2)在input文件夹中创建两个测试文件file1.txt和file2.txt,
命令如下:
$ cd /usr/local/hadoop/input
$ echo “hello world” > file1.txt
$ echo “hello hadoop” > file2.txt
(3)进入hive命令行界面,编写HiveQL语句实现
WordCount算法,命令如下:
$ hive
hive> create table docs(line string);
hive> load data inpath ‘input’ overwrite into table docs;
hive>create table word_count as
select word, count(1) as count from
(select explode(split(line,’ '))as word from docs) w
group by word
order by word;
执行完成后,用select语句查看运行结果如下:
docs |
---|
hello world |
hello Hadoop |
word |
---|
hello |
world |
hello |
Hadoop |
图14 运行结果
WordCount算法在MapReduce中的编程实现和Hive中编程实现的
主要不同点:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。