问题记录关于集成开发Presto访问不到内部表数据问题

本文记录了一次在Presto集成开发中遇到的无法访问Hive内部表数据的问题。经过排查,问题出在Hive3.0版本的ACID特性以及相关属性设置上。通过修改metastore.client.capability.check、hive.create.as.insert.only和metastore.create.as.acid属性,以及关闭内部表的严格管理属性,最终解决了Presto无法查询Hive内部表数据的问题。

【问题记录关于集成开发Presto】

测试环境:Hive3.1.0 HDP3 Presto0.22【这套环境没有问题】
生产环境:Hive3.0 Presto0.22【这套环境存在问题】
期间问题出现很多,大多都是通过原理角度去考虑分析问题,慢慢的排除从而找到具体原因,这次也不然,由于在Presto能查询到Hive的外部表数据等信息却查询不到内部表的数据信息(除了表名能查到之外其他都查不到),但是马上就想到了内外部表的存储位置以及用户权限问题,分析如下:
一:权限问题
先查看了生产环境下的Hive内外部表在HDFS上的存储路径,发现/xx/xx/managed/hive(内部表)的权限为drwxr-x—,而/xx/xx/external/hive(外部表)的权限为drwxrwxrwx,所属的用户及用户组分别是hive用户和Hadoop用户组,然后去查询Presto的指定用户是什么---->hive用户。
纳闷了,抱以一种怀疑的态度去想是不是Presto使用Presto进程的OS用户访问HDFS,导致使用了其他用户组用户访问内部表,从而权限不够引起的问题。后面将/xx/xx/managed/hive(内部表)的权限修改为drwxr-xr-x,测试,发现问题依然没有解决,报错信息:Your client does not appear to support insert-only tables.To skip capability checks, please set metastore.client.capability.check to false. This setting can be set globally, or on the client for the current metastore session. Note that this may lead to incorrect results, data loss, undefined behavior, etc. if your client is act

### Hive、Spark 和 Presto 的性能对比及优化方案 #### 1. 性能对比分析 Hive、Spark 和 Presto 各自针对不同的应用场景进行了优化,其核心差异主要体现在架构设计和执行模型上: - **Hive**: 主要用于构建批处理数据仓库系统,依赖 Hadoop 的 MapReduce 计算框架。由于其底层采用分布式文件系统(如 HDFS),在大规模数据集上的稳定性和可靠性较高[^1]。然而,Hive 的查询延迟相对较高,尤其是在交互式查询场景中表现不佳。 - **Spark**: 提供了一种更高效的内存计算模式,能够显著提升迭代型任务的执行效率[^3]。通过 RDD(Resilient Distributed Datasets)抽象层以及内置的 Catalyst 查询优化器,Spark 能够实现更快的数据处理速度。此外,它还支持多种编程接口(Scala/Java/Python/R),使得开发者可以根据需求灵活选择开发工具[^2]。 - **Presto**: 设计初衷是为了满足 Facebook 内部对低延时即席查询的需求,因此特别擅长实时数据分析任务[^1]。相比于其他两者而言,Presto 更加注重用户体验,在返回初步结果的速度上有明显优势。不过需要注意的是,它的资源消耗较大,可能不适合长期运行的任务。 #### 2. 集成使用方法探讨 随着企业业务复杂性的增加,单一技术栈往往难以覆盖所有需求领域。以下是几种常见组合方式及其适用场景: ##### (1)Hive + Spark 这种搭配充分利用了两者的长处:利用 Hive 来管理结构化表格定义及相关元信息;借助 Spark 强大的计算能力加速 ETL 流程或机器学习训练过程。具体做法包括但不限于开启 `spark.sql.hive.convertMetastoreOrc` 参数以无缝衔接 ORC 文件格式的支持。 ```scala // 示例代码展示如何从 Hive 表加载数据到 DataFrame 中 val df = spark.read.table("my_hive_table") df.createOrReplaceTempView("temp_view") val resultDF = spark.sql(""" SELECT column_name FROM temp_view WHERE condition_column='value' """) resultDF.show() ``` ##### (2)Presto + Hive Metastore 在这种情况下,Presto 可作为轻量级 OLAP 工具直接访问Hive 维护的外部表目录服务。这样既保留了原有基础设施投资又获得了亚秒级别响应时间体验[^4]。 ##### (3)三者联合部署 对于超大型综合平台来说,则可考虑同时引入这三种组件分别承担各自最擅长的部分功能模块。例如让 Spark 承担繁重的历史累积报表统计职责;交予 Presto 处理日常运营监控指标提取请求;最后再依靠 Hive 存储归档多年积累下来的原始日志资料以便日后追溯审计之需。 --- ###
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值