本文已参与「新人创作礼」活动,一起开启掘金创作之路。
一、前言
最近需要统计一张hbase
表的条数,网上的很多案例都是使用MR的方式来进行统计,所以我们也采用这个方式。
但是在实施过程中,遇到一些问题。使用MR
去统计时,如果不指定队列,那么就会使用默认的YARN
队列,而我们的默认队列是完全没有资源的。
网上关于指定YARN
队列的文章也比较少,这里整理并记录一下。
二、准备
这里我们使用 hbase.RowCounter
包执行MR
的任务。
[hbase@bi-hadoop02 ~]$ hbase org.apache.hadoop.hbase.mapreduce.RowCounter -Dmapreduce.job.queuename=root.bi 'default:rc_bifrost_user_data' --starttime=1627920000000 --endtime=1628006400000
- 重点:
-Dmapreduce.job.queuename=root.bi
上面这个参数就是我们今天的重点,另外一个注意这个参数的位置,是在包后面,在表的前面,注意不要将参数写在别的位置。
三、补充
另外一个,就是在使用MR统计行数时,抛出了大量的错误。
报错一:
报错内容如下:
21/09/07 16:19:15 INFO mapreduce.Job: Task Id : attempt_1628044774004_796644_m_000033_1, Status : FAILED
Error: org.apache.hadoop.hbase.client.RetriesExhaustedException: Failed after attempts=11, exceptions:
Tue Sep 07 16:17:23 CST 2021, null, java.net.SocketTimeoutException: callTimeout=60000, callDuration=60202: row '101232_99306126' on table 'rc_bifrost_user_data' at region=rc_bifrost_user_data,101232_94527761,1618890773382.b8903826797f396bd40907e9268067f6., hostname=dx-hadoop100.dx,60020,1629967785931, seqNum=32768084
at org.apache.hadoop.hbase.client.RpcRetryingCallerWithReadReplicas.throwEnrichedException(RpcRetryingCallerWithReadReplicas.java:320)
at org.apache.hadoop.hbase.client.ScannerCallableWithReplicas.call(ScannerCallableWithReplicas.java:247)
at org.apache.hadoop.hbase.client.ScannerCallableWithReplicas.call(ScannerCallableWithReplicas.java:62)
at org.apache.hadoop.hbase.client.RpcRetryingCaller.callWithoutRetries(RpcRetryingCaller.java:210)
at org.apache.hadoop.hbase.client.ClientScanner.call(ClientScanner.java:327)
at org.apache.hadoop.hbase.client.ClientScanner.loadCache(ClientScanner.java:410)
at org.apache.hadoop.hbase.client.ClientScanner.next(ClientScanner.java:371)
at org.apache.hadoop.hbase.mapreduce.TableRecordReaderImpl.nextKeyValue(TableRecordReaderImpl.java:252)
at org.apache.hadoop.hbase.mapreduce.TableRecordReader.nextKeyValue(TableRecordReader.java:147)
at org.apache.hadoop.hbase.mapreduce.TableInputFormatBase$1.nextKeyValue(TableInputFormatBase.java:216)
at org.apache.hadoop.mapred.MapTask$NewTrackingRecordReader.nextKeyValue(MapTask.java:562)
at org.apache.hadoop.mapreduce.task.MapContextImpl.nextKeyValue(MapContextImpl.java:80)
at org.apache.hadoop.mapreduce.lib.map.WrappedMapper$Context.nextKeyValue(WrappedMapper.java:91)
at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:144)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:793)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341)
at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:164)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1920)
at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)
Caused by: java.net.SocketTimeoutException: callTimeout=60000, callDuration=60202: row '101232_99306126' on table 'rc_bifrost_user_data' at region=rc_bifrost_user_data,101232_94527761,1618890773382.b8903826797f396bd40907e9268067f6., hostname=dx-hadoop100.dx,60020,1629967785931, seqNum=32768084
at org.apache.hadoop.hbase.client.RpcRetryingCaller.callWithRetries(RpcRetryingCaller.java:169)
at org.apache.hadoop.hbase.client.ResultBoundedCompletionService$QueueingFuture.run(ResultBoundedCompletionService.java:80)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.io.IOException: Call to dx-hadoop100.dx/10.11.34.85:60020 failed on local exception: org.apache.hadoop.hbase.ipc.CallTimeoutException: Call id=12, waitTime=60001, operationTimeout=60000 expired.
at org.apache.hadoop.hbase.ipc.AbstractRpcClient.wrapException(AbstractRpcClient.java:292)
at org.apache.hadoop.hbase.ipc.RpcClientImpl.call(RpcClientImpl.java:1276)
at org.apache.hadoop.hbase.ipc.AbstractRpcClient.callBlockingMethod(AbstractRpcClient.java:227)
at org.apache.hadoop.hbase.ipc.AbstractRpcClient$BlockingRpcChannelImplementation.callBlockingMethod(AbstractRpcClient.java:336)
at org.apache.hadoop.hbase.protobuf.generated.ClientProtos$ClientService$BlockingStub.scan(ClientProtos.java:34094)
at org.apache.hadoop.hbase.client.ScannerCallable.call(ScannerCallable.java:220)
at org.apache.hadoop.hbase.client.ScannerCallable.call(ScannerCallable.java:65)
at org.apache.hadoop.hbase.client.RpcRetryingCaller.callWithoutRetries(RpcRetryingCaller.java:210)
at org.apache.hadoop.hbase.client.ScannerCallableWithReplicas$RetryingRPC.call(ScannerCallableWithReplicas.java:397)
at org.apache.hadoop.hbase.client.ScannerCallableWithReplicas$RetryingRPC.call(ScannerCallableWithReplicas.java:371)
at org.apache.hadoop.hbase.client.RpcRetryingCaller.callWithRetries(RpcRetryingCaller.java:136)
... 4 more
Caused by: org.apache.hadoop.hbase.ipc.CallTimeoutException: Call id=12, waitTime=60001, operationTimeout=60000 expired.
at org.apache.hadoop.hbase.ipc.Call.checkAndSetTimeout(Call.java:73)
at org.apache.hadoop.hbase.ipc.RpcClientImpl.call(RpcClientImpl.java:1250)
问题原因: HBase Client Scanner Timeout。
解决方案:
修改此参数:hbase.client.scanner.timeout.period
默认为1分钟,延长该值。
另外这篇博客对于一些参数设置介绍比较多,大家可以根据自己的实际情况来进行配置: https://blog.csdn.net/jiangshouzhuang/article/details/52355670
问题二:
统计行数是使用的MR进行统计的,这个之前已经说过了,但是有个注意点就是当遇到上面或者别的一些报错时,MAP端失败的任务是不会重试的,所以我们在统计hbase表的行数时,可以会发现统计的结果与实际结果对不上。
这个就是因为在进行MR任务时,如果MAP端任务有失败,不会重试。这个需要大家注意一下。