背景
- hadoop 3.1.2
- hive 2.1.1
hive创建库时默认用户为个人用户,这个在ranger授权后访问hive库时没有hdfs权限,需要解决创建文件夹默认权限问题
原因分析
hive权限分为两层,一层是hdfs目录权限管控,一层是hive的权限管控。一般解决思路有两种,通过ranger两边授权。另一种是直接放开hdfs的目录权限管控,授权为777,通过ranger管理hive的权限,这种方式有风险
解决方法
- ranger中授权时在 hive中授权,再到hdfs中授权
- 修改warehouseq目录权限,让所有的hdfs目录权限都为777
- hive 配置继承
- hdfs umask
- hdfs acls设置
1、hive配置权限继承
1.1、设置warehouse目录权限为777
export HADOOP_USER_NAME=hdfs
hdfs dfs -chmod 777 /apps/hive/warehouse
1.2、修改hive-site.xml
主要是metastore的hive-site.xml配置文件
<property>
<name>hive.warehouse.subdir.inherit.perms</name>
<value>true</value>
<description>
Set this to false if the table directories should be created
with the permissions derived from dfs umask instead of
inheriting the permission of the warehouse or database directory.
</description>
</property>
image.png
umask
hadoop的umask 与linux的umask类似,umask-mode值为022,默认为创建文件夹为755对应rwxr-xr-x,文件为644对应rw-r--r--
针对上述问题,设置为002即可解决,但是存在设置权限过大问题。而且验证还影响ranger鉴权。
acls
hadoop shell提供命令setfacl,来设置一个目录额外添加权限,指定用户,组可以访问的权限。
1、前提条件,开启acks权限设置
需要确定hdfs-site.xml文件的两个配置项为true:
<property>
<name>dfs.permissions.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.namenode.acls.enabled</name>
<value>true</value>
</property>
2、命令setfacl
hdfs dfs -setfacl -R|[--set <acl_spec> <path>]
-b: 删除基本ACL条目以外的所有条目。保留用户,组和其他条目以与权限位兼容。
-k: 删除默认ACL。default
-R: 以递归方式将操作应用于所有文件和目录。常用。
-m: 修改ACL。新条目将添加到ACL,并保留现有条目。常用。
-x: 删除指定的ACL条目。保留其他ACL条目。常用。
--set: 完全替换ACL,丢弃所有现有条目。 acl_spec必须包含用户,组和其他条目,以便与权限位兼容。
acl_spec: 逗号分隔的ACL条目列表。
path: 要修改的文件或目录。
demo
hdfs dfs -setfacl -m user:hadoop:rw- /file
hdfs dfs -setfacl -x user:hadoop /file
hdfs dfs -setfacl -b /file
hdfs dfs -setfacl -k /dir
hdfs dfs -setfacl --set user::rw-,user:hadoop:rw-,group::r--,other::r-- /file
hdfs dfs -setfacl -R -m user:hadoop:r-x /dir
hdfs dfs -setfacl -m default:user:hadoop:r-x /dir
说明
default:user:hadoop:r-x 在添加默认用户权限时会被子目录,文件继承,如果不使用默认修饰则不会
可以继承的说明
image.png不可以继承的说明
image.pngThroubleShooting
hadoop 2.7.3版本不生效,因为在3.x才支持dfs.namenode.posix.acl.inheritance.enabled,默认为true,如果开启了hdfs默认继承父目录的权限,不以umask为准
解决办法
修改client的umask参数,在不支持dfs.namenode.posix.acl.inheritance.enabled以前通过client的umask配置来确定的
网友评论