前言
Hive
是Hadoop
生态系统中必不可少的一个工具,它提供了一种SQL
(结构化查询语言)方言,可以查询存储在Hadoop
分布式文件系统(HDFS
)中的数据或其他和Hadoop
集成的文件系统,如MapRFS
、Amazon
的S
3和像HBase
(Hadoop
数据库)和Cassandra
这样的数据库中的数据
第1章 基础知识
Hadoop
生态系统就是为处理如此大数据集而产生的一个合乎成本效益的解决方案。Hadoop
实现了一个特别的计算模型,也就是MapReduce
,其可以将计算任务分割成多个处理单元然后分散到一群家用的或服务器级别的硬件机器上,从而降低成本并提供水平可伸缩性。这个计算模型的下面是一个被称为Hadoop
分布式文件系统(HDFS
)的分布式文件系统。这个文件系统是“可插拔的Hive
提供了一个被称为Hive
查询语言(简称HiveQL
或HQL
)的SQL
方言,来查询存储在Hadoop
集群中的数据Hive
可以将大多数的查询转换为MapReduce
任务(job
),进而在介绍一个令人熟悉的SQL
抽象的同时,拓宽Hadoop
的可扩展性Hive
最适合于数据仓库应用程序,使用该应用程序进行相关的静态数据分析,不需要快速响应给出结果,而且数据本身不会频繁变化Hive
不是一个完整的数据库。Hadoop
以及HDFS
的设计本身约束和局限性地限制了Hive
所能胜任的工作。其中最大的限制就是Hive
不支持记录级别的更新、插入或者删除操作。但是用户可以通过查询生成新表或者将查询结果导入到文件中- 因为
Hadoop
是一个面向批处理的系统,而MapReduce
任务(job
)的启动过程需要消耗较长的时间,所以Hive
查询延时比较严重。传统数据库中在秒级别可以完成的查询,在Hive
中,即使数据集相对较小,往往也需要执行更长的时间[1] Hive
不支持事务Hive
不支持OLTP
(联机事务处理)所需的关键功能,而更接近成为一个OLAP
(联机分析技术)工具
图1-1 使用
MapReduce
执行WordCount
算法
Hadoop
神奇的地方一部分在于后面要进行的Sort
(排序)和Shuffle
(重新分发)过程。Hadoop
会按照键来对键值对进行排序,然后“重新洗牌”,将所有具有相同键的键值对分发到同一个Reducer
中。这里有多种方式可以用于决定哪个Reducer
获取哪个范围内的键对应的数据
图1-2显示了
Hive
的主要“模块”以及Hive
是如何与Hadoop
交互工作的
- 对于那些更喜欢图形用户界面的用户,可以使用现在逐步出现的商业和开源的解决方案,例如
Karmasphere
发布的一个商业产品(http://karmasphere.com
),Cloudera
提供的开源的Hue
项目(https://github.com/cloudera/hue
),以及Qubole
提供的“Hive
即服务”方式(http://qubole.com
),等 Hive
最适合于数据仓库程序,对于数据仓库程序不需要实时响应查询,不需要记录级别的插入、更新和删除Hive
的替代工具中最有名的就是Pig
了(请参考http://pig.apache.org
)。Pig
是由Yahoo
!开发完成的,而同时期Fackbook
正在开发Hive
。Pig
现在同样也是一个和Hadoop
紧密联系的顶级Apache
项目Pig
被描述成一种数据流语言,而不是一种查询语言。在Pig
中,用户需要写一系列的声明语句来定义某些关系和其他一些关系之间的联系,这里每个新的关系都会执行新的数据转换过程。Pig
会查找这些声明,然后创建一系列有次序的MapReduce
任务(job
),来对这些数据进行转换,直到产生符合用户预期的计算方式所得到的最终结果- 这种步进式的数据“流”可以比一组复杂的查询更加直观。也因此,
Pig
常用于ETL
(数据抽取,数据转换和数据装载)过程的一部分,也就是将外部数据装载到Hadoop
集群中,然后转换成所期望的数据格式 - 如果用户需要
Hive
无法提供的数据库特性(如行级别的更新,快速的查询响应时间,以及支持事务)的话,那么该怎么办呢? HBase
是一个分布式的、可伸缩的数据存储,其支持行级别的数据更新、快速查询和行级事务(但不支持多行事务)HBase
的设计灵感来自于谷歌(Google
)的BigTable
,不过HBase
并没有实现BigTable
的所有特性。HBase
支持的一个重要特性就是列存储,其中的列可以组织成列族。列族在分布式集群中物理上是存储在一起的。这就使得当查询场景涉及的列只是所有列的一个子集时,读写速度会快得多- 可以像键值存储一样来使用
HBase
,其每一行都使用了一个唯一键来提供非常快的速度读写这一行的列或者列族。HBase
还会对每个列保留多个版本的值(按照时间戳进行标记),版本数量是可以配置的 HBase
使用HDFS
(或其他某种分布式文件系统)来持久化存储数据。为了可以提供行级别的数据更新和快速查询,HBase
也使用了内存缓存技术对数据和本地文件进行追加数据更新操作日志。持久化文件将定期地使用附加日志更新进行更新等操作
表1-2 没有使用
MapReduce
的分布式处理工具
第2章 基础操作
Hive
提供了这样的功能,因为CLI
可以接受e
命令这种形式。如果表mytable
具有一个字符串字段和一个整型字段,我们可以看到如下输出:Hive
中可以使用–f
文件名方式执行指定文件中的一个或者多个查询语句。按照惯例,一般把这些Hive
查询文件保存为具有.q
或者.hql
后缀名的文件
第23章 案例研究
M6d.com
M6D 的数据科学,使用 Hive 和 R
m6d
是一家面向展示广告的公司。我们所扮演的角色就是通过创建定制的机器学习算法来为广告宣传活动寻找最好的新前景- 我们团队的几个数据科学家对于统计学习使用的主要工具是
R
。R
提供了众多的包来支持众多的统计算法。更重要的是,我们对于R
具有很多的经验,我们知道其是如何执行的,并了解它们的特性,而且非常熟悉其技术文档。不过,R
的一个主要缺点是,默认情况下其需要将所有的数据集载入到内存中。这是一个主要的限制。还有就是,一旦R
中的数据比可以载入内存的数据要大时,系统就会出现内存交换,导致系统抖动并显著降低处理速度[1]
Outbrain
Outbrain 是领先的内容发现平台
- 当用户想查看网站的流量情况时,很难弄清楚这些流量实际来源于哪里,特别是来源于用户网站之外的流量情况。如果用户的网站具有很多结构不同的
URL
的话,那么就无法简单地将所有的链接URL
和用户登录页面进行匹配
对 URL 进行清洗
- 我们期望达到的目的就是可以将链入的链接分成站内的、直接链入的或其他3个分组
Determining referrer type
- 如果链入的链接是空的或者值为
null
,那么我们将其标记为直接链入的那组 - 我们可以很容易地通过如下查询来添加链接类型
Multiple URL
- 如果我们使用的是一个广告网络呢?如果我们有成百上千的网站呢?如果每个站点可以有任意数量的
URL
结构呢? - 我们可能也有一个包含每个
URL
的表,以及它属于什么类型的网站。让我们将这张表命名为site_url
,其有如下2个字段:
- 通过每个链入网址,看它是否与任何相同的站点
ID
匹配。如果是匹配的话,那么这是一个站内链接,否则不是站内链接。所以,让我们通过如下查询进行确认