Hadoop学习笔记[3]-HDFS权限验证与客户端开发

hdfs自身没有用户体系,需要依靠第三方提供。例如LDAP,kerberos,linux系统用户等,但是HDFS和linux一样有超级管理员的概念,linux的超级管理员是root,HDFS的超级管理员是启动NN的用户,比如用hdp01用户启动hdfs,则hdfs的超级用户就是hdp01
  虽然HDFS没有用户的概念,但是有自身的权限体系,权限命令和linux差不多,可以赋权给用户或者用户组对应的权限

1、权限相关命令实战

1-1 熟悉几个命令
chown -R username path  #将path和path下的子目录的所有者都换成username
useradd user #添加新用户【root下】
passwd  user #【配置密码】
1-2、创建超级用户的家目录【超级用户是hdp01,普通用户是hdp02,linux系统用户是root】
  • 1)、hdfs dfs -mkdir -p /user/hdp01
  • 2)、切换到root,在/user/hdp01创建文件夹,会显示权限不足,因为只有持有者才有写入权限
  • 3)、切换回hdp01 ,在家目录下创建测试目录 abc
  • 4)、修改abc的组,hdfs dfs -chown hdp01:groupTest abc【将abc文件夹的所有者换成hdp02,所有组换成groupTest】
  • 5)、修改abc的权限,hdfs dfs -chmod 775 abc【所有者和所有者组都有全部权限,其他用户没有读权限】
  • 6)、切换到hdp02,还是没权限,因为hdfs没有组的概念,需要从操作系统同步用户和组的信息
  • 7)、切换到root【要在active的NN上执行】
  • 7)-1 id hdp02查看组信息
  • 7)-2 添加系统组groupTest,groupadd groupTest
  • 7)-3 用户添加到组 usermod -a -G groupTest hdp02
  • 7)-4 切换回hdp01【只有hdfs超级用户才能执行】,同步信息到hdfs,hdfs dfsadmin -refreshUserToGroupsMappings
  • 7)-5 切换回hdp02,查看hdfs组信息 hdfs groups,并执行在hdp01家目录下的abc建立文件夹下操作,已经不报错

2、客户端开发【idea】

在windows上添加环境变量,HADOOP_USER_HOME=hdp01,实际提交的时候程序会读取这个环境变量,如果不配置就会读取系统的USERNAME,到时候可能会有一些权限的问题,下面介绍一下代码调试种类

2-1 将代码打成jar包,上传到集群,用hadoop jar运行
2-2 嵌入式运行【也就是在idea提交任务到集群,可在linux或者windows】
  • 1)、 需要设置跨平台运行参数"mapreduce.app-submission.cross-platform"为true
  • 2)、需要设置上传的jar包,即需要上传到hdfs的jar包在本地的位置
  • 3)、 小插曲:在调试代码的时候由于在pom.xml文件同时引入了hadoop-client和hadoop-hdfs-client,导致jar包冲突,报错是No FileSystem for scheme: hdfs,把hadoop-hdfs-client去掉即可
  • 4)、 将代码写死的输出路径等参数化,可以使用工具类GenericOptionsParser,其内部会自动将-D标识的参数解析到conf中,将其余参数放到剩余参数数组,后续可以根据顺序取用,如以下参数
-D mapreduce.app-submission.cross-platform=true
       -D mapreduce.job.reduces=1
       D:\\JAVA_WORKSPACE\\TEST\\target\\JDBC_TEST-1.0-SNAPSHOT.jar
       hello_arg
       word.txt
       out
       -D的参数会直接设置在conf,其余的按照顺序存储字符串数组
2-3 单机调试【在IDE调试,不介绍了】