注意:说明:
注意:该功能适用于 Doris 1.2及后续版本。
除了 Hive 外,很多其他系统也会使用 Hive Metastore 存储元数据。所以通过 Hive Catalog,我们不仅能访问 Hive,也能访问使用 Hive Metastore 作为元数据存储的系统。如 Iceberg、Hudi 等。
一、使用须知
1. Hive 支持 1/2/3 版本。
2. 支持 Managed Table 和 External Table。
3. 可以识别 Hive Metastore 中存储的 Hive、Iceberg、Hudi 元数据。
4. 支持数据存储在 JuiceFS 上的 Hive 表,用法如下(需要把 juicefs-hadoop-x.x.x.jar放在 fe/lib/ 和 apache_hdfs_broker/lib/ 下)。
5. 支持数据存储在 CHDFS 上的 Hive 表。需配置环境:
5.1 把chdfs_hadoop_plugin_network-x.x.jar 放在 fe/lib/ 和 apache_hdfs_broker/lib/ 下。
5.2 创建 Hive Catalog 时,需要上传 Hive 所在 Hadoop 集群的 core-site.xml 和 hdfs-site.xml 文件,具体可参考 SQL工作区操作指南。
6. 支持数据存储在 GooseFS(GFS) 上的 Hive、Iceberg 表。需配置环境:
6.1 把 goosefs-x.x.x-client.jar 放在 fe/lib/ 和 apache_hdfs_broker/lib/ 下。
6.2 创建 catalog 时增加属性:'fs.AbstractFileSystem.gfs.impl' = 'com.qcloud.cos.goosefs.hadoop.GooseFileSystem', 'fs.gfs.impl' = 'com.qcloud.cos.goosefs.hadoop.FileSystem'。
二、功能限制
1. 不支持查询Hive / Iceberg / Hudi 中的视图。
2. v1.2 版本不支持查询 show partitions from 语句,v2.0之后支持。
3. 对于文本格式的表,Doris只支持非压缩格式,不支持lzo, bzip2, deflate, lz4 和 zstd 等压缩格式。
4. Doris 会缓存 Hive / Iceberg / Hudi 表的元数据,如原表更新频繁且要从Doris获得最准确的数据,需要查表之前执行refresh table。
三、创建 Catalog
CREATE CATALOG hive PROPERTIES ( 'type'='hms', 'hive.metastore.uris' = 'thrift://172.**.**.**:7004', 'hadoop.username' = 'hive', 'dfs.nameservices'='your-nameservice', 'dfs.ha.namenodes.your-nameservice'='nn1,nn2', 'dfs.namenode.rpc-address.your-nameservice.nn1'='172.**.**.**:4007', 'dfs.namenode.rpc-address.your-nameservice.nn2'='172.**.**.**:4007', 'dfs.client.failover.proxy.provider.your-nameservice'='org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider');
除了 type 和 hive.metastore.uris 两个必须参数外,还可以通过更多参数来传递连接所需要的信息。
如提供 HDFS HA 信息,示例如下:
CREATE CATALOG hive PROPERTIES ( 'type'='hms', 'hive.metastore.uris' = 'thrift://172.**.**.**:7004', 'hadoop.username' = 'hive', 'dfs.nameservices'='your-nameservice', 'dfs.ha.namenodes.your-nameservice'='nn1,nn2', 'dfs.namenode.rpc-address.your-nameservice.nn1'='172.**.**.**:4007', 'dfs.namenode.rpc-address.your-nameservice.nn2'='172.**.**.**:4007', 'dfs.client.failover.proxy.provider.your-nameservice'='org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider');
同时提供 HDFS HA 信息和 Kerberos 认证信息,示例如下:
CREATE CATALOG hive PROPERTIES ( 'type'='hms', 'hive.metastore.uris' = 'thrift://172.**.**.**:7004', 'hive.metastore.sasl.enabled' = 'true', 'hive.metastore.kerberos.principal' = 'your-hms-principal', 'dfs.nameservices'='your-nameservice', 'dfs.namenode.rpc-address.your-nameservice.nn1'='172.**.**.**:4007', 'dfs.namenode.rpc-address.your-nameservice.nn2'='172.**.**.**:4007', 'dfs.client.failover.proxy.provider.your-nameservice'='org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider', 'hadoop.security.authentication' = 'kerberos', 'hadoop.kerberos.keytab' = '/your-keytab-filepath/your.keytab', 'hadoop.kerberos.principal' = 'your-principal@YOUR.COM', 'yarn.resourcemanager.principal' = 'your-rm-principal');
请在所有的 BE、FE 节点下放置 krb5.conf 文件和 keytab 认证文件,keytab 认证文件路径和配置保持一致,krb5.conf 文件默认放置在 /etc/krb5.conf 路径。
hive.metastore.kerberos.principal 的值需要和所连接的 hive metastore 的同名属性保持一致,可从 hive-site.xml 中获取。
提供 Hadoop KMS 加密传输信息,示例如下:
CREATE CATALOG hive PROPERTIES ( 'type'='hms', 'hive.metastore.uris' = 'thrift://172.**.**.**:7004', 'dfs.encryption.key.provider.uri' = 'kms://http@kms_host:kms_port/kms');
Hive数据存储在JuiceFS,示例如下:
CREATE CATALOG hive PROPERTIES ( 'type'='hms', 'hive.metastore.uris' = 'thrift://172.**.**.**:7004', 'hadoop.username' = 'root', 'fs.jfs.impl' = 'io.juicefs.JuiceFileSystem', 'fs.AbstractFileSystem.jfs.impl' = 'io.juicefs.JuiceFS', 'juicefs.meta' = 'xxx');
在 1.2.1 版本之后,我们也可以将这些信息通过创建一个 Resource 统一存储,然后在创建 Catalog 时使用这个 Resource。示例如下:
# 1. 创建 ResourceCREATE RESOURCE hms_resource PROPERTIES ( 'type'='hms', 'hive.metastore.uris' = 'thrift://172.**.**.**:7004', 'hadoop.username' = 'hive', 'dfs.nameservices'='your-nameservice', 'dfs.ha.namenodes.your-nameservice'='nn1,nn2', 'dfs.namenode.rpc-address.your-nameservice.nn1'='172.**.**.**:4007', 'dfs.namenode.rpc-address.your-nameservice.nn2'='172.**.**.**:4007', 'dfs.client.failover.proxy.provider.your-nameservice'='org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider'); # 2. 创建 Catalog 并使用 Resource,这里的 Key Value 信息会覆盖 Resource 中的信息。CREATE CATALOG hive WITH RESOURCE hms_resource PROPERTIES( 'key' = 'value');
创建 Catalog 时可以采用参数 file.meta.cache.ttl-second 来设置 File Cache 自动失效时间,也可以将该值设置为 0 来禁用 File Cache。时间单位为:秒。示例如下:
CREATE CATALOG hive PROPERTIES ( 'type'='hms', 'hive.metastore.uris' = 'thrift://172.**.**.**:7004', 'hadoop.username' = 'hive', 'dfs.nameservices'='your-nameservice', 'dfs.ha.namenodes.your-nameservice'='nn1,nn2', 'dfs.namenode.rpc-address.your-nameservice.nn1'='172.**.**.**:4007', 'dfs.namenode.rpc-address.your-nameservice.nn2'='172.**.**.**:4007', 'dfs.client.failover.proxy.provider.your-nameservice'='org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider', 'file.meta.cache.ttl-second' = '60');
我们也可以直接将 hive-site.xml 放到 FE 和 BE 的 conf 目录下,系统也会自动读取 hive-site.xml 中的信息。信息覆盖的规则如下:
·Resource 中的信息覆盖 hive-site.xml 中的信息。
·CREATE CATALOG PROPERTIES 中的信息覆盖 Resource 中的信息。
四、Hive 版本
Doris 可以正确访问不同 Hive 版本中的 Hive Metastore。在默认情况下,Doris 会以 Hive 2.3 版本的兼容接口访问 Hive Metastore。你也可以在创建 Catalog 时指定 Hive 的版本。如访问 Hive 1.1.0 版本:
CREATE CATALOG hive PROPERTIES ( 'type'='hms', 'hive.metastore.uris' = 'thrift://172.**.**.**:7004', 'hive.version' = '1.1.0');
五、列类型映射
适用于 Hive/Iceberg/Hudi
| HMS Type | Doris Type | Comment |
| boolean | boolean | – |
| tinyint | tinyint | – |
| smallint | smallint | – |
| int | int | – |
| bigint | bigint | – |
| date | date | – |
| timestamp | datetime | – |
| float | float | – |
| double | double | – |
| char | char | – |
| varchar | varchar | – |
| decimal | decimal | – |
| array<type> | array<type> | 支持array嵌套,如 array<array<int>> |
| map<KeyType, ValueType> | map<KeyType, ValueType> | 暂不支持嵌套,KeyType 和 ValueType 需要为基础类型 |
| struct<col1: Type1, col2: Type2, …> | struct<col1: Type1, col2: Type2, …> | 暂不支持嵌套,Type1,Type2,… 需要为基础类型 |
| other | unsupported | – |
六、使用Ranger进行权限校验
注意:说明:
注意:该功能适用于 Doris 2.0及后续版本。
Apache Ranger 是一个用来在 Hadoop 平台上进行监控,启用服务,以及全方位数据安全访问管理的安全框架。目前 Doris 支持 Ranger 的库、表、列权限,不支持加密、行权限等。
七、环境配置
连接开启 Ranger 权限校验的 Hive Metastore 需要增加配置和配置环境:
1. 创建 Catalog 时增加:
"access_controller.properties.ranger.service.name" = "hive","access_controller.class" = "org.apache.doris.catalog.authorizer.RangerHiveAccessControllerFactory",
2. 配置所有 FE 环境:
2.1 将 HMS conf 目录下的配置文件 ranger-hive-audit.xml,ranger-hive-security.xml,ranger-policymgr-ssl.xml 复制到 <doris_home>/conf 目录下。
2.2 修改 ranger-hive-security.xml 的属性,参考配置如下:
<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/xsl" href="configuration.xsl"?><configuration> #The directory for caching permission data, needs to be writable <property> <name>ranger.plugin.hive.policy.cache.dir</name> <value>/mnt/datadisk0/zhangdong/rangerdata</value> </property> #The time interval for periodically pulling permission data <property> <name>ranger.plugin.hive.policy.pollIntervalMs</name> <value>30000</value> </property> <property> <name>ranger.plugin.hive.policy.rest.client.connection.timeoutMs</name> <value>60000</value> </property> <property> <name>ranger.plugin.hive.policy.rest.client.read.timeoutMs</name> <value>60000</value> </property> <property> <name>ranger.plugin.hive.policy.rest.ssl.config.file</name> <value></value> </property> <property> <name>ranger.plugin.hive.policy.rest.url</name> <value>http://172.**.**.**:6080</value> </property> <property> <name>ranger.plugin.hive.policy.source.impl</name> <value>org.apache.ranger.admin.client.RangerAdminRESTClient</value> </property> <property> <name>ranger.plugin.hive.service.name</name> <value>hive</value> </property> <property> <name>xasecure.hive.update.xapolicies.on.grant.revoke</name> <value>true</value> </property></configuration>
2.3 为获取到 Ranger 鉴权本身的日志,可在 <doris_home>/conf 目录下添加配置文件 Log4j.properties。
2.4 重启 FE。
八、实践教程
1. 在 Ranger 端创建用户 user1 并授权 db1.table1.col1 的查询权限。
2. 在 Ranger 端创建角色 role1 并授权 db1.table1.col2 的查询权限。
3. 在 Doris 创建同名用户 user1,user1 将直接拥有 db1.table1.col1 的查询权限。
4. 在 Doris 创建同名角色 role1,并将 role1 分配给 user1,user1 将同时拥有 db1.table1.col1 和 col2 的查询权限。