Developer Guide

代码组织和简要架构

Introduction

Hive 有 3 个主要组成部分:

除了这些主要组件之外,Hive 还包含许多其他组件。这些如下:

以下顶级目录包含帮助程序库,打包的配置文件等:

Hive SerDe

什么是 SerDe?

请注意,“键”部分在读取时会被忽略,而在写入时始终是常数。基本上行对象存储在“值”中。

Hive 的一项原则是 Hive 不拥有 HDFS 文件格式。用户应该能够使用其他工具直接读取 Hive 表中的 HDFS 文件,或者使用其他工具直接写入可以通过“ CREATE EXTERNAL TABLE”加载到 Hive 中或通过“ LOAD DATA INPATH”加载到 Hive 中的 HDFS 文件。 ”,将文件移到 Hive 的表目录中。

请注意,org.apache.hadoop.hive.serde 是已弃用的旧 SerDe 库。请查看 org.apache.hadoop.hive.serde2 以获取最新版本。

Hive 当前使用以下 FileFormat 类读取和写入 HDFS 文件:

Hive 当前使用这些 SerDe 类来序列化和反序列化数据:

ALTER TABLE person SET SERDEPROPERTIES ('serialization.encoding'='GBK');

如果将配置属性hive.lazysimple.extended_boolean_literal设置为true(Hive 0.14.0及更高版本),则 LazySimpleSerDe 可以将“ T”,“ t”,“ F”,“ f”,“ 1”和“ 0”视为扩展的合法布尔 Literals。默认值为false,这意味着仅将'TRUE'和'FALSE'视为合法的布尔 Literals。

Also:

有关 Importing 和输出处理的详细信息,请参见SerDe。另请参见HCatalog manual中的Storage Formats,包括JSON SerDe 的 CTAS 问题。有关如何使用自定义或本机 SerDe 创建表的信息,请参见行格式,存储格式和 SerDe

如何编写自己的 SerDe

关于 SerDe 的一些重要点:

ObjectInspector

Hive 使用 ObjectInspector 来分析行对象的内部结构以及各个列的结构。

ObjectInspector 提供了一种访问复杂对象的统一方法,这些对象可以以多种格式存储在内存中,包括:

一个复杂的对象可以由一对 ObjectInspector 和 Java Object 表示。 ObjectInspector 不仅告诉我们对象的结构,而且还提供了访问对象内部字段的方法。

注意:Apache Hive 建议创建用于与自定义 SerDes 一起使用的自定义 ObjectInspector,除了用于序列化的常规构造函数外,还应具有无参数的构造函数。有关更多详细信息,请参见HIVE-5380

本机 SerDes 的注册

Hive 0.14起,已为本地 Hive SerDes 引入了注册机制。这样可以在CreateTable语句中动态地绑定“ STORED AS”关键字,以代替\ {SerDe, InputFormat, and OutputFormat}规范的三 Tuples。

通过此注册机制添加了以下 Map:

Syntax Equivalent
储存为 AVRO /

储存为 Files
ROW FORMAT SERDE
````+43+

+46+``+47+`` `'`
````+55+
+58+`` ' |
|存储为 RCFILE | STORED AS INPUTFORMAT
'org.apache.hadoop.hive.ql.io.RCFileInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.RCFileOutputFormat'|
|存储为序列文件| STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.SequenceFileInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.mapred.SequenceFileOutputFormat'|
|存储为文本文件| STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat'|

要使用 STORED AS 关键字添加新的本机 SerDe,请按照下列步骤操作:

MetaStore

MetaStore 包含有关表,分区和数据库的元数据。在计划生成过程中,查询处理器将使用它。

Query Processor

以下是 Hive 查询处理器的主要组件:

Compiler

Parser

TypeChecking

Semantic Analysis

Plan generation

Task generation

Execution Engine

Plan

Operators

UDF 和 UDAF

可以在此Hive 解剖滑板中找到有关 Hive 查询处理器的有用概述。

编译并运行 Hive

Ant to Maven

从版本0.13开始,Hive 使用 Maven 而不是 Ant 进行构建。以下说明不是最新的。

有关更新的说明,请参见Hive 开发人员常见问题解答

Hive 可以针对不同版本的 Hadoop 进行编译。

Default Mode

从源树的根:

ant package

将使 Hive 可以针对 Hadoop 0.19.0 版进行编译。注意:

Advanced Mode

ant -Dtarget.dir=<my-install-dir> package
ant -Dhadoop.version=0.17.1 package
ant -Dhadoop.root=~/src/hadoop-19/build/hadoop-0.19.2-dev -Dhadoop.version=0.19.2-dev

note that:

在此特定示例中,~/src/hadoop-19是 Hadoop 19 分支的签出,该分支使用0.19.2-dev作为默认版本,并默认在build/hadoop-0.19.2-dev中创建分发目录。

从命令行使用“ $HIVE_HOME/bin/hive”运行 Hive,其中$HIVE_HOME通常是 Hive 存储库顶级目录下的build/dist

$ build/dist/bin/hive

如果 Hive 在运行时失败,请尝试使用“ ant very-clean package”删除 Ivy 缓存,然后再进行重建。

在没有 Hadoop 群集的情况下运行 Hive

From Thejas:

export HIVE_OPTS='--hiveconf mapred.job.tracker=local --hiveconffs.default.name=file:///tmp \
    --hiveconf hive.metastore.warehouse.dir=file:///tmp/warehouse \
    --hiveconf javax.jdo.option.ConnectionURL=jdbc:derby:;databaseName=/tmp/metastore_db;create=true'

然后,您可以运行“ build/dist/bin/hive”,它将对您的本地文件系统起作用。

单元测试和调试

单元测试的布局

Hive 使用JUnit进行单元测试。 Hive 的 3 个主要组件中的每一个在相应的 src/test 目录中都有其单元测试实现,例如 trunk/metastore/src/test 具有 metastore 的所有单元测试,trunk/serde/src/test 具有 serde 的所有单元测试,trunk/ql/src/test 具有查询处理器的所有单元测试。 Metastore 和 Serde 单元测试提供了 JUnit 的 TestCase 实现。另一方面,查询处理器测试是使用 Velocity 生成的。 trunk/ql/src/test 下包含这些测试和相应结果的主目录如下:

正在运行单元测试

Ant to Maven

从版本0.13开始,Hive 使用 Maven 而不是 Ant 进行构建。以下说明不是最新的。

有关更新的说明,请参见Hive 开发人员常见问题解答

运行所有测试:

ant package test

运行所有肯定的测试查询:

ant test -Dtestcase=TestCliDriver

运行特定的阳性测试查询:

ant test -Dtestcase=TestCliDriver -Dqfile=groupby1.q

上面的测试产生以下文件:

运行与正则表达式匹配的单元测试集,例如 partition_wise_fileformat 测试 10-16:

ant test -Dtestcase=TestCliDriver -Dqfile_regex=partition_wise_fileformat1[0-6]

请注意,此选项与不带.q 后缀的测试的基本名称匹配。

显然,除非您先运行ant package,否则清除后 Hive 测试不会成功运行。不知道为什么 build.xml 不编码此依赖项。

添加新的单元测试

Ant to Maven

从版本0.13开始,Hive 使用 Maven 而不是 Ant 进行构建。以下说明不是最新的。

有关更新的说明,请参见Hive 开发人员常见问题解答。另请参见在 Hive 中添加新测试的提示如何贡献:添加单元测试

首先,在 ql/src/test/queries/clientpositive 中编写一个新的 myname.q。

然后,使用查询运行测试并覆盖结果(在添加新测试时很有用)。

ant test -Dtestcase=TestCliDriver -Dqfile=myname.q -Doverwrite=true

然后,我们可以通过以下方式创建补丁:

svn add ql/src/test/queries/clientpositive/myname.q ql/src/test/results/clientpositive/myname.q.out
svn diff > patch.txt

同样,要添加否定的 Client 端测试,请在 ql/src/test/queries/clientnegative 中编写一个新的查询 Importing 文件,然后运行相同的命令,这次将测试用例名称指定为 TestNegativeCliDriver 而不是 TestCliDriver。请注意,对于负面的 Client 端测试,可以在目录 ql/src/test/results/clientnegative 中找到使用覆盖标志创建的输出文件。

调试 Hive 代码

Hive 代码包括 Client 端代码(例如 HiveQL 的编译器,语义分析器和优化器)和服务器端代码(例如,operator/task/SerDe 实现)。Client 端和服务器端代码的调试不同,如下所述。

调试 Client 端代码

Client 端代码在本地计算机上运行,因此您可以像调试任何常规本地 Java 代码一样轻松地使用 Eclipse 对其进行调试。以下是调试单元测试中的代码的步骤。

调试服务器端代码

服务器端代码是分布式的,并且在 Hadoop 群集上运行,因此调试服务器端 Hive 代码有点复杂。除了使用 log4j 打印到日志文件外,还可以在单元测试(单机模式)下将调试器附加到其他 JVM。以下是有关如何在服务器端代码上进行调试的步骤。

> ant -Djavac.debug=on package

如果您已经在没有 javac.debug = on 的情况下构建了 Hive,则可以清除该构建,然后运行上述命令。

> ant clean  # not necessary if the first time to compile
    > ant -Djavac.debug=on package
> export HIVE_DEBUG_PORT=8000
    > export HIVE_DEBUG="-Xdebug -Xrunjdwp:transport=dt_socket,address=${HIVE_DEBUG_PORT},server=y,suspend=y"

特别是 HIVE_DEBUG_PORT 是 JVM 正在侦听且调试器将附加到的端口号。然后如下运行单元测试:

> export HADOOP_OPTS=$HIVE_DEBUG
    > ant test -Dtestcase=TestCliDriver -Dqfile=<mytest>.q

单元测试将一直运行,直到显示:

[junit] Listening for transport dt_socket at address: 8000
> jdb -attach 8000

或者,如果您正在运行 Eclipse 并且已经导入了 Hive 项目,则可以使用 Eclipse 进行调试。在 Eclipse Run-> Debug Configurations 下,在左面板底部找到“ Remote Java Application”。应该已经有一个 MapRedTask 配置。如果没有这样的配置,则可以使用以下属性创建一个:

不使用 Ant 进行调试(Client 端和服务器端)

还有另一种无需通过 Ant 即可调试 Hive 代码的方法。
您需要安装 Hadoop 并将环境变量 HADOOP_HOME 设置为该变量。

> export HADOOP_HOME=<your hadoop home>

然后,启动 Hive:

>  ./build/dist/bin/hive --debug

然后,它的行为类似于 Debugging Hive 代码中概述的调试步骤。由于不需要编译 Hive 代码,因此速度更快,
并通过 Ant。它可以用于调试 Client 端 Hive 和服务器端 Hive。

如果要调试特定查询,请启动 Hive 并执行该查询之前所需的步骤。然后再次在调试中启动 Hive,以调试该查询。

>  ./build/dist/bin/hive
    >  perform steps before the query
>  ./build/dist/bin/hive --debug
    >  run the query

请注意,将使用本地文件系统,因此不会自动释放计算机上的空间(与通过 Ant 进行调试不同,在 Ant 中,在测试中创建的表会在测试结束时自动删除)。确保明确删除表,或从/ User/hive/warehouse 删除数据。

Pluggable interfaces

File Formats

请参阅Hive 用户组会议,2009 年 8 月 59-63 页。

SerDe-如何添加新的 SerDe

请参阅Hive 用户组会议,2009 年 8 月第 64-70 页。

Map-Reduce Scripts

请参阅Hive 用户组会议,2009 年 8 月第 71-73 页。

UDF 和 UDAF-如何添加新的 UDF 和 UDAF

请参阅Hive 用户组会议,2009 年 8 月 74-87 页。

首页