与 Hive Metastore 集成
在本节中,你将学习如何配置 Kyuubi 以便与 Hive Metastore 进行交互。
- 可以在 Kyuubi 服务端设置一个公共的 Hive metastore server
- 也可以让最终用户各自设置独立的 Hive metastore server
前提条件
一个正在运行的 Hive metastore server
一个带有
-Phive支持构建的 Spark 二进制发行版- 使用 Kyuubi 发行版中内置的 Spark
- 从 Spark 官方网站下载
- 从 Spark 源码构建,参见构建带有 Hive 和 JDBC 支持的 Spark
一份 Hive 客户端配置的副本
因此,这里的关键是让 Spark 应用程序使用这份 Hive 配置,为其启动一个 Hive metastore 客户端,用于与 Hive metastore server 进行通信。
默认行为
默认情况下,Kyuubi 会为每个应用程序启动指向一个虚拟的、基于内嵌 Apache Derby 的 metastore 的 Spark SQL 引擎,并且这些元数据在同一时间只能被一个用户看到,例如。
bin/beeline -u 'jdbc:hive2://localhost:10009/' -n kentyao
Connecting to jdbc:hive2://localhost:10009/
Connected to: Spark SQL (version 1.0.0-SNAPSHOT)
Driver: Hive JDBC (version 2.3.7)
Transaction isolation: TRANSACTION_REPEATABLE_READ
Beeline version 2.3.7 by Apache Hive
0: jdbc:hive2://localhost:10009/> show databases;
2020-11-16 23:50:50.388 INFO operation.ExecuteStatement:
Spark application name: kyuubi_kentyao_spark_2020-11-16T15:50:08.968Z
application ID: local-1605541809797
application web UI: http://192.168.1.14:60165
master: local[*]
deploy mode: client
version: 3.0.1
Start time: 2020-11-16T15:50:09.123Z
User: kentyao
2020-11-16 23:50:50.404 INFO metastore.HiveMetaStore: 2: get_databases: *
2020-11-16 23:50:50.404 INFO HiveMetaStore.audit: ugi=kentyao ip=unknown-ip-addr cmd=get_databases: *
2020-11-16 23:50:50.423 INFO operation.ExecuteStatement: Processing kentyao's query[8453e657-c1c4-4391-8406-ab4747a66c45]: RUNNING_STATE -> FINISHED_STATE, statement: show databases, time taken: 0.035 seconds
+------------+
| namespace |
+------------+
| default |
+------------+
1 row selected (0.122 seconds)
0: jdbc:hive2://localhost:10009/> show tables;
2020-11-16 23:50:52.957 INFO operation.ExecuteStatement:
Spark application name: kyuubi_kentyao_spark_2020-11-16T15:50:08.968Z
application ID: local-1605541809797
application web UI: http://192.168.1.14:60165
master: local[*]
deploy mode: client
version: 3.0.1
Start time: 2020-11-16T15:50:09.123Z
User: kentyao
2020-11-16 23:50:52.968 INFO metastore.HiveMetaStore: 2: get_database: default
2020-11-16 23:50:52.968 INFO HiveMetaStore.audit: ugi=kentyao ip=unknown-ip-addr cmd=get_database: default
2020-11-16 23:50:52.970 INFO metastore.HiveMetaStore: 2: get_database: default
2020-11-16 23:50:52.970 INFO HiveMetaStore.audit: ugi=kentyao ip=unknown-ip-addr cmd=get_database: default
2020-11-16 23:50:52.972 INFO metastore.HiveMetaStore: 2: get_tables: db=default pat=*
2020-11-16 23:50:52.972 INFO HiveMetaStore.audit: ugi=kentyao ip=unknown-ip-addr cmd=get_tables: db=default pat=*
2020-11-16 23:50:52.986 INFO operation.ExecuteStatement: Processing kentyao's query[ff902582-ba29-433b-b70a-c25ead1353a8]: RUNNING_STATE -> FINISHED_STATE, statement: show tables, time taken: 0.03 seconds
+-----------+------------+--------------+
| database | tableName | isTemporary |
+-----------+------------+--------------+
+-----------+------------+--------------+
No rows selected (0.04 seconds)此模式仅供实验用途。
在真实的生产环境中,我们通常会有一个公共的独立元数据存储,用于管理持久化关系型实体(如数据库、表、列、分区)的元数据,以便快速访问。通常,Hive metastore 是事实上的标准。
激活配置
通过 kyuubi-defaults.conf
在 $KYUUBI_HOME/conf/kyuubi-defaults.conf 中,所有 Hive 原生配置(例如 hive.metastore.uris),以及以 spark.hive. 或 spark.hadoop. 为前缀的 Spark 衍生配置(例如 spark.hive.metastore.uris 或 spark.hadoop.hive.metastore.uris),都会被 Spark 应用程序内的 Hive 客户端作为 Hive 原生配置加载。
Kyuubi 会将这些配置作为其启动的所有应用程序的系统级默认值。
通过 hive-site.xml
将你的 hive-site.xml 副本放入 $SPARK_HOME/conf,每个 Spark 应用程序都会自动将该配置文件加载到其 classpath 中。
这种配置方式的优先级低于 $KYUUBI_HOME/conf/kyuubi-defaults.conf 中的配置。
通过 JDBC 连接 URL
我们可以在 JDBC 连接 URL 中直接传递 Hive 原生配置 或 Spark 衍生配置,例如:
jdbc:hive2://localhost:10009/;#hive.metastore.uris=thrift://localhost:9083这将覆盖每个用户账号在 $SPARK_HOME/conf/hive-site.xml 和 $KYUUBI_HOME/conf/kyuubi-defaults.conf 中的默认设置。
借助此功能,最终用户可以访问不同的 Hive metastore 服务实例。同样,该功能也适用于 HDFS、YARN 等其他服务。
限制: 由于大多数 Hive 配置在 Spark 运行时是 final 且不可修改的,因此此功能仅在实例化 Spark 应用程序时生效,而在复用已有应用程序时会被忽略。请务必牢记这一点。
!!!此方法仅能生效一次!!!
!!!此方法仅能生效一次!!!
!!!此方法仅能生效一次!!!
通过 SET 语法
大多数 Hive 配置在 Spark 运行时是 final 且不可修改的,因此请务必牢记这一点。
!!!此方法无法生效!!!
!!!此方法无法生效!!!
!!!此方法无法生效!!!
版本兼容性
如果 Hive 版本机制保证了向后兼容性,那么我们始终可以使用较低版本的 Hive metastore 客户端与较高版本的 Hive metastore 服务端进行通信。
例如,Spark 3.0 发布时内置了 Hive 客户端(2.3.7),因此理想情况下,服务端的版本应当 >= 2.3.x。
如果你确实有一个无法轻易升级的旧版 Hive metastore 服务端,那么你可能会默认遇到如下问题,
Caused by: org.apache.thrift.TApplicationException: Invalid method name: 'get_table_req'
at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:79)
at org.apache.hadoop.hive.metastore.api.ThriftHiveMetastore$Client.recv_get_table_req(ThriftHiveMetastore.java:1567)
at org.apache.hadoop.hive.metastore.api.ThriftHiveMetastore$Client.get_table_req(ThriftHiveMetastore.java:1554)
at org.apache.hadoop.hive.metastore.HiveMetaStoreClient.getTable(HiveMetaStoreClient.java:1350)
at org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient.getTable(SessionHiveMetaStoreClient.java:127)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.hadoop.hive.metastore.RetryingMetaStoreClient.invoke(RetryingMetaStoreClient.java:173)
at com.sun.proxy.$Proxy37.getTable(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.hadoop.hive.metastore.HiveMetaStoreClient$SynchronizedHandler.invoke(HiveMetaStoreClient.java:2336)
at com.sun.proxy.$Proxy37.getTable(Unknown Source)
at org.apache.hadoop.hive.ql.metadata.Hive.getTable(Hive.java:1274)
... 93 more为避免此问题,我们可以使用 Spark 的 与不同版本的 Hive Metastore 交互。
延伸阅读
Hive Wiki
Spark 在线文档
评论
登录后参与评论
KnowForge