Spark运行任务时报错:org.apache.hadoop.hdfs.protocol.DSQuotaExceededException: The DiskSpace quota of...
今天運行spark任務時,遇到一個錯誤,主要報錯信息如下:
org.apache.spark.SparkException:Task failed while writing rows.
Caused by: org.apache.hadoop.hdfs.protocol.DSQuotaExceededException: The DiskSpace quota of /user/hive/warehouse/hive_test.db is exceeded: quota = 13194139533312 B = 12 TB but diskspace consumed = 13194919316682 B = 12.00 TB.
Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.hdfs.protocol.DSQuotaExceededException): The DiskSpace quota of /user/hive/warehouse/hive_test.db is exceeded: quota = 13194139533312 B = 12 TB but diskspace consumed = 13194919316682 B = 12.00 TB.
Caused by: java.lang.IllegalArgumentException: Column has wrong number of index entries found: 0 expected: 17.
出現上述問題的原因是 HDFS 目錄 /user/hive/warehouse/hive_test.db 沒有足夠的磁盤空間 quota,磁盤配額不夠了,即磁盤已滿或超出了用戶所能使用的配額上限。
查看 HDFS 下 /user/hive/warehouse/hive_test.db文件大小:
[hadoop@hadoop102 ~]$ hadoop fs -du -s -h /user/hive/warehouse/hive_test.db查看 HDFS 下 /user/hive/warehouse/hive_test.db 文件中各個表所占空間大小:
[hadoop@hadoop102 ~]$ hadoop fs -du -s -h /user/hive/warehouse/hive_test.db/*可以根據具體的情況刪除一些比較大,且沒有用的表,或者刪除一些分區,這樣可以臨時解決一些問題。
其實最主要的還是要增加磁盤容量:
可以使用 hadoop fs -count 來查看配置情況:
以下是查詢結果,none 和 inf 表示沒有設置配額(默認情況下 HDFS 沒有任何配置限制)
QUOTA REMAINING_QUOTA SPACE_QUOTA REMAINING_SPACE_QUOTA DIR_COUNT FILE_COUNT CONTENT_SIZE FILE_NAME none inf none inf 6 15 14.7 K /user/hive/warehouse/hive_test.db上述依次表示為:文件數限額 可用文件數 空間限額 可用空間 目錄數 文件數 總大小 文件/目錄名
在多人共用 HDFS 的環境下,配置設置非常重要。特別是在 Hadoop處理大量資料的環境,如果沒有配額管理,很容易把所有的空間用完造成別人無法存取。HDFS 的配額設定是針對目標而不是針對賬號,所以在管理上最好讓每個賬號僅操作某一個目錄,然后對目錄設置配置。
設置方法有兩種:
- Name Quotas:設置某一個目錄下文件總數
- Space Quotas:設置某一個目錄下可使用空間大小
1. Name Quotas
-
計算公式:QUOTA – (DIR_COUNT + FILE_COUNT) = REMAINING_QUOTA
-
設置 Name Quota:
這里的 10000 是指 DIR_COUNT + FILE_COUNT = 10000,最大值為 Long.Max_Value 。
- 清除 Name Quota:
2. Space Quotas
-
計算公式:SPACE_QUOTA – CONTENT_SIZE = REMAINING_SPACE_QUOTA
-
設置 Space Quota:
可以使用 m,g,t 代表 MB,GB,TB
- 清除 Space Quota:
這里需要特別注意的是"Space Quota" 的設置看的不是 HDFS 的文件大小,而是寫入 HDFS 所有 block 塊的大小,假設一個文件被切分為2個 block 塊,在 core-site.xml 里面設置 dfs.block.size = 64MB,dfs.replication = 3,那么該文件所需要的存儲空間為:2 * 64M * 3 = 384MB
如果一個小文件(例如,2k大小的文件)被上傳到 HDFS,該文件并不能占滿一整個 block 塊,但是按照 HDFS 配置規則也需要按照一個 block 塊計算,即存儲空間為:1 x 64MB x 3 = 192MB
所以,綜上所述,這里統計空間的時候會將 block 塊的大小和備份數也考慮在里面。
3. 其它事項
HDFS 的配額管理是跟著目錄走,如果目錄被重命名,配額依然有效。
麻煩的是,在設置完配額以后,如果超過限制,雖然文件不會寫入到 HDFS,但是文件名依然會存在,只是文件 size 為0。當加大配額設置后,還需要將之前的空文件刪除才能進一步寫入。
如果新設置的 quota 值,小于該目錄現有的 Name Quotas 及 Space Quotas,系統并不會給出錯誤提示,但是該目錄的配置會變成最新設置的 quota。
如果查詢的配額沒滿的話,那么就是磁盤空間滿了,掛載新的磁盤空間就可以了。
了解磁盤配額(Quota):磁盤配額(Quota)
總結
以上是生活随笔為你收集整理的Spark运行任务时报错:org.apache.hadoop.hdfs.protocol.DSQuotaExceededException: The DiskSpace quota of...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【深度强化学习】深度学习:Pytorch
- 下一篇: Xshell连接ubuntu后,在vim