首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Hadoop 權限錯誤解決:Permission denied user=hadoop access=WRITE inode=root

     編輯:Java 綜合教學

錯誤現象與根因分析

在 Ubuntu 上使用 Eclipse 運行 MapReduce 程式時,報錯:

Permission denied: user=hadoop, access=WRITE, inode="/user/root":root:supergroup:rwxr-xr-x

核心原因: 程式以 `hadoop` 用戶身份運行(非 root),嘗試將輸出寫入 HDFS 的 `/user/root/output` 目錄,但該目錄擁有者為 `root`,權限 `rwxr-xr-x` 僅允許擁有者寫入,`hadoop` 用戶無寫入權限。

兩種解決方案

方案一:調整輸出路徑至 hadoop 用戶可寫目錄(推薦)

在代碼中將輸出路徑指定為 `hadoop` 用戶擁有的目錄,如 `/user/hadoop/output` 或 `/tmp/output`:

FileOutputFormat.setOutputPath(job, new Path("/user/hadoop/output"));

或在提交任務前確保目錄存在且有權限:

hadoop fs -mkdir -p /user/hadoop/output
hadoop fs -chown hadoop:hadoop /user/hadoop/output

方案二:修改目標目錄權限(快速驗證用)

授予 `/user/root` 目錄寫入權限:

hadoop fs -chmod 777 /user/root

注意: 生產環境嚴禁使用 777,僅限開發/測試環境快速驗證。正規做法是規劃用戶專屬目錄並設定合適 ACL。

最佳實踐:HDFS 用戶與權限規劃

  1. 用戶隔離: 每個業務用戶(或服務賬號)擁有獨立的 HDFS 家目錄 `/user/{username}`,權限 `drwxr-xr-x`,由該用戶擁有。
  2. 目錄預創建: 部署腳本/初始化任務中包含 `hadoop fs -mkdir -p /user/{username} && hadoop fs -chown {username}:{group} /user/{username}`。
  3. 程式碼參數化: 輸入/輸出路徑通過配置文件或命令行參數傳入,避免硬編碼。
  4. Kerberos 環境: 安全集群需使用 `UserGroupInformation.loginUserFromKeytab()` 進行認證,而非依賴 OS 用戶。

排查檢查清單

  • [ ] 確認提交任務的 OS 用戶(`whoami`)
  • [ ] 檢查 HDFS 目標目錄擁有者與權限(`hadoop fs -ls /user/root`)
  • [ ] 確認程式碼中輸出路徑是否硬編碼
  • [ ] 查看 NameNode/DataNode 日誌是否有更詳細的拒絕信息
  • [ ] 驗證 `core-site.xml` 中 `hadoop.proxyuser.{user}.hosts/groups` 配置(如使用代理用戶)

權限問題是 Hadoop 開發中最常見的「坑」之一,建立清晰的用戶-目錄映射規範,並將其納入部署自動化流程,能從根源上杜絕此類問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved