往hdfs写数据无权限
調(diào)用jar包把風(fēng)電數(shù)據(jù)往hdfs寫數(shù)據(jù)無權(quán)限問題 錯(cuò)誤信息:hadoop.security.AccessControlException:Permission denied:user=gcl,access=write,inode:"":jeff:hive:-rw-r--r-- 首先想到的兩個(gè)方法: 1、將hdfs-core.xml配置文件的dfs.permisssions參數(shù)修改為false 2、修改操作文件的權(quán)限 但是這兩種方法都很僵,不夠優(yōu)雅
因?yàn)閡ser=gcl,這里我所期望的是系統(tǒng)的用戶名為hive,于是就想configuration這個(gè)配置類有沒有在哪段源碼里設(shè)置以哪個(gè)用戶運(yùn)行?
org.apache.hadoop.security.UserGroupInformation有一個(gè)靜態(tài)方法:getCurrentUser()。它會(huì)返回一個(gè)UserGroupInformation類的實(shí)例,如果subject為空,或者這個(gè)subject中與org.apache.hadoop.security.User對(duì)應(yīng)的Principal為空,那么說明尚未登錄過,調(diào)用getLoginUser()創(chuàng)建UserGroupInformation的實(shí)例。 getLoginUser()的流程: 1.創(chuàng)建LoginContext: name:如果hadoop.security.authentication等于”kerberos”,那么是“hadoop-user-kerberos”或者“hadoop-keytab-kerberos”,否則是“hadoop-simple”。它的主要作用是作為appName傳遞給UserGroupInformation.HadoopConfiguration.getAppConfigurationEntry(String appName)方法。 subject: callbackHandler: 空 Configuration: UserGroupInformation.HadoopConfiguration的實(shí)例。 2.login.login(); 這個(gè)會(huì)調(diào)用HadoopLoginModule的login()和commit()方法。 HadoopLoginModule的login()方法是一個(gè)空函數(shù),只打印了一行調(diào)試日志 LOG.debug("hadoop login"); commit()方法負(fù)責(zé)把Principal添加到Subject中。 此時(shí)一個(gè)首要問題是username是什么? 在使用了kerberos的情況下,從javax.security.auth.kerberos.KerberosPrincipal的實(shí)例獲取username。 在未使用kerberos的情況下,優(yōu)先讀取HADOOP_USER_NAME這個(gè)系統(tǒng)環(huán)境變量,如果不為空,那么拿它作username。否則,讀取HADOOP_USER_NAME這個(gè)java環(huán)境變量。否則,從com.sun.security.auth.NTUserPrincipal或者com.sun.security.auth.UnixPrincipal的實(shí)例獲取username。 如果以上嘗試都失敗,那么拋出異常LoginException("Can’t find user name")。 最終拿username構(gòu)造org.apache.hadoop.security.User的實(shí)例添加到Subject中。 配置完HADOOP_USER_NAME系統(tǒng)變量之后,文件夾所有者和使用者都將成為hive
轉(zhuǎn)載于:https://juejin.im/post/5c4692a9518825255d29867d
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的往hdfs写数据无权限的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Boot 应用程序启动流程
- 下一篇: Eclipse错误提示: Symbol