Error: org.apache.hadoop.hbase.client.RetriesExhaustedWithDetailsException

本文记录了一次使用MapReduce操作HBase时遇到的RetriesExhaustedWithDetailsException错误,并详细分析了错误原因及解决过程。通过检查表名和列族名称的一致性,最终解决了问题。

问题如下:

因为我要使用mapreduce操作hbase,所以我把hbase下所有的.jar文件都导入了eclipse下的mapreduce工程,在操作hbase时,遇到了下面的问题,弄了好久也不知道问题的所在,提示如下:

Error: org.apache.hadoop.hbase.client.RetriesExhaustedWithDetailsException: Failed 176 actions: event_logs: 176 times, 

at org.apache.hadoop.hbase.client.AsyncProcess$BatchErrors.makeException(AsyncProcess.java:192)
at org.apache.hadoop.hbase.client.AsyncProcess$BatchErrors.access$500(AsyncProcess.java:176)
at org.apache.hadoop.hbase.client.AsyncProcess.getErrors(AsyncProcess.java:913)
at org.apache.hadoop.hbase.client.HTable.backgroundFlushCommits(HTable.java:984)
at org.apache.hadoop.hbase.client.HTable.flushCommits(HTable.java:1252)
at org.apache.hadoop.hbase.client.HTable.close(HTable.java:1289)
at org.apache.hadoop.hbase.mapreduce.TableOutputFormat$TableRecordWriter.close(TableOutputFormat.java:112)
at org.apache.hadoop.mapred.MapTask$NewDirectOutputCollector.close(MapTask.java:667)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:790)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341)
at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:168)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:415)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1642)
at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:163)


17/06/29 20:59:13 INFO mapreduce.Job:  map 0% reduce 0%
17/06/29 20:59:32 INFO mapreduce.Job:  map 68% reduce 0%
17/06/29 20:59:35 INFO mapreduce.Job:  map 100% reduce 0%
17/06/29 20:59:35 INFO mapreduce.Job: Task Id : attempt_1498732164664_0003_m_000000_1, Status : FAILED
Error: org.apache.hadoop.hbase.client.RetriesExhaustedWithDetailsException: Failed 176 actions: event_logs: 176 times, 
at org.apache.hadoop.hbase.client.AsyncProcess$BatchErrors.makeException(AsyncProcess.java:192)
at org.apache.hadoop.hbase.client.AsyncProcess$BatchErrors.access$500(AsyncProcess.java:176)
at org.apache.hadoop.hbase.client.AsyncProcess.getErrors(AsyncProcess.java:913)
at org.apache.hadoop.hbase.client.HTable.backgroundFlushCommits(HTable.java:984)
at org.apache.hadoop.hbase.client.HTable.flushCommits(HTable.java:1252)
at org.apache.hadoop.hbase.client.HTable.close(HTable.java:1289)
at org.apache.hadoop.hbase.mapreduce.TableOutputFormat$TableRecordWriter.close(TableOutputFormat.java:112)
at org.apache.hadoop.mapred.MapTask$NewDirectOutputCollector.close(MapTask.java:667)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:790)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341)
at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:168)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:415)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1642)
at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:163)


17/06/29 20:59:36 INFO mapreduce.Job:  map 0% reduce 0%
17/06/29 20:59:55 INFO mapreduce.Job:  map 43% reduce 0%
17/06/29 20:59:58 INFO mapreduce.Job:  map 100% reduce 0%
17/06/29 20:59:59 INFO mapreduce.Job: Task Id : attempt_1498732164664_0003_m_000000_2, Status : FAILED
Error: org.apache.hadoop.hbase.client.RetriesExhaustedWithDetailsException: Failed 176 actions: event_logs: 176 times, 
at org.apache.hadoop.hbase.client.AsyncProcess$BatchErrors.makeException(AsyncProcess.java:192)
at org.apache.hadoop.hbase.client.AsyncProcess$BatchErrors.access$500(AsyncProcess.java:176)
at org.apache.hadoop.hbase.client.AsyncProcess.getErrors(AsyncProcess.java:913)
at org.apache.hadoop.hbase.client.HTable.backgroundFlushCommits(HTable.java:984)
at org.apache.hadoop.hbase.client.HTable.flushCommits(HTable.java:1252)
at org.apache.hadoop.hbase.client.HTable.close(HTable.java:1289)
at org.apache.hadoop.hbase.mapreduce.TableOutputFormat$TableRecordWriter.close(TableOutputFormat.java:112)
at org.apache.hadoop.mapred.MapTask$NewDirectOutputCollector.close(MapTask.java:667)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:790)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341)
at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:168)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:415)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1642)
at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:163)


17/06/29 21:00:00 INFO mapreduce.Job:  map 0% reduce 0%
17/06/29 21:00:21 INFO mapreduce.Job:  map 100% reduce 0%
17/06/29 21:00:26 INFO mapreduce.Job: Job job_1498732164664_0003 failed with state FAILED due to: Task failed task_1498732164664_0003_m_000000
Job failed as tasks failed. failedMaps:1 failedReduces:0


17/06/29 21:00:27 INFO mapreduce.Job: Counters: 9
Job Counters 
Failed map tasks=4
Launched map tasks=4
Other local map tasks=3
Data-local map tasks=1
Total time spent by all maps in occupied slots (ms)=91969
Total time spent by all reduces in occupied slots (ms)=0
Total time spent by all map tasks (ms)=91969
Total vcore-seconds taken by all map tasks=91969
Total megabyte-seconds taken by all map tasks=94176256

17/06/29 21:00:27 INFO etl.AnalyserLogDataRunner: 任务执行失败!

问题是出在建立的表上面,前面建立的表是(在 hbase shell下):create 'even_logs','info',然后我改为 :create 'event_logs','info'就没有出错了,所以应该是建立的表的family的名字应该和文件里的一样才行。在hbase shell 下看 mrtable的数据如下:


<think>好的,我现在需要解决用户在使用Sqoop导入数据到HBase时遇到的错误:org.apache.hadoop.hbase.KeyValueUtil.length(Lorg/apache/hadoop/hbase/Cell;)I。首先,我要分析这个错误的原因。用户之前提到过HBaseAdmin的构造函数错误以及HTableDescriptor.addFamily的问题,这可能与版本兼容性有关。KeyValueUtil类中的length方法找不到,通常是因为HBase客户端和服务器端的版本不一致,或者Sqoop使用的HBase依赖与集群上的HBase版本不匹配。接下来,我应该考虑可能的解决方案。首先检查版本兼容性,确认Sqoop和HBase的版本是否匹配。比如,如果用户用的是HBase2.x,而Sqoop1.4.6默认可能依赖HBase1.x的库,这会导致方法不存在的问题。这时候可能需要升级Sqoop或者更换兼容的版本。另外,用户可能需要手动替换Sqoop的HBase客户端jar包,确保与集群版本一致。然后,检查依赖冲突。用户的classpath中可能存在多个不同版本的HBase jar包,导致加载了错误的方法。这时候需要排除旧版本的依赖,例如在Sqoop命令中添加--hbase-home参数,或者设置环境变量HBASE_HOME指向正确的路径。 另外,用户之前的问题中提到过因为没有预先在HBase中建表导致错误,所以需要确认是否已经正确创建了表结构,并且列族名称与Sqoop命令中指定的匹配。如果表不存在或者列族不匹配,也可能引发其他错误,需要一并检查。 此外,用户之前遇到的HCatalog和Accumulo的警告提示,可能说明环境变量设置不正确,但当前的问题更可能直接与HBase的版本相关。不过,确保所有相关的环境变量如HBASE_HOME正确设置也是必要的步骤。最后,建议用户进行测试,例如执行hbase version确认版本,或者使用Sqoop的--verbose选项查看详细日志,帮助定位问题。如果用户按照步骤操作后仍然存在问题,可能需要进一步检查Maven依赖或构建配置中的HBase版本是否正确。</think>### 解决方案:Sqoop HBase错误`KeyValueUtil.length()`的排查步骤 此错误通常由**HBase客户端与服务器版本不兼容**或**依赖冲突**导致,以下是具体解决方法: --- #### 1. **确认HBase版本兼容性** - **现象分析**:`KeyValueUtil.length()`在HBase 1.x中属于`KeyValue`类的方法,而HBase 2.x后该方法可能被重构或移除[^1]。若Sqoop使用的HBase客户端版本与集群实际版本不一致(如Sqoop 1.4.6默认依赖HBase 1.x,而集群是HBase 2.x),则会触发此错误。 - **操作步骤**: 1. 检查HBase集群版本: ```bash hbase version ``` 2. 查看Sqoop的HBase依赖版本: ```bash ls $SQOOP_HOME/lib/hbase-client-*.jar ``` 3. **若版本不匹配**,需手动替换Sqoop的HBase客户端JAR包为与集群一致的版本(例如HBase 2.2.6): ```bash # 删除旧版本JAR rm $SQOOP_HOME/lib/hbase-client-1.*.jar # 从HBase 2.x安装目录复制新版JAR cp $HBASE_HOME/lib/hbase-client-2.*.jar $SQOOP_HOME/lib/ ``` --- #### 2. **排除依赖冲突** - **现象分析**:若环境变量`HBASE_HOME`指向错误版本,或Hadoop生态组件自带旧版HBase依赖,会导致类加载冲突。 - **操作步骤**: 1. 确保`HBASE_HOME`指向正确的HBase安装目录: ```bash export HBASE_HOME=/path/to/hbase-2.x ``` 2. 在Sqoop命令中显式指定HBase配置目录: ```bash sqoop import \ --hbase-home $HBASE_HOME \ --connect jdbc:mysql://localhost/test \ --table users \ --hbase-table users_hbase \ --column-family info ``` 3. 检查Hadoop/Hive等其他组件的依赖,排除旧版HBase JAR(如`hadoop-common`中可能包含冲突JAR)。 --- #### 3. **验证HBase表结构** - **关联问题**:若未预先创建HBase表或列族名称不匹配,可能触发`NoSuchColumnFamilyException`[^2]。 - **操作步骤**: 1.HBase Shell中手动建表并指定列族: ```bash create 'users_hbase', 'info' ``` 2. 确保Sqoop命令中的`--hbase-table`和`--column-family`参数与HBase表结构一致。 --- #### 4. **测试与日志分析** - **启用Sqoop详细日志**:通过`--verbose`参数定位具体错误位置: ```bash sqoop import --verbose ... ``` - **典型成功日志片段**: ``` INFO hbase.HBaseImportJob: Transmitted 1000 rows to HBase. ``` --- ###
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shujuboke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值