近日,OpenMLDB 实现了与开源数据仓库软件 Hive 的连接,继完成与 Kafka、Pulsar、RocketMQ 等实时数据源生态整合后,持续构建离线数据生态,期待建设一个更加全面一体的上下游生态圈,在吸引更多用户的同时也能降低用户的使用门槛。

背景

OpenMLDB Hive Connector 的开发解决了 OpenMLDB 无法轻松连接使用 Hive 数据源的问题,利用其可以简单地对 Hive 数据进行读写,优化用户使用体验和降低时间成本

介绍

通过 OpenMLDB Hive Connector 可以连接 Hive 数据源,对其进行数据访问和元数据操作。Hive 数据源的访问通过 Hive Metastore Service (HMS)。在使用 Hive Connector 之前,要确保 HMS 已启动。

优势

  • Connector 联通 Hive 之后,只需配置好 Hive,就可以在 OpenMLDB 中用 hive:// 方式读写 Hive 表。
  • 学习成本低,易上手。Hive 是 Apache Hadoop 上的 SQL 接口,可以写 SQL 语句来对数据进行处理和运算。

注意

  • 在使用 Hive Connector 之前,必须启动 HMS。
  • 目前只支持整表导入,不支持分区导入。

配置操作

OpenMLDB 版本要求:v0.6.7 及以上。

关键流程

  1. 启动 Hive 与 Hive metastore 服务
  2. OpenMLDB 配置 Hive metastore URI
  3. 启动 OpenMLDB 集群
  4. 测试——从 Hive 导入数据到 OpenMLDB 、从 OpenMLDB 导出数据到 Hive 表

具体操作

  1. Docker 上拉取并运行 OpenMLDB 镜像(镜像下载大小大约 1GB,解压后约 1.7 GB):

    docker run -it 4pdosc/openmldb:0.6.7 bash
  2. 安装支持

    a. 安装 jdk8:Docker 镜像内默认为 jdk11,Hive 不支持 jdk11,建议安装 jdk8:

    apt-get update && apt-get install -y gnupg2
    curl -s https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public | apt-key add -
    apt-get update && apt-get install -y adoptopenjdk-8-hotspot
    export JAVA_HOME=/usr/lib/jvm/adoptopenjdk-8-hotspot-amd64
    export PATH=$JAVA_HOME/bin:$PATH

    b. 安装 Hadoop:

    curl -SLO https://dlcdn.apache.org/hadoop/common/hadoop-3.2.3/hadoop-3.2.3.tar.gz
    tar zxf hadoop-3.2.3.tar.gz
    export HADOOP_HOME=`pwd`/hadoop-3.2.3
    curl -SLO http://mirror.bit.edu.cn/apache/hive/hive-3.1.3/apache-hive-3.1.3-bin.tar.gz
    tar zxf apache-hive-3.1.3-bin.tar.gz
    export HIVE_HOME=`pwd`/apache-hive-3.1.3-bin

    c. 由于 Hadoop 和 Hive 的 Guava 版本不一致,运行以下命令调整为一致版本:

    rm $HIVE_HOME/lib/guava-19.0.jar
    cp $HADOOP_HOME/share/hadoop/common/lib/guava-27.0-jre.jar $HIVE_HOME/lib/
    $HIVE_HOME/bin/schematool -dbType derby -initSchema
  3. 使用 Hive 客户端创建表 使用 Hive 客户端创建表 htable(表会创建到默认数据库 default,如需使用其他数据库,请保证数据库已存在,OpenMLDB 不会自动创建 Hive 数据库);插入一条数据,可以查询出已插入的数据:

    $HIVE_HOME/bin/hive
    CREATE TABLE htable(key INT, value STRING NOT NULL);
    INSERT INTO htable VALUES (NULL, "n"), (1,"a"), (2,"b");
    SELECT * FROM htable;
  4. 启动 Hive metastore 服务(默认端口号为 9083):

    $HIVE_HOME/bin/hive --service metastore > metastore.log 2>&1 &
  5. OpenMLDB 配置 Hive 连接,并启动 OpenMLDB 集群有多种方式配置 Hive 连接,具体请参考 Hive 配置文档。此处使用“在 taskmanager 配置文件中添加 Hive 连接配置”的方式。

    a. 打开 taskmanager 配置文件:

    vim openmldb/conf/taskmanager.properties

    b. 在 spark.default.conf 配置项中添加配置

    spark.hadoop.hive.metastore.uris:
    spark.default.conf=...;spark.hadoop.hive.metastore.uris=thrift://localhost:9083

    c. 启动 OpenMLDB 集群:

    /work/init.sh
  6. 从 Hive 导入数据到 OpenMLDB 需要提前创建好 OpenMLDB 表 otable,使用 LOAD DATA 语句,只需使用 hive:// 前缀并指定 Hive 表名便可导入表中数据到 OpenMLDB 表 otable。支持导入到在线和离线。运行以下代码导入到离线:

    CREATE DATABASE db;
    USE db;
    CREATE TABLE otable(key INT, value STRING NOT NULL);
    SET @@sync_job=true;
    SET @@job_timeout=600000;
    LOAD DATA INFILE 'hive://htable' INTO TABLE otable OPTIONS(mode='overwrite');
  7. 将 OpenMLDB 表数据导出到 Hive 使用 SELECT INTO 语句,同样路径只需要使用 hive:// 前缀并指定表名(表可以不存在,将自动创建)。

    USE db;
    SET @@sync_job=true;
    SET @@job_timeout=600000;
    SELECT * FROM otable INTO OUTFILE 'hive://hsaved' OPTIONS(mode='overwrite');

可以在 Hive 中查询到 hsaved 表,由于演示使用的是 derby 作为元数据库,请将 metastore 进程关闭后再使用 $HIVE_HOME/bin/hive 查询:

SELECT * FROM hsaved;

也可直接在 Hive 的保存目录中看到 hsaved 表:

ls /user/hive/warehouse/hsaved