hdfs自身没有用户体系,需要依靠第三方提供。例如LDAP,kerberos,linux系统用户等,但是HDFS和linux一样有超级管理员的概念,linux的超级管理员是root,HDFS的超级管理员是启动NN的用户,比如用hdp01用户启动hdfs,则hdfs的超级用户就是hdp01
虽然HDFS没有用户的概念,但是有自身的权限体系,权限命令和linux差不多,可以赋权给用户或者用户组对应的权限
chown -R username path #将path和path下的子目录的所有者都换成usernameuseradd user #添加新用户【root下】passwd user #【配置密码】
1-2、创建超级用户的家目录【超级用户是hdp01,普通用户是hdp02,linux系统用户是root】1)、hdfs dfs -mkdir -p /user/hdp012)、切换到root,在/user/hdp01创建文件夹,会显示权限不足,因为只有持有者才有写入权限3)、切换回hdp01 ,在家目录下创建测试目录 abc4)、修改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 groupTest7)-3 用户添加到组 usermod -a -G groupTest hdp027)-4 切换回hdp01【只有hdfs超级用户才能执行】,同步信息到hdfs,hdfs dfsadmin -refreshUserToGroupsMappings7)-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"为true2)、需要设置上传的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调试,不介绍了】