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

【问题记录关于集成开发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 actually incompatible. ---------------------【排除文件权限问题】
二:属性参数
修改属性,关闭客户端能力校验,将metastore.client.capability.check设置为false,测试,发现能够对内部表进行DESC操作,但在Presto中能进行插入数据操作[埋个伏点],插入的数据也能查询到(Hive-Presto双向查询),但是仍然查询不到原先就已经存储在Hive内部表中的数据。说明内部表是能访问的到的,只是什么东西阻碍了Presto或者说是这个“用户”去从原来的内部表中获取数据。
三:表属性(Hive版本问题)
刚开始一直以为是Presto版本的问题,但一直找不到具体原因,后面通过查询Hive官网信息,发现Hive3.0之后其在创建内部表的时候是默认创建ACID的事务表(这边就不叙述ACID特性了),在本地的测试环境下找到hive.create.as.insert.only属性,发现false的,而生产环境下却是true着的,那么关闭它,就能在Presto中进行插入操作了[前面的伏点]。在这里插入图片描述
但是还是和表的ACID特性无相关,继续看官网,滴,找到对应属性metastore.create.as.acid,添加并将默认值改变,最后再添一笔,将内部表的严格管理属性也关闭了,测试,成功,Presto成功查询到Hive中内部表全部数据,操作正常。
========================================================================
问题解决,是Hive版本造成的“权限”读写问题。还不懂的就去看看ACID特性。上述所涉及到的图片我就不多贴了,基本叙述就很清楚的表述了。
仅记录,防踩坑!

猜你喜欢

转载自blog.csdn.net/qq_42035364/article/details/98880836