Google云计算原理

Download Report

Transcript Google云计算原理

简介
Hive的组成
Hive的数据模型
查询语言


Hive 是一个构建在Hadoop 上的数据仓库平台,其设计目标是使
Hadoop上的数据操作与传统SQL结合,让熟悉SQL编程的开发人员
能够向Hadoop平台迁移。
Hive可以在HDFS上构建数据仓库来存储结构化的数据,这些数据来
源于HDFS上的原始数据, Hive提供了类似SQL的查询语言HiveQL,
可以执行查询,变换数据等操作。通过解析,HiveQL语言在底层被
转化为相应的MapReduce操作。
◦ Hive的体系结构
JDBC/
ODBC
CLI
Web
GUI
Thrift
Server
Metastore
Driver
(Compiler,
Optimizer,
Executor)
Hive
Name
Node
Job
Tracker
Hadoop
H

Hive相关组件:
◦ 外部接口:Hive提供了例如命令行(CLI)、Web界面等用户接口,
还提供了应用程序接口(API)例如 JDBC,ODBC等。
◦ Thrift服务器:Hive Thrift服务器是一种跨语言服务的可伸缩软件
框架。它结合律功能强大的软件堆栈的代码生成引擎,可以无缝的
与C++、C#、Java、Python、PHP和Ruby结合。Thrift允许用户
简单地定义文件中的数据类型和服务接口,编译器生成代码来实现
RPC客户端和服务器之间的通信。
Hive内部集成了Thrift服务,支持在多种语言中运行Hive命令,使
客户端可以跨平台连接Hive。

Hive相关组件:
◦ 解析器(Driver):包括解释器,编译器,优化器,执行器,通过这
一系列对HiveQL查询语句的处理,最后生成查询计划。解析器管
理着HiveQL语句在编译,优化和执行时的生命周期。当接收到一
个HiveQL查询语句时,解析器会创建一个相对的句柄,这个句柄
被用来追踪执行时间,输出行数等数据。
◦ Hadoop:数据仓库和查询计划存储在HDFS上,计算过程由
MapReduce执行。

Hive相关组件:
◦ 元数据库(Metastore):管理系统目录,通常存储在关系数据库如
MySQL,Derby中。Hive所有其他的组件都会与它进行交互。
Hive的元数据中保存了表的属性和服务信息,为查询操作提供依据,
默认的元数据库是内部的Derby,这种情况下metastore和其他
Hive服务运行在同一个Java虚拟机里,只能允许建立单个会话,要
实现多用户多会话支持,需要配置一个独立的元数据库。

数据在Hive里组织成表,分区和桶的形式
◦ 表:Hive里的表类似于关系数据库中的表。每个表都有一个对应的
HDFS目录。表中的数据被序列化后存储在该目录的文件中。
Hive提供了内置的序列化格式。用户还可以通过自定义序列化
和反序列化的方法去支持新的数据格式。每张表的序列化格式
存储在原数据库中,并在查询编译和执行时被自动调用。Hive
同时还支持数据存储在NFS,本地目录的外部表。

数据在Hive里组织成表,分区和桶的形式
◦ 分区:分区是表的部分列的集合。一个表可以有一个或者多个分区,
这些分区确定了数据在表目录下的分布情况。假设表T的数
据是在/wh/T目录下。如果T在列ds和ctry上被分区,那么
ds值为20090101和ctry值为US的数据将会被存储到
/wh/T/ds=20090101/ctry=US的目录下。
◦ 桶:在每个分区中的数据可以根据列的哈希值进一步划分成桶,每
个桶在分区目录下都存在一个文件中。

Hive支持的数据类型(基本类型)
基本类型
大小
描述
TINYINT
1字节
有符号整数
SMALLINT
2字节
有符号整数
INT
4字节
有符号整数
BIGINT
8字节
有符号整数
FLOAT
4字节
单精度浮点数
DOUBLE
8字节
双精度浮点数
~
取true/false
BOOLEAN
STRING
最大2GB
字符串,类似于sql的varchar

Hive支持的数据类型(复杂类型)
复杂类型
大小
描述
ARRAY
不限
一组有序字段,字段类型必须相
同
MAP
不限
无序键值对,键值内部字段类型
必须相同
STRUCT
不限
一组字段,字段类型可以不同

Hive提供了类似于SQL的查询语言 HiveQL。
◦ HiveQL支持选择,投影,连接,聚合,合并以及From中
嵌套的子查询语句。
◦ HiveQL允许在创建表的时候申明表的序列化格式,分区等
HiveQL目前不支持行的删除和更新。
◦ HiveQL支持多表的插入操作。

HiveQL的常用操作
◦ 创建表:创建一张名为userinfo的表,表中有两列id和name,
Hive Shell中的创建命令为:
create table userinfo (id int, name string) row format delimited fields
terminated by ‘\t’;
row format delimited fields terminated by ‘\t 是HiveQL特有的,用来指定数据
的分隔方式
◦ 导入数据:建表后可以从本地文件系统或HDFS中导入数据文件,
导入命令如下:
load data local inpath ‘/home/hadoop/1’ overwrite into table userinfo

HiveQL的常用操作
◦ 创建分区:创建一张名为userinfo的表,表中有两列id和name,
并且对name进行分区,创建命令为:
create table userinfo (id int) partitioned by (name string) row format
delimited fields terminated by ‘\t’;
◦ 创建桶:可以把表或者是分区组织成桶,桶是按行分开组织特定字
段,每个桶对应一个reduce操作。在建立桶之前要设置
hive.enforce.bucketing属性,命令为:
set hive.enforce.bucketing;
hive.enforce.bucketing=true
create table userinfo (id int,name string) clusteredby (id) into 3 buckets
row format delimited fields terminated by ‘\t’;

HiveQL的常用操作
◦ 多表插入:在同一条语句中,把读取的同一份元数据插入到不同表
中。
from userinfo insert overwrite table t1 select id,name insert overwrite
table t2 select count(distinct id),name group by name
◦ 修改表:重命名表,增加数据列
alter table userinfo rename to userinfo1
alter talbe userinfo1 add colums (grade string);

HiveQL的常用操作
◦ 连接,HiveQL的连接分为内连接,左向外连接,右向外连接,全
外连接和半连接。例如内链节:
select userinfo.*, choice.* from userinfo join choice on (userinf.id =
choice.id);
◦ 子查询:HiveQL只能在from引导的字句中出现子查询。
select teacher, MAX(class_num) from (select teacher, count(classname) as
class_num from classinfo group by teacher)subq group by teacher;

HiveQL的扩展性
◦ HiveQL只有几十个内嵌的函数,但是可以通过编写
UDF(User-Defined Function) 来扩展功能。

Hive的UDF包括三种。
◦ UDF(User-Defined Function) 支持一个输入产生一个输
出。
◦ UDAF(User-Defined Aggregate Function) 支持多个输
入一个输出。
◦ UDTF(Uers-Defined Table-Generating Function) 支
持一个输入多个输出。

UDF编程示例
◦ UDF类必须继承自org.apache.hadoop.hive.ql.exec.UDF 类,
并且实现evaluate方法。下面为对一个查询结果进行大小
转化的UDF。
package com.cstore
Import org.apache.hadoop.hive.ql.UDF;
….
Public class lowerORupper extends UDF
{
public Text evalute(Text t, String up_or_lower)
{…….}
}

UDAF编程示例
◦ UDAF类必须继承自org.apache.hadoop.hive.ql.exec.UDAF 类,并且在
内部类中实现 org.apache.hadoop.hive.ql.exec.UDAFEvaluator接口,
UDAFEvaluator接口有五个方法:
◦ 1. init 方法负责对中间结果实现初始化;
◦ 2. iterate 接收传入的参数,并进行内部的转化,其返回值类型为
boolean;
◦ 3. terminatePartial 没有参数,负责返回iterate函数轮转后的数据;
◦ 4. merge 接收 terminatePartial的返回结果,合并接收的中间值,返回
类型为boolean;
◦ 5. terminate返回最终结果。