使用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
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的集成让您的数据湖架构更灵活,支持大数据量和复杂查询需求,同时保证了集群的可扩展性和高可用性。