近日,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。
- 目前只支持整表导入,不支持分区导入。
配置操作
- 在使用 Hive Connector 之前,必须启动 HMS。
- 目前只支持整表导入,不支持分区导入。
配置操作
OpenMLDB 版本要求:v0.6.7 及以上。
关键流程
- 启动 Hive 与 Hive metastore 服务
- OpenMLDB 配置 Hive metastore URI
- 启动 OpenMLDB 集群
- 测试——从 Hive 导入数据到 OpenMLDB 、从 OpenMLDB 导出数据到 Hive 表
具体操作
-
Docker 上拉取并运行 OpenMLDB 镜像(镜像下载大小大约 1GB,解压后约 1.7 GB):
docker run -it 4pdosc/openmldb:0.6.7 bash
-
安装支持
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
-
使用 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;
-
启动 Hive metastore 服务(默认端口号为 9083):
$HIVE_HOME/bin/hive --service metastore > metastore.log 2>&1 &
-
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
-
从 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');
-
将 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');
-
Docker 上拉取并运行 OpenMLDB 镜像(镜像下载大小大约 1GB,解压后约 1.7 GB):
docker run -it 4pdosc/openmldb:0.6.7 bash
-
安装支持
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
-
使用 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;
-
启动 Hive metastore 服务(默认端口号为 9083):
$HIVE_HOME/bin/hive --service metastore > metastore.log 2>&1 &
-
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
-
从 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');
-
将 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