栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

hive3 acid引起的spark和presto报错的问题,以及无法使用自定义函数问题

hive3 acid引起的spark和presto报错的问题,以及无法使用自定义函数问题

一.hive3 acid引起的spark和presto报错的问题

在hdp3.1.5中hive3中内部表默认开启了acid,当spark和presto创建和读取内部表的时候会报错,网上建议的方式是舍弃掉acid特性

hive.strict.managed.tables=false 
hive.create.as.insert.only=false 
metastore.create.as.acid=false

对应hdp的hive默认配置做如下修改,重新hive服务后确实可以生效:

存在的一些其他问题

在修改上述配置之后同事反馈创建新表但是没有任何表数据,于是我实际测试发现如下问题。

首先使用hive的beeline客户端使用命令行的方式利用create table as select这样的语法创建一个表。如下我创建一个测试表,查询的时候会发现表里没有任何数据,查询建表语句也能发现表是正常创建的:

0: jdbc:hive2://192.168.32.102:10000> create table test.test  STORED AS TEXTFILE as 
0: jdbc:hive2://192.168.32.102:10000> select * from test.test;
+--------------------+-------------------+--------------------+-------------------+-------------+
| test.sepal_length  | test.sepal_width  | test.petal_length  | test.petal_width  | test.lable  |
+--------------------+-------------------+--------------------+-------------------+-------------+
+--------------------+-------------------+--------------------+-------------------+-------------+
No rows selected (0.114 seconds)
0: jdbc:hive2://192.168.32.102:10000> show create table test.test;
+----------------------------------------------------+
|                   createtab_stmt                   |
+----------------------------------------------------+
| CREATE EXTERNAL TABLE `test.test`(                 |
|   `sepal_length` double,                           |
|   `sepal_width` double,                            |
|   `petal_length` double,                           |
|   `petal_width` double,                            |
|   `lable` string)                                  |
| ROW FORMAT SERDE                                   |
|   'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'  |
| STORED AS INPUTFORMAT                              |
|   'org.apache.hadoop.mapred.TextInputFormat'       |
| OUTPUTFORMAT                                       |
|   'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' |
| LOCATION                                           |
|   'hdfs://ubdi-hdp101:8020/warehouse/tablespace/external/hive/test.db/test' |
| TBLPROPERTIES (                                    |
|   'TRANSLATED_TO_EXTERNAL'='TRUE',                 |
|   'bucketing_version'='2',                         |
|   'external.table.purge'='TRUE',                   |
|   'transient_lastDdlTime'='1637892211')            |
+----------------------------------------------------+
19 rows selected (0.133 seconds)

排除原始表没有数据的情况,如果仔细观察上述建表语句就会发现这里建表的时候没有指定“EXTERNAL”但是hive还是创建了外部表,如果查看hdfs上的存储目录会发现hive其实是导入了数据,但是同时创建了内部表和外部表两个存储目录,却将数据导入了内部表的存储目录,所以就导致了查询外部表的时候无法查询到数据

[hdfs@ubdi-hdp101 ~]$ hdfs dfs -ls /warehouse/tablespace/external/hive/test.db/test
[hdfs@ubdi-hdp101 ~]$
[hdfs@ubdi-hdp101 ~]$
[hdfs@ubdi-hdp101 ~]$ hdfs dfs -ls /warehouse/tablespace/managed/hive/test.db/test
Found 1 items
-rw-rw----+  3 hive hadoop       3751 2021-11-26 10:03 /warehouse/tablespace/managed/hive/test.db/test/000000_0

测试发现这种情况目前只存在hive上,如果使用presto和spark创建内部表都是是正常的。这也许是hive存在的一个bug。如果使用“create EXTERNAL table as select” 这样的语法则不会出现上述问题,所以如果非要这么用加上“EXTERNAL”指定外部表即可。

二、无法使用自定义函数问题

在使用自定义函数的时候会报权限问题,如果试图使用“set role admin;”切换权限同样会报错,则需要做如下两处修改。修改"hive.security.authorization.manager"配置项为"org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdHiveAuthorizerFactory",同时增加自定义配置指定hive用户为admin角色

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/600206.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号