离线计算系统------Hive(1)

一、 数据仓库

1. 数据仓库的基本概念

数据仓库,

英文名称为Data Warehouse,可简写为DW或DWH。数据仓库的目的是构建面向分析的集成化数据环境,为企业提供决策支持(Decision Support)。它出于分析性报告和决策支持目的而创建。

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

2. 数据仓库的主要特征

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

2.1. 面向主题

传统数据库中,最大的特点是面向应用进行数据的组织,各个业务系统可能是相互分离的。而数据仓库则是面向主题的。主题是一个抽象的概念,是较高层次上企业信息系统中的数据综合、归类并进行分析利用的抽象。在逻辑意义上,它是对应企业中某一宏观分析领域所涉及的分析对象。

操作型处理(传统数据)对数据的划分并不适用于决策分析。而基于主题组织的数据则不同,它们被划分为各自独立的领域,每个领域有各自的逻辑内涵但互不交叉,在抽象层次上对数据进行完整、一致和准确的描述。一些主题相关的数据通常分布在多个操作型系统中。

2.2. 集成性

通过对分散、独立、异构的数据库数据进行抽取、清理、转换和汇总便得到了数据仓库的数据,这样保证了数据仓库内的数据关于整个企业的一致性。

数据仓库中的综合数据不能从原有的数据库系统直接得到。因此在数据进入数据仓库之前,必然要经过统一与综合,这一步是数据仓库建设中最关键、最复杂的一步,所要完成的工作有:

(1)要统一源数据中所有矛盾之处,如字段的同名异义、异名同义、单位不统一、字长不一致,等等。

(2)进行数据综合和计算。数据仓库中的数据综合工作可以在从原有数据库抽取数据时生成,但许多是在数据仓库内部生成的,即进入数据仓库以后进行综合生成的。

下图说明一个保险公司综合数据的简单处理过程,其中数据仓库中与“保险” 主题有关的数据来自于多个不同的操作型系统。这些系统内部数据的命名可能不同,数据格式也可能不同。把不同来源的数据存储到数据仓库之前,需要去除这些不一致。

离线计算系统------Hive(1)_第1张图片

2.3. 非易失性(不可更新性)

操作型数据库主要服务于日常的业务操作,使得数据库需要不断地对数据实时更新,以便迅速获得当前最新数据,不至于影响正常的业务运作。在数据仓库中只要保存过去的业务数据,不需要每一笔业务都实时更新数据仓库,而是根据商业需要每隔一段时间把一批较新的数据导入数据仓库。

数据仓库的数据反映的是一段相当长的时间内历史数据的内容,是不同时点

的数据库快照的集合,以及基于这些快照进行统计、综合和重组的导出数据。

数据非易失性主要是针对应用而言。数据仓库的用户对数据的操作大多是数据查询或比较复杂的挖掘,一旦数据进入数据仓库以后,一般情况下被较长时间保留。数据仓库中一般有大量的查询操作,但修改和删除操作很少。因此,数据经加工和集成进入数据仓库后是极少更新的,通常只需要定期的加载和更新。

2.4. 时变性

数据仓库包含各种粒度的历史数据。数据仓库中的数据可能与某个特定日期、星期、月份、季度或者年份有关。数据仓库的目的是通过分析企业过去一段时间业务的经营状况,挖掘其中隐藏的模式。虽然数据仓库的用户不能修改数据,但并不是说数据仓库的数据是永远不变的。分析的结果只能反映过去的情况,当业务变化后,挖掘出的模式会失去时效性。因此数据仓库的数据需要更新,以适应决策的需要。从这个角度讲,数据仓库建设是一个项目,更是一个过程 。数据仓库的数据随时间的变化表现在以下几个方面。

(1)    数据仓库的数据时限一般要远远长于操作型数据的数据时限。

(2)    操作型系统存储的是当前数据,而数据仓库中的数据是历史数据。

(3)    数据仓库中的数据是按照时间顺序追加的,它们都带有时间属性。

3. 数据仓库与数据库区别

数据库与数据仓库的区别实际讲的是 OLTP 与 OLAP 的区别。

操作型处理,叫联机事务处理 OLTP(On-Line Transaction Processing,),也可以称面向交易的处理系统,它是针对具体业务在数据库联机的日常操作,通常对少数记录进行查询、修改。用户较为关心操作的响应时间、数据的安全性、完整性和并发支持的用户数等问题。传统的数据库系统作为数据管理的主要手段,主要用于操作型处理。

分析型处理,叫联机分析处理 OLAP(On-Line Analytical Processing)一般针对某些主题的历史数据进行分析,支持管理决策。

首先要明白,数据仓库的出现,并不是要取代数据库。

  1. 数据库是面向事务的设计,数据仓库是面向主题设计的。

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

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

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

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

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

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

4、数据仓库分层架构

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

离线计算系统------Hive(1)_第2张图片

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

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

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

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

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

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

用空间换时间,通过大量的预处理来提升应用系统的用户体验(效率),因此数据仓库会存在大量冗余的数据;不分层的话,如果源业务系统的业务规则发生变化将会影响整个数据清洗过程,工作量巨大。

通过数据分层管理可以简化数据清洗的过程,因为把原来一步的工作分到了多个步骤去完成,相当于把一个复杂的工作拆成了多个简单的工作,把一个大的黑盒变成了一个白盒,每一层的处理逻辑都相对简单和容易理解,这样我们比较容易保证每一个步骤的正确性,当数据发生错误的时候,往往我们只需要局部调整某个步骤即可。

5、数据仓库元数据管理

元数据(Meta Date),主要记录数据仓库中模型的定义、各层级间的映射关系、监控数据仓库的数据状态及ETL的任务运行状态。一般会通过元数据资料库(Metadata Repository)来统一地存储和管理元数据,其主要目的是使数据仓库的设计、部署、操作和管理能达成协同和一致。

元数据是数据仓库管理系统的重要组成部分,元数据管理是企业级数据仓库中的关键组件,贯穿数据仓库构建的整个过程,直接影响着数据仓库的构建、使用和维护。

  1. 构建数据仓库的主要步骤之一是ETL。这时元数据将发挥重要的作用,它定义了源数据系统到数据仓库的映射、数据转换的规则、数据仓库的逻辑结构、数据更新的规则、数据导入历史记录以及装载周期等相关内容。数据抽取和转换的专家以及数据仓库管理员正是通过元数据高效地构建数据仓库。

  2. 用户在使用数据仓库时,通过元数据访问数据,明确数据项的含义以及定制报表。

  3. 数据仓库的规模及其复杂性离不开正确的元数据管理,包括增加或移除外部数据源,改变数据清洗方法,控制出错的查询以及安排备份等。

离线计算系统------Hive(1)_第3张图片

元数据可分为技术元数据业务元数据。技术元数据为开发和管理数据仓库的IT 人员使用,它描述了与数据仓库开发、管理和维护相关的数据,包括数据源信息、数据转换描述、数据仓库模型、数据清洗与更新规则、数据映射和访问权限等。而业务元数据为管理层和业务分析人员服务,从业务角度描述数据,包括商务术语、数据仓库中有什么数据、数据的位置和数据的可用性等,帮助业务人员更好地理解数据仓库中哪些数据是可用的以及如何使用。

由上可见,元数据不仅定义了数据仓库中数据的模式、来源、抽取和转换规则等,而且是整个数据仓库系统运行的基础,元数据把数据仓库系统中各个松散的组件联系起来,组成了一个有机的整体。

二、Hive基本概念

2.1、Hive简介

什么是Hive

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

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

为什么使用Hive

  • 直接使用hadoop所面临的问题

人员学习成本太高

项目周期要求太短

MapReduce实现复杂查询逻辑开发难度太大

 

  • 为什么要使用Hive

操作接口采用类SQL语法,提供快速开发的能力。

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

功能扩展很方便。

Hive的特点

  • 可扩展

Hive可以自由的扩展集群的规模,一般情况下不需要重启服务。

 

  • 延展性

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

 

  • 容错

良好的容错性,节点出现问题SQL仍可完成执行。

2.2、 Hive架构

架构图

离线计算系统------Hive(1)_第4张图片

基本组成

用户接口:包括CLI、JDBC/ODBC、WebGUI。其中,CLI(command line interface)为shell命令行;JDBC/ODBC是Hive的JAVA实现,与传统数据库JDBC类似;WebGUI是通过浏览器访问Hive。

元数据存储:通常是存储在关系数据库如mysql/derby中。Hive 将元数据存储在数据库中。Hive 中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。

解释器、编译器、优化器、执行器:完成HQL 查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在HDFS 中,并在随后有MapReduce 调用执行。

2.3、Hive与Hadoop的关系

Hive利用HDFS存储数据,利用MapReduce查询分析数据

离线计算系统------Hive(1)_第5张图片

2.4、Hive与传统数据库对比

1. 查询语言。由于 SQL 被广泛的应用在数据仓库中,因此,专门针对 Hive 的特性设计了类 SQL 的查询语
言 HQL。熟悉 SQL 开发的开发者可以很方便的使用 Hive 进行开发。 
2.	数据存储位置。Hive 是建立在 Hadoop 之上的,所有 Hive 的数据都是存储在 HDFS 中的。而数据库
则可以将数据保存在块设备或者本地文件系统中。 
3.	数据格式。Hive 中没有定义专门的数据格式,数据格式可以由用户指定,用户定义数据格式需要指定三
个属性:列分隔符(通常为空格、”\t”、”\x001″)、行分隔符(”\n”)以及读取文件数据的方法(Hive 中
默认有三个文件格式 TextFile,SequenceFile 以及 RCFile)。由于在加载数据的过程中,不需要从用户
数据格式到 Hive 定义的数据格式的转换,因此,Hive 在加载的过程中不会对数据本身进行任何修改,而只
是将数据内容复制或者移动到相应的 HDFS 目录中。而在数据库中,不同的数据库有不同的存储引擎,定义了
自己的数据格式。所有数据都会按照一定的组织存储,因此,数据库加载数据的过程会比较耗时。 

4.	数据更新。由于 Hive 是针对数据仓库应用设计的,而数据仓库的内容是读多写少的。因此,Hive 中不
支持对数据的改写和添加,所有的数据都是在加载的时候中确定好的。而数据库中的数据通常是需要经常进行
修改的,因此可以使用 INSERT INTO ...  VALUES 添加数据,使用 UPDATE ... SET 修改数据。 

5.	索引。之前已经说过,Hive 在加载数据的过程中不会对数据进行任何处理,甚至不会对数据进行扫描,
因此也没有对数据中的某些 Key 建立索引。Hive 要访问数据中满足条件的特定值时,需要暴力扫描整个数
据,因此访问延迟较高。由于 MapReduce 的引入, Hive 可以并行访问数据,因此即使没有索引,对于大数
据量的访问,Hive 仍然可以体现出优势。数据库中,通常会针对一个或者几个列建立索引,因此对于少量的特
定条件的数据的访问,数据库可以有很高的效率,较低的延迟。由于数据的访问延迟较高,决定了 Hive 不适
合在线数据查询。 

6.	执行。Hive 中大多数查询的执行是通过 Hadoop 提供的 MapReduce 来实现的,而数据库通常有自己的
执行引擎。 
7.	执行延迟。之前提到,Hive 在查询数据的时候,由于没有索引,需要扫描整个表,因此延迟较高。另外
一个导致 Hive 执行延迟高的因素是 MapReduce 框架。由于 MapReduce 本身具有较高的延迟,因此在利用 
MapReduce 执行 Hive 查询时,也会有较高的延迟。相对的,数据库的执行延迟较低。当然,这个低是有条件
的,即数据规模较小,当数据规模大到超过数据库的处理能力的时候,Hive 的并行计算显然能体现出优势。
 
8.	可扩展性。由于 Hive 是建立在 Hadoop 之上的,因此 Hive 的可扩展性是和 Hadoop 的可扩展性是一
致的(世界上最大的 Hadoop 集群在 Yahoo!,2009年的规模在 4000 台节点左右)。而数据库由于 ACID
 语义的严格限制,扩展行非常有限。目前最先进的并行数据库 Oracle 在理论上的扩展能力也只有 100 台左
右。 
9.	数据规模。由于 Hive 建立在集群上并可以利用 MapReduce 进行并行计算,因此可以支持很大规模的数
据;对应的,数据库可以支持的数据规模较小。

hive用于海量数据的离线数据分析

离线计算系统------Hive(1)_第6张图片

总结:hive具有sql数据库的外表,但应用场景完全不同,hive只适合用来做批量数据统计分析

2.5、Hive的数据存储

  1. Hive中所有的数据都存储在 HDFS 中,没有专门的数据存储格式(可支持Text,SequenceFile,ParquetFile,ORC格式RCFILE等)

SequenceFile是hadoop中的一种文件格式:

      文件内容是以序列化的kv对象来组织的

2、只需要在创建表的时候告诉 Hive 数据中的列分隔符和行分隔符,Hive 就可以解析数据。

3、Hive 中包含以下数据模型:DB、Table,External Table,Partition,Bucket。

  • db:在hdfs中表现为${hive.metastore.warehouse.dir}目录下一个文件夹

  • table:在hdfs中表现所属db目录下一个文件夹

  • external table:与table类似,不过其数据存放位置可以在任意指定路径

  • partition:在hdfs中表现为table目录下的子目录

  • bucket:在hdfs中表现为同一个表目录下根据hash散列之后的多个文件

2.6、HIVE的安装部署

我们在此处选择第三台机器作为我们hive的安装机器

2.6.1 安装

2.6.1.1、derby版hive直接使用

1、解压hive

cd /export/softwares
tar -zxvf hive-1.1.0-cdh5.14.0.tar.gz -C ../servers/

离线计算系统------Hive(1)_第7张图片

  1. 直接启动  bin/hive

cd ../servers/
cd hive-1.1.0-cdh5.14.0/
bin/hive
hive> create database mytest;

离线计算系统------Hive(1)_第8张图片

缺点:多个地方安装hive后,每一个hive是拥有一套自己的元数据,大家的库、表就不统一;

2.6.1.2、使用mysql共享hive元数据

mysql数据库的安装(使用rpm包的方式进行安装,不推荐)
第一步:查看系统自带的mysql的rpm包
rpm -qa | grep mysql
rpm -e mysql-libs-5.1.73-8.el6_8.x86_64 --nodeps

离线计算系统------Hive(1)_第9张图片

第二步:安装mysql的rpm包

rpm   -ivh  *.rpm

离线计算系统------Hive(1)_第10张图片

第三步:启动mysql的服务
service  mysqld  start


第四步:查看mysql初始化密码
more /root/.mysql_secret

离线计算系统------Hive(1)_第11张图片

第五步:使用随记密码登录mysql并更新密码
mysql  -uroot –p 
SET PASSWORD = PASSWORD('123456');

第六步:开启mysql远程连接
grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;
flush privileges;

第七步:设置mysql的开机启动
chkconfig --add mysqld
chkconfig mysqld on

mysql数据库的安装(使用yum源进行安装,强烈推荐)
第一步:在线安装mysql相关的软件包
yum  install  mysql  mysql-server  mysql-devel
第二步:启动mysql的服务
/etc/init.d/mysqld start
第三步:通过mysql安装自带脚本进行设置
/usr/bin/mysql_secure_installation
第四步:进入mysql的客户端然后进行授权
 grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;
 flush privileges;

离线计算系统------Hive(1)_第12张图片

离线计算系统------Hive(1)_第13张图片

离线计算系统------Hive(1)_第14张图片

离线计算系统------Hive(1)_第15张图片

修改hive的配置文件

修改hive-env.sh 

添加我们的hadoop的环境变量
cd  /export/servers/hive-1.1.0-cdh5.14.0/conf
cp hive-env.sh.template hive-env.sh
vim hive-env.sh




HADOOP_HOME=/export/servers/hadoop-2.6.0-cdh5.14.0
# Hive Configuration Directory can be controlled by:
export HIVE_CONF_DIR=/export/servers/hive-1.1.0-cdh5.14.0/conf

离线计算系统------Hive(1)_第16张图片

修改hive-site.xml
cd /export/servers/hive-1.1.0-cdh5.14.0/conf
vim hive-site.xml



        
                javax.jdo.option.ConnectionURL
                jdbc:mysql://node03.hadoop.com:3306/hive?createDatabaseIfNotExist=true
        

        
                javax.jdo.option.ConnectionDriverName
                com.mysql.jdbc.Driver
        
        
                javax.jdo.option.ConnectionUserName
                root
        
        
                javax.jdo.option.ConnectionPassword
                123456
        
        
                hive.cli.print.current.db
                true
        
        
                hive.cli.print.header
                true
        
        
                hive.server2.thrift.bind.host
                node03.hadoop.com
        


上传mysql的lib驱动包
将mysql的lib驱动包上传到hive的lib目录下
cd /export/servers/hive-1.1.0-cdh5.14.0/lib
将mysql-connector-java-5.1.38.jar 上传到这个目录下

2.6.2 使用方式

第一种交互方式:Hive交互shell
cd /export/servers/hive-1.1.0-cdh5.14.0
bin/hive

查看所有的数据库
hive (default)> show databases;

创建一个数据库
hive (default)> create database myhive;
使用该数据库并创建数据库表
hive (default)> use myhive;
hive (myhive)> create table test(id int,name string);

以上命令操作完成之后,一定要确认mysql里面出来一个数据库hive
第二种交互方式:Hive JDBC服务
启动hiveserver2服务
前台启动
cd  /export/servers/hive-1.1.0-cdh5.14.0
bin/hive --service hiveserver2

后台启动
cd  /export/servers/hive-1.1.0-cdh5.14.0
nohup bin/hive --service hiveserver2  &

离线计算系统------Hive(1)_第17张图片

beeline连接hiveserver2
bin/beeline
beeline> !connect jdbc:hive2://node03.hadoop.com:10000

离线计算系统------Hive(1)_第18张图片

注意:如果使用beeline方式连接hiveserver2,一定要保证hivemysql当中的元数据库已经创建成功,不然就会拒绝连接

第三种交互方式:Hive命令
使用 –e  参数来直接执行hql的语句
bin/hive -e "use myhive;select * from test;"

使用 –f  参数通过指定文本文件来执行hql的语句
vim hive.sql
use myhive;select * from test;

bin/hive -f hive.sql

更多参数参考以下

离线计算系统------Hive(1)_第19张图片

你可能感兴趣的:(离线计算系统------Hive(1))