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