Hive External Table of Doris

Hive External Table of Doris 提供了 Doris 直接访问 Hive 外部表的能力,外部表省去了繁琐的数据导入工作,并借助 Doris 本身的 OLAP 的能力来解决 Hive 表的数据分析问题:

  1. 支持 Hive 数据源接入Doris
  2. 支持 Doris 与 Hive 数据源中的表联合查询,进行更加复杂的分析操作
  3. 支持 访问开启 kerberos 的 Hive 数据源

本文档主要介绍该功能的使用方式和注意事项等。

名词解释

Doris 相关

  • FE:Frontend,Doris 的前端节点,负责元数据管理和请求接入
  • BE:Backend,Doris 的后端节点,负责查询执行和数据存储

使用方法

Doris 中创建 Hive 的外表

  1. -- 语法
  2. CREATE [EXTERNAL] TABLE table_name (
  3. col_name col_type [NULL | NOT NULL] [COMMENT "comment"]
  4. ) ENGINE=HIVE
  5. [COMMENT "comment"]
  6. PROPERTIES (
  7. 'property_name'='property_value',
  8. ...
  9. );
  10. -- 例子1:创建 Hive 集群中 hive_db 下的 hive_table
  11. CREATE TABLE `t_hive` (
  12. `k1` int NOT NULL COMMENT "",
  13. `k2` char(10) NOT NULL COMMENT "",
  14. `k3` datetime NOT NULL COMMENT "",
  15. `k5` varchar(20) NOT NULL COMMENT "",
  16. `k6` double NOT NULL COMMENT ""
  17. ) ENGINE=HIVE
  18. COMMENT "HIVE"
  19. PROPERTIES (
  20. 'hive.metastore.uris' = 'thrift://192.168.0.1:9083',
  21. 'database' = 'hive_db',
  22. 'table' = 'hive_table'
  23. );
  24. -- 例子2:创建 Hive 集群中 hive_db 下的 hive_table 表,HDFS使用HA配置
  25. CREATE TABLE `t_hive` (
  26. `k1` int NOT NULL COMMENT "",
  27. `k2` char(10) NOT NULL COMMENT "",
  28. `k3` datetime NOT NULL COMMENT "",
  29. `k5` varchar(20) NOT NULL COMMENT "",
  30. `k6` double NOT NULL COMMENT ""
  31. ) ENGINE=HIVE
  32. COMMENT "HIVE"
  33. PROPERTIES (
  34. 'hive.metastore.uris' = 'thrift://192.168.0.1:9083',
  35. 'database' = 'hive_db',
  36. 'table' = 'hive_table',
  37. 'dfs.nameservices'='hacluster',
  38. 'dfs.ha.namenodes.hacluster'='n1,n2',
  39. 'dfs.namenode.rpc-address.hacluster.n1'='192.168.0.1:8020',
  40. 'dfs.namenode.rpc-address.hacluster.n2'='192.168.0.2:8020',
  41. 'dfs.client.failover.proxy.provider.hacluster'='org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider'
  42. );
  43. -- 例子3:创建 Hive 集群中 hive_db 下的 hive_table 表, HDFS使用HA配置并开启kerberos认证方式
  44. CREATE TABLE `t_hive` (
  45. `k1` int NOT NULL COMMENT "",
  46. `k2` char(10) NOT NULL COMMENT "",
  47. `k3` datetime NOT NULL COMMENT "",
  48. `k5` varchar(20) NOT NULL COMMENT "",
  49. `k6` double NOT NULL COMMENT ""
  50. ) ENGINE=HIVE
  51. COMMENT "HIVE"
  52. PROPERTIES (
  53. 'hive.metastore.uris' = 'thrift://192.168.0.1:9083',
  54. 'database' = 'hive_db',
  55. 'table' = 'hive_table',
  56. 'dfs.nameservices'='hacluster',
  57. 'dfs.ha.namenodes.hacluster'='n1,n2',
  58. 'dfs.namenode.rpc-address.hacluster.n1'='192.168.0.1:8020',
  59. 'dfs.namenode.rpc-address.hacluster.n2'='192.168.0.2:8020',
  60. 'dfs.client.failover.proxy.provider.hacluster'='org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider',
  61. 'dfs.namenode.kerberos.principal'='hadoop/_HOST@REALM.COM'
  62. 'hadoop.security.authentication'='kerberos',
  63. 'hadoop.kerberos.principal'='doris_test@REALM.COM',
  64. 'hadoop.kerberos.keytab'='/path/to/doris_test.keytab'
  65. );
  66. -- 例子4:创建 Hive 集群中 hive_db 下的 hive_table 表, Hive数据存储在S3
  67. CREATE TABLE `t_hive` (
  68. `k1` int NOT NULL COMMENT "",
  69. `k2` char(10) NOT NULL COMMENT "",
  70. `k3` datetime NOT NULL COMMENT "",
  71. `k5` varchar(20) NOT NULL COMMENT "",
  72. `k6` double NOT NULL COMMENT ""
  73. ) ENGINE=HIVE
  74. COMMENT "HIVE"
  75. PROPERTIES (
  76. 'hive.metastore.uris' = 'thrift://192.168.0.1:9083',
  77. 'database' = 'hive_db',
  78. 'table' = 'hive_table',
  79. 'AWS_ACCESS_KEY' = 'your_access_key',
  80. 'AWS_SECRET_KEY' = 'your_secret_key',
  81. 'AWS_ENDPOINT' = 's3.us-east-1.amazonaws.com',
  82. 'AWS_REGION' = 'us-east-1'
  83. );

参数说明:

  • 外表列

    • 列名要于 Hive 表一一对应
    • 列的顺序需要与 Hive 表一致
    • 必须包含 Hive 表中的全部列
    • Hive 表分区列无需指定,与普通列一样定义即可。
  • ENGINE 需要指定为 HIVE

  • PROPERTIES 属性:

    • hive.metastore.uris:Hive Metastore 服务地址
    • database:挂载 Hive 对应的数据库名
    • table:挂载 Hive 对应的表名
    • dfs.nameservices:name service名称,与hdfs-site.xml保持一致
    • `dfs.ha.namenodes.[nameservice ID]:namenode的id列表,与hdfs-site.xml保持一致
    • dfs.namenode.rpc-address.[nameservice ID].[name node ID]:Name node的rpc地址,数量与namenode数量相同,与hdfs-site.xml保持一致
    • dfs.client.failover.proxy.provider.[nameservice ID] :HDFS客户端连接活跃namenode的java类,通常是”org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider”
  • 访问开启kerberos的Hive数据源,需要为Hive外表额外配置如下 PROPERTIES 属性:

    • hadoop.security.authentication:认证方式请设置为 kerberos,默认为simple
    • dfs.namenode.kerberos.principal:HDFS namenode 服务的Kerberos 主体
    • hadoop.kerberos.principal:设置 Doris 连接 HDFS 时使用的 Kerberos 主体
    • hadoop.kerberos.keytab:设置 keytab 本地文件路径
    • AWS_ACCESS_KEY: AWS账户的access key id.
    • AWS_SECRET_KEY: AWS账户的secret access key.
    • AWS_ENDPOINT: S3 endpoint. 例如:s3.us-east-1.amazonaws.com
    • AWS_REGION: AWS区域. 例如:us-east-1

注意:

  • 若要使 Doris 访问开启kerberos认证方式的hadoop集群,需要在 Doris 集群所有运行节点上部署 Kerberos 客户端 kinit,并配置 krb5.conf,填写KDC 服务信息等。
  • PROPERTIES 属性 hadoop.kerberos.keytab 的值需要指定 keytab 本地文件的绝对路径,并允许 Doris 进程访问该本地文件。

类型匹配

支持的 Hive 列类型与 Doris 对应关系如下表:

HiveDoris描述
BOOLEANBOOLEAN
CHARCHAR当前仅支持UTF8编码
VARCHARVARCHAR当前仅支持UTF8编码
TINYINTTINYINT
SMALLINTSMALLINT
INTINT
BIGINTBIGINT
FLOATFLOAT
DOUBLEDOUBLE
DECIMALDECIMAL
DATEDATE
TIMESTAMPDATETIMETimestamp 转成 Datetime 会损失精度

注意:

  • Hive 表 Schema 变更不会自动同步,需要在 Doris 中重建 Hive 外表。
  • 当前 Hive 的存储格式仅支持 Text,Parquet 和 ORC 类型
  • 当前默认支持的 Hive 版本为 2.3.7、3.1.2,未在其他版本进行测试。后续后支持更多版本。

查询用法

完成在 Doris 中建立 Hive 外表后,除了无法使用 Doris 中的数据模型(rollup、预聚合、物化视图等)外,与普通的 Doris OLAP 表并无区别

  1. select * from t_hive where k1 > 1000 and k3 ='term' or k4 like '%doris';