一.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角色