Hive#

简介#

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

Warning

目前只能支持读写Hive的非ACID表(EXTERNAL表),ACID表(Full ACID或insert-only表,即MANAGED表)暂不支持。

使用#

安装#

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

Note

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

  • 在 Spark 中执行如下命令编译 Hive 依赖:

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

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

配置#

目前 OpenMLDB 只支持使用 metastore 服务来连接Hive。你可以在以下两种配置方式中选择一种,来访问 Hive 数据源。测试搭建的HIVE环境简单,通常只需要配置hive.metastore.uris即可。但生产环境中,可能需要配置更多的Hive配置,更推荐使用hive-site.xml的方式。

  • 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的配置 hive-site.xml 放入 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

BOOL

SMALLINT

SMALLINT

INT

INT

BIGINT

BIGINT

FLOAT

FLOAT

DOUBLE

DOUBLE

DATE

DATE

TIMESTAMP

TIMESTAMP

STRING

STRING

通过 LIKE 语法快速建表#

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

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

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

  • 使用命令行默认超时配置,创建表可能会显示超时但是执行成功,可通过 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_copymodesql 有效

举例:

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

加载数据还支持使用 SQL 语句筛选 Hive 数据表特定数据,注意 SQL 必须符合 SparkSQL 语法,数据表为注册后的表名,不带 hive:// 前缀。

举例:

LOAD DATA INFILE 'hive://db1.t1' INTO TABLE db1.t1 OPTIONS(deep_copy=true, sql='SELECT * FROM db1.t1 where key=\"foo\"')

导出 OpenMLDB 数据到 Hive#

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

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

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

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

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

举例:

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