[转][转]使用 Hive 构建数据库
当您需要处理大量数据时,存储它们是一个不错的选择。令人难以置信的发现或未来预测不会来自未使用的数据。大数据是一个复杂的怪兽。用 Java™ 编程语言编写复杂的 MapReduce 程序要耗费很多时间、良好的资源和专业知识,这正是大部分企业所不具备的。这也是在 Hadoop 上使用诸如 Hive 之类的工具构建数据库会成为一个功能强大的解决方案的原因。
作者: Peter J. Jamack,
来源: http://www.ibm.com/developerworks/cn/data/library/bd-hivelibrary/index.html
如果一家公司没有资源构建一个复杂的大数据分析平台,该怎么办?当业务智能 (BI)、数据仓库和分析工具无法连接到 Apache Hadoop 系统,或者它们比需求更复杂时,又该怎样办?大多数企业都有一些拥有关系数据库管理系统 (RDBMSes) 和结构化查询语言 (SQL) 经验的员工。Apache Hive 允许这些数据库开发人员或者数据分析人员使用 Hadoop,无需了解 Java 编程语言或者 MapReduce。现在,您可以设计星型模型的数据仓库,或者常态化的数据库,而不需要挑战 MapReduce 代码。忽然之间,BI 和分析工具,比如 IBM Cognos® 或者 SPSS® Statistics,就可以连接到 Hadoop 系统。
数据库
构建数据库,并且能够使用这些数据,这不是 Hadoop 或者数据库问题。多年以来,人们一直习惯将数据组织到库中。有许多由来已久的问题:如何将数据分门别类?如何将所有数据连接到集成的平台、机箱或者 库?多年来,各种方案层出不穷。
人们发明了很多方法,比如 Dewey Decimal 系统。他们将通讯录中的人名或企业名按照字母顺序排列。还有金属文件柜、带货架的仓库、地址卡文件系统,等等。雇主尝试用时间卡,打卡器以及时间表追踪员工。人们需要结构化和组织化数据,还需要反映和检查这些数据。如果您无法访问、结构化或理解这些数据,那么存储这么多的数据有什么实际意义呢?
RDBMSes 使用了过集合论和第三范式。数据仓库有 Kimball、Inmon、星型模型、Corporate Information Factory,以及专用数据集市。他们有主数据管理、企业资源规划、客户关系管理、电子医疗记录和其他许多系统,人们使用这些系统将事务组织到某种结构和主题中。现在,我们有大量来自各个行业的非机构化或半结构化数据,例如,社交媒体、邮件、通话记录、机械指令、远程信息,等等。这些新数据需要集成到存储结构化的新旧数据的非常复杂、非常庞大的系统中。如何分类才能使得销售经理能够改进报告?如何构建库才能使得执行主管能够访问图表和图形?
您需要找到一种将数据结构化到数据库的方法。否则,只是拥有大量只有数据科学家才能访问数据。有时,人们只是需要简单的报告。有时,他们只是想要拖拽或者编写 SQL 查询。
大数据、Hadoop 和 InfoSphere BigInsights
本小节将向您介绍 InfoSphere® BigInsights™,以及它与 Hadoop、大数据、Hive、数据库等有何联系。InfoSphere BigInsights 是 Hadoop 的 IBM 分区。您可能对 Apache 和 Cloudera 比较了解,但是业内许多人都曾涉足 Hadoop。它开始于开源的使用 MapReduce 的 Hadoop 和 Hadoop 分布式文件系统 (HDFS),通常还包括其他工具,比如 ZooKeeper、Oozie、Sqoop、Hive、Pig 和 HBase。这些发布版与普通 Hadoop 的区别在于它们被添加在 Hadoop 顶层。InfoSphere BigInsights 就属于这一类版本。
您可以在 Hadoop 的 Cloudera 版本之上使用 InfoSphere BigInsights。此外,InfoSphere BigInsights 提供一个快速的非结构化的分析引擎,您可以将它和 InfoSphere Streams 结合在一起使用。InfoSphere Streams 是一个实时的分析引擎,它开创了联合实时分析和面向批次的分析的可能。
InfoSphere BigInsights 还拥有内置的、基于浏览器的电子表格 BigSheets。这个电子表格允许分析人员每天以电子表格样式使用大数据和 Hadoop。其他功能包括基于角色的安全和管理的 LDAP 集成;与 InfoSphere DataStage® 的集成,用于提取、转换、加载 (ETL);常用的使用案例的加速器,比如日志和机器数据分析;包含常用目录和可重复使用工作的应用目录;Eclipse 插件;以及 BigIndex,它实际上是一个基于 Lucene 的索引工具,构建于 Hadoop 之上。
您还可以使用 Adaptive MapReduce、压缩文本文件、自适应调度增强来提高性能。此外,您还可以集成其他应用,例如,内容分析和 Cognos Consumer Insights。
Hive
Hive 是一个强大的工具。它使用了 HDFS,元数据存储(默认情况下是一个 Apache Derby 数据库)、shell 命令、驱动器、编译器和执行引擎。它还支持 Java 数据库连接性 (JDBC) 连接。 由于其类似 SQL 的能力和类似数据库的功能,Hive 能够为非编程人员打开大数据 Hadoop 生态系统。它还提供了外部 BI 软件,例如,通过 JDBC 驱动器和 Web 客户端和 Cognos 连接。
您可以依靠现有的数据库开发人员,不用费时费力地寻找 Java MapReduce 编程人员。这样做的好处在于:您可以让一个数据库开发人员编写 10-15 行 SQL 代码,然后将它优化和翻译为 MapReduce 代码,而不是强迫一个非编程人员或者编程人员写 200 行代码,甚至更多的复杂 MapReduce 代码。
Hive 常被描述为构建于 Hadoop 之上的数据仓库基础架构。事实是,Hive 与数据仓库没有什么关系。如果您想构建一个真实的数据仓库,可以借助一些工具,比如 IBM Netezza。但是如果您想使用 Hadoop 构建一个数据库,但又没有掌握 Java 或者 MapReduce 方面的知识,那么 Hive 会是一个非常不错的选择(如果您了解 SQL)。Hive 允许您使用 Hadoop 和 HBase 的 HiveQL 编写类似 SQL 的查询,还允许您在 HDFS 之上构建星型模型。
Hive 与 RDBMSes
Hive 是一个读模式 系统,而 RDBMSes 是一个典型的写模式 系统。传统的 RDMBSes 在编写数据时验证模型。如果数据与结构不符,则会遭到拒绝。Hive 并不关心数据的结构,至少不会在第一时间关心数据结构,它不会在您加载数据时验证模型。更确切地说,只在您运行查询之后,它才会关心该模型。
Hive 的限制
在使用 Hive 时可能会有一些挑战。首先,它与 SQL-92 不兼容。某些标准的 SQL 函数,例如 NOT IN
、 NOT LIKE
和 NOT EQUAL
并不存在,或者需要某种工作区。类似地,部分数学函数有严格限制,或者不存在。时间戳或者 date
是最近添加的值,与 SQL 日期兼容性相比,更具有 Java 日期兼容性。一些简单功能,例如数据差别,不能正常工作。
此外,Hive 不是为了获得低延时的、实时或者近乎实时的查询而开发的。SQL 查询被转化成 MapReduce,这意味着与传统 RDBMS 相比,对于某种查询,性能可能较低。
另一个限制是,元数据存储默认情况下是一个 Derby 数据库,并不是为企业或者生产而准备。部分 Hadoop 用户转而使用外部数据库作为元数据存储,但是这些外部元数据存储也有其自身的难题和配置问题。这也意味着需要有人在 Hadoop 外部维护和管理 RDBMS 系统。
安装 InfoSphere BigInsights
这个棒球运动数据示例向您展示了在 Hive 中如何从平面文件构建常用的数据库。虽然这个示例比较小,但它显示了使用 Hive 构建数据库有多么轻松,您可以使用该数据运行统计数据,确保它符合预期。将来尝试组织非结构数据时就无需检查那些信息。
完成数据库构建之后,只要连接到 Hive JDBC,就可以使用任何语言构建 Web 或者 GUI 前端。(配置和设置一个 thrift 服务器,Hive JDBC 是另一个话题)。我使用 VMware Fusion 在我的 Apple Macbook 上创建了一个 InfoSphere BigInsights 虚拟机 (VM)。这是一个简单的测试,这样我的 VM 就有 1 GB 的 RAM 和 20 GB 的固态磁盘存储空间。操作系统是 CentOS 6.4 64-bit distro 的 Linux®。您还可以使用某些工具,例如 Oracle VM VirtualBox,如果您是 Windows® 用户,那么您还可以使用 VMware Player 创建 InfoSphere BigInsights VM。(在 Fusion 上设置 VM、VMware Player 或者 VirtualBox 不在本文的讨论范围之内。)
从下载 IBM InfoSphere BigInsights 基础版开始(参阅 参考资料)。您需要有一个 IBM ID,或者您可以注册一个 ID,然后下载 InfoSphere BigInsights 基础版。
输入和分析数据
现在,您可以在任何地方获取数据。绝大多数网站都提供了逗号分隔值 (CSV) 格式的数据:天气、能源、运动、金融和博客数据。例如,我使用来自 Sean Lahman 网站的结构化数据。使用非结构化数据会费力一些。
首先 下载 CSV 文件(参见 图 1)。
图 1. 下载示例数据库
如果您宁愿在一个更手动的环境中,那么可以从 Linux® 完成它,您需要创建一个目录,然后运行 wget
:
$ Sudo mkdir /user/baseball. sudo wget http://seanlahman.com/files/database/lahman2012-csv.zip
该数据使用了 Creative Commons Attribution-ShareAlike 3.0 Unported 许可。
压缩文件在 CSV 文件中,包含了棒球和棒球运动员的统计数据。示例中包含四个主表,每个表都只有一个列(Player_ID):
- Master table.csv— 运动员姓名、出生日期和生平信息
- Batting.csv— 击球统计
- Pitching.csv— 投球统计
- Fielding.csv— 接球统计
辅表:
- AllStarFull.csv— 全明星阵容
- Hall of Fame.csv— 名人堂投票数据
- Managers.csv— 管理统计
- Teams.csv— 年度统计和排名
- BattingPost.csv— 赛季后的击球统计
- PitchingPost.csv— 赛季后的投球统计
- TeamFranchises.csv— 加盟信息
- FieldingOF.csv— 场外位置数据
- FieldingPost.csv— 赛季后的现场数据
- ManagersHalf.csv— 经纪人的分季数据
- TeamsHalf.csv— 团队的分季数据
- Salaries.csv— 球员薪资数据
- SeriesPost.csv— 赛季后系列信息
- AwardsManagers.csv— 经纪人奖项
- AwardsPlayers.csv— 球员奖项
- AwardsShareManagers.csv— 经纪人奖项投票
- AwardsSharePlayers.csv— 球员奖项投票
- Appearances.csv
- Schools.csv
- SchoolsPlayers.csv
设计数据库
设计数据库的大部分内容已经完成。Player_ID 是四个主表(Master、Batting、Pitching 和 Fielding)的主键。(为了更好地理解表格结构和依赖性,请阅读 Readme2012.txt。)
设计非常简单:主表是通过 Player_ID 连接的。Hive 并没有真的使用主键或者引用完整性的概念。Schema on Read 意味着 Hive 会摒弃您输入到表格中的所有内容。如果文件是混乱无序的,那么可能需要寻求连接它们的最佳方法 。此外,在将数据加载到 HDFS 或 Hive 之前,需要进行一些转化。根据 Schema on Rea 原理,不良数据在 Hive 中将彻底变成不良数据。这就是数据分析(无论是源级别的或者 HDFS 级别的)是一个重要步骤的原因。没有数据分析,最终获得的原始数据没有人可以使用。幸运的是,这个棒球的示例包含一些数据,这些数据在您输入 Hadoop 之前,已经被清理和组织到一起。
将数据加载到 HDFS 或者 Hive
将数据加载到 Hadoop 使用了很多不同的理论和实践。有时,您可以将原始文件直接输入到 HDFS。您可能会创建一个目录和子目录来组织文件,但是将文件从一个地方复制或移动到另一个位置是一个简单的过程。
就这个示例来说,只需发出 put
命令,然后创建一个名为 baseball 的目录即可:
Hdfs dfs -mkdir /user/hadoop/baseball hdfs dfs -put /LOCALFILE /user/hadoop/baseball
使用 Hive 构建数据库
随着数据分析和设计的完成,下一步就是构建数据库了。
虽然我没有介绍所有的示例,但是,如果跟随我构建了第一个示例,那么您就能够了解如何完成剩下的步骤。我通常会构建一些 SQL 文本脚本,然后将它们输入或者粘贴到 Hive。其他人可以使用 Hue 或其他工具来构建数据库和表格。
为了简便起见,我们使用了 Hive Shell。高级步骤是:
- 创建棒球数据库
- 创建表格
- 加载表格
- 验证表格是正确的
您会看到一些选项,例如,创建外部或者内部数据库和表格,但是在这个示例中,需要遵守内部默认设置。实际上,内部的 就意味着 Hive 处理了内部存储的数据库。清单 1 说明了 Hive shell 的流程。
清单 1. 创建数据库
$ Hive Create Database baseball; Create table baseball.Master ( lahmanID int, playerID int, managerID int, hofID int, birthyear INT, birthMonth INT, birthDay INT, birthCountry STRING, birthState STRING, birthCity STRING, deathYear INT, deathMonth INT, deathDay INT, deathCountry STRING, deathState STRING, deathCity STRING, nameFirst STRING, nameLast STRING, nameNote STRING, nameGive STRING, nameNick STRING, weight decimal, height decimal, bats STRING, throws STRING, debut INT, finalGame INT, college STRING, lahman40ID INT, lahman45ID INT, retroID INT, holtzID INT, hbrefID INT ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ;
其他所有表也都遵守这个程序。为了将数据加载到 Hive 表,将会再次打开 Hive shell,然后运行以下代码:
$hive LOAD DATA LOCAL INPATH Master.csv OVERWRITE INTO TABLE baseball.Master;
使用 Hive 构建标准化数据库
这个棒球的数据库或多或少是标准化的:有四个主表和几个辅表。再次重申,Hive 是一个 Schema on Read,因此您必须完成数据分析和 ETL 阶段的大部分工作,因为没有传统 RDBMSes 中的索引或者引用完整性。如果您想要使用索引功能,那么下一步应该使用类似 HBase 的工具。请查看 清单 2 中的代码。
清单 2. 运行一个查询
$ HIVE Use baseball; Select * from Master; Select PlayerID from Master; Select A.PlayerID, B.teamID, B.AB, B.R, B.H, B.2B, B.3B, B.HR, B.RBI FROM Master A JOIN BATTING B ON A.playerID = B.playerID;
结束语
这就是 Hive 的优势以及构建数据库的好处:它为混沌的世界创建了结构。和我们喜欢讨论的非结构化或半结构化数据一样,它最终还是要了解谁可以分析数据,谁能基于它运行报告,以及您如何能够让它快速投入到工作中。大多数用户将 Hive 视为某种黑盒:他们不在意数据来自何处,也不在乎需要做什么才能以正确格式获取数据。也不会在意集成或者验证这些数据有多么困难,只要这些数据是精确的。这通常意味着您必须有组织和结构。否则,您的数据库会成为一个永久存储无限制数据的死区,没人能够或者想要使用这些数据。
结构复杂的数据仓库已经风光不再。虽然近年情况有所好转,但是概念还是一样:这是一个业务,业务用户想要结果,而不是编程逻辑。这就是在 Hive 中构建数据库会成为正确开端的原因。
下载
描述 | 名字 | 大小 |
---|---|---|
样例 CSV 文件 | lahman2012-csv.zip | 11MB |