Spark/Flink可以使用Hive的metastore,但是Hive无法通过Hive metastore中的Spark/Flink表直接查询数据。为了解决这个问题,可以配置使用Hive sync。在Spark/Flink操作表的时候,自动同步Hive的元数据。这样就可以通过Hive查询Hudi表的内容。
Hive metastore通过目录结构的来维护元数据,数据的更新是通过覆盖来保证事务。但是数据湖是通过追踪文件来管理元数据,一个目录中可以包含多个版本的文件。这一点和Hive元数据管理是不同的。所以说为了兼容Hive metastore,Hudi需要实时从Timeline同步元数据到Hive metastore。
复制编译后的 packaging/hudi-hadoop-mr-bundle/target/hudi-hadoop-mr-bundle-0.11.1.jar 到各节点Hive安装目录的 auxlib 目录中。
进入 beeline 后执行:
如果要使用Hive Sync功能,编译时候需要激活 flink-bundle-shade-hive3 profile。编译命令如下所示:
Flink Hive Sync支持两种模式连接Hive:
两种使用方式如下所示:
例如使用HMS方式配置Hive Sync:
然后我们进入beeline,执行:
我们可以看到同步过来的 t1 表。
然后执行:
可以从Hive中查出Hudi表数据。
如果执行Flink的时候遇到如下错误:
需要修改 packaging/hudi-flink-bundle/pom.xml ,在 relocations 标签中加入:
然后重新编译。
参考链接:
/apache/hudi/issues/3042
Spark Hive Sync目前只支持DataFrame API。下面使用官网的例子插入数据到 hudi_cow 表:
Spark Hudi Hive Sync配置项含义如下:
和Flink一样,执行成功后可以使用Hive通过 beeline 查询Hudi表数据。
https://hudi.apache.org/docs/syncing_metastore