文档首页/ MapReduce服务 MRS/ 最佳实践/ 数据分析/ 实时OLAP数据分析/ 通过Doris Catalog读取Hive外表数据并写入Doris
更新时间:2025-09-04 GMT+08:00
分享

通过Doris Catalog读取Hive外表数据并写入Doris

应用场景

通过Doris创建Catalog成功读取Hive外表数据并写入Doris,并按照Unique指定字段自动去重。

方案架构

离线数据可以从数据湖加载,也可以直接加载本地文件。从数据湖加载可以使用工具CDM,在没有CDM工具时,可以直接使用外表加载、BrokerLoad的方式。

本地文件加载则使用Doris自带的StreamLoad工具。

图1 离线数据加载
  • 场景特点:

    业务特点为离线数据,端到端时延无要求,仅对数据集市中的数据查询时延有要求,如离线报表场景、实时报表的数据初始化场景。

  • 数据加载方式:
    • 在存在DataArts Studio工具的场景下,数据加载统一使用CDM进行(DataArts Studio需要2.10及以上版本)。
    • 在不存在DataArts Studio工具的场景下,可以使用Spark或者外表方式加载。由数据加工方进行数据推送加载时,推荐使用BrokerLoad加载方式,方便数据加工方统一调度;如果有数据应用方负责数据加载,则使用外表方式进行数据加载较为方便应用层另外配置加载数据。
    • 在没有数据湖的场景下,轻量化数仓场景中,数据直接由源端文件加载到Doris中,可以使用Streamload方式加载本地文件。
  • 注意事项:

    Hive外表通过整体添加Hive的MetaStore的方式,将全量元数据在Doris中呈现。

步骤1:创建MRS Hive集群并配置

  1. 创建MRS Hive集群。

    详细操作请参考自定义购买MRS集群,例如相关参数如下:

    • 集群名称:自定义,例如“mrs_test”
    • 集群版本:MRS 3.3.0-LTS
    • 集群组件包含:Hive等
    • Kerberos认证:开启

    其他参数根据实际需要进行配置。

  2. 集群购买完成后安装集群全量客户端,详细操作请参考安装客户端(3.x版本)

    例如客户端安装路径为“/opt/client”。

  3. 配置集群存算分离。

    详细操作请参考配置MRS集群通过IAM委托对接OBS

  4. 已存在Hive外表(数据格式仅限ORC格式)。

    例如表wxk.lineorder_orc02,存在一定量业务数据。

    建表语句参考:

    CREATE TABLE wxk.`lineorder_orc02`(
      `lo_orderkey` bigint,
      `lo_linenumber` int,
      `lo_custkey` bigint,
      `lo_partkey` bigint,
      `lo_suppkey` bigint,
      `lo_orderdate` date,
      `lo_orderpriority` varchar(300),
      `lo_shippriority` int,
      `lo_quantity` int,
      `lo_extendedprice` bigint,
      `lo_ordtotalprice` bigint,
      `lo_discount` int,
      `lo_revenue` bigint,
      `lo_supplycost` int,
      `lo_tax` int,
      `lo_commitdate` date,
      `lo_shipmode` varchar(300)
    ) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.orc.OrcSerde' STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat' LOCATION 'obs://test-wxk/doristest' TBLPROPERTIES (
      'bucketing_version' = '2',
      'orc.compress' = 'ZLIB',
      'transient_lastDdlTime' = '1705923234'
    ) ;

    准备数据如下:

步骤2:创建MRS Doris集群并配置

  1. 创建MRS Doris集群。

    详细操作请参考自定义购买MRS集群,例如相关参数如下:

    • 集群名称:自定义,例如“mrs_doris”
    • 集群版本:MRS 3.3.0-LTS
    • 组件选择:Doris集群。
    • Kerberos认证:开启

    其他参数根据实际需要进行配置。

  2. 集群购买完成后安装集群客户端。

    详细操作请参考安装客户端(3.x版本)

    例如客户端安装路径为“/opt/dorisclient”。

  3. 在Doris集群安装MySQL客户端。

    详细操作请参考使用MySQL客户端连接Doris

  4. 创建拥有Doris管理权限的人机用户(例如用户名为dorisuser),并修改初始密码。

    1. 登录Doris集群Manager页面。
    2. 选择“系统 > 权限 > 角色 > 添加角色”,填写角色名称,如“dorisrole”,在“配置资源权限”选择“待操作的集群 > Doris”,勾选“Doris管理员权限”,单击“确定”。
    3. 选择“用户 > 添加用户”,填写用户名称,如“dorisuser”,“用户类型”选择“人机”,“密码策略”默认,输入用户密码并确认密码,关联“dorisrole”角色,单击“确定”。
    4. 使用新建的dorisuser用户重新登录FusionInsight Manager,修改该用户初始密码。

  5. 配置MRS Hive集群与Doris集群互信。

    1. 配置MRS Hive集群与Doris集群互信,详细操作请参考集群互信管理
    2. 配置后验证。
      1. root用户登录Doris集群客户端,执行以下命令加载环境变量。
        source 客户端安装路径/bigdata_env
      2. 执行以下命令认证Hive集群用户。
        kinit Hive集群业务用户@Hive集群系统域名

        输入Hive集群用户相应密码,认证成功即为互信成功。

        • Hive集群用户:可以自行创建也可使用默认的系统用户,例如hive,用户默认密码请参考MRS集群用户账号一览表
        • Hive集群系统域名:可以登录Hive集群Manager页面,选择“系统 > 权限 > 域和互信”,查看“本端域”参数获取。

步骤3:创建Doris Catalog并将Hive外表数据写入Doris

  1. 登录Doris集群中已安装好MySQL客户端的节点,执行如下命令进入Doris数据库。

    export LIBMYSQL_ENABLE_CLEARTEXT_PLUGIN=1 //若集群已启用Kerberos认证(安全模式)需执行该命令。
    mysql -u数据库登录用户 -p数据库登录用户密码 -P数据库连接端口 -hDoris FE实例IP地址
    • 数据库连接端口为Doris FE的查询连接端口,可通过登录MRS Doris集群的Manager界面,选择“集群 > 服务 > Doris > 实例”,查看任一FE实例的业务IP地址获取。
    • Doris FE实例IP地址可通过登录MRS Doris集群的Manager界面,选择“集群 > 服务 > Doris > 配置 > 全部配置”,搜索并查看“query_port”参数值获取。

  2. 创建Catalog。

    例如执行以下命令,相关参数说明见表1,参数取值请以时间为准。

    CREATE CATALOG hive_catalog_obs11 PROPERTIES (
      'type' = 'hms',
      'hive.metastore.uris' = 'thrift://192.168.xx.xx:21088',
      'hive.metastore.sasl.enabled' = 'true',
      'hive.server2.thrift.sasl.qop' = 'auth-conf',
      'hive.server2.authentication' = 'KERBEROS',
      'dfs.nameservices' = 'hacluster',
      'dfs.ha.namenodes.hacluster' = '24,25',
      'dfs.namenode.rpc-address.hacluster.24' = '主NameNodeIP地址:RPC通信端口',
      'dfs.namenode.rpc-address.hacluster.25' = '主NameNodeIP地址:RPC通信端口',
      'dfs.client.failover.proxy.provider.hacluster' = 'org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider',
      'hive.version' = '3.1.0',
      'yarn.resourcemanager.address' = '192.168.xx.xx:26004',
      'yarn.resourcemanager.principal' = 'mapred/hadoop.hadoop.com@HADOOP.COM',
      'hive.metastore.kerberos.principal' = 'hive/hadoop.hadoop.com@HADOOP.COM',
      'hadoop.security.authentication' = 'kerberos',
      'hadoop.kerberos.keytab' = '/opt/Bigdata/FusionInsight_Doris_8.3.0/install/FusionInsight-Doris-1.2.3/doris-fe/bin/doris.keytab',
      'hadoop.kerberos.principal' = 'doris/hadoop.hadoop.com@hadoop.com',
      'java.security.krb5.conf' = '/opt/Bigdata/FusionInsight_BASE_8.3.0/1_2_KerberosClient/etc/krb5.conf',
      'AWS_ACCESS_KEY' = 'AK信息',
      'AWS_SECRET_KEY' = 'SK信息',
      'AWS_ENDPOINT' = '集群所在地区的终端节点',
      'AWS_REGION' = '集群所在region',
      'hadoop.rpc.protection' = 'privacy'
    );
    表1 参数说明

    参数

    取值样例

    参数描述

    hive.metastore.uris

    thrift://192.168.xx.xx:21088

    Hive MetaStore的URL,格式为“thrift://<Hive MetaStore的IP地址>:<端口号>”,支持多个值,以逗号分隔。

    hive.metastore.sasl.enabled

    true

    MetaStore的管理权限开关,值为“true”。

    hive.server2.thrift.sasl.qop

    auth-conf

    HiveServer2和客户端交互是否加密传输,值为“auth-conf”。

    hive.server2.authentication

    KERBEROS

    访问HiveServer的安全认证方式,值为“KERBEROS”。

    dfs.nameservices

    hacluster

    集群NameService名称。

    可在NameNode所在节点的“${BIGDATA_HOME}/FusionInsight_HD_*/1_*_NameNode/etc”目录下的“hdfs-site.xml”中查找该配置项的值。

    dfs.ha.namenodes.hacluster

    24,25

    集群NameService前缀,包含两个值。

    可在NameNode所在节点的“${BIGDATA_HOME}/FusionInsight_HD_*/1_*_NameNode/etc”目录下的“hdfs-site.xml”中查找该配置项的值。

    dfs.namenode.rpc-address.hacluster.xx1

    -

    主NameNode的RPC通信地址。

    可在NameNode所在节点的“${BIGDATA_HOME}/FusionInsight_HD_*/1_*_NameNode/etc”目录下的“hdfs-site.xml”中查找该配置项的值。xx为“dfs.ha.namenodes.hacluster”参数的值。

    dfs.namenode.rpc-address.hacluster.xx2

    -

    备NameNode的RPC通信地址。

    可在NameNode所在节点的“${BIGDATA_HOME}/FusionInsight_HD_*/1_*_NameNode/etc”目录下的“hdfs-site.xml”中查找该配置项的值。xx为“dfs.ha.namenodes.hacluster”参数的值。

    hive.version

    3.1.0

    Hive版本。

    可在Manager界面,选择“集群 > 服务 > Hive”,在概览页面查看“版本”获取。

    yarn.resourcemanager.address

    192.168.xx.xx

    主ResourceManager实例的IP地址。

    可在Manager界面,选择“集群 > 服务 > Yarn > 实例”,查看主ResourceManager实例的业务IP地址。

    yarn.resourcemanager.principal

    mapred/hadoop.hadoop.com@HADOOP.COM

    访问Yarn集群的Principal。

    可登录Manager页面,选择“系统 > 权限 > 域和互信”,查看“本端域”参数获取。

    hive.metastore.kerberos.principal

    hive/hadoop.hadoop.com@HADOOP.COM

    访问Hive集群的Principal,值为“hive/hadoop.hadoop.com@HADOOP.COM”。

    hadoop.security.authentication

    kerberos

    访问Hadoop的安全认证方式,值为“kerberos”。

    hadoop.kerberos.keytab

    /opt/Bigdata/FusionInsight_Doris_8.3.0/install/FusionInsight-Doris-1.2.3/doris-fe/bin/doris.keytab

    访问Hadoop集群的keytab文件所在的具体路径,值为“${BIGDATA_HOME}/FusionInsight_Doris_*/install/FusionInsight-Doris-*/doris-be/bin/doris.keytab”。

    hadoop.kerberos.principal

    doris/hadoop.hadoop.com@HADOOP.COM

    访问Hadoop集群的Principal,值为“doris/hadoop.hadoop.com@HADOOP.COM”。

    说明:

    该参数值的系统域名要严格区分大小写。如系统域名查询为11B1A87B_48C8_xxx_CC4039.COM时,对应配置应为:

    'hadoop.kerberos.principal' = 'doris/hadoop.11b1a87b_48c8_451f_a283_dd0be9cc4039.com@11B1A87B_48C8_xxx_CC4039.COM',

    java.security.krb5.conf

    /opt/Bigdata/FusionInsight_BASE_8.3.0/1_2_KerberosClient/etc/krb5.conf

    krb5文件所在的具体路径,值为“${BIGDATA_HOME}/FusionInsight_BASE_*/1_*_KerberosClient/etc/krb5.conf”。

    AWS_ACCESS_KEY

    xxx

    AK、SK信息。可以通过以下操作以下获取:

    1. 登录控制台,在用户名下拉列表中选择“我的凭证”。
    2. 进入“我的凭证”页面,选择“访问密钥 > 新增访问密钥”。
    3. 单击“确定”,根据浏览器提示,保存密钥文件。密钥文件会直接保存到浏览器默认的下载文件夹中。打开名称为“credentials.csv”的文件,即可查看访问密钥AK(Access Key Id)和SK(Secret Access Key)。

    AWS_SECRET_KEY

    xxx

    AWS_ENDPOINT

    xxx

    登录“对象存储服务 OBS”管理控制台,单击“并行文件系统”,单击Hive表所在的OBS并行文件系统名称,在概览界面查看“Endpoint”参数值,该值为创建Catalog时设置AWS_ENDPOINT参数的值。

    AWS_REGION

    xxx

    可在地区和终端节点获取。

    hadoop.rpc.protection

    AWS_SECRET_KEY

    设置Hadoop中各模块的RPC通道是否加密,默认为“privacy”。

    可在Manager界面,选择“集群 > 服务 > HDFS > 配置”,搜索“hadoop.rpc.protection”获取。

  3. 执行以下命令查询Hive表。

    • 执行以下命令查询Catalogs。
      show catalogs;
    • 执行以下命令查询Catalog下面的数据库。
      show databases from hive_catalog;
    • 执行以下命令切换到Catalog下,再进入到数据库中。
      switch hive_catalog;
      use default;
    • 查询Catalog中某个库的所有表。
      show tables from `hive_catalog`.`default`;
    • 查询指定表。
      select * from `hive_catalog`.`default`.`test_table`;
    • 执行以下命令查看表的Schema。
      DESC test_table;
    • 新建或操作Hive表后,需要在Doris中执行刷新。
      refresh catalog hive_catalog;

    例如执行后结果如下,表示查询成功:

  4. 执行以下命令创建Doris表(使用引擎为 UNIQUE )。

    CREATE TABLE wxk.`lineorder_u` (
      `LO_ORDERKEY` bigint NOT NULL COMMENT "订单id",
      `LO_LINENUMBER` int NOT NULL COMMENT "订单码",
      `LO_CUSTKEY` bigint NOT NULL COMMENT "客户id",
      `LO_PARTKEY` bigint NOT NULL COMMENT "商品id",
      `LO_SUPPKEY` bigint NOT NULL COMMENT "供应商id",
      `LO_ORDERDATE` date DEFAULT NULL COMMENT "订单日期",
      `LO_ORDERPRIORITY` varchar(100) DEFAULT NULL COMMENT "订单优先级",
      `LO_SHIPPRIORITY` int DEFAULT NULL COMMENT "物流优先级",
      `LO_QUANTITY` int DEFAULT NULL COMMENT "数量",
      `LO_EXTENDEDPRICE` bigint DEFAULT NULL COMMENT "扩展价格",
      `LO_ORDTOTALPRICE` bigint DEFAULT NULL COMMENT "订单总价",
      `LO_DISCOUNT` int DEFAULT NULL COMMENT "折扣",
      `LO_REVENUE` bigint DEFAULT NULL COMMENT "收入",
      `LO_SUPPLYCOST` int DEFAULT NULL COMMENT "成本",
      `LO_TAX` int DEFAULT NULL COMMENT "税款",
      `LO_COMMITDATE` date DEFAULT NULL COMMENT "承诺日期",
      `LO_SHIPMODE` varchar(100) NOT NULL COMMENT "运输方式"
    ) UNIQUE KEY (
      `LO_ORDERKEY`,
      `LO_LINENUMBER`,
      `LO_CUSTKEY`,
      `LO_PARTKEY`,
      `LO_SUPPKEY`,
      `LO_ORDERDATE`
    ) PARTITION BY RANGE(`LO_ORDERDATE`) (
      PARTITION `p1992`
      VALUES
        LESS THAN ("1993-01-01"),
        PARTITION `p1993`
      VALUES
        LESS THAN ("1994-01-01"),
        PARTITION `p1994`
      VALUES
        LESS THAN ("1995-01-01"),
        PARTITION `p1995`
      VALUES
        LESS THAN ("1996-01-01"),
        PARTITION `p1996`
      VALUES
        LESS THAN ("1997-01-01"),
        PARTITION `p1997`
      VALUES
        LESS THAN ("1998-01-01"),
        PARTITION `p1998`
      VALUES
        LESS THAN ("1999-01-01"),
        PARTITION `p1999`
      VALUES
        LESS THAN ("2000-01-01"),
        PARTITION `p2000`
      VALUES
        LESS THAN ("2001-01-01"),
        PARTITION `p2001`
      VALUES
        LESS THAN ("2002-01-01")
    ) DISTRIBUTED BY HASH(`LO_ORDERDATE`) BUCKETS 1 PROPERTIES (
      "replication_allocation" = "tag.location.default: 3"
    );

    例如执行后结果如下,表示创建Doris表成功。

  5. 执行以下命令读取Hive外表数据写入Doris。

    insert into internal.wxk.lineorder_u select * from hive_catalog.wxk.lineorder02

    例如执行后结果如下,数据写入Doris成功,且按照UNIQUE KEY指定字段自动去除重复数据。

相关文档