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 来查看配置情况:

[hadoop@hadoop102 ~]$ hadoop fs -count -q -h /user/hive/warehouse/hive_test.db

以下是查询结果,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:

[hadoop@hadoop102 ~]$ hadoop dfsadmin -setQuota 10000 /user/hive/warehouse/hive_test.db

这里的 10000 是指 DIR_COUNT + FILE_COUNT = 10000,最大值為 Long.Max_Value 。

  • 清除 Name Quota:
[hadoop@hadoop102 ~]$ hadoop dfsadmin -clrQuota /user/hive/warehouse/hive_test.db

2. Space Quotas

  • 计算公式:SPACE_QUOTA – CONTENT_SIZE = REMAINING_SPACE_QUOTA

  • 设置 Space Quota:

[hadoop@hadoop102 ~]$ hadoop dfsadmin -setSpaceQuota 1g /user/hive/warehouse/hive_test.db

可以使用 m,g,t 代表 MB,GB,TB

  • 清除 Space Quota:
[hadoop@hadoop102 ~]$ hadoop dfsadmin -clrSpaceQuota /user/hive/warehouse/hive_test.db

这里需要特别注意的是"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)

### 回答1: 这个错误是因为Spark无法找到HBase的配置文件。可能是因为HBase的依赖库没有正确地添加到Spark的classpath中。您需要确保在Spark的classpath中包含了HBase的依赖库,或者将HBase的依赖库添加到Spark的lib目录中。 ### 回答2: 在使用Spark读取HBase的候,如果出现“java.lang.noclassdeffounderror: org/apache/hadoop/hbase/hbaseconfiguration”的报错,一般是由于缺少了HBase依赖包或者版本不匹配导致的。 解决方法如下: 1. 确认HBase依赖包是否存在,以及是否与Spark版本兼容。 可以通过以下两种方式解决: ① 直接将HBase的依赖包复制到Spark的lib目录中。具体操作:将HBase的hbase-client-xxx.jar和hbase-common-xxx.jar复制到Spark的安装目录下的lib目录即可。 ② 修改Spark的pom.xml文件,添加HBase的依赖。具体操作:在Spark源码根目录中的pom.xml文件中添加以下代码: <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>x.x.x</version> </dependency> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-common</artifactId> <version>x.x.x</version> </dependency> 注意:x.x.x表示HBase的版本号,需要根据实际情况替换。 2. 确认HBase配置文件是否正确。 如果上述方法解决不了问题,可能是HBase的配置文件不正确导致的。请确认HBase的hbase-site.xml文件中是否有以下配置项: <property> <name>hbase.client.keyvalue.maxsize</name> <value>2097152</value> </property> 如果没有,请手动添加并重启HBase服务。 3. 确认系统环境变量是否正确。 如果上述方法都没有解决问题,可以检查系统的环境变量是否正确。请确认系统的HADOOP_CLASSPATH、JAVA_HOME、HBASE_HOME和SPARK_HOME环境变量是否正确设置,以及是否包含了HBase和Spark的相关依赖。 综上所述,出现“java.lang.noclassdeffounderror: org/apache/hadoop/hbase/hbaseconfiguration”报错,在排查的过程中需要关注HBase依赖包、配置文件和系统环境等多方面的原因。需要进行彻底的排查才能找到问题的症结并解决问题。 ### 回答3: 在 Spark 中读取 HBase ,可能会出现“ java.lang.noclassdeffounderror: org/apache/hadoop/hbase/hbaseconfiguration ”这个错误。这是因为在 Spark 中没有找到一些必需的 HBase 的类文件,导致无法成功读取 HBase 数据。 解决此问题的步骤如下: 第一步:检查 Classpath 环境变量 请确保 Classpath 环境变量中包含 HBase 和 Hadoop 的 JAR 文件的路径。因为这两个框架的配置文件都被加载到这些 JAR 文件中,如果 Spark 找不到它们,就会导致错误。 如果 Classpath 设置正确,那么需要检查 Spark 主节点的 Spark 配置中是否包含 HBase 和 Hadoop 的 JAR 文件。 这可以通过将 HBase 和 Hadoop JAR 文件置于 Spark 的 lib 目录中来实现。可以使用以下命令检查 SPARK_HOME/lib 目录中是否存在 HBase 和 Hadoop 的 JAR 文件: $ ls $SPARK_HOME/lib | grep -i hbase $ ls $SPARK_HOME/lib | grep -i hadoop 第二步:检查 HBASE_CLASSPATH 环境变量 如果在环境变量中将 HBASE_CLASSPATH 设置为包含配置文件的路径,那么 Spark 可能不会找到它们。 要更正此错误,请确保在 Shell 中运行 HBase 脚本也加载了这些配置文件。可以通过将 HBase 目录添加到 HBASE_CLASSPATH 环境变量中来实现,例如: $ export HBASE_CLASSPATH=$HBASE_HOME/conf 第三步:操作系统权限问题 还有可能出现因操作系统权限不足而导致无法读取 HBase 数据的情况。此,可以修改文件的权限以解决此问题。可以使用以下命令检查当前目录下的权限: $ ls -ld $PWD 如果权限不正确,可以使用以下命令更正: $ chmod 777 $PWD 总之,如果 Spark 在从 HBase 读取数据遇到“ java.lang.noclassdeffounderror: org/apache/hadoop/hbase/hbaseconfiguration ”错误,需要按照上述步骤检查并修复问题,以确保 Spark 可以顺利地从 HBase 读取数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值