[ 
https://issues.apache.org/jira/browse/HBASE-14267?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14728278#comment-14728278
 ] 

stack commented on HBASE-14267:
-------------------------------

 bq. User should know the data can not be modified.

I read through the javadoc and we do not clearly state this.

When you modify the row, you are altering the cache'd row instance in Result?

  // We're not using java serialization.  Transient here is just a marker to say
  // that this is where we cache row if we're ever asked for it.
  private transient byte [] row = null;

I am unclear on how this plays in the restart of the Scan? Is the modified 
Result row used to calculate where new Scan restarts?

Thanks [~qianxiZhang] Looks like some dirty debugging to figure the issue.

> In Mapreduce on HBase scenario, restart in TableInputFormat will result in 
> getting wrong data.
> ----------------------------------------------------------------------------------------------
>
>                 Key: HBASE-14267
>                 URL: https://issues.apache.org/jira/browse/HBASE-14267
>             Project: HBase
>          Issue Type: Bug
>          Components: Client, mapreduce
>            Reporter: Qianxi Zhang
>            Assignee: Qianxi Zhang
>         Attachments: HBASE_14267_trunk_v1.patch
>
>
> When I run a mapreduce job on HBase, I will modify the row got from 
> Result.getRow(), for example, reverse the row. Since my program is very 
> complicated to handle data, it takes long time, and the lease int Region 
> server expired. 
> Result#195
> {code}
>   public byte [] getRow() {
>     if (this.row == null) {
>       this.row = (this.cells == null || this.cells.length == 0) ?
>           null :
>           CellUtil.cloneRow(this.cells[0]);
>     }
>     return this.row;
>   }
> {code}
> TableInputFormat will restart the scan from last row, but the row has been 
> modified, so it will read wrong data.
> TableRecordReaderImpl#218
> {code}
>       } catch (IOException e) {
>         // do not retry if the exception tells us not to do so
>         if (e instanceof DoNotRetryIOException) {
>           throw e;
>         }
>         // try to handle all other IOExceptions by restarting
>         // the scanner, if the second call fails, it will be rethrown
>         LOG.info("recovered from " + StringUtils.stringifyException(e));
>         if (lastSuccessfulRow == null) {
>           LOG.warn("We are restarting the first next() invocation," +
>               " if your mapper has restarted a few other times like this" +
>               " then you should consider killing this job and investigate" +
>               " why it's taking so long.");
>         }
>         if (lastSuccessfulRow == null) {
>           restart(scan.getStartRow());
>         } else {
>           restart(lastSuccessfulRow);
>           scanner.next();    // skip presumed already mapped row
>         }
>         value = scanner.next();
>         if (value != null && value.isStale()) numStale++;
>         numRestarts++;
>       }
>       if (value != null && value.size() > 0) {
>         key.set(value.getRow());
>         lastSuccessfulRow = key.get();
>         return true;
>       }
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to