实战:使用Doris从Hudi(Hive)读取数据

824 阅读3分钟

使用Doris从Hudi(Hive)读取数据

想象一下,只需少量配置,您的Doris系统就能轻松读取Hudi(Hive)中的数据。这并不是一个遥不可及的梦想,而是Doris与Hudi(Hive)深度集成带来的巨大便利。Doris,一个强大的实时分析数据库,可以无缝地与Hudi结合,用于快速、实时的数据查询与分析。以下是如何实现这一目标的详细过程

背景

Apache Doris是一款高性能、实时的分布式 SQL 数据库,特别适合用于实时分析。而Apache Hudi是一种数据湖平台,主要用于提供数据设计和更新的高效HDFS存储层。

在Doris中创建Hive Metastore资源

我们需要在Doris中创建一个外部资源,指向Hive的Metastore。这个配置允许Doris访问通过Hive Metastore管理的Hudi和Hive表。假设你的集群环境需要Kerberos进行验证,下述示例展示了如何配置这些参数:

配置参数解释

  • type:指定资源类型为hms(Hive Metastore)。
  • hive.metastore.uris:Hive Metastore服务器的Thrift URI列表。
  • dfs.namenode.rpc-address:HDFS Namenode的RPC地址。
  • hive.metastore.sasl.enabled:启用SASL验证。
  • hadoop.security.authentication:设置Hadoop安全认证类型为kerberos
  • hadoop.kerberos.keytab:指定Kerberos认证所需的Keytab文件路径。
  • hadoop.kerberos.principal:指定Kerberos认证的Principal。
  • hive.metastore.kerberos.principal:用于Hive Metastore的Kerberos principal。
  • yarn.resourcemanager.principal:YARN ResourceManager的Kerberos principal。
CREATE RESOURCE hms_resource2 PROPERTIES (
'type'='hms',
'hive.metastore.uris' = 'thrift://master.am.com:9083,thrift://slave1.am.com:9083',
'dfs.namenode.rpc-address'='master.am.com:8020',
'hive.metastore.sasl.enabled' = 'true',
'hadoop.security.authentication' = 'kerberos',
'hadoop.kerberos.keytab' = '/etc/security/keytabs/smokeuser.headless.keytab',   
'hadoop.kerberos.principal' = 'ambari-qa-hadoop@AM.COM',
'hive.metastore.kerberos.principal' = 'hive/_HOST@AM.COM',
'yarn.resourcemanager.principal' = 'rm/_HOST@AM.COM');

如果报错Cannot locate default realm.

将 -Djava.security.krb5.conf=/your-path 配置项添加到 Broker Load 启动脚本的 start_broker.sh 的 JAVA_OPTS里。

elif [[ "${RUN_DAEMON}" -eq 1 ]]; then
    nohup ${LIMIT:+${LIMIT}} "${JAVA}" ${final_java_opt:+${final_java_opt}} -Djava.security.krb5.conf=/etc/krb5.conf -XX:-OmitStackTraceInFastThrow -XX:OnOutOfMemoryError="kill -9 %p" org.apache.doris.DorisFE ${HELPER:+${HELPER}} "${METADATA_FAILURE_RECOVERY}" "$@" >>"${LOG_DIR}/fe.out" 2>&1 </dev/null &
elif [[ "${RUN_CONSOLE}" -eq 1 ]]; then

a80c9d1deaa0b759558a3be79e13934.png

CREATE RESOURCE hms_resource PROPERTIES (
'type'='hms',
'hive.metastore.uris' = 'thrift://ddp-js6dn-c027:9083,thrift://ddp-js6dn-c028:9083',
'dfs.nameservices'='ns1',
'dfs.ha.namenodes.ns1'='nn1,nn2',
'dfs.namenode.rpc-address.ns1.nn1'='ddp-js6dn-c022:54310',
'dfs.namenode.rpc-address.ns1.nn2'='ddp-js6dn-c023:54310',
'dfs.client.failover.proxy.provider.ns1'='org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider',
'hive.metastore.sasl.enabled' = 'true',
'hadoop.security.authentication' = 'kerberos',
'hadoop.kerberos.keytab' = '/opt/TDP/keytab/hdfs.keytab',   
'hadoop.kerberos.principal' = 'hdfs/_HOST@GROUPB.HADOOP.CN',
'hive.metastore.kerberos.principal' = 'hive/_HOST@GROUPB.HADOOP.CN',
'yarn.resourcemanager.principal' = 'yarn/_HOST@GROUPB.HADOOP.CN');

问题

CREATE CATALOG hudi WITH RESOURCE hms_resource;
ERROR 1105 (HY000): errCode = 2, detailMessage = Create catalog with resource is deprecated and is not allowed. You can set `disallow_create_catalog_with_resource=false` in fe.conf to enable it temporarily.

问题

ERROR 1105 (HY000): HMSClientException, msg: javax.security.auth.login.LoginException: Unable to obtain password from user

解决

加上主机名不用_host

CREATE RESOURCE hms_resource1 PROPERTIES (
'type'='hms',
'hive.metastore.uris' = 'thrift://ddp-js6dn-c027:9083,thrift://ddp-js6dn-c028:9083',
'dfs.nameservices'='ns1',
'dfs.ha.namenodes.ns1'='nn1,nn2',
'dfs.namenode.rpc-address.ns1.nn1'='ddp-js6dn-c022:54310',
'dfs.namenode.rpc-address.ns1.nn2'='ddp-js6dn-c023:54310',
'dfs.client.failover.proxy.provider.ns1'='org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider',
'hive.metastore.sasl.enabled' = 'true',
'hadoop.security.authentication' = 'kerberos',
'hadoop.kerberos.keytab' = '/opt/TDP/keytab/hdfs.keytab',   
'hadoop.kerberos.principal' = 'hdfs/ddp-js6dn-c022@GROUPB.HADOOP.CN',
'hive.metastore.kerberos.principal' = 'hive/_HOST@GROUPB.HADOOP.CN',
'yarn.resourcemanager.principal' = 'yarn/_HOST@GROUPB.HADOOP.CN');

创建Doris表引用Hive表

配置完外部资源后,我们可以在Doris中创建一个表,这个表将引用Hive Metastore中的表。以下是一个示例,该表引用了在Hive中管理的Hudi数据表:

CREATE EXTERNAL TABLE hudi_external_table (
    `id` int,
    `name` string,
    `price` double
) ENGINE=HIVE
PROPERTIES (
    "resource" = "hms_resource2",
    "database" = "default",
    "table" = "hudi_table"
);

查询数据

一旦外部表配置完成,您可以使用Doris的查询功能直接从Hudi表中查询数据。这将允许您利用Doris的高效查询引擎,快速分析和处理存储在Hudi和Hive中的数据。例如:

SELECT * FROM hudi_external_table WHERE price > 100;

总结

  • 实时数据查询:Doris强大的实时查询能力与Hudi(Hive)结合,极大地提升了数据处理的时效性。
  • 简单易用:通过直观的SQL配置和查询,大大降低了技术复杂度,便于开发和运维使用。
  • 扩展性好:Doris与Hudi的集成让您的数据湖架构更灵活,支持大数据量和复杂查询需求,同时保证了集群的可扩展性和高可用性。