在HDFS路径创建Hive外部表时遇到权限问题求助
Hive创建外部表权限被拒问题排查与解决
问题详情
创建Hive外部表时触发权限错误,执行的SQL语句:
CREATE EXTERNAL TABLE IF NOT EXISTS `testing`( id bigint, name string, Guid string ) PARTITIONED BY(id bigint) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.orc.OrcSerde' STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat' LOCATION "hdfs://hivehostname:8020/tmp/external/test" ;
报错信息:
Error: Error while compiling statement: FAILED: HiveAccessControlException Permission denied: user [username] does not have [ALL] privilege on
解决步骤
1. 校验HDFS目标路径权限
先确认HDFS上/tmp/external/test路径的权限是否对当前用户开放:
- 执行命令查看路径权限:
hdfs dfs -ls /tmp/external/
- 若权限不足,使用HDFS超级用户(如
hdfs)调整权限:
# 给目标用户分配路径所有权 hdfs dfs -chown username:your_group /tmp/external/test # 或添加读写执行权限(生产环境按需调整,避免过度开放) hdfs dfs -chmod 755 /tmp/external/test
2. 配置Hive细粒度权限(若启用)
如果集群用了Sentry/Ranger这类权限管控组件,需要给用户username分配对应权限:
- Sentry授权示例:
-- 直接授权目标表 GRANT ALL ON TABLE testing TO USER username; -- 或先授权所属数据库 GRANT ALL ON DATABASE your_database TO USER username;
- Ranger授权:登录Ranger控制台,找到Hive权限策略,添加用户
username对目标表/路径的ALL权限规则。
3. 修正表结构逻辑问题
注意到SQL中同时将id设为普通字段和分区字段,这会引发数据写入、查询的逻辑冲突,建议修改分区字段为其他字段(如dt):
CREATE EXTERNAL TABLE IF NOT EXISTS `testing`( name string, Guid string ) PARTITIONED BY(dt string) -- 替换为非重复字段 ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.orc.OrcSerde' STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat' LOCATION "hdfs://hivehostname:8020/tmp/external/test" ;
内容的提问来源于stack exchange,提问作者dataeng
相关产品推荐
相关产品推荐

