HiveAws

= Hive 和 Amazon Web Services =

Background

本文档探讨了在 Amazon Web Services 上利用 Hive 的不同方式,即S3EC2Elastic Map-Reduce

Hadoop 已经有在 EC2 和 S3 上运行的悠久传统。这些在下面的链接中有明确记录,必须阅读:

第二份文档还提供了有关如何开始使用 EC2 和 S3 的指针。对于不熟悉 S3 的人-下面的S3 for n00bs 部分中有一些有用的 Comments。下面的其余文档假定 Reader 可以在 EC2 中启动 hadoop 集群,可以将文件复制到 S3 中或从中复制出来,以及运行一些简单的 Hadoop 作业。

Hive 和 AWS 简介

在 AWS 上运行 Hive 时需要考虑三个独立的问题:

  • 从何处运行Hive CLI并存储 metastore 数据库(包含表和架构定义)。

  • 如何在现有数据集(可能是 S3 中已经存在的数据集)上定义 Hive 表

  • 如何将 Hive 查询(全部使用一个或多个 map-reduce 程序执行)分配给在 EC2 中运行的 Hadoop 集群。

我们将引导您完成此处涉及的选择,并显示一些实际的案例研究,其中包含详细的设置和配置说明。

运行 Hive CLI

CLI 接收 Hive 查询,将其编译为一个计划(通常,但并非总是由 map-reduce 作业组成),然后将其提交给 Hadoop 集群。尽管它为此目的依赖于 Hadoop 库-否则它相对独立于 Hadoop 集群本身。因此,可以从具有 Hive 发行版,Hadoop 发行版,Java 运行时引擎的任何节点上运行 CLI。它可以将作业提交到可以连接到的任何兼容的 hadoop 集群(其版本与 Hive 使用的 Hadoop 库的版本匹配)。 Hive CLI 还需要访问表元数据。默认情况下,Hive 通过嵌入式 Derby 数据库将其保存到本地文件系统上名为 metastore_db 的文件夹中(但是状态可以保存在任何数据库中,包括远程 mysql 实例)。

在何处运行 Hive CLI 的方法有两种:

  • 从 EC2 内部运行 Hive CLI-Hadoop 主节点是显而易见的选择。这种方法存在几个问题:

  • 缺乏将不同版本的 Hive 和 Hadoop 发行版 Binding 在一起的综合 AMI(并且考虑到大量此类组合,这样做很困难)。 Cloudera提供了一些将 Hive 与 HadoopBinding 在一起的 AMI-尽管在 Hive 和 Hadoop 版本方面的选择可能受到限制。

  • 任何必需的 map-reduce 脚本也可能需要复制到 master/Hive 节点。

  • 如果使用默认的 Derby 数据库,则必须考虑超过一个 hadoop 集群的生存期的持久状态。 S3 是一个显而易见的选择-但是用户必须在 Hadoop 集群启动和终止时还原和备份 Hive 元数据。

2.从 EC2 外部远程运行 Hive CLI。在这种情况下,用户在个人工作站上安装了 Hive 发行版-此选项的主要技巧是连接到 Hadoop 集群-既可以提交作业,也可以将文件读写到 HDFS。 从远程计算机运行作业上的部分详细说明了如何完成此操作。 个案研究 1详细介绍了此设置。此选项解决了上述问题:

  • 可以使用库存的 Hadoop AMI。用户可以在其工作站上运行任何版本的 Hive,在 EC2 上启动具有所需 Hadoop 版本的 Hadoop 集群等,然后开始运行查询。

  • Hive 在作业提交时将 Map-reduce 脚本自动推送到 Hadoop 的分布式缓存中,不需要将其复制到 Hadoop 机器上。

  • Hive 元数据可以轻松存储在本地磁盘上。

但是-选项 2 的一个缺点是,对于每个 map-reduce 作业,jar 文件都被复制到 Hadoop 集群中。这可能导致作业提交中的高延迟,并导致一些 AWS 网络传输成本。选项 1 似乎适合高级用户,他们已经找到了适用于他们的稳定 Hadoop 和 Hive(以及潜在的外部库)配置,并且可以使用该配置创建新的 AMI。

将数据加载到 Hive 表中

遍历 Hadoop/EC2 环境的主要存储选择非常有用:

  • S3 是长期存储数据的绝佳场所。关于如何使用 S3,有两种选择:

  • 可以使用S3 for n00bs 部分中详细介绍的 aws 和 s3curl 之类的工具将数据存储为 S3 中的文件。这受到 S3 中文件大小的 5G 限制的限制。但可喜的是,可能有许多工具可以以这种方式帮助将数据复制/复制到 S3. Hadoop 能够使用 S3N 文件系统读取/写入此类文件。

    • 或者,Hadoop 使用 S3 作为后备存储提供基于块的文件系统。这不受 5G 最大文件大小限制的影响。但是,必须使用 HadoopUtil 和库来读取/写入此类文件。
  • Hadoop 集群中计算机本地驱动器上的 HDFS 实例。其生存期仅限于 Hadoop 实例的生存期-因此,这不适用于寿命长的数据。但是,它应该提供可以更快访问的数据,因此是中间/ tmp 数据的不错选择。

考虑到这些因素,Hive 表的意义如下:

  • 对于寿命长的表,请使用基于 S3 的存储机制
    2.对于中间数据和 tmp 表,请使用 HDFS

个案研究 1向您展示了如何使用 S3N 文件系统实现这种安排。

如果用户正在其个人工作站上运行 Hive CLI,则他们还可以使用 Hive 的“本地加载数据”命令(作为 dfs 命令的便捷替代方法)将数据从其本地文件系统(可从其工作站访问)复制到通过以下两种方法定义的表中 HDFS 或 S3.

将作业提交到 Hadoop 集群

当 Hive CLI 远程运行时,这尤其适用。单个 Hive CLI 会话可以在不同的 hadoop 群集之间切换(尤其是在群集被购买并终止后)。只有两个配置变量:

  • fs.default.name

  • mapred.job.tracker
    需要更改以将 CLI 从一个 Hadoop 群集指向另一个 Hadoop 群集。请注意,由于 CLI 从一个群集切换到另一个群集,因此无法访问存储在先前 HDFS 实例中的表。同样,更多详细信息可以在个案研究 1中找到。

Case Studies

Appendix

<<Anchor(S3n00b)>>

S3 for n00bs

需要理解的一件事是 S3 通常如何用作文件系统。每个 S3 存储桶都可以视为文件系统的根。该文件系统中的不同文件成为存储在 S3 中的对象-文件的路径名(与“ /”连接的路径组件)成为存储桶中的 S3 键,文件内容成为值。 Hadoop(s3n)中的[S3Fox | https:-addons.mozilla.org-zh-cn-firefox-addon-3247]和本机 S3!FileSystem 等不同工具显示的目录结构由键中的通用前缀隐含。并非所有工具都能创建一个空目录。特别是-S3Fox 这样做(通过创建代表目录的空键)。诸如awss3cmds3curl之类的其他流行工具提供了从命令行访问 S3 的便捷方法-但没有创建空目录的功能。