数据仓库概念
数据仓库是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合,用于支持管理决策。
传统的数据仓库是数据存储产品也是数据处理分析产品,能同事支持数据的存储和处理分析
传统数据仓库所面临的挑战
- 无法满足快速增长的海量数据存储需求
- 无法有效处理不同类型的数据
- 计算和处理能力不足
构建在Hadoop平台之上的Hive
Hive本身不支持数据存储和处理,为用户提供了一种编程语言HiveQL,用户根据提供HiveQL语句,来运行具体的MapReduce任务,支持类似SQL的接口, 很容易进行移植。Hive是一个可以提供有效合理直观组织和使用数据的分析工具
Hive有两个方面的特性:
- 采用批处理方式处理海量数据
数据仓库存储是静态数据,对静态数据的分析适合采用批处理方式, 不需要快速响应给出结果,而且数据本身也不会频繁发生 - Hive提供了适合数据仓库的一系列对数据进行提取、转换、加载(ETL)的工具
可以存储、查询和分析存储在Hadoop的大规模数据。这些工具能够很好地满足数据仓库各种应用场景
Pig和Hive应用场景的区别:
- Pig主要用于数据仓库的ETL环节
- Hive主要用于数据仓库海量数据的批处理分析
Hive在企业中的应用
Hive的系统架构
Hive系统架构中三个核心模块
- 用户接口,Hive对外访问接口
- CLI :一种命令行工具
- HWI : Hive Web Interface 是一种Web接口
- JDBC和ODBC:开放数据库连接接口很多应用开发都支持
- Thrift Server:基于Thrift架构开发的接口,允许外界通过这个接口,实现Hive仓库的RPC掉调用
- 驱动模块
包含编译器、优化器、执行器,负责把Hive QL语句转换为一系列MapReduce作业 - 元数据存储模块
是一个独立的关系型数纪库,通过MySQL数据库来存储HIve的元数据
除了用CLI和HWI工具来访问Hive外,还可以采用以下几种典型外部访问工具:
- Karmasphere
Karmasphere是由Karmasphere公司发布的一个商业产品。可以直接访问Hadoop里面结构化和非结构化的数据,可以运用SQL及其他语言,可以用于Ad Hoc查询和进一步的分析;还为开发人员提供了一种图形化环境,可以在里面开发自定义算法,为应用程序和可重复的生产流程创建实用的数据集。 - Hue是由Cloudera提供的一个开源项目。是运营和开发Hadoop应用的图形化用户界面;Hue程序被整合到一个类似桌面的环境,以web程序的形式发布,对于单独的用户来说不需要额外的安装。
- Qubole公司提供了“Hive即服务”的方式。托管在AWS平台,这样用户在分析存储在亚马逊S3云中的数据集时,就无需了解Hadoop系统管理;提供的Hadoop服务能够根据用户的工作负载动态调整服务器资源配置,实现随需计算。
Hive的工作原理
SQL语句转换成MapReduce作业的基本原理
连接(join)实现的基本原理
- 编写Map处理逻辑
- Map处理逻辑输入关系数据库的表
- 通过Map进行转换,生产一系列的键值对
在Map阶段,表user中记录(uid,name)映射为键值对(uid,<1,name>),表order中记录(uid, orderid)映射为键值对(uid,<2,orderid >)。1,2是表user和order的标记位。
在Shuffle、Sort阶段,(uid,<1,name>)和(uid,<2, orderid >)按键uid的值进行哈希,然后传送给对应的Reduce机器执行,并在该机器上按表的标记位对这些键值对进行排序。比如,(1,<1,Lily>)、(1,<2,101>)和(1,<2,102>)传送到同一台Reduce机器上,并按该顺序排序。
在Reduce阶段,对同一台Reduce机器上的键值对,根据表标记位对来自不同表的数据进行笛卡尔积连接操作,以生成最终的连接结果。
分组(group by)实现的基本原理
在Map阶段,表score中记录(rank,level)映射为键值对(<rank,level> , count(rank,level)),比如,score表的第一片段中有两条记录,所以键值对为(<A,1> ,2)。
在Shuffle、Sort阶段,(<rank,level> ,count(rank,level))按键<rank,level>的值进行哈希,然后传送给对应的Reduce机器执行,并在该机器上按<rank,level>的值对这些键值对进行排序。比如,(<A,1>,2)和(<A,1>,1)传送到同一台Reduce机器上,按到达顺序排序
在Reduce阶段,对Reduce机器上的这些键值对,把具有相同<rank,level>键的所有count(rank,level)值进行累加,生成最终结果。
Hive种SQL查询转换成MapReduce作业的过程
当用户向Hive输入一段命令或查询时,Hive需要与Hadoop交互工作来完成该操作。
首先,驱动模块接收该命令或查询编译器。接着,对该命令或查询进行解析编译。然后,由优化器对该命令或查询进行优化计算。最后该命令或查询通过执行器进行执行。
具体可分为以下7步:
- 由Hive驱动模块中的编译器对用户输入的SQL语言进行词法和语法解析,将SQL语句转化为抽象语法树的形式,这种语法树无法直接进行MapReduce任务的
- 抽象语法树的结构仍然很复杂,不方面直接翻译为MapReduce算法程序,因此,需要把抽象语法树转化为查询块
- 把查询块转换成逻辑查询计划,里面包含了许多逻辑操作符
- 重写逻辑查询计划,进行优化合并多余操作,减少MapReduce任务数量
- 将第四步中的逻辑操作符转换成需要执行的具体MapReduce任务
- 对生成的MapReduce任务进行优化生成最终的MapReduce任务执行计划
- 由Hive驱动模块中的执行器对最终的MapReduce任务进行执行输出
当启动MapReduce程序时,Hive本身是不会生成MapReduce算法程序的。需要通过一个表示“job执行计划”的XML文件驱动执行内置的、原生的Mapper和Reducer模块。
Hive通过和JobTracker通信来初始化MapReduce任务,不必直接部署在JobTracker所在的管理节点上执行。
通常在大型集群上,会有专门的网关机来部署Hive工具。网关机的作用主要是远程操作和管理节点上的JobTracker通信,来执行任务。
数据文件通常存储在HDFS上,HDFS由NameNode节点管理
Hive的基本操作
- create:创建数据库、表、视图
- 创建数据库
create database hive;
create database if not exists hive;
- 创建表
use hive;
create table if not exists usr(id bigint, name string, age int) location '/usr/local/hive/warehouse/hive/sur';
- 创建视图
create view little_usr as select id, age from usr;
- show: 查看数据库、表、视图
- 查看数据库:
show database;
show database like 'h.*';
- 查看所有的表和视图:
use hive;
show tables
show tables in hive like 'u.*';
- 向表中装载数据
- 把对用目录下的数据文件中的数据装载进usr表并覆盖原有数据
load data local inpath 'usr/local/data' overwrite into table ust;
- 把对应目录下的数据文件中的数据装载进usr表不覆盖原有数据
load data local inpath '/usr/local/data' into table usr
- 把分布式文件系统的数据文件数据装载进usr表并覆盖原有数据
load data inpath 'hdfs://master_server/usr/local/data' overwrite into table usr;
- 向表中插入数据或从表中导出数据
- 向表usr中插入来自usr1表中的数据并覆盖原有的数据
insert overwrite table usr select * from usr1 where age=10;
- 向表usr中插入来自usr1表总的数据并追加到原来的数据后面
insert into table usr select * from usr where age=10;
Hive应用实例之WordCount
- 创建Input目录,在本地创建input目录
mkdir input
- 在input目录下创建两个测试文件file1.txt和file2.txt
echo "hello world ">file1.txt
,exho "hello hadoop">file2.txt
- 进入hive命令行界面,编写HiveQL语句实现WordCount算法
create table docs(line string);
load data inpath 'input' overwrite into table docs;
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;
WordCount算法在MapReduce中的编程实现和Hive中的编程实现的不同点:
- Hive的代码量少
- MaoReduce需要事先编译生成jar文件来执行算法