[
https://issues.apache.org/jira/browse/HBASE-19750?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16320261#comment-16320261
]
Wang, Xinglong commented on HBASE-19750:
----------------------------------------
[~carp84] Thanks. That's great suggestion.
By looking into Bytes.toStringBinary, we can see that there is only one
readable character '\' will be changed into \x format.
So for example, if rowkey is "abc\\", then
{code:java}
Bytes.toString(row) => abc\
Bytes.toStringBinary(row) => abc\x5C
{code}
But as long as user use Bytes.toBytesBinary() to deserialize the row string,
they will get the same row.
{code:java}
Bytes.toString(Bytes.toBytesBinary("abc\\x5C")) ==> abc\
Bytes.toString(Bytes.toBytesBinary("abc\\")) ===> abc\
{code}
Then I think it's OK to do it like your suggestion.
> print pretty rowkey in getExceptionMessageAdditionalDetail
> ----------------------------------------------------------
>
> Key: HBASE-19750
> URL: https://issues.apache.org/jira/browse/HBASE-19750
> Project: HBase
> Issue Type: Improvement
> Components: Client
> Reporter: Wang, Xinglong
> Assignee: Wang, Xinglong
> Priority: Minor
> Attachments: HBASE-19750.001.patch, HBASE-19750.002.patch
>
>
> Sometimes the rowkey is binary format and is not able to print out human
> readable string. In this case, the exception will still try to call the
> toString() method and result in something like '�\(�\'.
> It will be very inefficient to trouble shooting the issue when we get such
> kind of exception. We can't identify the problematic row key based on the
> printout.
> The idea here is that print out the rowkey use Bytes.toStringBinary() in
> additional with Bytes.toString(row).
> If the row is serialized from human readable string, then Bytes.toString(row)
> makes more sense. When it's from human unreadable string, then
> Bytes.toStringBinary(row) will help.
> The output of Bytes.toStringBinary(row) anyway can be applied to hbase shell
> to do the scan so that we can easily identify the corresponding row.
> {code:java}
> 2017-12-16 07:25:41,304 INFO [main]
> org.apache.hadoop.hbase.mapreduce.TableRecordReaderImpl: recovered from
> org.apache.hadoop.hbase.client.RetriesExhaustedException: Failed after
> attempts=36, exceptions:
> Sat Dec 16 07:25:41 GMT-07:00 2017, null, java.net.SocketTimeoutException:
> callTimeout=250000, callDuration=250473: row '�\(�\' on table 'mytable' at
> region=mytable,\xDF\x5C(\xF5\xC2\x8F\x5C\x1B,1412216342143.5d74ce411eecd40001d9bf6e62f0b607.,
> hostname=mycluster.internal.xx.com,60020,1503881012672, seqNum=6265890293
> at
> org.apache.hadoop.hbase.client.RpcRetryingCallerWithReadReplicas.throwEnrichedException(RpcRetryingCallerWithReadReplicas.java:271)
> at
> org.apache.hadoop.hbase.client.ScannerCallableWithReplicas.call(ScannerCallableWithReplicas.java:203)
> at
> org.apache.hadoop.hbase.client.ScannerCallableWithReplicas.call(ScannerCallableWithReplicas.java:60)
> at
> org.apache.hadoop.hbase.client.RpcRetryingCaller.callWithoutRetries(RpcRetryingCaller.java:200)
> at
> org.apache.hadoop.hbase.client.ClientScanner.call(ClientScanner.java:320)
> at
> org.apache.hadoop.hbase.client.ClientScanner.loadCache(ClientScanner.java:403)
> at
> org.apache.hadoop.hbase.client.ClientScanner.next(ClientScanner.java:364)
> at
> org.apache.hadoop.hbase.mapreduce.TableRecordReaderImpl.nextKeyValue(TableRecordReaderImpl.java:205)
> 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:556)
> 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:145)
> at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:787)
> 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:422)
> at
> org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1709)
> at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:162)
> {code}
> Current code:
> RegionServerCallable.java
> {code:java}
> public String getExceptionMessageAdditionalDetail() {
> return "row '" + Bytes.toString(row) + "' on table '" + tableName + "' at
> " + location;
> }
> {code}
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)