Hive#

简介#

Apache Hive 是一款常用的数据仓库工具。OpenMLDB 提供对于 Hive 作为数据仓库的导入和导出操作。一般情况下,Hive 作为离线数据仓场景较为普遍,但是也可以作为在线引擎冷启动时候的在线数据导入的数据源。

配置#

安装#

OpenMLDB Spark 发行版 v0.6.7 及以上版本均已经包含 Hive 依赖。如果使用其他 Spark 发行版,使用以下步骤进行安装。

Note

如果你并不想使用hive支持,并且不会在Spark依赖中添加Hive依赖包,需要在taskmanager配置中添加enable.hive.support=false。否则,Job会因找不到Hive相关Class而出错。

  1. 在 Spark 中执行如下命令编译 Hive 依赖

./build/mvn -Pyarn -Phive -Phive-thriftserver -DskipTests clean package
  1. 执行成功以后,依赖包在目录assembly/target/scala-xx/jars

  2. 将所有依赖包加入 Spark 的 class path 中。

配置#

目前 OpenMLDB 只支持使用 metastore 服务来连接Hive。你可以在以下两种配置方式中选择一种,来访问 Hive 数据源。

  • spark.conf:你可以在 spark conf 中配置 spark.hadoop.hive.metastore.uris。有两种方式:

    • taskmanager.properties: 在配置项 spark.default.conf 中加入spark.hadoop.hive.metastore.uris=thrift://... ,随后重启taskmanager。

    • CLI: 在 ini conf 中加入此配置项,并使用--spark_conf启动CLI,参考客户端Spark配置文件

  • hive-site.xml:你可以配置 hive-site.xml 中的 hive.metastore.uris,并将配置文件放入 Spark home的conf/(如果已配置HADOOP_CONF_DIR环境变量,也可以将配置文件放入HADOOP_CONF_DIR中)。hive-site.xml 样例:

    <configuration>
    	<property>
    		<name>hive.metastore.uris</name>
    		<!--Make sure that <value> points to the Hive Metastore URI in your cluster -->
    		<value>thrift://localhost:9083</value>
    		<description>URI for client to contact metastore server</description>
    	</property>
    </configuration>
    

除了Hive连接配置,还需要在Hive中给TaskMananger的启动用户(OS用户和组)授予创建/读/写等权限,以及Hive表的HDFS路径的Read/Write/Execute权限。

如果权限不够,可能出现如下错误:

org.apache.hadoop.security.AccessControlException: Permission denied: user=xx, access=xxx, inode="xxx":xxx:supergroup:drwxr-xr-x

这个错误是指用户没有权限访问Hive表的HDFS路径,需要给用户授予HDFS路径的Read/Write/Execute权限。

See also

如有疑问,请确认你的Hive集群使用了哪种权限管理方式,参考权限管理

调试信息#

确认任务是否连接到正确的 Hive 集群,可以通过任务日志来查看。

  • INFO HiveConf:提示读取到的是哪个 Hive 配置文件。如果需要配置加载的细节,可以打开 Spark 的日志。

  • 连接 Hive metastore 应该有 INFO metastore: Trying to connect to metastore with URI的日志提示。连接成功会有INFO metastore: Connected to metastore.日志。

数据格式#

目前仅支持以下几种 Hive 的数据格式:

OpenMLDB 数据格式

Hive 数据格式

BOOL

BOOLEAN

SMALLINT

SMALLINT

INT

INT

BIGINT

BIGINT

FLOAT

FLOAT

DOUBLE

DOUBLE

DATE

DATE

TIMESTAMP

TIMESTAMP

通过 LIKE 语法快速建表#

我们支持使用 LIKE 语法,基于 Hive 已存在的表格,在 OpenMLDB 便捷的建立相同 schema 的表格,其示例如下。

CREATE TABLE db1.t1 LIKE HIVE 'hive://hive_db.t1';
-- SUCCEED

使用 LIKE 基于 Hive 快捷建表有以下已知问题:

  • 如果创建表失败仍然会返回 SUCCEED,无法在命令行看到错误日志,需要在 TaskManager 日志目录查看

  • 创建的表名必须包含数据库名,如上例的 db1.t1db1 不能被忽略)

  • 使用命令行默认超时配置,创建表可能会显示超时但是执行成功,可通过 SHOW TABLES 查看最终结果。调整超时时间,见调整配置

  • Hive 中表如果包含列约束(如 NOT NULL),在创建的新表中不会包含这些列约束

导入 Hive 数据到 OpenMLDB#

对于 Hive 数据源的导入是通过 API LOAD DATA INFILE 进行支持,通过使用特定的 URI 接口 hive://[db].table 的格式进行导入 Hive 内的数据。注意:

  • 离线和在线引擎均可以导入 Hive 数据源

  • Hive 导入支持软连接,可以减少硬拷贝并且保证 OpenMLDB 随时读取到 Hive 的最新数据。启用软链接方式进行数据导入:使用参数 deep_copy=false

  • OPTIONS 参数仅有 deep_copymode 有效

举例:

LOAD DATA INFILE 'hive://db1.t1' INTO TABLE t1 OPTIONS(deep_copy=false);

导出 OpenMLDB 数据到 Hive#

对于 Hive 数据源的导出是通过 API SELECT INTO 进行支持,通过使用特定的 URI 接口 hive://[db].table 的格式进行导出到 Hive 数仓。注意:

  • 如果不指定数据库名字,则会使用默认数据库名字 default_db

  • 如果指定数据库名字,则该数据库必须已经存在,目前不支持对于不存在的数据库进行自动创建

  • 如果指定的Hive表名不存在,则会在 Hive 内自动创建对应名字的表

  • OPTIONS 参数只有导出模式mode生效,其他参数均不生效

举例:

SELECT col1, col2, col3 FROM t1 INTO OUTFILE 'hive://db1.t1';