You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by gi...@apache.org on 2021/03/12 20:17:23 UTC

[hbase-site] branch asf-site updated: Published site at 876fec1648d78747f7585bd539afc9d1b3e67cb5.

This is an automated email from the ASF dual-hosted git repository.

git-site-role pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/hbase-site.git


The following commit(s) were added to refs/heads/asf-site by this push:
     new 9e706b6  Published site at 876fec1648d78747f7585bd539afc9d1b3e67cb5.
9e706b6 is described below

commit 9e706b672ac3f6bae005fcfe010ec198b0a3849d
Author: jenkins <bu...@apache.org>
AuthorDate: Fri Mar 12 20:17:02 2021 +0000

    Published site at 876fec1648d78747f7585bd539afc9d1b3e67cb5.
---
 acid-semantics.html                                |    2 +-
 apache_hbase_reference_guide.pdf                   |    4 +-
 apidocs/allclasses-frame.html                      |    1 +
 apidocs/allclasses-noframe.html                    |    1 +
 apidocs/constant-values.html                       |   19 +
 apidocs/index-all.html                             |   17 +
 apidocs/org/apache/hadoop/hbase/CellUtil.html      |   55 +-
 .../org/apache/hadoop/hbase/class-use/Cell.html    |   17 +-
 apidocs/org/apache/hadoop/hbase/client/Result.html |   26 +-
 .../hbase/mapreduce/ResultSerialization.html       |    4 +-
 .../mapreduce/RoundRobinTableInputFormat.html      |  383 +
 .../apache/hadoop/hbase/mapreduce/RowCounter.html  |    4 +-
 .../hadoop/hbase/mapreduce/TableInputFormat.html   |    4 +
 .../hadoop/hbase/mapreduce/TableMapReduceUtil.html |  110 +-
 ...Format.html => RoundRobinTableInputFormat.html} |   20 +-
 .../mapreduce/class-use/TableInputFormat.html      |   48 +-
 .../mapreduce/class-use/TableInputFormatBase.html  |    7 +
 .../hadoop/hbase/mapreduce/package-frame.html      |    1 +
 .../hadoop/hbase/mapreduce/package-summary.html    |   41 +-
 .../hadoop/hbase/mapreduce/package-tree.html       |    6 +-
 .../apache/hadoop/hbase/mapreduce/package-use.html |   17 +-
 .../apache/hadoop/hbase/rest/client/Client.html    |   84 +-
 apidocs/overview-tree.html                         |    6 +-
 .../src-html/org/apache/hadoop/hbase/CellUtil.html |  546 +-
 .../org/apache/hadoop/hbase/client/Result.html     |  411 +-
 .../mapreduce/RoundRobinTableInputFormat.html      |  245 +
 .../hadoop/hbase/mapreduce/TableMapReduceUtil.html | 1976 ++---
 .../apache/hadoop/hbase/mapreduce/TableSplit.html  |   16 +-
 .../apache/hadoop/hbase/rest/client/Client.html    | 1552 ++--
 book.html                                          |    2 +-
 bulk-loads.html                                    |    2 +-
 checkstyle-aggregate.html                          | 7762 ++++++++++----------
 checkstyle.rss                                     |   36 +-
 coc.html                                           |    2 +-
 dependencies.html                                  |    2 +-
 dependency-convergence.html                        |    2 +-
 dependency-info.html                               |    2 +-
 dependency-management.html                         |    2 +-
 devapidocs/allclasses-frame.html                   |    1 +
 devapidocs/allclasses-noframe.html                 |    1 +
 devapidocs/constant-values.html                    |   19 +
 devapidocs/index-all.html                          |   42 +
 devapidocs/org/apache/hadoop/hbase/CellUtil.html   |   63 +-
 ...rivateCellUtil.EmptyByteBufferExtendedCell.html |   62 +-
 .../hadoop/hbase/PrivateCellUtil.EmptyCell.html    |   42 +-
 ...eCellUtil.FirstOnRowByteBufferExtendedCell.html |   26 +-
 .../hbase/PrivateCellUtil.FirstOnRowCell.html      |   26 +-
 ...llUtil.FirstOnRowColByteBufferExtendedCell.html |   32 +-
 .../hbase/PrivateCellUtil.FirstOnRowColCell.html   |   32 +-
 ...Util.FirstOnRowColTSByteBufferExtendedCell.html |   12 +-
 .../hbase/PrivateCellUtil.FirstOnRowColTSCell.html |   12 +-
 ...PrivateCellUtil.FirstOnRowDeleteFamilyCell.html |   26 +-
 ...teCellUtil.LastOnRowByteBufferExtendedCell.html |   26 +-
 .../hbase/PrivateCellUtil.LastOnRowCell.html       |   26 +-
 ...ellUtil.LastOnRowColByteBufferExtendedCell.html |   32 +-
 .../hbase/PrivateCellUtil.LastOnRowColCell.html    |   32 +-
 .../org/apache/hadoop/hbase/PrivateCellUtil.html   |  215 +-
 .../apache/hadoop/hbase/backup/package-tree.html   |    4 +-
 .../org/apache/hadoop/hbase/class-use/Cell.html    |   12 +
 .../org/apache/hadoop/hbase/client/Result.html     |   30 +-
 .../apache/hadoop/hbase/client/package-tree.html   |   24 +-
 .../apache/hadoop/hbase/executor/package-tree.html |    2 +-
 .../apache/hadoop/hbase/filter/package-tree.html   |    8 +-
 .../hadoop/hbase/hbtop/terminal/package-tree.html  |    2 +-
 .../org/apache/hadoop/hbase/http/package-tree.html |    2 +-
 .../apache/hadoop/hbase/io/hfile/package-tree.html |    6 +-
 .../org/apache/hadoop/hbase/ipc/package-tree.html  |    2 +-
 .../ResultSerialization.ResultSerializer.html      |    4 +-
 .../mapreduce/RoundRobinTableInputFormat.html      |  527 ++
 .../apache/hadoop/hbase/mapreduce/RowCounter.html  |    4 +-
 .../hadoop/hbase/mapreduce/TableInputFormat.html   |    4 +
 .../hadoop/hbase/mapreduce/TableMapReduceUtil.html |  167 +-
 ...Format.html => RoundRobinTableInputFormat.html} |   20 +-
 .../mapreduce/class-use/TableInputFormat.html      |   48 +-
 .../mapreduce/class-use/TableInputFormatBase.html  |    7 +
 .../hadoop/hbase/mapreduce/package-frame.html      |    1 +
 .../hadoop/hbase/mapreduce/package-summary.html    |   75 +-
 .../hadoop/hbase/mapreduce/package-tree.html       |   12 +-
 .../apache/hadoop/hbase/mapreduce/package-use.html |   29 +-
 .../hbase/master/assignment/package-tree.html      |    2 +-
 .../apache/hadoop/hbase/master/package-tree.html   |    6 +-
 .../hbase/master/procedure/package-tree.html       |    4 +-
 .../hadoop/hbase/monitoring/package-tree.html      |    2 +-
 .../org/apache/hadoop/hbase/package-tree.html      |   16 +-
 .../hadoop/hbase/procedure2/package-tree.html      |    4 +-
 .../apache/hadoop/hbase/quotas/package-tree.html   |    4 +-
 .../hadoop/hbase/regionserver/package-tree.html    |   16 +-
 .../regionserver/querymatcher/package-tree.html    |    2 +-
 .../hbase/regionserver/wal/package-tree.html       |    2 +-
 ...nt.ClientTrustStoreInitializationException.html |    4 +-
 .../apache/hadoop/hbase/rest/client/Client.html    |  110 +-
 .../hadoop/hbase/rest/model/package-tree.html      |    2 +-
 .../hadoop/hbase/security/access/package-tree.html |    6 +-
 .../apache/hadoop/hbase/security/package-tree.html |    2 +-
 .../apache/hadoop/hbase/thrift/package-tree.html   |    2 +-
 .../org/apache/hadoop/hbase/util/package-tree.html |   10 +-
 .../org/apache/hadoop/hbase/wal/package-tree.html  |    2 +-
 devapidocs/overview-tree.html                      |    6 +-
 .../src-html/org/apache/hadoop/hbase/CellUtil.html |  546 +-
 ...rivateCellUtil.EmptyByteBufferExtendedCell.html | 3951 +++++-----
 .../hadoop/hbase/PrivateCellUtil.EmptyCell.html    | 3951 +++++-----
 ...eCellUtil.FirstOnRowByteBufferExtendedCell.html | 3951 +++++-----
 .../hbase/PrivateCellUtil.FirstOnRowCell.html      | 3951 +++++-----
 ...llUtil.FirstOnRowColByteBufferExtendedCell.html | 3951 +++++-----
 .../hbase/PrivateCellUtil.FirstOnRowColCell.html   | 3951 +++++-----
 ...Util.FirstOnRowColTSByteBufferExtendedCell.html | 3951 +++++-----
 .../hbase/PrivateCellUtil.FirstOnRowColTSCell.html | 3951 +++++-----
 ...PrivateCellUtil.FirstOnRowDeleteFamilyCell.html | 3951 +++++-----
 ...teCellUtil.LastOnRowByteBufferExtendedCell.html | 3951 +++++-----
 .../hbase/PrivateCellUtil.LastOnRowCell.html       | 3951 +++++-----
 ...ellUtil.LastOnRowColByteBufferExtendedCell.html | 3951 +++++-----
 .../hbase/PrivateCellUtil.LastOnRowColCell.html    | 3951 +++++-----
 ...eCellUtil.TagRewriteByteBufferExtendedCell.html | 3951 +++++-----
 .../hbase/PrivateCellUtil.TagRewriteCell.html      | 3951 +++++-----
 ...l.ValueAndTagRewriteByteBufferExtendedCell.html | 3951 +++++-----
 .../PrivateCellUtil.ValueAndTagRewriteCell.html    | 3951 +++++-----
 .../org/apache/hadoop/hbase/PrivateCellUtil.html   | 3951 +++++-----
 .../org/apache/hadoop/hbase/client/Result.html     |  411 +-
 .../mapreduce/RoundRobinTableInputFormat.html      |  245 +
 .../hadoop/hbase/mapreduce/TableMapReduceUtil.html | 1976 ++---
 .../hadoop/hbase/mapreduce/TableSplit.Version.html |   16 +-
 .../apache/hadoop/hbase/mapreduce/TableSplit.html  |   16 +-
 .../hbase/master/cleaner/CleanerChore.Action.html  |   31 +-
 .../hadoop/hbase/master/cleaner/CleanerChore.html  |   31 +-
 ...nt.ClientTrustStoreInitializationException.html | 1552 ++--
 .../apache/hadoop/hbase/rest/client/Client.html    | 1552 ++--
 downloads.html                                     |    2 +-
 export_control.html                                |    2 +-
 index.html                                         |    2 +-
 issue-tracking.html                                |    2 +-
 mail-lists.html                                    |    2 +-
 metrics.html                                       |    2 +-
 old_news.html                                      |    2 +-
 plugin-management.html                             |    2 +-
 plugins.html                                       |    2 +-
 poweredbyhbase.html                                |    2 +-
 project-info.html                                  |    2 +-
 project-reports.html                               |    2 +-
 project-summary.html                               |    2 +-
 pseudo-distributed.html                            |    2 +-
 replication.html                                   |    2 +-
 resources.html                                     |    2 +-
 source-repository.html                             |    2 +-
 sponsors.html                                      |    2 +-
 supportingprojects.html                            |    2 +-
 team-list.html                                     |    2 +-
 testdevapidocs/allclasses-frame.html               |    2 +
 testdevapidocs/allclasses-noframe.html             |    2 +
 testdevapidocs/constant-values.html                |   19 +
 testdevapidocs/index-all.html                      |   47 +
 .../hadoop/hbase/class-use/HBaseClassTestRule.html |   90 +-
 .../org/apache/hadoop/hbase/client/TestResult.html |  129 +-
 .../hbase/mapreduce/TestRegionSizeCalculator.html  |    4 +-
 ...RoundRobinTableInputFormat.SplitComparator.html |  157 +-
 ...or.html => TestRoundRobinTableInputFormat.html} |  221 +-
 .../hadoop/hbase/mapreduce/TestRowCounter.html     |    4 +-
 ...RoundRobinTableInputFormat.SplitComparator.html |   20 +-
 .../class-use/TestRoundRobinTableInputFormat.html  |   20 +-
 .../hadoop/hbase/mapreduce/package-frame.html      |    2 +
 .../hadoop/hbase/mapreduce/package-summary.html    |   12 +
 .../hadoop/hbase/mapreduce/package-tree.html       |    2 +
 .../org/apache/hadoop/hbase/package-tree.html      |   18 +-
 .../hadoop/hbase/procedure/package-tree.html       |    8 +-
 .../hadoop/hbase/procedure2/package-tree.html      |    2 +-
 .../hadoop/hbase/regionserver/package-tree.html    |    6 +-
 .../org/apache/hadoop/hbase/test/package-tree.html |    2 +-
 .../org/apache/hadoop/hbase/wal/package-tree.html  |    2 +-
 testdevapidocs/overview-tree.html                  |    2 +
 .../org/apache/hadoop/hbase/client/TestResult.html |  763 +-
 ...RoundRobinTableInputFormat.SplitComparator.html |  249 +
 .../mapreduce/TestRoundRobinTableInputFormat.html  |  249 +
 171 files changed, 49015 insertions(+), 45905 deletions(-)

diff --git a/acid-semantics.html b/acid-semantics.html
index 393b940..74c5107 100644
--- a/acid-semantics.html
+++ b/acid-semantics.html
@@ -467,7 +467,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2021
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-03-11</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-03-12</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/apache_hbase_reference_guide.pdf b/apache_hbase_reference_guide.pdf
index f305773..5a17197 100644
--- a/apache_hbase_reference_guide.pdf
+++ b/apache_hbase_reference_guide.pdf
@@ -5,8 +5,8 @@
 /Author (Apache HBase Team)
 /Creator (Asciidoctor PDF 1.5.3, based on Prawn 2.2.2)
 /Producer (Apache HBase Team)
-/ModDate (D:20210311200507+00'00')
-/CreationDate (D:20210311201450+00'00')
+/ModDate (D:20210312200456+00'00')
+/CreationDate (D:20210312201449+00'00')
 >>
 endobj
 2 0 obj
diff --git a/apidocs/allclasses-frame.html b/apidocs/allclasses-frame.html
index ee36036..97adcaa 100644
--- a/apidocs/allclasses-frame.html
+++ b/apidocs/allclasses-frame.html
@@ -298,6 +298,7 @@
 <li><a href="org/apache/hadoop/hbase/client/RetriesExhaustedException.html" title="class in org.apache.hadoop.hbase.client" target="classFrame">RetriesExhaustedException</a></li>
 <li><a href="org/apache/hadoop/hbase/client/RetriesExhaustedWithDetailsException.html" title="class in org.apache.hadoop.hbase.client" target="classFrame">RetriesExhaustedWithDetailsException</a></li>
 <li><a href="org/apache/hadoop/hbase/RetryImmediatelyException.html" title="class in org.apache.hadoop.hbase" target="classFrame">RetryImmediatelyException</a></li>
+<li><a href="org/apache/hadoop/hbase/mapreduce/RoundRobinTableInputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce" target="classFrame">RoundRobinTableInputFormat</a></li>
 <li><a href="org/apache/hadoop/hbase/client/Row.html" title="interface in org.apache.hadoop.hbase.client" target="classFrame"><span class="interfaceName">Row</span></a></li>
 <li><a href="org/apache/hadoop/hbase/mapred/RowCounter.html" title="class in org.apache.hadoop.hbase.mapred" target="classFrame">RowCounter</a></li>
 <li><a href="org/apache/hadoop/hbase/mapreduce/RowCounter.html" title="class in org.apache.hadoop.hbase.mapreduce" target="classFrame">RowCounter</a></li>
diff --git a/apidocs/allclasses-noframe.html b/apidocs/allclasses-noframe.html
index eebdb56..af29501 100644
--- a/apidocs/allclasses-noframe.html
+++ b/apidocs/allclasses-noframe.html
@@ -298,6 +298,7 @@
 <li><a href="org/apache/hadoop/hbase/client/RetriesExhaustedException.html" title="class in org.apache.hadoop.hbase.client">RetriesExhaustedException</a></li>
 <li><a href="org/apache/hadoop/hbase/client/RetriesExhaustedWithDetailsException.html" title="class in org.apache.hadoop.hbase.client">RetriesExhaustedWithDetailsException</a></li>
 <li><a href="org/apache/hadoop/hbase/RetryImmediatelyException.html" title="class in org.apache.hadoop.hbase">RetryImmediatelyException</a></li>
+<li><a href="org/apache/hadoop/hbase/mapreduce/RoundRobinTableInputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce">RoundRobinTableInputFormat</a></li>
 <li><a href="org/apache/hadoop/hbase/client/Row.html" title="interface in org.apache.hadoop.hbase.client"><span class="interfaceName">Row</span></a></li>
 <li><a href="org/apache/hadoop/hbase/mapred/RowCounter.html" title="class in org.apache.hadoop.hbase.mapred">RowCounter</a></li>
 <li><a href="org/apache/hadoop/hbase/mapreduce/RowCounter.html" title="class in org.apache.hadoop.hbase.mapreduce">RowCounter</a></li>
diff --git a/apidocs/constant-values.html b/apidocs/constant-values.html
index 3bd38f4..5fa5ffb 100644
--- a/apidocs/constant-values.html
+++ b/apidocs/constant-values.html
@@ -4318,6 +4318,25 @@
 </li>
 <li class="blockList">
 <table class="constantsSummary" border="0" cellpadding="3" cellspacing="0" summary="Constant Field Values table, listing constant fields, and values">
+<caption><span>org.apache.hadoop.hbase.mapreduce.<a href="org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html" title="class in org.apache.hadoop.hbase.mapreduce">TableMapReduceUtil</a></span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th scope="col">Constant Field</th>
+<th class="colLast" scope="col">Value</th>
+</tr>
+<tbody>
+<tr class="altColor">
+<td class="colFirst"><a name="org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil.TABLE_INPUT_CLASS_KEY">
+<!--   -->
+</a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
+<td><code><a href="org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#TABLE_INPUT_CLASS_KEY">TABLE_INPUT_CLASS_KEY</a></code></td>
+<td class="colLast"><code>"hbase.table.input.class"</code></td>
+</tr>
+</tbody>
+</table>
+</li>
+<li class="blockList">
+<table class="constantsSummary" border="0" cellpadding="3" cellspacing="0" summary="Constant Field Values table, listing constant fields, and values">
 <caption><span>org.apache.hadoop.hbase.mapreduce.<a href="org/apache/hadoop/hbase/mapreduce/TableOutputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce">TableOutputFormat</a>&lt;<a href="org/apache/hadoop/hbase/mapreduce/TableOutputFormat.html" title="type parameter in TableOutputFormat">KEY</a>&gt;</span><span class="tabEnd">&nbsp;</span></caption>
 <tr>
 <th class="colFirst" scope="col">Modifier and Type</th>
diff --git a/apidocs/index-all.html b/apidocs/index-all.html
index da3977d..e541c5b 100644
--- a/apidocs/index-all.html
+++ b/apidocs/index-all.html
@@ -7197,6 +7197,8 @@
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/mapreduce/MultiTableSnapshotInputFormat.html#getSplits-org.apache.hadoop.mapreduce.JobContext-">getSplits(JobContext)</a></span> - Method in class org.apache.hadoop.hbase.mapreduce.<a href="org/apache/hadoop/hbase/mapreduce/MultiTableSnapshotInputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce">MultiTableSnapshotInputFormat</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/mapreduce/RoundRobinTableInputFormat.html#getSplits-org.apache.hadoop.mapreduce.JobContext-">getSplits(JobContext)</a></span> - Method in class org.apache.hadoop.hbase.mapreduce.<a href="org/apache/hadoop/hbase/mapreduce/RoundRobinTableInputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce">RoundRobinTableInputFormat</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/mapreduce/TableInputFormat.html#getSplits-org.apache.hadoop.mapreduce.JobContext-">getSplits(JobContext)</a></span> - Method in class org.apache.hadoop.hbase.mapreduce.<a href="org/apache/hadoop/hbase/mapreduce/TableInputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce">TableInputFormat</a></dt>
 <dd>
 <div class="block">Calculates the splits that will serve as input for the map tasks.</div>
@@ -10050,6 +10052,10 @@
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/mapreduce/ImportTsv.html#main-java.lang.String:A-">main(String[])</a></span> - Static method in class org.apache.hadoop.hbase.mapreduce.<a href="org/apache/hadoop/hbase/mapreduce/ImportTsv.html" title="class in org.apache.hadoop.hbase.mapreduce">ImportTsv</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/mapreduce/RoundRobinTableInputFormat.html#main-java.lang.String:A-">main(String[])</a></span> - Static method in class org.apache.hadoop.hbase.mapreduce.<a href="org/apache/hadoop/hbase/mapreduce/RoundRobinTableInputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce">RoundRobinTableInputFormat</a></dt>
+<dd>
+<div class="block">Pass table name as argument.</div>
+</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/mapreduce/RowCounter.html#main-java.lang.String:A-">main(String[])</a></span> - Static method in class org.apache.hadoop.hbase.mapreduce.<a href="org/apache/hadoop/hbase/mapreduce/RowCounter.html" title="class in org.apache.hadoop.hbase.mapreduce">RowCounter</a></dt>
 <dd>
 <div class="block">Main entry point.</div>
@@ -10285,6 +10291,8 @@
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/CellUtil.html#matchingRows-org.apache.hadoop.hbase.Cell-short-org.apache.hadoop.hbase.Cell-short-">matchingRows(Cell, short, Cell, short)</a></span> - Static method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/CellUtil.html" title="class in org.apache.hadoop.hbase">CellUtil</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/CellUtil.html#matchingTags-org.apache.hadoop.hbase.Cell-org.apache.hadoop.hbase.Cell-">matchingTags(Cell, Cell)</a></span> - Static method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/CellUtil.html" title="class in org.apache.hadoop.hbase">CellUtil</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/CellUtil.html#matchingTimestamp-org.apache.hadoop.hbase.Cell-org.apache.hadoop.hbase.Cell-">matchingTimestamp(Cell, Cell)</a></span> - Static method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/CellUtil.html" title="class in org.apache.hadoop.hbase">CellUtil</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/CellUtil.html#matchingValue-org.apache.hadoop.hbase.Cell-org.apache.hadoop.hbase.Cell-">matchingValue(Cell, Cell)</a></span> - Static method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/CellUtil.html" title="class in org.apache.hadoop.hbase">CellUtil</a></dt>
@@ -13294,6 +13302,13 @@ service.</div>
 <dd>
 <div class="block">Roll the log writer.</div>
 </dd>
+<dt><a href="org/apache/hadoop/hbase/mapreduce/RoundRobinTableInputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">RoundRobinTableInputFormat</span></a> - Class in <a href="org/apache/hadoop/hbase/mapreduce/package-summary.html">org.apache.hadoop.hbase.mapreduce</a></dt>
+<dd>
+<div class="block">Process the return from super-class <a href="org/apache/hadoop/hbase/mapreduce/TableInputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce"><code>TableInputFormat</code></a> (TIF) so as to undo any clumping of
+ <code>InputSplit</code>s around RegionServers.</div>
+</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/mapreduce/RoundRobinTableInputFormat.html#RoundRobinTableInputFormat--">RoundRobinTableInputFormat()</a></span> - Constructor for class org.apache.hadoop.hbase.mapreduce.<a href="org/apache/hadoop/hbase/mapreduce/RoundRobinTableInputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce">RoundRobinTableInputFormat</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/Mutation.html#row">row</a></span> - Variable in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/client/Row.html" title="interface in org.apache.hadoop.hbase.client"><span class="typeNameLink">Row</span></a> - Interface in <a href="org/apache/hadoop/hbase/client/package-summary.html">org.apache.hadoop.hbase.client</a></dt>
@@ -15524,6 +15539,8 @@ service.</div>
 <dd>
 <div class="block">The catalog family as a string</div>
 </dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#TABLE_INPUT_CLASS_KEY">TABLE_INPUT_CLASS_KEY</a></span> - Static variable in class org.apache.hadoop.hbase.mapreduce.<a href="org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html" title="class in org.apache.hadoop.hbase.mapreduce">TableMapReduceUtil</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/mapreduce/WALPlayer.html#TABLE_MAP_KEY">TABLE_MAP_KEY</a></span> - Static variable in class org.apache.hadoop.hbase.mapreduce.<a href="org/apache/hadoop/hbase/mapreduce/WALPlayer.html" title="class in org.apache.hadoop.hbase.mapreduce">WALPlayer</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/HConstants.html#TABLE_MAX_ROWSIZE_DEFAULT">TABLE_MAX_ROWSIZE_DEFAULT</a></span> - Static variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/HConstants.html" title="class in org.apache.hadoop.hbase">HConstants</a></dt>
diff --git a/apidocs/org/apache/hadoop/hbase/CellUtil.html b/apidocs/org/apache/hadoop/hbase/CellUtil.html
index b556a8f..3eaa090 100644
--- a/apidocs/org/apache/hadoop/hbase/CellUtil.html
+++ b/apidocs/org/apache/hadoop/hbase/CellUtil.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":9,"i1":9,"i2":9,"i3":9,"i4":9,"i5":9,"i6":9,"i7":9,"i8":9,"i9":9,"i10":9,"i11":9,"i12":9,"i13":9,"i14":9,"i15":9,"i16":9,"i17":9,"i18":9,"i19":9,"i20":9,"i21":9,"i22":9,"i23":9,"i24":9,"i25":9,"i26":9,"i27":9,"i28":9,"i29":9,"i30":9,"i31":9,"i32":9,"i33":9,"i34":9,"i35":9,"i36":9,"i37":9,"i38":9,"i39":9,"i40":9,"i41":9,"i42":9,"i43":9,"i44":9,"i45":9,"i46":9};
+var methods = {"i0":9,"i1":9,"i2":9,"i3":9,"i4":9,"i5":9,"i6":9,"i7":9,"i8":9,"i9":9,"i10":9,"i11":9,"i12":9,"i13":9,"i14":9,"i15":9,"i16":9,"i17":9,"i18":9,"i19":9,"i20":9,"i21":9,"i22":9,"i23":9,"i24":9,"i25":9,"i26":9,"i27":9,"i28":9,"i29":9,"i30":9,"i31":9,"i32":9,"i33":9,"i34":9,"i35":9,"i36":9,"i37":9,"i38":9,"i39":9,"i40":9,"i41":9,"i42":9,"i43":9,"i44":9,"i45":9,"i46":9,"i47":9};
 var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -390,33 +390,38 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </tr>
 <tr id="i41" class="rowColor">
 <td class="colFirst"><code>static boolean</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/CellUtil.html#matchingTags-org.apache.hadoop.hbase.Cell-org.apache.hadoop.hbase.Cell-">matchingTags</a></span>(<a href="../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;left,
+            <a href="../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;right)</code>&nbsp;</td>
+</tr>
+<tr id="i42" class="altColor">
+<td class="colFirst"><code>static boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/CellUtil.html#matchingTimestamp-org.apache.hadoop.hbase.Cell-org.apache.hadoop.hbase.Cell-">matchingTimestamp</a></span>(<a href="../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;a,
                  <a href="../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;b)</code>&nbsp;</td>
 </tr>
-<tr id="i42" class="altColor">
+<tr id="i43" class="rowColor">
 <td class="colFirst"><code>static boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/CellUtil.html#matchingValue-org.apache.hadoop.hbase.Cell-byte:A-">matchingValue</a></span>(<a href="../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;left,
              byte[]&nbsp;buf)</code>&nbsp;</td>
 </tr>
-<tr id="i43" class="rowColor">
+<tr id="i44" class="altColor">
 <td class="colFirst"><code>static boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/CellUtil.html#matchingValue-org.apache.hadoop.hbase.Cell-org.apache.hadoop.hbase.Cell-">matchingValue</a></span>(<a href="../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;left,
              <a href="../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;right)</code>&nbsp;</td>
 </tr>
-<tr id="i44" class="altColor">
+<tr id="i45" class="rowColor">
 <td class="colFirst"><code>static boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/CellUtil.html#matchingValue-org.apache.hadoop.hbase.Cell-org.apache.hadoop.hbase.Cell-int-int-">matchingValue</a></span>(<a href="../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;left,
              <a href="../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;right,
              int&nbsp;lvlength,
              int&nbsp;rvlength)</code>&nbsp;</td>
 </tr>
-<tr id="i45" class="rowColor">
+<tr id="i46" class="altColor">
 <td class="colFirst"><code>static byte[][]</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/CellUtil.html#parseColumn-byte:A-">parseColumn</a></span>(byte[]&nbsp;c)</code>
 <div class="block">Splits a column in <code>family:qualifier</code> form into separate byte arrays.</div>
 </td>
 </tr>
-<tr id="i46" class="altColor">
+<tr id="i47" class="rowColor">
 <td class="colFirst"><code>static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/CellUtil.html#toString-org.apache.hadoop.hbase.Cell-boolean-">toString</a></span>(<a href="../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell,
         boolean&nbsp;verbose)</code>
@@ -931,13 +936,23 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
                                     byte[]&nbsp;buf)</pre>
 </li>
 </ul>
+<a name="matchingTags-org.apache.hadoop.hbase.Cell-org.apache.hadoop.hbase.Cell-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>matchingTags</h4>
+<pre>public static&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/CellUtil.html#line.573">matchingTags</a>(<a href="../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;left,
+                                   <a href="../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;right)</pre>
+</li>
+</ul>
 <a name="isDelete-org.apache.hadoop.hbase.Cell-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>isDelete</h4>
-<pre>public static&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/CellUtil.html#line.579">isDelete</a>(<a href="../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</pre>
+<pre>public static&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/CellUtil.html#line.583">isDelete</a>(<a href="../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>True if a delete type, a <code>KeyValue.Type.Delete</code> or a
@@ -952,7 +967,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isPut</h4>
-<pre>public static&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/CellUtil.html#line.587">isPut</a>(<a href="../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</pre>
+<pre>public static&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/CellUtil.html#line.591">isPut</a>(<a href="../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>True if this cell is a Put.</dd>
@@ -965,7 +980,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getCellKeyAsString</h4>
-<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/CellUtil.html#line.621">getCellKeyAsString</a>(<a href="../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</pre>
+<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/CellUtil.html#line.625">getCellKeyAsString</a>(<a href="../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>The Key portion of the passed <code>cell</code> as a String.</dd>
@@ -978,7 +993,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getCellKeyAsString</h4>
-<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/CellUtil.html#line.631">getCellKeyAsString</a>(<a href="../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell,
+<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/CellUtil.html#line.635">getCellKeyAsString</a>(<a href="../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell,
                                         <a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html?is-external=true" title="class or interface in java.util.function">Function</a>&lt;<a href="../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;rowConverter)</pre>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -995,7 +1010,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>toString</h4>
-<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/CellUtil.html#line.655">toString</a>(<a href="../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell,
+<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/CellUtil.html#line.659">toString</a>(<a href="../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell,
                               boolean&nbsp;verbose)</pre>
 <div class="block">Returns a string representation of the cell</div>
 </li>
@@ -1006,7 +1021,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>equals</h4>
-<pre>public static&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/CellUtil.html#line.688">equals</a>(<a href="../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;a,
+<pre>public static&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/CellUtil.html#line.692">equals</a>(<a href="../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;a,
                              <a href="../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;b)</pre>
 <div class="block">equals</div>
 </li>
@@ -1017,7 +1032,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>matchingTimestamp</h4>
-<pre>public static&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/CellUtil.html#line.693">matchingTimestamp</a>(<a href="../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;a,
+<pre>public static&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/CellUtil.html#line.697">matchingTimestamp</a>(<a href="../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;a,
                                         <a href="../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;b)</pre>
 </li>
 </ul>
@@ -1027,7 +1042,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>matchingRows</h4>
-<pre>public static&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/CellUtil.html#line.703">matchingRows</a>(<a href="../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;left,
+<pre>public static&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/CellUtil.html#line.707">matchingRows</a>(<a href="../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;left,
                                    <a href="../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;right)</pre>
 <div class="block">Compares the row of two keyvalues for equality</div>
 <dl>
@@ -1045,7 +1060,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>matchingRows</h4>
-<pre>public static&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/CellUtil.html#line.709">matchingRows</a>(<a href="../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;left,
+<pre>public static&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/CellUtil.html#line.713">matchingRows</a>(<a href="../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;left,
                                    short&nbsp;lrowlength,
                                    <a href="../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;right,
                                    short&nbsp;rrowlength)</pre>
@@ -1057,7 +1072,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>matchingRowColumn</h4>
-<pre>public static&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/CellUtil.html#line.738">matchingRowColumn</a>(<a href="../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;left,
+<pre>public static&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/CellUtil.html#line.742">matchingRowColumn</a>(<a href="../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;left,
                                         <a href="../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;right)</pre>
 <div class="block">Compares the row and column of two keyvalues for equality</div>
 <dl>
@@ -1075,7 +1090,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>matchingRowColumnBytes</h4>
-<pre>public static&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/CellUtil.html#line.764">matchingRowColumnBytes</a>(<a href="../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;left,
+<pre>public static&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/CellUtil.html#line.768">matchingRowColumnBytes</a>(<a href="../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;left,
                                              <a href="../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;right)</pre>
 </li>
 </ul>
@@ -1085,7 +1100,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>compareQualifiers</h4>
-<pre>public static final&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/CellUtil.html#line.802">compareQualifiers</a>(<a href="../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;left,
+<pre>public static final&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/CellUtil.html#line.806">compareQualifiers</a>(<a href="../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;left,
                                           byte[]&nbsp;right,
                                           int&nbsp;rOffset,
                                           int&nbsp;rLength)</pre>
@@ -1108,7 +1123,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>compareFamilies</h4>
-<pre>public static final&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/CellUtil.html#line.821">compareFamilies</a>(<a href="../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;left,
+<pre>public static final&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/CellUtil.html#line.825">compareFamilies</a>(<a href="../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;left,
                                         byte[]&nbsp;right,
                                         int&nbsp;roffset,
                                         int&nbsp;rlength)</pre>
@@ -1131,7 +1146,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>compareColumns</h4>
-<pre>public static final&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/CellUtil.html#line.842">compareColumns</a>(<a href="../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;left,
+<pre>public static final&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/CellUtil.html#line.846">compareColumns</a>(<a href="../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;left,
                                        byte[]&nbsp;right,
                                        int&nbsp;rfoffset,
                                        int&nbsp;rflength,
diff --git a/apidocs/org/apache/hadoop/hbase/class-use/Cell.html b/apidocs/org/apache/hadoop/hbase/class-use/Cell.html
index 3e887b1..22e1492 100644
--- a/apidocs/org/apache/hadoop/hbase/class-use/Cell.html
+++ b/apidocs/org/apache/hadoop/hbase/class-use/Cell.html
@@ -440,27 +440,32 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static boolean</code></td>
+<td class="colLast"><span class="typeNameLabel">CellUtil.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/CellUtil.html#matchingTags-org.apache.hadoop.hbase.Cell-org.apache.hadoop.hbase.Cell-">matchingTags</a></span>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;left,
+            <a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;right)</code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>static boolean</code></td>
 <td class="colLast"><span class="typeNameLabel">CellUtil.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/CellUtil.html#matchingTimestamp-org.apache.hadoop.hbase.Cell-org.apache.hadoop.hbase.Cell-">matchingTimestamp</a></span>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;a,
                  <a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;b)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>static boolean</code></td>
 <td class="colLast"><span class="typeNameLabel">CellUtil.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/CellUtil.html#matchingValue-org.apache.hadoop.hbase.Cell-byte:A-">matchingValue</a></span>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;left,
              byte[]&nbsp;buf)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>static boolean</code></td>
 <td class="colLast"><span class="typeNameLabel">CellUtil.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/CellUtil.html#matchingValue-org.apache.hadoop.hbase.Cell-org.apache.hadoop.hbase.Cell-">matchingValue</a></span>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;left,
              <a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;right)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>static boolean</code></td>
 <td class="colLast"><span class="typeNameLabel">CellUtil.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/CellUtil.html#matchingValue-org.apache.hadoop.hbase.Cell-org.apache.hadoop.hbase.Cell-int-int-">matchingValue</a></span>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;left,
              <a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;right,
              int&nbsp;lvlength,
              int&nbsp;rvlength)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>static void</code></td>
 <td class="colLast"><span class="typeNameLabel">CellUtil.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/CellUtil.html#setTimestamp-org.apache.hadoop.hbase.Cell-byte:A-int-">setTimestamp</a></span>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell,
             byte[]&nbsp;ts,
@@ -468,14 +473,14 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 <div class="block">Sets the given timestamp to the cell.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>static void</code></td>
 <td class="colLast"><span class="typeNameLabel">CellUtil.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/CellUtil.html#setTimestamp-org.apache.hadoop.hbase.Cell-long-">setTimestamp</a></span>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell,
             long&nbsp;ts)</code>
 <div class="block">Sets the given timestamp to the cell.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><span class="typeNameLabel">CellUtil.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/CellUtil.html#toString-org.apache.hadoop.hbase.Cell-boolean-">toString</a></span>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell,
         boolean&nbsp;verbose)</code>
diff --git a/apidocs/org/apache/hadoop/hbase/client/Result.html b/apidocs/org/apache/hadoop/hbase/client/Result.html
index b195e01..8c51836 100644
--- a/apidocs/org/apache/hadoop/hbase/client/Result.html
+++ b/apidocs/org/apache/hadoop/hbase/client/Result.html
@@ -1244,7 +1244,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/CellScannable.html" t
 <ul class="blockList">
 <li class="blockList">
 <h4>createCompleteResult</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Result.html#line.809">createCompleteResult</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Iterable.html?is-external=true" title="class or interface in java.lang">Iterable</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Result.html" title="c [...]
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Result.html#line.810">createCompleteResult</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Iterable.html?is-external=true" title="class or interface in java.lang">Iterable</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Result.html" title="c [...]
                                    throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Forms a single result from the partial results in the partialResults list. This method is
  useful for reconstructing partial results on the client side.</div>
@@ -1265,7 +1265,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/CellScannable.html" t
 <ul class="blockList">
 <li class="blockList">
 <h4>getTotalSizeOfCells</h4>
-<pre>public static&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Result.html#line.856">getTotalSizeOfCells</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;result)</pre>
+<pre>public static&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Result.html#line.857">getTotalSizeOfCells</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;result)</pre>
 <div class="block">Get total size of raw cells</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -1281,7 +1281,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/CellScannable.html" t
 <ul class="blockList">
 <li class="blockList">
 <h4>copyFrom</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Result.html#line.873">copyFrom</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;other)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Result.html#line.874">copyFrom</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;other)</pre>
 <div class="block">Copy another Result into this one. Needed for the old Mapred framework</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -1298,7 +1298,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/CellScannable.html" t
 <ul class="blockList">
 <li class="blockList">
 <h4>cellScanner</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/CellScanner.html" title="interface in org.apache.hadoop.hbase">CellScanner</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Result.html#line.881">cellScanner</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/CellScanner.html" title="interface in org.apache.hadoop.hbase">CellScanner</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Result.html#line.882">cellScanner</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/CellScannable.html#cellScanner--">cellScanner</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/CellScannable.html" title="interface in org.apache.hadoop.hbase">CellScannable</a></code></dd>
@@ -1313,7 +1313,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/CellScannable.html" t
 <ul class="blockList">
 <li class="blockList">
 <h4>current</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Result.html#line.888">current</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Result.html#line.889">current</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/CellScanner.html#current--">current</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/CellScanner.html" title="interface in org.apache.hadoop.hbase">CellScanner</a></code></dd>
@@ -1328,7 +1328,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/CellScannable.html" t
 <ul class="blockList">
 <li class="blockList">
 <h4>advance</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Result.html#line.897">advance</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Result.html#line.898">advance</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/CellScanner.html#advance--">CellScanner</a></code></span></div>
 <div class="block">Advance the scanner 1 cell.</div>
 <dl>
@@ -1345,7 +1345,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/CellScannable.html" t
 <ul class="blockList">
 <li class="blockList">
 <h4>getExists</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html?is-external=true" title="class or interface in java.lang">Boolean</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Result.html#line.908">getExists</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html?is-external=true" title="class or interface in java.lang">Boolean</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Result.html#line.909">getExists</a>()</pre>
 </li>
 </ul>
 <a name="setExists-java.lang.Boolean-">
@@ -1354,7 +1354,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/CellScannable.html" t
 <ul class="blockList">
 <li class="blockList">
 <h4>setExists</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Result.html#line.912">setExists</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html?is-external=true" title="class or interface in java.lang">Boolean</a>&nbsp;exists)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Result.html#line.913">setExists</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html?is-external=true" title="class or interface in java.lang">Boolean</a>&nbsp;exists)</pre>
 </li>
 </ul>
 <a name="isStale--">
@@ -1363,7 +1363,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/CellScannable.html" t
 <ul class="blockList">
 <li class="blockList">
 <h4>isStale</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Result.html#line.922">isStale</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Result.html#line.923">isStale</a>()</pre>
 <div class="block">Whether or not the results are coming from possibly stale data. Stale results
  might be returned if <a href="../../../../../org/apache/hadoop/hbase/client/Consistency.html" title="enum in org.apache.hadoop.hbase.client"><code>Consistency</code></a> is not STRONG for the query.</div>
 <dl>
@@ -1378,7 +1378,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/CellScannable.html" t
 <ul class="blockList">
 <li class="blockList">
 <h4>mayHaveMoreCellsInRow</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Result.html#line.934">mayHaveMoreCellsInRow</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Result.html#line.935">mayHaveMoreCellsInRow</a>()</pre>
 <div class="block">For scanning large rows, the RS may choose to return the cells chunk by chunk to prevent OOM
  or timeout. This flag is used to tell you if the current Result is the last one of the current
  row. False means this Result is the last one. True means there MAY be more cells belonging to
@@ -1393,7 +1393,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/CellScannable.html" t
 <ul class="blockList">
 <li class="blockList">
 <h4>getStats</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/RegionLoadStats.html" title="class in org.apache.hadoop.hbase.client">RegionLoadStats</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Result.html#line.951">getStats</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/RegionLoadStats.html" title="class in org.apache.hadoop.hbase.client">RegionLoadStats</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Result.html#line.952">getStats</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>the associated statistics about the region from which this was returned. Can be
@@ -1407,7 +1407,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/CellScannable.html" t
 <ul class="blockList">
 <li class="blockList">
 <h4>isCursor</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Result.html#line.985">isCursor</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Result.html#line.986">isCursor</a>()</pre>
 <div class="block">Return true if this Result is a cursor to tell users where the server has scanned.
  In this Result the only meaningful method is <a href="../../../../../org/apache/hadoop/hbase/client/Result.html#getCursor--"><code>getCursor()</code></a>.
 
@@ -1433,7 +1433,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/CellScannable.html" t
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getCursor</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Cursor.html" title="class in org.apache.hadoop.hbase.client">Cursor</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Result.html#line.995">getCursor</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Cursor.html" title="class in org.apache.hadoop.hbase.client">Cursor</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Result.html#line.996">getCursor</a>()</pre>
 <div class="block">Return the cursor if this Result is a cursor result.
  <a href="../../../../../org/apache/hadoop/hbase/client/Scan.html#setNeedCursorResult-boolean-"><code>Scan.setNeedCursorResult(boolean)</code></a>
  <a href="../../../../../org/apache/hadoop/hbase/client/Cursor.html" title="class in org.apache.hadoop.hbase.client"><code>Cursor</code></a>
diff --git a/apidocs/org/apache/hadoop/hbase/mapreduce/ResultSerialization.html b/apidocs/org/apache/hadoop/hbase/mapreduce/ResultSerialization.html
index 263e204..5711353 100644
--- a/apidocs/org/apache/hadoop/hbase/mapreduce/ResultSerialization.html
+++ b/apidocs/org/apache/hadoop/hbase/mapreduce/ResultSerialization.html
@@ -50,7 +50,7 @@ var activeTableTab = "activeTableTab";
 <div class="subNav">
 <ul class="navList">
 <li><a href="../../../../../org/apache/hadoop/hbase/mapreduce/PutSortReducer.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
-<li><a href="../../../../../org/apache/hadoop/hbase/mapreduce/RowCounter.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/mapreduce/RoundRobinTableInputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
 <li><a href="../../../../../index.html?org/apache/hadoop/hbase/mapreduce/ResultSerialization.html" target="_top">Frames</a></li>
@@ -323,7 +323,7 @@ implements org.apache.hadoop.io.serializer.Serialization&lt;<a href="../../../..
 <div class="subNav">
 <ul class="navList">
 <li><a href="../../../../../org/apache/hadoop/hbase/mapreduce/PutSortReducer.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
-<li><a href="../../../../../org/apache/hadoop/hbase/mapreduce/RowCounter.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/mapreduce/RoundRobinTableInputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
 <li><a href="../../../../../index.html?org/apache/hadoop/hbase/mapreduce/ResultSerialization.html" target="_top">Frames</a></li>
diff --git a/apidocs/org/apache/hadoop/hbase/mapreduce/RoundRobinTableInputFormat.html b/apidocs/org/apache/hadoop/hbase/mapreduce/RoundRobinTableInputFormat.html
new file mode 100644
index 0000000..cb74c92
--- /dev/null
+++ b/apidocs/org/apache/hadoop/hbase/mapreduce/RoundRobinTableInputFormat.html
@@ -0,0 +1,383 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc -->
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>RoundRobinTableInputFormat (Apache HBase 3.0.0-SNAPSHOT API)</title>
+<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
+<script type="text/javascript" src="../../../../../script.js"></script>
+</head>
+<body>
+<script type="text/javascript"><!--
+    try {
+        if (location.href.indexOf('is-external=true') == -1) {
+            parent.document.title="RoundRobinTableInputFormat (Apache HBase 3.0.0-SNAPSHOT API)";
+        }
+    }
+    catch(err) {
+    }
+//-->
+var methods = {"i0":10,"i1":9};
+var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
+var altColor = "altColor";
+var rowColor = "rowColor";
+var tableTab = "tableTab";
+var activeTableTab = "activeTableTab";
+</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="topNav"><a name="navbar.top">
+<!--   -->
+</a>
+<div class="skipNav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<a name="navbar.top.firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../overview-summary.html">Overview</a></li>
+<li><a href="package-summary.html">Package</a></li>
+<li class="navBarCell1Rev">Class</li>
+<li><a href="class-use/RoundRobinTableInputFormat.html">Use</a></li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li><a href="../../../../../org/apache/hadoop/hbase/mapreduce/ResultSerialization.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/mapreduce/RowCounter.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../index.html?org/apache/hadoop/hbase/mapreduce/RoundRobinTableInputFormat.html" target="_top">Frames</a></li>
+<li><a href="RoundRobinTableInputFormat.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_top">
+<li><a href="../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_top");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<div>
+<ul class="subNavList">
+<li>Summary:&nbsp;</li>
+<li>Nested&nbsp;|&nbsp;</li>
+<li><a href="#fields.inherited.from.class.org.apache.hadoop.hbase.mapreduce.TableInputFormat">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method.summary">Method</a></li>
+</ul>
+<ul class="subNavList">
+<li>Detail:&nbsp;</li>
+<li>Field&nbsp;|&nbsp;</li>
+<li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method.detail">Method</a></li>
+</ul>
+</div>
+<a name="skip.navbar.top">
+<!--   -->
+</a></div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<!-- ======== START OF CLASS DATA ======== -->
+<div class="header">
+<div class="subTitle">org.apache.hadoop.hbase.mapreduce</div>
+<h2 title="Class RoundRobinTableInputFormat" class="title">Class RoundRobinTableInputFormat</h2>
+</div>
+<div class="contentContainer">
+<ul class="inheritance">
+<li><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">java.lang.Object</a></li>
+<li>
+<ul class="inheritance">
+<li>org.apache.hadoop.mapreduce.InputFormat&lt;<a href="../../../../../org/apache/hadoop/hbase/io/ImmutableBytesWritable.html" title="class in org.apache.hadoop.hbase.io">ImmutableBytesWritable</a>,<a href="../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&gt;</li>
+<li>
+<ul class="inheritance">
+<li><a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableInputFormatBase.html" title="class in org.apache.hadoop.hbase.mapreduce">org.apache.hadoop.hbase.mapreduce.TableInputFormatBase</a></li>
+<li>
+<ul class="inheritance">
+<li><a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableInputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce">org.apache.hadoop.hbase.mapreduce.TableInputFormat</a></li>
+<li>
+<ul class="inheritance">
+<li>org.apache.hadoop.hbase.mapreduce.RoundRobinTableInputFormat</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+<div class="description">
+<ul class="blockList">
+<li class="blockList">
+<dl>
+<dt>All Implemented Interfaces:</dt>
+<dd>org.apache.hadoop.conf.Configurable</dd>
+</dl>
+<hr>
+<br>
+<pre>@InterfaceAudience.Public
+public class <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/RoundRobinTableInputFormat.html#line.49">RoundRobinTableInputFormat</a>
+extends <a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableInputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce">TableInputFormat</a></pre>
+<div class="block">Process the return from super-class <a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableInputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce"><code>TableInputFormat</code></a> (TIF) so as to undo any clumping of
+ <code>InputSplit</code>s around RegionServers. Spread splits broadly to distribute read-load over
+ RegionServers in the cluster. The super-class TIF returns splits in hbase:meta table order.
+ Adjacent or near-adjacent hbase:meta Regions can be hosted on the same RegionServer -- nothing
+ prevents this. This hbase:maeta ordering of InputSplit placement can be lumpy making it so some
+ RegionServers end up hosting lots of InputSplit scans while contemporaneously other RegionServers
+ host few or none. This class does a pass over the return from the super-class to better spread
+ the load. See the below helpful Flipkart blog post for a description and from where the base of
+ this code comes from (with permission).</div>
+<dl>
+<dt><span class="seeLabel">See Also:</span></dt>
+<dd><code>https://tech.flipkart.com/is-data-locality-always-out-of-the-box-in-hadoop-not-really-2ae9c95163cb</code></dd>
+</dl>
+</li>
+</ul>
+</div>
+<div class="summary">
+<ul class="blockList">
+<li class="blockList">
+<!-- =========== FIELD SUMMARY =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="field.summary">
+<!--   -->
+</a>
+<h3>Field Summary</h3>
+<ul class="blockList">
+<li class="blockList"><a name="fields.inherited.from.class.org.apache.hadoop.hbase.mapreduce.TableInputFormat">
+<!--   -->
+</a>
+<h3>Fields inherited from class&nbsp;org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableInputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce">TableInputFormat</a></h3>
+<code><a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableInputFormat.html#INPUT_TABLE">INPUT_TABLE</a>, <a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableInputFormat.html#SCAN">SCAN</a>, <a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableInputFormat.html#SCAN_BATCHSIZE">SCAN_BATCHSIZE</a>, <a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableInputFormat.html#SCAN_CACHEBLOCKS">SCAN_CACHEBLOCKS</a>, <a href="../../../../../org/apache/hadoop/hb [...]
+</ul>
+<ul class="blockList">
+<li class="blockList"><a name="fields.inherited.from.class.org.apache.hadoop.hbase.mapreduce.TableInputFormatBase">
+<!--   -->
+</a>
+<h3>Fields inherited from class&nbsp;org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableInputFormatBase.html" title="class in org.apache.hadoop.hbase.mapreduce">TableInputFormatBase</a></h3>
+<code><a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableInputFormatBase.html#MAPREDUCE_INPUT_AUTOBALANCE">MAPREDUCE_INPUT_AUTOBALANCE</a>, <a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableInputFormatBase.html#MAX_AVERAGE_REGION_SIZE">MAX_AVERAGE_REGION_SIZE</a>, <a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableInputFormatBase.html#NUM_MAPPERS_PER_REGION">NUM_MAPPERS_PER_REGION</a></code></li>
+</ul>
+</li>
+</ul>
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+<ul class="blockList">
+<li class="blockList"><a name="constructor.summary">
+<!--   -->
+</a>
+<h3>Constructor Summary</h3>
+<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Constructor Summary table, listing constructors, and an explanation">
+<caption><span>Constructors</span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colOne" scope="col">Constructor and Description</th>
+</tr>
+<tr class="altColor">
+<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/mapreduce/RoundRobinTableInputFormat.html#RoundRobinTableInputFormat--">RoundRobinTableInputFormat</a></span>()</code>&nbsp;</td>
+</tr>
+</table>
+</li>
+</ul>
+<!-- ========== METHOD SUMMARY =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="method.summary">
+<!--   -->
+</a>
+<h3>Method Summary</h3>
+<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Method Summary table, listing methods, and an explanation">
+<caption><span id="t0" class="activeTableTab"><span>All Methods</span><span class="tabEnd">&nbsp;</span></span><span id="t1" class="tableTab"><span><a href="javascript:show(1);">Static Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t2" class="tableTab"><span><a href="javascript:show(2);">Instance Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t4" class="tableTab"><span><a href="javascript:show(8);">Concrete Methods</a></span><span class="tabEnd [...]
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th class="colLast" scope="col">Method and Description</th>
+</tr>
+<tr id="i0" class="altColor">
+<td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.mapreduce.InputSplit&gt;</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/mapreduce/RoundRobinTableInputFormat.html#getSplits-org.apache.hadoop.mapreduce.JobContext-">getSplits</a></span>(org.apache.hadoop.mapreduce.JobContext&nbsp;context)</code>
+<div class="block">Calculates the splits that will serve as input for the map tasks.</div>
+</td>
+</tr>
+<tr id="i1" class="rowColor">
+<td class="colFirst"><code>static void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/mapreduce/RoundRobinTableInputFormat.html#main-java.lang.String:A-">main</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)</code>
+<div class="block">Pass table name as argument.</div>
+</td>
+</tr>
+</table>
+<ul class="blockList">
+<li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.mapreduce.TableInputFormat">
+<!--   -->
+</a>
+<h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableInputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce">TableInputFormat</a></h3>
+<code><a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableInputFormat.html#addColumns-org.apache.hadoop.hbase.client.Scan-byte:A:A-">addColumns</a>, <a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableInputFormat.html#configureSplitTable-org.apache.hadoop.mapreduce.Job-org.apache.hadoop.hbase.TableName-">configureSplitTable</a>, <a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableInputFormat.html#createScanFromConfiguration-org.apache.hadoop.conf.Configur [...]
+</ul>
+<ul class="blockList">
+<li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.mapreduce.TableInputFormatBase">
+<!--   -->
+</a>
+<h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableInputFormatBase.html" title="class in org.apache.hadoop.hbase.mapreduce">TableInputFormatBase</a></h3>
+<code><a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableInputFormatBase.html#calculateAutoBalancedSplits-java.util.List-long-">calculateAutoBalancedSplits</a>, <a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableInputFormatBase.html#closeTable--">closeTable</a>, <a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableInputFormatBase.html#createNInputSplitsUniform-org.apache.hadoop.mapreduce.InputSplit-int-">createNInputSplitsUniform</a>, <a href="../../../. [...]
+</ul>
+<ul class="blockList">
+<li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
+<!--   -->
+</a>
+<h3>Methods inherited from class&nbsp;java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></h3>
+<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#clone--" title="class or interface in java.lang">clone</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#equals-java.lang.Object-" title="class or interface in java.lang">equals</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#finalize--" title="class or interface in java.lang">finalize</a>, <a href="htt [...]
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</div>
+<div class="details">
+<ul class="blockList">
+<li class="blockList">
+<!-- ========= CONSTRUCTOR DETAIL ======== -->
+<ul class="blockList">
+<li class="blockList"><a name="constructor.detail">
+<!--   -->
+</a>
+<h3>Constructor Detail</h3>
+<a name="RoundRobinTableInputFormat--">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>RoundRobinTableInputFormat</h4>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/RoundRobinTableInputFormat.html#line.49">RoundRobinTableInputFormat</a>()</pre>
+</li>
+</ul>
+</li>
+</ul>
+<!-- ============ METHOD DETAIL ========== -->
+<ul class="blockList">
+<li class="blockList"><a name="method.detail">
+<!--   -->
+</a>
+<h3>Method Detail</h3>
+<a name="getSplits-org.apache.hadoop.mapreduce.JobContext-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>getSplits</h4>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.mapreduce.InputSplit&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/RoundRobinTableInputFormat.html#line.62">getSplits</a>(org.apache.hadoop.mapreduce.JobContext&nbsp;context)
+                                                       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
+<div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableInputFormat.html#getSplits-org.apache.hadoop.mapreduce.JobContext-">TableInputFormat</a></code></span></div>
+<div class="block">Calculates the splits that will serve as input for the map tasks. The
+ number of splits matches the number of regions in a table. Splits are shuffled if
+ required.</div>
+<dl>
+<dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
+<dd><code><a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableInputFormat.html#getSplits-org.apache.hadoop.mapreduce.JobContext-">getSplits</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableInputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce">TableInputFormat</a></code></dd>
+<dt><span class="paramLabel">Parameters:</span></dt>
+<dd><code>context</code> - The current job context.</dd>
+<dt><span class="returnLabel">Returns:</span></dt>
+<dd>The list of input splits.</dd>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code> - When creating the list of splits fails.</dd>
+<dt><span class="seeLabel">See Also:</span></dt>
+<dd><code>InputFormat.getSplits(
+   org.apache.hadoop.mapreduce.JobContext)</code></dd>
+</dl>
+</li>
+</ul>
+<a name="main-java.lang.String:A-">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>main</h4>
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/RoundRobinTableInputFormat.html#line.160">main</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
+                 throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
+<div class="block">Pass table name as argument. Set the zk ensemble to use with the System property
+ 'hbase.zookeeper.quorum'</div>
+<dl>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd>
+</dl>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</div>
+</div>
+<!-- ========= END OF CLASS DATA ========= -->
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottomNav"><a name="navbar.bottom">
+<!--   -->
+</a>
+<div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<a name="navbar.bottom.firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../overview-summary.html">Overview</a></li>
+<li><a href="package-summary.html">Package</a></li>
+<li class="navBarCell1Rev">Class</li>
+<li><a href="class-use/RoundRobinTableInputFormat.html">Use</a></li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li><a href="../../../../../org/apache/hadoop/hbase/mapreduce/ResultSerialization.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/mapreduce/RowCounter.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../index.html?org/apache/hadoop/hbase/mapreduce/RoundRobinTableInputFormat.html" target="_top">Frames</a></li>
+<li><a href="RoundRobinTableInputFormat.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_bottom">
+<li><a href="../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_bottom");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<div>
+<ul class="subNavList">
+<li>Summary:&nbsp;</li>
+<li>Nested&nbsp;|&nbsp;</li>
+<li><a href="#fields.inherited.from.class.org.apache.hadoop.hbase.mapreduce.TableInputFormat">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method.summary">Method</a></li>
+</ul>
+<ul class="subNavList">
+<li>Detail:&nbsp;</li>
+<li>Field&nbsp;|&nbsp;</li>
+<li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method.detail">Method</a></li>
+</ul>
+</div>
+<a name="skip.navbar.bottom">
+<!--   -->
+</a></div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<p class="legalCopy"><small>Copyright &#169; 2007&#x2013;2021 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All rights reserved.</small></p>
+</body>
+</html>
diff --git a/apidocs/org/apache/hadoop/hbase/mapreduce/RowCounter.html b/apidocs/org/apache/hadoop/hbase/mapreduce/RowCounter.html
index cff7c2c..c9dbb8c 100644
--- a/apidocs/org/apache/hadoop/hbase/mapreduce/RowCounter.html
+++ b/apidocs/org/apache/hadoop/hbase/mapreduce/RowCounter.html
@@ -49,7 +49,7 @@ var activeTableTab = "activeTableTab";
 </div>
 <div class="subNav">
 <ul class="navList">
-<li><a href="../../../../../org/apache/hadoop/hbase/mapreduce/ResultSerialization.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/mapreduce/RoundRobinTableInputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
 <li><a href="../../../../../org/apache/hadoop/hbase/mapreduce/SimpleTotalOrderPartitioner.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
@@ -490,7 +490,7 @@ public static&nbsp;org.apache.hadoop.mapreduce.Job&nbsp;<a href="../../../../../
 </div>
 <div class="subNav">
 <ul class="navList">
-<li><a href="../../../../../org/apache/hadoop/hbase/mapreduce/ResultSerialization.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/mapreduce/RoundRobinTableInputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
 <li><a href="../../../../../org/apache/hadoop/hbase/mapreduce/SimpleTotalOrderPartitioner.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
diff --git a/apidocs/org/apache/hadoop/hbase/mapreduce/TableInputFormat.html b/apidocs/org/apache/hadoop/hbase/mapreduce/TableInputFormat.html
index 8193340..1f1c340 100644
--- a/apidocs/org/apache/hadoop/hbase/mapreduce/TableInputFormat.html
+++ b/apidocs/org/apache/hadoop/hbase/mapreduce/TableInputFormat.html
@@ -121,6 +121,10 @@ var activeTableTab = "activeTableTab";
 <dt>All Implemented Interfaces:</dt>
 <dd>org.apache.hadoop.conf.Configurable</dd>
 </dl>
+<dl>
+<dt>Direct Known Subclasses:</dt>
+<dd><a href="../../../../../org/apache/hadoop/hbase/mapreduce/RoundRobinTableInputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce">RoundRobinTableInputFormat</a></dd>
+</dl>
 <hr>
 <br>
 <pre>@InterfaceAudience.Public
diff --git a/apidocs/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html b/apidocs/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html
index 7ff774a..39ee786 100644
--- a/apidocs/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html
+++ b/apidocs/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html
@@ -75,13 +75,13 @@ var activeTableTab = "activeTableTab";
 <ul class="subNavList">
 <li>Summary:&nbsp;</li>
 <li>Nested&nbsp;|&nbsp;</li>
-<li>Field&nbsp;|&nbsp;</li>
+<li><a href="#field.summary">Field</a>&nbsp;|&nbsp;</li>
 <li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
 <li><a href="#method.summary">Method</a></li>
 </ul>
 <ul class="subNavList">
 <li>Detail:&nbsp;</li>
-<li>Field&nbsp;|&nbsp;</li>
+<li><a href="#field.detail">Field</a>&nbsp;|&nbsp;</li>
 <li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
 <li><a href="#method.detail">Method</a></li>
 </ul>
@@ -119,6 +119,25 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <div class="summary">
 <ul class="blockList">
 <li class="blockList">
+<!-- =========== FIELD SUMMARY =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="field.summary">
+<!--   -->
+</a>
+<h3>Field Summary</h3>
+<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Field Summary table, listing fields, and an explanation">
+<caption><span>Fields</span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th class="colLast" scope="col">Field and Description</th>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#TABLE_INPUT_CLASS_KEY">TABLE_INPUT_CLASS_KEY</a></span></code>&nbsp;</td>
+</tr>
+</table>
+</li>
+</ul>
 <!-- ======== CONSTRUCTOR SUMMARY ======== -->
 <ul class="blockList">
 <li class="blockList"><a name="constructor.summary">
@@ -470,6 +489,27 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <div class="details">
 <ul class="blockList">
 <li class="blockList">
+<!-- ============ FIELD DETAIL =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="field.detail">
+<!--   -->
+</a>
+<h3>Field Detail</h3>
+<a name="TABLE_INPUT_CLASS_KEY">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>TABLE_INPUT_CLASS_KEY</h4>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.74">TABLE_INPUT_CLASS_KEY</a></pre>
+<dl>
+<dt><span class="seeLabel">See Also:</span></dt>
+<dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil.TABLE_INPUT_CLASS_KEY">Constant Field Values</a></dd>
+</dl>
+</li>
+</ul>
+</li>
+</ul>
 <!-- ========= CONSTRUCTOR DETAIL ======== -->
 <ul class="blockList">
 <li class="blockList"><a name="constructor.detail">
@@ -499,7 +539,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>initTableMapperJob</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.88">initTableMapperJob</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;table,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.89">initTableMapperJob</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;table,
                                       <a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
                                       <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableMapper.html" title="class in org.apache.hadoop.hbase.mapreduce">TableMapper</a>&gt;&nbsp;mapper,
                                       <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;&nbsp;outputKeyClass,
@@ -528,7 +568,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>initTableMapperJob</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.111">initTableMapperJob</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;table,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.112">initTableMapperJob</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;table,
                                       <a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
                                       <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableMapper.html" title="class in org.apache.hadoop.hbase.mapreduce">TableMapper</a>&gt;&nbsp;mapper,
                                       <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;&nbsp;outputKeyClass,
@@ -557,7 +597,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>initTableMapperJob</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.139">initTableMapperJob</a>(byte[]&nbsp;table,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.140">initTableMapperJob</a>(byte[]&nbsp;table,
                                       <a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
                                       <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableMapper.html" title="class in org.apache.hadoop.hbase.mapreduce">TableMapper</a>&gt;&nbsp;mapper,
                                       <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;&nbsp;outputKeyClass,
@@ -586,7 +626,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>initTableMapperJob</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.163">initTableMapperJob</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;table,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.164">initTableMapperJob</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;table,
                                       <a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
                                       <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableMapper.html" title="class in org.apache.hadoop.hbase.mapreduce">TableMapper</a>&gt;&nbsp;mapper,
                                       <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;&nbsp;outputKeyClass,
@@ -619,7 +659,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>initTableMapperJob</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.191">initTableMapperJob</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;table,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.192">initTableMapperJob</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;table,
                                       <a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
                                       <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableMapper.html" title="class in org.apache.hadoop.hbase.mapreduce">TableMapper</a>&gt;&nbsp;mapper,
                                       <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;&nbsp;outputKeyClass,
@@ -655,7 +695,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>initTableMapperJob</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.236">initTableMapperJob</a>(byte[]&nbsp;table,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.237">initTableMapperJob</a>(byte[]&nbsp;table,
                                       <a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
                                       <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableMapper.html" title="class in org.apache.hadoop.hbase.mapreduce">TableMapper</a>&gt;&nbsp;mapper,
                                       <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;&nbsp;outputKeyClass,
@@ -689,7 +729,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>initTableMapperJob</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.261">initTableMapperJob</a>(byte[]&nbsp;table,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.262">initTableMapperJob</a>(byte[]&nbsp;table,
                                       <a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
                                       <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableMapper.html" title="class in org.apache.hadoop.hbase.mapreduce">TableMapper</a>&gt;&nbsp;mapper,
                                       <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;&nbsp;outputKeyClass,
@@ -721,7 +761,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>initTableMapperJob</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.286">initTableMapperJob</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;table,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.296">initTableMapperJob</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;table,
                                       <a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
                                       <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableMapper.html" title="class in org.apache.hadoop.hbase.mapreduce">TableMapper</a>&gt;&nbsp;mapper,
                                       <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;&nbsp;outputKeyClass,
@@ -753,7 +793,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>resetCacheConfig</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.302">resetCacheConfig</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.312">resetCacheConfig</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <div class="block">Enable a basic on-heap cache for these jobs. Any BlockCache implementation based on
  direct memory will likely cause the map tasks to OOM when opening the region. This
  is done here instead of in TableSnapshotRegionRecordReader in case an advanced user
@@ -766,7 +806,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>initMultiTableSnapshotMapperJob</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.323">initMultiTableSnapshotMapperJob</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/ [...]
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.333">initMultiTableSnapshotMapperJob</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/ [...]
                                                    <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableMapper.html" title="class in org.apache.hadoop.hbase.mapreduce">TableMapper</a>&gt;&nbsp;mapper,
                                                    <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;&nbsp;outputKeyClass,
                                                    <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;&nbsp;outputValueClass,
@@ -798,7 +838,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>initTableSnapshotMapperJob</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.365">initTableSnapshotMapperJob</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;snapshotName,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.375">initTableSnapshotMapperJob</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;snapshotName,
                                               <a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
                                               <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableMapper.html" title="class in org.apache.hadoop.hbase.mapreduce">TableMapper</a>&gt;&nbsp;mapper,
                                               <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;&nbsp;outputKeyClass,
@@ -836,7 +876,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>initTableSnapshotMapperJob</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.399">initTableSnapshotMapperJob</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;snapshotName,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.409">initTableSnapshotMapperJob</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;snapshotName,
                                               <a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
                                               <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableMapper.html" title="class in org.apache.hadoop.hbase.mapreduce">TableMapper</a>&gt;&nbsp;mapper,
                                               <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;&nbsp;outputKeyClass,
@@ -878,7 +918,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>initTableMapperJob</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.426">initTableMapperJob</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&gt;&nbsp;scans,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.436">initTableMapperJob</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&gt;&nbsp;scans,
                                       <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableMapper.html" title="class in org.apache.hadoop.hbase.mapreduce">TableMapper</a>&gt;&nbsp;mapper,
                                       <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;&nbsp;outputKeyClass,
                                       <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;&nbsp;outputValueClass,
@@ -905,7 +945,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>initTableMapperJob</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.448">initTableMapperJob</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&gt;&nbsp;scans,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.458">initTableMapperJob</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&gt;&nbsp;scans,
                                       <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableMapper.html" title="class in org.apache.hadoop.hbase.mapreduce">TableMapper</a>&gt;&nbsp;mapper,
                                       <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;&nbsp;outputKeyClass,
                                       <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;&nbsp;outputValueClass,
@@ -935,7 +975,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>initTableMapperJob</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.472">initTableMapperJob</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&gt;&nbsp;scans,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.482">initTableMapperJob</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&gt;&nbsp;scans,
                                       <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableMapper.html" title="class in org.apache.hadoop.hbase.mapreduce">TableMapper</a>&gt;&nbsp;mapper,
                                       <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;&nbsp;outputKeyClass,
                                       <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;&nbsp;outputValueClass,
@@ -967,7 +1007,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>initCredentials</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.505">initCredentials</a>(org.apache.hadoop.mapreduce.Job&nbsp;job)
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.515">initCredentials</a>(org.apache.hadoop.mapreduce.Job&nbsp;job)
                             throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -982,7 +1022,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <li class="blockList">
 <h4>initCredentialsForCluster</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.561">initCredentialsForCluster</a>(org.apache.hadoop.mapreduce.Job&nbsp;job,
+public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.571">initCredentialsForCluster</a>(org.apache.hadoop.mapreduce.Job&nbsp;job,
                                                          <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;quorumAddress)
                                                   throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">Since 1.2.0 and will be removed in 3.0.0. Use
@@ -1011,7 +1051,7 @@ public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/
 <ul class="blockList">
 <li class="blockList">
 <h4>initCredentialsForCluster</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.576">initCredentialsForCluster</a>(org.apache.hadoop.mapreduce.Job&nbsp;job,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.586">initCredentialsForCluster</a>(org.apache.hadoop.mapreduce.Job&nbsp;job,
                                              org.apache.hadoop.conf.Configuration&nbsp;conf)
                                       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Obtain an authentication token, for the specified cluster, on behalf of the current user
@@ -1031,7 +1071,7 @@ public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/
 <ul class="blockList">
 <li class="blockList">
 <h4>convertScanToString</h4>
-<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.601">convertScanToString</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan)
+<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.611">convertScanToString</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan)
                                   throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Writes the given scan into a Base64 encoded string.</div>
 <dl>
@@ -1050,7 +1090,7 @@ public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/
 <ul class="blockList">
 <li class="blockList">
 <h4>convertStringToScan</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.613">convertStringToScan</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;base64)
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.623">convertStringToScan</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;base64)
                                 throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Converts the given Base64 string back into a Scan instance.</div>
 <dl>
@@ -1069,7 +1109,7 @@ public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/
 <ul class="blockList">
 <li class="blockList">
 <h4>initTableReducerJob</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.627">initTableReducerJob</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;table,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.637">initTableReducerJob</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;table,
                                        <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableReducer.html" title="class in org.apache.hadoop.hbase.mapreduce">TableReducer</a>&gt;&nbsp;reducer,
                                        org.apache.hadoop.mapreduce.Job&nbsp;job)
                                 throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -1091,7 +1131,7 @@ public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/
 <ul class="blockList">
 <li class="blockList">
 <h4>initTableReducerJob</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.644">initTableReducerJob</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;table,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.654">initTableReducerJob</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;table,
                                        <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableReducer.html" title="class in org.apache.hadoop.hbase.mapreduce">TableReducer</a>&gt;&nbsp;reducer,
                                        org.apache.hadoop.mapreduce.Job&nbsp;job,
                                        <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&nbsp;partitioner)
@@ -1116,7 +1156,7 @@ public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/
 <ul class="blockList">
 <li class="blockList">
 <h4>initTableReducerJob</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.674">initTableReducerJob</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;table,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.684">initTableReducerJob</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;table,
                                        <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableReducer.html" title="class in org.apache.hadoop.hbase.mapreduce">TableReducer</a>&gt;&nbsp;reducer,
                                        org.apache.hadoop.mapreduce.Job&nbsp;job,
                                        <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&nbsp;partitioner,
@@ -1157,7 +1197,7 @@ public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/
 <ul class="blockList">
 <li class="blockList">
 <h4>initTableReducerJob</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.708">initTableReducerJob</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;table,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.718">initTableReducerJob</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;table,
                                        <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableReducer.html" title="class in org.apache.hadoop.hbase.mapreduce">TableReducer</a>&gt;&nbsp;reducer,
                                        org.apache.hadoop.mapreduce.Job&nbsp;job,
                                        <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&nbsp;partitioner,
@@ -1201,7 +1241,7 @@ public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/
 <ul class="blockList">
 <li class="blockList">
 <h4>limitNumReduceTasks</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.757">limitNumReduceTasks</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;table,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.767">limitNumReduceTasks</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;table,
                                        org.apache.hadoop.mapreduce.Job&nbsp;job)
                                 throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Ensures that the given number of reduce tasks for the given job
@@ -1221,7 +1261,7 @@ public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/
 <ul class="blockList">
 <li class="blockList">
 <h4>setNumReduceTasks</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.772">setNumReduceTasks</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;table,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.782">setNumReduceTasks</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;table,
                                      org.apache.hadoop.mapreduce.Job&nbsp;job)
                               throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Sets the number of reduce tasks for the given job configuration to the
@@ -1241,7 +1281,7 @@ public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/
 <ul class="blockList">
 <li class="blockList">
 <h4>setScannerCaching</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.785">setScannerCaching</a>(org.apache.hadoop.mapreduce.Job&nbsp;job,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.795">setScannerCaching</a>(org.apache.hadoop.mapreduce.Job&nbsp;job,
                                      int&nbsp;batchSize)</pre>
 <div class="block">Sets the number of rows to return and cache with each scanner iteration.
  Higher caching values will enable faster mapreduce jobs at the expense of
@@ -1260,7 +1300,7 @@ public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/
 <ul class="blockList">
 <li class="blockList">
 <h4>addHBaseDependencyJars</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.801">addHBaseDependencyJars</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.811">addHBaseDependencyJars</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)
                                    throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Add HBase and its dependencies (only) to the job configuration.
  <p>
@@ -1286,7 +1326,7 @@ public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/
 <ul class="blockList">
 <li class="blockList">
 <h4>buildDependencyClasspath</h4>
-<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.831">buildDependencyClasspath</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.841">buildDependencyClasspath</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <div class="block">Returns a classpath string built from the content of the "tmpjars" value in <code>conf</code>.
  Also exposed to shell scripts via `bin/hbase mapredcp`.</div>
 </li>
@@ -1297,7 +1337,7 @@ public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/
 <ul class="blockList">
 <li class="blockList">
 <h4>addDependencyJars</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.855">addDependencyJars</a>(org.apache.hadoop.mapreduce.Job&nbsp;job)
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.865">addDependencyJars</a>(org.apache.hadoop.mapreduce.Job&nbsp;job)
                               throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Add the HBase dependency jars as well as jars for any of the configured
  job classes to the job configuration, so that JobClient will ship them
@@ -1315,7 +1355,7 @@ public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/
 <li class="blockList">
 <h4>addDependencyJars</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.884">addDependencyJars</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.894">addDependencyJars</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                                                  <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;...&nbsp;classes)
                                           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">since 1.3.0 and will be removed in 3.0.0. Use <a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#addDependencyJars-org.apache.hadoop.mapreduce.Job-"><code>addDependencyJars(Job)</code></a>
@@ -1386,13 +1426,13 @@ public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/
 <ul class="subNavList">
 <li>Summary:&nbsp;</li>
 <li>Nested&nbsp;|&nbsp;</li>
-<li>Field&nbsp;|&nbsp;</li>
+<li><a href="#field.summary">Field</a>&nbsp;|&nbsp;</li>
 <li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
 <li><a href="#method.summary">Method</a></li>
 </ul>
 <ul class="subNavList">
 <li>Detail:&nbsp;</li>
-<li>Field&nbsp;|&nbsp;</li>
+<li><a href="#field.detail">Field</a>&nbsp;|&nbsp;</li>
 <li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
 <li><a href="#method.detail">Method</a></li>
 </ul>
diff --git a/apidocs/org/apache/hadoop/hbase/mapreduce/class-use/TableInputFormat.html b/apidocs/org/apache/hadoop/hbase/mapreduce/class-use/RoundRobinTableInputFormat.html
similarity index 80%
copy from apidocs/org/apache/hadoop/hbase/mapreduce/class-use/TableInputFormat.html
copy to apidocs/org/apache/hadoop/hbase/mapreduce/class-use/RoundRobinTableInputFormat.html
index fa25547..a8eb5f9 100644
--- a/apidocs/org/apache/hadoop/hbase/mapreduce/class-use/TableInputFormat.html
+++ b/apidocs/org/apache/hadoop/hbase/mapreduce/class-use/RoundRobinTableInputFormat.html
@@ -4,7 +4,7 @@
 <head>
 <!-- Generated by javadoc -->
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Uses of Class org.apache.hadoop.hbase.mapreduce.TableInputFormat (Apache HBase 3.0.0-SNAPSHOT API)</title>
+<title>Uses of Class org.apache.hadoop.hbase.mapreduce.RoundRobinTableInputFormat (Apache HBase 3.0.0-SNAPSHOT API)</title>
 <link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
 <script type="text/javascript" src="../../../../../../script.js"></script>
 </head>
@@ -12,7 +12,7 @@
 <script type="text/javascript"><!--
     try {
         if (location.href.indexOf('is-external=true') == -1) {
-            parent.document.title="Uses of Class org.apache.hadoop.hbase.mapreduce.TableInputFormat (Apache HBase 3.0.0-SNAPSHOT API)";
+            parent.document.title="Uses of Class org.apache.hadoop.hbase.mapreduce.RoundRobinTableInputFormat (Apache HBase 3.0.0-SNAPSHOT API)";
         }
     }
     catch(err) {
@@ -33,7 +33,7 @@
 <ul class="navList" title="Navigation">
 <li><a href="../../../../../../overview-summary.html">Overview</a></li>
 <li><a href="../package-summary.html">Package</a></li>
-<li><a href="../../../../../../org/apache/hadoop/hbase/mapreduce/TableInputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce">Class</a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/mapreduce/RoundRobinTableInputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce">Class</a></li>
 <li class="navBarCell1Rev">Use</li>
 <li><a href="../package-tree.html">Tree</a></li>
 <li><a href="../../../../../../deprecated-list.html">Deprecated</a></li>
@@ -47,8 +47,8 @@
 <li>Next</li>
 </ul>
 <ul class="navList">
-<li><a href="../../../../../../index.html?org/apache/hadoop/hbase/mapreduce/class-use/TableInputFormat.html" target="_top">Frames</a></li>
-<li><a href="TableInputFormat.html" target="_top">No&nbsp;Frames</a></li>
+<li><a href="../../../../../../index.html?org/apache/hadoop/hbase/mapreduce/class-use/RoundRobinTableInputFormat.html" target="_top">Frames</a></li>
+<li><a href="RoundRobinTableInputFormat.html" target="_top">No&nbsp;Frames</a></li>
 </ul>
 <ul class="navList" id="allclasses_navbar_top">
 <li><a href="../../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
@@ -70,9 +70,9 @@
 </a></div>
 <!-- ========= END OF TOP NAVBAR ========= -->
 <div class="header">
-<h2 title="Uses of Class org.apache.hadoop.hbase.mapreduce.TableInputFormat" class="title">Uses of Class<br>org.apache.hadoop.hbase.mapreduce.TableInputFormat</h2>
+<h2 title="Uses of Class org.apache.hadoop.hbase.mapreduce.RoundRobinTableInputFormat" class="title">Uses of Class<br>org.apache.hadoop.hbase.mapreduce.RoundRobinTableInputFormat</h2>
 </div>
-<div class="classUseContainer">No usage of org.apache.hadoop.hbase.mapreduce.TableInputFormat</div>
+<div class="classUseContainer">No usage of org.apache.hadoop.hbase.mapreduce.RoundRobinTableInputFormat</div>
 <!-- ======= START OF BOTTOM NAVBAR ====== -->
 <div class="bottomNav"><a name="navbar.bottom">
 <!--   -->
@@ -84,7 +84,7 @@
 <ul class="navList" title="Navigation">
 <li><a href="../../../../../../overview-summary.html">Overview</a></li>
 <li><a href="../package-summary.html">Package</a></li>
-<li><a href="../../../../../../org/apache/hadoop/hbase/mapreduce/TableInputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce">Class</a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/mapreduce/RoundRobinTableInputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce">Class</a></li>
 <li class="navBarCell1Rev">Use</li>
 <li><a href="../package-tree.html">Tree</a></li>
 <li><a href="../../../../../../deprecated-list.html">Deprecated</a></li>
@@ -98,8 +98,8 @@
 <li>Next</li>
 </ul>
 <ul class="navList">
-<li><a href="../../../../../../index.html?org/apache/hadoop/hbase/mapreduce/class-use/TableInputFormat.html" target="_top">Frames</a></li>
-<li><a href="TableInputFormat.html" target="_top">No&nbsp;Frames</a></li>
+<li><a href="../../../../../../index.html?org/apache/hadoop/hbase/mapreduce/class-use/RoundRobinTableInputFormat.html" target="_top">Frames</a></li>
+<li><a href="RoundRobinTableInputFormat.html" target="_top">No&nbsp;Frames</a></li>
 </ul>
 <ul class="navList" id="allclasses_navbar_bottom">
 <li><a href="../../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
diff --git a/apidocs/org/apache/hadoop/hbase/mapreduce/class-use/TableInputFormat.html b/apidocs/org/apache/hadoop/hbase/mapreduce/class-use/TableInputFormat.html
index fa25547..f888a3d 100644
--- a/apidocs/org/apache/hadoop/hbase/mapreduce/class-use/TableInputFormat.html
+++ b/apidocs/org/apache/hadoop/hbase/mapreduce/class-use/TableInputFormat.html
@@ -72,7 +72,53 @@
 <div class="header">
 <h2 title="Uses of Class org.apache.hadoop.hbase.mapreduce.TableInputFormat" class="title">Uses of Class<br>org.apache.hadoop.hbase.mapreduce.TableInputFormat</h2>
 </div>
-<div class="classUseContainer">No usage of org.apache.hadoop.hbase.mapreduce.TableInputFormat</div>
+<div class="classUseContainer">
+<ul class="blockList">
+<li class="blockList">
+<table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing packages, and an explanation">
+<caption><span>Packages that use <a href="../../../../../../org/apache/hadoop/hbase/mapreduce/TableInputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce">TableInputFormat</a></span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colFirst" scope="col">Package</th>
+<th class="colLast" scope="col">Description</th>
+</tr>
+<tbody>
+<tr class="altColor">
+<td class="colFirst"><a href="#org.apache.hadoop.hbase.mapreduce">org.apache.hadoop.hbase.mapreduce</a></td>
+<td class="colLast">
+<div class="block">Provides HBase <a href="https://cwiki.apache.org/confluence/display/HADOOP2/HadoopMapReduce">MapReduce</a>
+Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
+</td>
+</tr>
+</tbody>
+</table>
+</li>
+<li class="blockList">
+<ul class="blockList">
+<li class="blockList"><a name="org.apache.hadoop.hbase.mapreduce">
+<!--   -->
+</a>
+<h3>Uses of <a href="../../../../../../org/apache/hadoop/hbase/mapreduce/TableInputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce">TableInputFormat</a> in <a href="../../../../../../org/apache/hadoop/hbase/mapreduce/package-summary.html">org.apache.hadoop.hbase.mapreduce</a></h3>
+<table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing subclasses, and an explanation">
+<caption><span>Subclasses of <a href="../../../../../../org/apache/hadoop/hbase/mapreduce/TableInputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce">TableInputFormat</a> in <a href="../../../../../../org/apache/hadoop/hbase/mapreduce/package-summary.html">org.apache.hadoop.hbase.mapreduce</a></span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th class="colLast" scope="col">Class and Description</th>
+</tr>
+<tbody>
+<tr class="altColor">
+<td class="colFirst"><code>class&nbsp;</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/mapreduce/RoundRobinTableInputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce">RoundRobinTableInputFormat</a></span></code>
+<div class="block">Process the return from super-class <a href="../../../../../../org/apache/hadoop/hbase/mapreduce/TableInputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce"><code>TableInputFormat</code></a> (TIF) so as to undo any clumping of
+ <code>InputSplit</code>s around RegionServers.</div>
+</td>
+</tr>
+</tbody>
+</table>
+</li>
+</ul>
+</li>
+</ul>
+</div>
 <!-- ======= START OF BOTTOM NAVBAR ====== -->
 <div class="bottomNav"><a name="navbar.bottom">
 <!--   -->
diff --git a/apidocs/org/apache/hadoop/hbase/mapreduce/class-use/TableInputFormatBase.html b/apidocs/org/apache/hadoop/hbase/mapreduce/class-use/TableInputFormatBase.html
index 6b8b410..35e4943 100644
--- a/apidocs/org/apache/hadoop/hbase/mapreduce/class-use/TableInputFormatBase.html
+++ b/apidocs/org/apache/hadoop/hbase/mapreduce/class-use/TableInputFormatBase.html
@@ -107,6 +107,13 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 <tbody>
 <tr class="altColor">
 <td class="colFirst"><code>class&nbsp;</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/mapreduce/RoundRobinTableInputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce">RoundRobinTableInputFormat</a></span></code>
+<div class="block">Process the return from super-class <a href="../../../../../../org/apache/hadoop/hbase/mapreduce/TableInputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce"><code>TableInputFormat</code></a> (TIF) so as to undo any clumping of
+ <code>InputSplit</code>s around RegionServers.</div>
+</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/mapreduce/TableInputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce">TableInputFormat</a></span></code>
 <div class="block">Convert HBase tabular data into a format that is consumable by Map/Reduce.</div>
 </td>
diff --git a/apidocs/org/apache/hadoop/hbase/mapreduce/package-frame.html b/apidocs/org/apache/hadoop/hbase/mapreduce/package-frame.html
index 80b3a82..10c57b6 100644
--- a/apidocs/org/apache/hadoop/hbase/mapreduce/package-frame.html
+++ b/apidocs/org/apache/hadoop/hbase/mapreduce/package-frame.html
@@ -39,6 +39,7 @@
 <li><a href="PutCombiner.html" title="class in org.apache.hadoop.hbase.mapreduce" target="classFrame">PutCombiner</a></li>
 <li><a href="PutSortReducer.html" title="class in org.apache.hadoop.hbase.mapreduce" target="classFrame">PutSortReducer</a></li>
 <li><a href="ResultSerialization.html" title="class in org.apache.hadoop.hbase.mapreduce" target="classFrame">ResultSerialization</a></li>
+<li><a href="RoundRobinTableInputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce" target="classFrame">RoundRobinTableInputFormat</a></li>
 <li><a href="RowCounter.html" title="class in org.apache.hadoop.hbase.mapreduce" target="classFrame">RowCounter</a></li>
 <li><a href="SimpleTotalOrderPartitioner.html" title="class in org.apache.hadoop.hbase.mapreduce" target="classFrame">SimpleTotalOrderPartitioner</a></li>
 <li><a href="TableInputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce" target="classFrame">TableInputFormat</a></li>
diff --git a/apidocs/org/apache/hadoop/hbase/mapreduce/package-summary.html b/apidocs/org/apache/hadoop/hbase/mapreduce/package-summary.html
index 4fac331..4e70c96 100644
--- a/apidocs/org/apache/hadoop/hbase/mapreduce/package-summary.html
+++ b/apidocs/org/apache/hadoop/hbase/mapreduce/package-summary.html
@@ -249,113 +249,120 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="altColor">
+<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/mapreduce/RoundRobinTableInputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce">RoundRobinTableInputFormat</a></td>
+<td class="colLast">
+<div class="block">Process the return from super-class <a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableInputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce"><code>TableInputFormat</code></a> (TIF) so as to undo any clumping of
+ <code>InputSplit</code>s around RegionServers.</div>
+</td>
+</tr>
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/mapreduce/RowCounter.html" title="class in org.apache.hadoop.hbase.mapreduce">RowCounter</a></td>
 <td class="colLast">
 <div class="block">A job with a just a map phase to count rows.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/mapreduce/SimpleTotalOrderPartitioner.html" title="class in org.apache.hadoop.hbase.mapreduce">SimpleTotalOrderPartitioner</a>&lt;VALUE&gt;</td>
 <td class="colLast">
 <div class="block">A partitioner that takes start and end keys and uses bigdecimal to figure
  which reduce a key belongs to.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableInputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce">TableInputFormat</a></td>
 <td class="colLast">
 <div class="block">Convert HBase tabular data into a format that is consumable by Map/Reduce.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableInputFormatBase.html" title="class in org.apache.hadoop.hbase.mapreduce">TableInputFormatBase</a></td>
 <td class="colLast">
 <div class="block">A base for <a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableInputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce"><code>TableInputFormat</code></a>s.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableMapper.html" title="class in org.apache.hadoop.hbase.mapreduce">TableMapper</a>&lt;KEYOUT,VALUEOUT&gt;</td>
 <td class="colLast">
 <div class="block">Extends the base <code>Mapper</code> class to add the required input key
  and value classes.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html" title="class in org.apache.hadoop.hbase.mapreduce">TableMapReduceUtil</a></td>
 <td class="colLast">
 <div class="block">Utility for <a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableMapper.html" title="class in org.apache.hadoop.hbase.mapreduce"><code>TableMapper</code></a> and <a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableReducer.html" title="class in org.apache.hadoop.hbase.mapreduce"><code>TableReducer</code></a></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableOutputCommitter.html" title="class in org.apache.hadoop.hbase.mapreduce">TableOutputCommitter</a></td>
 <td class="colLast">
 <div class="block">Small committer class that does not do anything.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableOutputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce">TableOutputFormat</a>&lt;KEY&gt;</td>
 <td class="colLast">
 <div class="block">Convert Map/Reduce output and write it to an HBase table.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableRecordReader.html" title="class in org.apache.hadoop.hbase.mapreduce">TableRecordReader</a></td>
 <td class="colLast">
 <div class="block">Iterate over an HBase table data, return (ImmutableBytesWritable, Result)
  pairs.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableRecordReaderImpl.html" title="class in org.apache.hadoop.hbase.mapreduce">TableRecordReaderImpl</a></td>
 <td class="colLast">
 <div class="block">Iterate over an HBase table data, return (ImmutableBytesWritable, Result)
  pairs.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableReducer.html" title="class in org.apache.hadoop.hbase.mapreduce">TableReducer</a>&lt;KEYIN,VALUEIN,KEYOUT&gt;</td>
 <td class="colLast">
 <div class="block">Extends the basic <code>Reducer</code> class to add the required key and
  value input/output classes.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce">TableSnapshotInputFormat</a></td>
 <td class="colLast">
 <div class="block">TableSnapshotInputFormat allows a MapReduce job to run over a table snapshot.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableSplit.html" title="class in org.apache.hadoop.hbase.mapreduce">TableSplit</a></td>
 <td class="colLast">
 <div class="block">A table split corresponds to a key range (low, high) and an optional scanner.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/mapreduce/TextSortReducer.html" title="class in org.apache.hadoop.hbase.mapreduce">TextSortReducer</a></td>
 <td class="colLast">
 <div class="block">Emits Sorted KeyValues.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/mapreduce/TsvImporterMapper.html" title="class in org.apache.hadoop.hbase.mapreduce">TsvImporterMapper</a></td>
 <td class="colLast">
 <div class="block">Write table content out to files in hdfs.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/mapreduce/TsvImporterTextMapper.html" title="class in org.apache.hadoop.hbase.mapreduce">TsvImporterTextMapper</a></td>
 <td class="colLast">
 <div class="block">Write table content out to map output files.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/mapreduce/WALInputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce">WALInputFormat</a></td>
 <td class="colLast">
 <div class="block">Simple <code>InputFormat</code> for <code>WAL</code> files.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/mapreduce/WALPlayer.html" title="class in org.apache.hadoop.hbase.mapreduce">WALPlayer</a></td>
 <td class="colLast">
 <div class="block">A tool to replay WAL files as a M/R job.</div>
diff --git a/apidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html b/apidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
index 4ce76ec..1c5e626 100644
--- a/apidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
+++ b/apidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
@@ -108,7 +108,11 @@
 </li>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableInputFormatBase.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">TableInputFormatBase</span></a>
 <ul>
-<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableInputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">TableInputFormat</span></a> (implements org.apache.hadoop.conf.Configurable)</li>
+<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableInputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">TableInputFormat</span></a> (implements org.apache.hadoop.conf.Configurable)
+<ul>
+<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/RoundRobinTableInputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">RoundRobinTableInputFormat</span></a></li>
+</ul>
+</li>
 </ul>
 </li>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">TableSnapshotInputFormat</span></a>
diff --git a/apidocs/org/apache/hadoop/hbase/mapreduce/package-use.html b/apidocs/org/apache/hadoop/hbase/mapreduce/package-use.html
index 11a6ec0..b14fd2d 100644
--- a/apidocs/org/apache/hadoop/hbase/mapreduce/package-use.html
+++ b/apidocs/org/apache/hadoop/hbase/mapreduce/package-use.html
@@ -117,39 +117,44 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 </td>
 </tr>
 <tr class="rowColor">
+<td class="colOne"><a href="../../../../../org/apache/hadoop/hbase/mapreduce/class-use/TableInputFormat.html#org.apache.hadoop.hbase.mapreduce">TableInputFormat</a>
+<div class="block">Convert HBase tabular data into a format that is consumable by Map/Reduce.</div>
+</td>
+</tr>
+<tr class="altColor">
 <td class="colOne"><a href="../../../../../org/apache/hadoop/hbase/mapreduce/class-use/TableInputFormatBase.html#org.apache.hadoop.hbase.mapreduce">TableInputFormatBase</a>
 <div class="block">A base for <a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableInputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce"><code>TableInputFormat</code></a>s.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="../../../../../org/apache/hadoop/hbase/mapreduce/class-use/TableMapper.html#org.apache.hadoop.hbase.mapreduce">TableMapper</a>
 <div class="block">Extends the base <code>Mapper</code> class to add the required input key
  and value classes.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="../../../../../org/apache/hadoop/hbase/mapreduce/class-use/TableRecordReader.html#org.apache.hadoop.hbase.mapreduce">TableRecordReader</a>
 <div class="block">Iterate over an HBase table data, return (ImmutableBytesWritable, Result)
  pairs.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="../../../../../org/apache/hadoop/hbase/mapreduce/class-use/TableReducer.html#org.apache.hadoop.hbase.mapreduce">TableReducer</a>
 <div class="block">Extends the basic <code>Reducer</code> class to add the required key and
  value input/output classes.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="../../../../../org/apache/hadoop/hbase/mapreduce/class-use/TableSnapshotInputFormat.html#org.apache.hadoop.hbase.mapreduce">TableSnapshotInputFormat</a>
 <div class="block">TableSnapshotInputFormat allows a MapReduce job to run over a table snapshot.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colOne"><a href="../../../../../org/apache/hadoop/hbase/mapreduce/class-use/TableSplit.html#org.apache.hadoop.hbase.mapreduce">TableSplit</a>
 <div class="block">A table split corresponds to a key range (low, high) and an optional scanner.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colOne"><a href="../../../../../org/apache/hadoop/hbase/mapreduce/class-use/VisibilityExpressionResolver.html#org.apache.hadoop.hbase.mapreduce">VisibilityExpressionResolver</a>
 <div class="block">Interface to convert visibility expressions into Tags for storing along with Cells in HFiles.</div>
 </td>
diff --git a/apidocs/org/apache/hadoop/hbase/rest/client/Client.html b/apidocs/org/apache/hadoop/hbase/rest/client/Client.html
index 64ae06b..378f9f8 100644
--- a/apidocs/org/apache/hadoop/hbase/rest/client/Client.html
+++ b/apidocs/org/apache/hadoop/hbase/rest/client/Client.html
@@ -110,7 +110,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Public
-public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.70">Client</a>
+public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.72">Client</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
 <div class="block">A wrapper around HttpClient which provides some useful function and
  semantics for interacting with the REST gateway.</div>
@@ -483,7 +483,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>EMPTY_HEADER_ARRAY</h4>
-<pre>public static final&nbsp;org.apache.http.Header[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.71">EMPTY_HEADER_ARRAY</a></pre>
+<pre>public static final&nbsp;org.apache.http.Header[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.73">EMPTY_HEADER_ARRAY</a></pre>
 </li>
 </ul>
 </li>
@@ -500,7 +500,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>Client</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.90">Client</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.92">Client</a>()</pre>
 <div class="block">Default Constructor</div>
 </li>
 </ul>
@@ -510,7 +510,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>Client</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.129">Client</a>(<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Cluster.html" title="class in org.apache.hadoop.hbase.rest.client">Cluster</a>&nbsp;cluster)</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.131">Client</a>(<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Cluster.html" title="class in org.apache.hadoop.hbase.rest.client">Cluster</a>&nbsp;cluster)</pre>
 <div class="block">Constructor</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -524,7 +524,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>Client</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.138">Client</a>(<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Cluster.html" title="class in org.apache.hadoop.hbase.rest.client">Cluster</a>&nbsp;cluster,
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.140">Client</a>(<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Cluster.html" title="class in org.apache.hadoop.hbase.rest.client">Cluster</a>&nbsp;cluster,
               boolean&nbsp;sslEnabled)</pre>
 <div class="block">Constructor</div>
 <dl>
@@ -540,7 +540,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>Client</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.152">Client</a>(<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Cluster.html" title="class in org.apache.hadoop.hbase.rest.client">Cluster</a>&nbsp;cluster,
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.154">Client</a>(<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Cluster.html" title="class in org.apache.hadoop.hbase.rest.client">Cluster</a>&nbsp;cluster,
               <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;trustStorePath,
               <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html?is-external=true" title="class or interface in java.util">Optional</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;trustStorePassword,
               <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html?is-external=true" title="class or interface in java.util">Optional</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;trustStoreType)</pre>
@@ -570,7 +570,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>shutdown</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.176">shutdown</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.180">shutdown</a>()</pre>
 <div class="block">Shut down the client. Close any open persistent connections.</div>
 </li>
 </ul>
@@ -580,7 +580,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getHttpClient</h4>
-<pre>public&nbsp;org.apache.http.client.HttpClient&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.182">getHttpClient</a>()</pre>
+<pre>public&nbsp;org.apache.http.client.HttpClient&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.186">getHttpClient</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>the wrapped HttpClient</dd>
@@ -593,7 +593,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>addExtraHeader</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.191">addExtraHeader</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.195">addExtraHeader</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name,
                            <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;value)</pre>
 <div class="block">Add extra headers.  These extra headers will be applied to all http
  methods before they are removed. If any header is not used any more,
@@ -606,7 +606,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getExtraHeader</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.198">getExtraHeader</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name)</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.202">getExtraHeader</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name)</pre>
 <div class="block">Get an extra header value.</div>
 </li>
 </ul>
@@ -616,7 +616,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getExtraHeaders</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apa [...]
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apa [...]
 <div class="block">Get all extra headers (read-only).</div>
 </li>
 </ul>
@@ -626,7 +626,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>removeExtraHeader</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.212">removeExtraHeader</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.216">removeExtraHeader</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name)</pre>
 <div class="block">Remove an extra header.</div>
 </li>
 </ul>
@@ -636,7 +636,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>executePathOnly</h4>
-<pre>public&nbsp;org.apache.http.HttpResponse&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.229">executePathOnly</a>(<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Cluster.html" title="class in org.apache.hadoop.hbase.rest.client">Cluster</a>&nbsp;cluster,
+<pre>public&nbsp;org.apache.http.HttpResponse&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.233">executePathOnly</a>(<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Cluster.html" title="class in org.apache.hadoop.hbase.rest.client">Cluster</a>&nbsp;cluster,
                                                     org.apache.http.client.methods.HttpUriRequest&nbsp;method,
                                                     org.apache.http.Header[]&nbsp;headers,
                                                     <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;path)
@@ -665,7 +665,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>executeURI</h4>
-<pre>public&nbsp;org.apache.http.HttpResponse&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.284">executeURI</a>(org.apache.http.client.methods.HttpUriRequest&nbsp;method,
+<pre>public&nbsp;org.apache.http.HttpResponse&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.288">executeURI</a>(org.apache.http.client.methods.HttpUriRequest&nbsp;method,
                                                org.apache.http.Header[]&nbsp;headers,
                                                <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;uri)
                                         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -688,7 +688,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>execute</h4>
-<pre>public&nbsp;org.apache.http.HttpResponse&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.324">execute</a>(<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Cluster.html" title="class in org.apache.hadoop.hbase.rest.client">Cluster</a>&nbsp;cluster,
+<pre>public&nbsp;org.apache.http.HttpResponse&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.328">execute</a>(<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Cluster.html" title="class in org.apache.hadoop.hbase.rest.client">Cluster</a>&nbsp;cluster,
                                             org.apache.http.client.methods.HttpUriRequest&nbsp;method,
                                             org.apache.http.Header[]&nbsp;headers,
                                             <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;path)
@@ -715,7 +715,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getCluster</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Cluster.html" title="class in org.apache.hadoop.hbase.rest.client">Cluster</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.369">getCluster</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Cluster.html" title="class in org.apache.hadoop.hbase.rest.client">Cluster</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.373">getCluster</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>the cluster definition</dd>
@@ -728,7 +728,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setCluster</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.376">setCluster</a>(<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Cluster.html" title="class in org.apache.hadoop.hbase.rest.client">Cluster</a>&nbsp;cluster)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.380">setCluster</a>(<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Cluster.html" title="class in org.apache.hadoop.hbase.rest.client">Cluster</a>&nbsp;cluster)</pre>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
 <dd><code>cluster</code> - the cluster definition</dd>
@@ -741,7 +741,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>head</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Response.html" title="class in org.apache.hadoop.hbase.rest.client">Response</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.386">head</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;path)
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Response.html" title="class in org.apache.hadoop.hbase.rest.client">Response</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.390">head</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;path)
               throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Send a HEAD request</div>
 <dl>
@@ -760,7 +760,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>head</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Response.html" title="class in org.apache.hadoop.hbase.rest.client">Response</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.398">head</a>(<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Cluster.html" title="class in org.apache.hadoop.hbase.rest.client">Cluster</a>&nbsp;cluster,
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Response.html" title="class in org.apache.hadoop.hbase.rest.client">Response</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.402">head</a>(<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Cluster.html" title="class in org.apache.hadoop.hbase.rest.client">Cluster</a>&nbsp;cluster,
                      <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;path,
                      org.apache.http.Header[]&nbsp;headers)
               throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -783,7 +783,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>get</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Response.html" title="class in org.apache.hadoop.hbase.rest.client">Response</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.415">get</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;path)
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Response.html" title="class in org.apache.hadoop.hbase.rest.client">Response</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.419">get</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;path)
              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Send a GET request</div>
 <dl>
@@ -802,7 +802,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>get</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Response.html" title="class in org.apache.hadoop.hbase.rest.client">Response</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.426">get</a>(<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Cluster.html" title="class in org.apache.hadoop.hbase.rest.client">Cluster</a>&nbsp;cluster,
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Response.html" title="class in org.apache.hadoop.hbase.rest.client">Response</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.430">get</a>(<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Cluster.html" title="class in org.apache.hadoop.hbase.rest.client">Cluster</a>&nbsp;cluster,
                     <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;path)
              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Send a GET request</div>
@@ -823,7 +823,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>get</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Response.html" title="class in org.apache.hadoop.hbase.rest.client">Response</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.437">get</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;path,
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Response.html" title="class in org.apache.hadoop.hbase.rest.client">Response</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.441">get</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;path,
                     <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;accept)
              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Send a GET request</div>
@@ -844,7 +844,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>get</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Response.html" title="class in org.apache.hadoop.hbase.rest.client">Response</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.449">get</a>(<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Cluster.html" title="class in org.apache.hadoop.hbase.rest.client">Cluster</a>&nbsp;cluster,
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Response.html" title="class in org.apache.hadoop.hbase.rest.client">Response</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.453">get</a>(<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Cluster.html" title="class in org.apache.hadoop.hbase.rest.client">Cluster</a>&nbsp;cluster,
                     <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;path,
                     <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;accept)
              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -867,7 +867,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>get</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Response.html" title="class in org.apache.hadoop.hbase.rest.client">Response</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.464">get</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;path,
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Response.html" title="class in org.apache.hadoop.hbase.rest.client">Response</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.468">get</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;path,
                     org.apache.http.Header[]&nbsp;headers)
              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Send a GET request</div>
@@ -889,7 +889,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getResponseBody</h4>
-<pre>public static&nbsp;byte[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.484">getResponseBody</a>(org.apache.http.HttpResponse&nbsp;resp)
+<pre>public static&nbsp;byte[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.488">getResponseBody</a>(org.apache.http.HttpResponse&nbsp;resp)
                               throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Returns the response body of the HTTPResponse, if any, as an array of bytes.
  If response body is not available or cannot be read, returns <tt>null</tt>
@@ -915,7 +915,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>get</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Response.html" title="class in org.apache.hadoop.hbase.rest.client">Response</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.515">get</a>(<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Cluster.html" title="class in org.apache.hadoop.hbase.rest.client">Cluster</a>&nbsp;c,
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Response.html" title="class in org.apache.hadoop.hbase.rest.client">Response</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.519">get</a>(<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Cluster.html" title="class in org.apache.hadoop.hbase.rest.client">Cluster</a>&nbsp;c,
                     <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;path,
                     org.apache.http.Header[]&nbsp;headers)
              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -938,7 +938,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>put</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Response.html" title="class in org.apache.hadoop.hbase.rest.client">Response</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.534">put</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;path,
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Response.html" title="class in org.apache.hadoop.hbase.rest.client">Response</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.538">put</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;path,
                     <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;contentType,
                     byte[]&nbsp;content)
              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -961,7 +961,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>put</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Response.html" title="class in org.apache.hadoop.hbase.rest.client">Response</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.548">put</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;path,
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Response.html" title="class in org.apache.hadoop.hbase.rest.client">Response</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.552">put</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;path,
                     <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;contentType,
                     byte[]&nbsp;content,
                     org.apache.http.Header&nbsp;extraHdr)
@@ -986,7 +986,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>put</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Response.html" title="class in org.apache.hadoop.hbase.rest.client">Response</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.562">put</a>(<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Cluster.html" title="class in org.apache.hadoop.hbase.rest.client">Cluster</a>&nbsp;cluster,
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Response.html" title="class in org.apache.hadoop.hbase.rest.client">Response</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.566">put</a>(<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Cluster.html" title="class in org.apache.hadoop.hbase.rest.client">Cluster</a>&nbsp;cluster,
                     <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;path,
                     <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;contentType,
                     byte[]&nbsp;content)
@@ -1011,7 +1011,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>put</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Response.html" title="class in org.apache.hadoop.hbase.rest.client">Response</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.579">put</a>(<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Cluster.html" title="class in org.apache.hadoop.hbase.rest.client">Cluster</a>&nbsp;cluster,
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Response.html" title="class in org.apache.hadoop.hbase.rest.client">Response</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.583">put</a>(<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Cluster.html" title="class in org.apache.hadoop.hbase.rest.client">Cluster</a>&nbsp;cluster,
                     <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;path,
                     <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;contentType,
                     byte[]&nbsp;content,
@@ -1038,7 +1038,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>put</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Response.html" title="class in org.apache.hadoop.hbase.rest.client">Response</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.599">put</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;path,
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Response.html" title="class in org.apache.hadoop.hbase.rest.client">Response</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.603">put</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;path,
                     org.apache.http.Header[]&nbsp;headers,
                     byte[]&nbsp;content)
              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -1062,7 +1062,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>put</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Response.html" title="class in org.apache.hadoop.hbase.rest.client">Response</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.614">put</a>(<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Cluster.html" title="class in org.apache.hadoop.hbase.rest.client">Cluster</a>&nbsp;cluster,
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Response.html" title="class in org.apache.hadoop.hbase.rest.client">Response</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.618">put</a>(<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Cluster.html" title="class in org.apache.hadoop.hbase.rest.client">Cluster</a>&nbsp;cluster,
                     <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;path,
                     org.apache.http.Header[]&nbsp;headers,
                     byte[]&nbsp;content)
@@ -1088,7 +1088,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>post</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Response.html" title="class in org.apache.hadoop.hbase.rest.client">Response</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.636">post</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;path,
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Response.html" title="class in org.apache.hadoop.hbase.rest.client">Response</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.640">post</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;path,
                      <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;contentType,
                      byte[]&nbsp;content)
               throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -1111,7 +1111,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>post</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Response.html" title="class in org.apache.hadoop.hbase.rest.client">Response</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.650">post</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;path,
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Response.html" title="class in org.apache.hadoop.hbase.rest.client">Response</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.654">post</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;path,
                      <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;contentType,
                      byte[]&nbsp;content,
                      org.apache.http.Header&nbsp;extraHdr)
@@ -1136,7 +1136,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>post</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Response.html" title="class in org.apache.hadoop.hbase.rest.client">Response</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.664">post</a>(<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Cluster.html" title="class in org.apache.hadoop.hbase.rest.client">Cluster</a>&nbsp;cluster,
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Response.html" title="class in org.apache.hadoop.hbase.rest.client">Response</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.668">post</a>(<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Cluster.html" title="class in org.apache.hadoop.hbase.rest.client">Cluster</a>&nbsp;cluster,
                      <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;path,
                      <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;contentType,
                      byte[]&nbsp;content)
@@ -1161,7 +1161,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>post</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Response.html" title="class in org.apache.hadoop.hbase.rest.client">Response</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.681">post</a>(<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Cluster.html" title="class in org.apache.hadoop.hbase.rest.client">Cluster</a>&nbsp;cluster,
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Response.html" title="class in org.apache.hadoop.hbase.rest.client">Response</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.685">post</a>(<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Cluster.html" title="class in org.apache.hadoop.hbase.rest.client">Cluster</a>&nbsp;cluster,
                      <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;path,
                      <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;contentType,
                      byte[]&nbsp;content,
@@ -1188,7 +1188,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>post</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Response.html" title="class in org.apache.hadoop.hbase.rest.client">Response</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.701">post</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;path,
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Response.html" title="class in org.apache.hadoop.hbase.rest.client">Response</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.705">post</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;path,
                      org.apache.http.Header[]&nbsp;headers,
                      byte[]&nbsp;content)
               throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -1212,7 +1212,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>post</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Response.html" title="class in org.apache.hadoop.hbase.rest.client">Response</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.716">post</a>(<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Cluster.html" title="class in org.apache.hadoop.hbase.rest.client">Cluster</a>&nbsp;cluster,
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Response.html" title="class in org.apache.hadoop.hbase.rest.client">Response</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.720">post</a>(<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Cluster.html" title="class in org.apache.hadoop.hbase.rest.client">Cluster</a>&nbsp;cluster,
                      <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;path,
                      org.apache.http.Header[]&nbsp;headers,
                      byte[]&nbsp;content)
@@ -1238,7 +1238,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>delete</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Response.html" title="class in org.apache.hadoop.hbase.rest.client">Response</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.736">delete</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;path)
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Response.html" title="class in org.apache.hadoop.hbase.rest.client">Response</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.740">delete</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;path)
                 throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Send a DELETE request</div>
 <dl>
@@ -1257,7 +1257,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>delete</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Response.html" title="class in org.apache.hadoop.hbase.rest.client">Response</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.747">delete</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;path,
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Response.html" title="class in org.apache.hadoop.hbase.rest.client">Response</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.751">delete</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;path,
                        org.apache.http.Header&nbsp;extraHdr)
                 throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Send a DELETE request</div>
@@ -1278,7 +1278,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>delete</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Response.html" title="class in org.apache.hadoop.hbase.rest.client">Response</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.758">delete</a>(<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Cluster.html" title="class in org.apache.hadoop.hbase.rest.client">Cluster</a>&nbsp;cluster,
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Response.html" title="class in org.apache.hadoop.hbase.rest.client">Response</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.762">delete</a>(<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Cluster.html" title="class in org.apache.hadoop.hbase.rest.client">Cluster</a>&nbsp;cluster,
                        <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;path)
                 throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Send a DELETE request</div>
@@ -1299,7 +1299,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>delete</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Response.html" title="class in org.apache.hadoop.hbase.rest.client">Response</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.777">delete</a>(<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Cluster.html" title="class in org.apache.hadoop.hbase.rest.client">Cluster</a>&nbsp;cluster,
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Response.html" title="class in org.apache.hadoop.hbase.rest.client">Response</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/rest/client/Client.html#line.781">delete</a>(<a href="../../../../../../org/apache/hadoop/hbase/rest/client/Cluster.html" title="class in org.apache.hadoop.hbase.rest.client">Cluster</a>&nbsp;cluster,
                        <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;path,
                        org.apache.http.Header&nbsp;extraHdr)
                 throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
diff --git a/apidocs/overview-tree.html b/apidocs/overview-tree.html
index 20c8e15..785c7dc 100644
--- a/apidocs/overview-tree.html
+++ b/apidocs/overview-tree.html
@@ -319,7 +319,11 @@
 </li>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="org/apache/hadoop/hbase/mapreduce/TableInputFormatBase.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">TableInputFormatBase</span></a>
 <ul>
-<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="org/apache/hadoop/hbase/mapreduce/TableInputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">TableInputFormat</span></a> (implements org.apache.hadoop.conf.Configurable)</li>
+<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="org/apache/hadoop/hbase/mapreduce/TableInputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">TableInputFormat</span></a> (implements org.apache.hadoop.conf.Configurable)
+<ul>
+<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="org/apache/hadoop/hbase/mapreduce/RoundRobinTableInputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">RoundRobinTableInputFormat</span></a></li>
+</ul>
+</li>
 </ul>
 </li>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">TableSnapshotInputFormat</span></a>
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/CellUtil.html b/apidocs/src-html/org/apache/hadoop/hbase/CellUtil.html
index 78aa323..a1674e1 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/CellUtil.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/CellUtil.html
@@ -578,282 +578,286 @@
 <span class="sourceLineNo">570</span>        buf.length);<a name="line.570"></a>
 <span class="sourceLineNo">571</span>  }<a name="line.571"></a>
 <span class="sourceLineNo">572</span><a name="line.572"></a>
-<span class="sourceLineNo">573</span>  /**<a name="line.573"></a>
-<span class="sourceLineNo">574</span>   * @return True if a delete type, a {@link KeyValue.Type#Delete} or a<a name="line.574"></a>
-<span class="sourceLineNo">575</span>   *         {KeyValue.Type#DeleteFamily} or a<a name="line.575"></a>
-<span class="sourceLineNo">576</span>   *         {@link KeyValue.Type#DeleteColumn} KeyValue type.<a name="line.576"></a>
-<span class="sourceLineNo">577</span>   */<a name="line.577"></a>
-<span class="sourceLineNo">578</span>  @SuppressWarnings("deprecation")<a name="line.578"></a>
-<span class="sourceLineNo">579</span>  public static boolean isDelete(final Cell cell) {<a name="line.579"></a>
-<span class="sourceLineNo">580</span>    return PrivateCellUtil.isDelete(cell.getTypeByte());<a name="line.580"></a>
-<span class="sourceLineNo">581</span>  }<a name="line.581"></a>
-<span class="sourceLineNo">582</span><a name="line.582"></a>
-<span class="sourceLineNo">583</span>  /**<a name="line.583"></a>
-<span class="sourceLineNo">584</span>   * @return True if this cell is a Put.<a name="line.584"></a>
-<span class="sourceLineNo">585</span>   */<a name="line.585"></a>
-<span class="sourceLineNo">586</span>  @SuppressWarnings("deprecation")<a name="line.586"></a>
-<span class="sourceLineNo">587</span>  public static boolean isPut(Cell cell) {<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    return cell.getTypeByte() == Type.Put.getCode();<a name="line.588"></a>
-<span class="sourceLineNo">589</span>  }<a name="line.589"></a>
-<span class="sourceLineNo">590</span><a name="line.590"></a>
-<span class="sourceLineNo">591</span>  /**<a name="line.591"></a>
-<span class="sourceLineNo">592</span>   * Sets the given timestamp to the cell.<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   *<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   * Note that this method is a LimitedPrivate API and may change between minor releases.<a name="line.594"></a>
-<span class="sourceLineNo">595</span>   * @param cell<a name="line.595"></a>
-<span class="sourceLineNo">596</span>   * @param ts<a name="line.596"></a>
-<span class="sourceLineNo">597</span>   * @throws IOException when the passed cell is not of type {@link ExtendedCell}<a name="line.597"></a>
-<span class="sourceLineNo">598</span>   */<a name="line.598"></a>
-<span class="sourceLineNo">599</span>  @InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.COPROC)<a name="line.599"></a>
-<span class="sourceLineNo">600</span>  public static void setTimestamp(Cell cell, long ts) throws IOException {<a name="line.600"></a>
-<span class="sourceLineNo">601</span>    PrivateCellUtil.setTimestamp(cell, ts);<a name="line.601"></a>
-<span class="sourceLineNo">602</span>  }<a name="line.602"></a>
-<span class="sourceLineNo">603</span><a name="line.603"></a>
-<span class="sourceLineNo">604</span>  /**<a name="line.604"></a>
-<span class="sourceLineNo">605</span>   * Sets the given timestamp to the cell.<a name="line.605"></a>
-<span class="sourceLineNo">606</span>   *<a name="line.606"></a>
-<span class="sourceLineNo">607</span>   * Note that this method is a LimitedPrivate API and may change between minor releases.<a name="line.607"></a>
-<span class="sourceLineNo">608</span>   * @param cell<a name="line.608"></a>
-<span class="sourceLineNo">609</span>   * @param ts buffer containing the timestamp value<a name="line.609"></a>
-<span class="sourceLineNo">610</span>   * @param tsOffset offset to the new timestamp<a name="line.610"></a>
-<span class="sourceLineNo">611</span>   * @throws IOException when the passed cell is not of type {@link ExtendedCell}<a name="line.611"></a>
-<span class="sourceLineNo">612</span>   */<a name="line.612"></a>
-<span class="sourceLineNo">613</span>  @InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.COPROC)<a name="line.613"></a>
-<span class="sourceLineNo">614</span>  public static void setTimestamp(Cell cell, byte[] ts, int tsOffset) throws IOException {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    PrivateCellUtil.setTimestamp(cell, Bytes.toLong(ts, tsOffset));<a name="line.615"></a>
-<span class="sourceLineNo">616</span>  }<a name="line.616"></a>
-<span class="sourceLineNo">617</span><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * @return The Key portion of the passed &lt;code&gt;cell&lt;/code&gt; as a String.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   */<a name="line.620"></a>
-<span class="sourceLineNo">621</span>  public static String getCellKeyAsString(Cell cell) {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    return getCellKeyAsString(cell,<a name="line.622"></a>
-<span class="sourceLineNo">623</span>      c -&gt; Bytes.toStringBinary(c.getRowArray(), c.getRowOffset(), c.getRowLength()));<a name="line.623"></a>
-<span class="sourceLineNo">624</span>  }<a name="line.624"></a>
-<span class="sourceLineNo">625</span><a name="line.625"></a>
-<span class="sourceLineNo">626</span>  /**<a name="line.626"></a>
-<span class="sourceLineNo">627</span>   * @param cell the cell to convert<a name="line.627"></a>
-<span class="sourceLineNo">628</span>   * @param rowConverter used to convert the row of the cell to a string<a name="line.628"></a>
-<span class="sourceLineNo">629</span>   * @return The Key portion of the passed &lt;code&gt;cell&lt;/code&gt; as a String.<a name="line.629"></a>
-<span class="sourceLineNo">630</span>   */<a name="line.630"></a>
-<span class="sourceLineNo">631</span>  public static String getCellKeyAsString(Cell cell, Function&lt;Cell, String&gt; rowConverter) {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    StringBuilder sb = new StringBuilder(rowConverter.apply(cell));<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    sb.append('/');<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    sb.append(cell.getFamilyLength() == 0 ? "" :<a name="line.634"></a>
-<span class="sourceLineNo">635</span>      Bytes.toStringBinary(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength()));<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    // KeyValue only added ':' if family is non-null. Do same.<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    if (cell.getFamilyLength() &gt; 0) sb.append(':');<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    sb.append(cell.getQualifierLength() == 0 ? "" :<a name="line.638"></a>
-<span class="sourceLineNo">639</span>      Bytes.toStringBinary(cell.getQualifierArray(), cell.getQualifierOffset(),<a name="line.639"></a>
-<span class="sourceLineNo">640</span>        cell.getQualifierLength()));<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    sb.append('/');<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    sb.append(KeyValue.humanReadableTimestamp(cell.getTimestamp()));<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    sb.append('/');<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    sb.append(Type.codeToType(cell.getTypeByte()));<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    if (!(cell instanceof KeyValue.KeyOnlyKeyValue)) {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>      sb.append("/vlen=");<a name="line.646"></a>
-<span class="sourceLineNo">647</span>      sb.append(cell.getValueLength());<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    }<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    sb.append("/seqid=");<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    sb.append(cell.getSequenceId());<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    return sb.toString();<a name="line.651"></a>
-<span class="sourceLineNo">652</span>  }<a name="line.652"></a>
-<span class="sourceLineNo">653</span><a name="line.653"></a>
-<span class="sourceLineNo">654</span>  /** Returns a string representation of the cell */<a name="line.654"></a>
-<span class="sourceLineNo">655</span>  public static String toString(Cell cell, boolean verbose) {<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    if (cell == null) {<a name="line.656"></a>
-<span class="sourceLineNo">657</span>      return "";<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    }<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    StringBuilder builder = new StringBuilder();<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    String keyStr = getCellKeyAsString(cell);<a name="line.660"></a>
-<span class="sourceLineNo">661</span><a name="line.661"></a>
-<span class="sourceLineNo">662</span>    String tag = null;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    String value = null;<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    if (verbose) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      // TODO: pretty print tags as well<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      if (cell.getTagsLength() &gt; 0) {<a name="line.666"></a>
-<span class="sourceLineNo">667</span>        tag = Bytes.toStringBinary(cell.getTagsArray(), cell.getTagsOffset(), cell.getTagsLength());<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      }<a name="line.668"></a>
-<span class="sourceLineNo">669</span>      if (!(cell instanceof KeyValue.KeyOnlyKeyValue)) {<a name="line.669"></a>
-<span class="sourceLineNo">670</span>        value = Bytes.toStringBinary(cell.getValueArray(), cell.getValueOffset(),<a name="line.670"></a>
-<span class="sourceLineNo">671</span>          cell.getValueLength());<a name="line.671"></a>
+<span class="sourceLineNo">573</span>  public static boolean matchingTags(final Cell left, final Cell right) {<a name="line.573"></a>
+<span class="sourceLineNo">574</span>    return PrivateCellUtil.matchingTags(left, right, left.getTagsLength(), right.getTagsLength());<a name="line.574"></a>
+<span class="sourceLineNo">575</span>  }<a name="line.575"></a>
+<span class="sourceLineNo">576</span><a name="line.576"></a>
+<span class="sourceLineNo">577</span>  /**<a name="line.577"></a>
+<span class="sourceLineNo">578</span>   * @return True if a delete type, a {@link KeyValue.Type#Delete} or a<a name="line.578"></a>
+<span class="sourceLineNo">579</span>   *         {KeyValue.Type#DeleteFamily} or a<a name="line.579"></a>
+<span class="sourceLineNo">580</span>   *         {@link KeyValue.Type#DeleteColumn} KeyValue type.<a name="line.580"></a>
+<span class="sourceLineNo">581</span>   */<a name="line.581"></a>
+<span class="sourceLineNo">582</span>  @SuppressWarnings("deprecation")<a name="line.582"></a>
+<span class="sourceLineNo">583</span>  public static boolean isDelete(final Cell cell) {<a name="line.583"></a>
+<span class="sourceLineNo">584</span>    return PrivateCellUtil.isDelete(cell.getTypeByte());<a name="line.584"></a>
+<span class="sourceLineNo">585</span>  }<a name="line.585"></a>
+<span class="sourceLineNo">586</span><a name="line.586"></a>
+<span class="sourceLineNo">587</span>  /**<a name="line.587"></a>
+<span class="sourceLineNo">588</span>   * @return True if this cell is a Put.<a name="line.588"></a>
+<span class="sourceLineNo">589</span>   */<a name="line.589"></a>
+<span class="sourceLineNo">590</span>  @SuppressWarnings("deprecation")<a name="line.590"></a>
+<span class="sourceLineNo">591</span>  public static boolean isPut(Cell cell) {<a name="line.591"></a>
+<span class="sourceLineNo">592</span>    return cell.getTypeByte() == Type.Put.getCode();<a name="line.592"></a>
+<span class="sourceLineNo">593</span>  }<a name="line.593"></a>
+<span class="sourceLineNo">594</span><a name="line.594"></a>
+<span class="sourceLineNo">595</span>  /**<a name="line.595"></a>
+<span class="sourceLineNo">596</span>   * Sets the given timestamp to the cell.<a name="line.596"></a>
+<span class="sourceLineNo">597</span>   *<a name="line.597"></a>
+<span class="sourceLineNo">598</span>   * Note that this method is a LimitedPrivate API and may change between minor releases.<a name="line.598"></a>
+<span class="sourceLineNo">599</span>   * @param cell<a name="line.599"></a>
+<span class="sourceLineNo">600</span>   * @param ts<a name="line.600"></a>
+<span class="sourceLineNo">601</span>   * @throws IOException when the passed cell is not of type {@link ExtendedCell}<a name="line.601"></a>
+<span class="sourceLineNo">602</span>   */<a name="line.602"></a>
+<span class="sourceLineNo">603</span>  @InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.COPROC)<a name="line.603"></a>
+<span class="sourceLineNo">604</span>  public static void setTimestamp(Cell cell, long ts) throws IOException {<a name="line.604"></a>
+<span class="sourceLineNo">605</span>    PrivateCellUtil.setTimestamp(cell, ts);<a name="line.605"></a>
+<span class="sourceLineNo">606</span>  }<a name="line.606"></a>
+<span class="sourceLineNo">607</span><a name="line.607"></a>
+<span class="sourceLineNo">608</span>  /**<a name="line.608"></a>
+<span class="sourceLineNo">609</span>   * Sets the given timestamp to the cell.<a name="line.609"></a>
+<span class="sourceLineNo">610</span>   *<a name="line.610"></a>
+<span class="sourceLineNo">611</span>   * Note that this method is a LimitedPrivate API and may change between minor releases.<a name="line.611"></a>
+<span class="sourceLineNo">612</span>   * @param cell<a name="line.612"></a>
+<span class="sourceLineNo">613</span>   * @param ts buffer containing the timestamp value<a name="line.613"></a>
+<span class="sourceLineNo">614</span>   * @param tsOffset offset to the new timestamp<a name="line.614"></a>
+<span class="sourceLineNo">615</span>   * @throws IOException when the passed cell is not of type {@link ExtendedCell}<a name="line.615"></a>
+<span class="sourceLineNo">616</span>   */<a name="line.616"></a>
+<span class="sourceLineNo">617</span>  @InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.COPROC)<a name="line.617"></a>
+<span class="sourceLineNo">618</span>  public static void setTimestamp(Cell cell, byte[] ts, int tsOffset) throws IOException {<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    PrivateCellUtil.setTimestamp(cell, Bytes.toLong(ts, tsOffset));<a name="line.619"></a>
+<span class="sourceLineNo">620</span>  }<a name="line.620"></a>
+<span class="sourceLineNo">621</span><a name="line.621"></a>
+<span class="sourceLineNo">622</span>  /**<a name="line.622"></a>
+<span class="sourceLineNo">623</span>   * @return The Key portion of the passed &lt;code&gt;cell&lt;/code&gt; as a String.<a name="line.623"></a>
+<span class="sourceLineNo">624</span>   */<a name="line.624"></a>
+<span class="sourceLineNo">625</span>  public static String getCellKeyAsString(Cell cell) {<a name="line.625"></a>
+<span class="sourceLineNo">626</span>    return getCellKeyAsString(cell,<a name="line.626"></a>
+<span class="sourceLineNo">627</span>      c -&gt; Bytes.toStringBinary(c.getRowArray(), c.getRowOffset(), c.getRowLength()));<a name="line.627"></a>
+<span class="sourceLineNo">628</span>  }<a name="line.628"></a>
+<span class="sourceLineNo">629</span><a name="line.629"></a>
+<span class="sourceLineNo">630</span>  /**<a name="line.630"></a>
+<span class="sourceLineNo">631</span>   * @param cell the cell to convert<a name="line.631"></a>
+<span class="sourceLineNo">632</span>   * @param rowConverter used to convert the row of the cell to a string<a name="line.632"></a>
+<span class="sourceLineNo">633</span>   * @return The Key portion of the passed &lt;code&gt;cell&lt;/code&gt; as a String.<a name="line.633"></a>
+<span class="sourceLineNo">634</span>   */<a name="line.634"></a>
+<span class="sourceLineNo">635</span>  public static String getCellKeyAsString(Cell cell, Function&lt;Cell, String&gt; rowConverter) {<a name="line.635"></a>
+<span class="sourceLineNo">636</span>    StringBuilder sb = new StringBuilder(rowConverter.apply(cell));<a name="line.636"></a>
+<span class="sourceLineNo">637</span>    sb.append('/');<a name="line.637"></a>
+<span class="sourceLineNo">638</span>    sb.append(cell.getFamilyLength() == 0 ? "" :<a name="line.638"></a>
+<span class="sourceLineNo">639</span>      Bytes.toStringBinary(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength()));<a name="line.639"></a>
+<span class="sourceLineNo">640</span>    // KeyValue only added ':' if family is non-null. Do same.<a name="line.640"></a>
+<span class="sourceLineNo">641</span>    if (cell.getFamilyLength() &gt; 0) sb.append(':');<a name="line.641"></a>
+<span class="sourceLineNo">642</span>    sb.append(cell.getQualifierLength() == 0 ? "" :<a name="line.642"></a>
+<span class="sourceLineNo">643</span>      Bytes.toStringBinary(cell.getQualifierArray(), cell.getQualifierOffset(),<a name="line.643"></a>
+<span class="sourceLineNo">644</span>        cell.getQualifierLength()));<a name="line.644"></a>
+<span class="sourceLineNo">645</span>    sb.append('/');<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    sb.append(KeyValue.humanReadableTimestamp(cell.getTimestamp()));<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    sb.append('/');<a name="line.647"></a>
+<span class="sourceLineNo">648</span>    sb.append(Type.codeToType(cell.getTypeByte()));<a name="line.648"></a>
+<span class="sourceLineNo">649</span>    if (!(cell instanceof KeyValue.KeyOnlyKeyValue)) {<a name="line.649"></a>
+<span class="sourceLineNo">650</span>      sb.append("/vlen=");<a name="line.650"></a>
+<span class="sourceLineNo">651</span>      sb.append(cell.getValueLength());<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    }<a name="line.652"></a>
+<span class="sourceLineNo">653</span>    sb.append("/seqid=");<a name="line.653"></a>
+<span class="sourceLineNo">654</span>    sb.append(cell.getSequenceId());<a name="line.654"></a>
+<span class="sourceLineNo">655</span>    return sb.toString();<a name="line.655"></a>
+<span class="sourceLineNo">656</span>  }<a name="line.656"></a>
+<span class="sourceLineNo">657</span><a name="line.657"></a>
+<span class="sourceLineNo">658</span>  /** Returns a string representation of the cell */<a name="line.658"></a>
+<span class="sourceLineNo">659</span>  public static String toString(Cell cell, boolean verbose) {<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    if (cell == null) {<a name="line.660"></a>
+<span class="sourceLineNo">661</span>      return "";<a name="line.661"></a>
+<span class="sourceLineNo">662</span>    }<a name="line.662"></a>
+<span class="sourceLineNo">663</span>    StringBuilder builder = new StringBuilder();<a name="line.663"></a>
+<span class="sourceLineNo">664</span>    String keyStr = getCellKeyAsString(cell);<a name="line.664"></a>
+<span class="sourceLineNo">665</span><a name="line.665"></a>
+<span class="sourceLineNo">666</span>    String tag = null;<a name="line.666"></a>
+<span class="sourceLineNo">667</span>    String value = null;<a name="line.667"></a>
+<span class="sourceLineNo">668</span>    if (verbose) {<a name="line.668"></a>
+<span class="sourceLineNo">669</span>      // TODO: pretty print tags as well<a name="line.669"></a>
+<span class="sourceLineNo">670</span>      if (cell.getTagsLength() &gt; 0) {<a name="line.670"></a>
+<span class="sourceLineNo">671</span>        tag = Bytes.toStringBinary(cell.getTagsArray(), cell.getTagsOffset(), cell.getTagsLength());<a name="line.671"></a>
 <span class="sourceLineNo">672</span>      }<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    }<a name="line.673"></a>
-<span class="sourceLineNo">674</span><a name="line.674"></a>
-<span class="sourceLineNo">675</span>    builder.append(keyStr);<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    if (tag != null &amp;&amp; !tag.isEmpty()) {<a name="line.676"></a>
-<span class="sourceLineNo">677</span>      builder.append("/").append(tag);<a name="line.677"></a>
-<span class="sourceLineNo">678</span>    }<a name="line.678"></a>
-<span class="sourceLineNo">679</span>    if (value != null) {<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      builder.append("/").append(value);<a name="line.680"></a>
-<span class="sourceLineNo">681</span>    }<a name="line.681"></a>
-<span class="sourceLineNo">682</span><a name="line.682"></a>
-<span class="sourceLineNo">683</span>    return builder.toString();<a name="line.683"></a>
-<span class="sourceLineNo">684</span>  }<a name="line.684"></a>
-<span class="sourceLineNo">685</span><a name="line.685"></a>
-<span class="sourceLineNo">686</span>  /**************** equals ****************************/<a name="line.686"></a>
-<span class="sourceLineNo">687</span><a name="line.687"></a>
-<span class="sourceLineNo">688</span>  public static boolean equals(Cell a, Cell b) {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>    return matchingRows(a, b) &amp;&amp; matchingFamily(a, b) &amp;&amp; matchingQualifier(a, b)<a name="line.689"></a>
-<span class="sourceLineNo">690</span>        &amp;&amp; matchingTimestamp(a, b) &amp;&amp; PrivateCellUtil.matchingType(a, b);<a name="line.690"></a>
-<span class="sourceLineNo">691</span>  }<a name="line.691"></a>
-<span class="sourceLineNo">692</span><a name="line.692"></a>
-<span class="sourceLineNo">693</span>  public static boolean matchingTimestamp(Cell a, Cell b) {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    return CellComparator.getInstance().compareTimestamps(a.getTimestamp(), b.getTimestamp()) == 0;<a name="line.694"></a>
+<span class="sourceLineNo">673</span>      if (!(cell instanceof KeyValue.KeyOnlyKeyValue)) {<a name="line.673"></a>
+<span class="sourceLineNo">674</span>        value = Bytes.toStringBinary(cell.getValueArray(), cell.getValueOffset(),<a name="line.674"></a>
+<span class="sourceLineNo">675</span>          cell.getValueLength());<a name="line.675"></a>
+<span class="sourceLineNo">676</span>      }<a name="line.676"></a>
+<span class="sourceLineNo">677</span>    }<a name="line.677"></a>
+<span class="sourceLineNo">678</span><a name="line.678"></a>
+<span class="sourceLineNo">679</span>    builder.append(keyStr);<a name="line.679"></a>
+<span class="sourceLineNo">680</span>    if (tag != null &amp;&amp; !tag.isEmpty()) {<a name="line.680"></a>
+<span class="sourceLineNo">681</span>      builder.append("/").append(tag);<a name="line.681"></a>
+<span class="sourceLineNo">682</span>    }<a name="line.682"></a>
+<span class="sourceLineNo">683</span>    if (value != null) {<a name="line.683"></a>
+<span class="sourceLineNo">684</span>      builder.append("/").append(value);<a name="line.684"></a>
+<span class="sourceLineNo">685</span>    }<a name="line.685"></a>
+<span class="sourceLineNo">686</span><a name="line.686"></a>
+<span class="sourceLineNo">687</span>    return builder.toString();<a name="line.687"></a>
+<span class="sourceLineNo">688</span>  }<a name="line.688"></a>
+<span class="sourceLineNo">689</span><a name="line.689"></a>
+<span class="sourceLineNo">690</span>  /**************** equals ****************************/<a name="line.690"></a>
+<span class="sourceLineNo">691</span><a name="line.691"></a>
+<span class="sourceLineNo">692</span>  public static boolean equals(Cell a, Cell b) {<a name="line.692"></a>
+<span class="sourceLineNo">693</span>    return matchingRows(a, b) &amp;&amp; matchingFamily(a, b) &amp;&amp; matchingQualifier(a, b)<a name="line.693"></a>
+<span class="sourceLineNo">694</span>        &amp;&amp; matchingTimestamp(a, b) &amp;&amp; PrivateCellUtil.matchingType(a, b);<a name="line.694"></a>
 <span class="sourceLineNo">695</span>  }<a name="line.695"></a>
 <span class="sourceLineNo">696</span><a name="line.696"></a>
-<span class="sourceLineNo">697</span>  /**<a name="line.697"></a>
-<span class="sourceLineNo">698</span>   * Compares the row of two keyvalues for equality<a name="line.698"></a>
-<span class="sourceLineNo">699</span>   * @param left<a name="line.699"></a>
-<span class="sourceLineNo">700</span>   * @param right<a name="line.700"></a>
-<span class="sourceLineNo">701</span>   * @return True if rows match.<a name="line.701"></a>
-<span class="sourceLineNo">702</span>   */<a name="line.702"></a>
-<span class="sourceLineNo">703</span>  public static boolean matchingRows(final Cell left, final Cell right) {<a name="line.703"></a>
-<span class="sourceLineNo">704</span>    short lrowlength = left.getRowLength();<a name="line.704"></a>
-<span class="sourceLineNo">705</span>    short rrowlength = right.getRowLength();<a name="line.705"></a>
-<span class="sourceLineNo">706</span>    return matchingRows(left, lrowlength, right, rrowlength);<a name="line.706"></a>
-<span class="sourceLineNo">707</span>  }<a name="line.707"></a>
-<span class="sourceLineNo">708</span><a name="line.708"></a>
-<span class="sourceLineNo">709</span>  public static boolean matchingRows(final Cell left, final short lrowlength, final Cell right,<a name="line.709"></a>
-<span class="sourceLineNo">710</span>      final short rrowlength) {<a name="line.710"></a>
-<span class="sourceLineNo">711</span>    if (lrowlength != rrowlength) return false;<a name="line.711"></a>
-<span class="sourceLineNo">712</span>    if (left instanceof ByteBufferExtendedCell &amp;&amp; right instanceof ByteBufferExtendedCell) {<a name="line.712"></a>
-<span class="sourceLineNo">713</span>      return ByteBufferUtils.equals(((ByteBufferExtendedCell) left).getRowByteBuffer(),<a name="line.713"></a>
-<span class="sourceLineNo">714</span>          ((ByteBufferExtendedCell) left).getRowPosition(), lrowlength,<a name="line.714"></a>
-<span class="sourceLineNo">715</span>          ((ByteBufferExtendedCell) right).getRowByteBuffer(),<a name="line.715"></a>
-<span class="sourceLineNo">716</span>          ((ByteBufferExtendedCell) right).getRowPosition(), rrowlength);<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    }<a name="line.717"></a>
-<span class="sourceLineNo">718</span>    if (left instanceof ByteBufferExtendedCell) {<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      return ByteBufferUtils.equals(((ByteBufferExtendedCell) left).getRowByteBuffer(),<a name="line.719"></a>
-<span class="sourceLineNo">720</span>          ((ByteBufferExtendedCell) left).getRowPosition(), lrowlength, right.getRowArray(),<a name="line.720"></a>
-<span class="sourceLineNo">721</span>          right.getRowOffset(), rrowlength);<a name="line.721"></a>
-<span class="sourceLineNo">722</span>    }<a name="line.722"></a>
-<span class="sourceLineNo">723</span>    if (right instanceof ByteBufferExtendedCell) {<a name="line.723"></a>
-<span class="sourceLineNo">724</span>      return ByteBufferUtils.equals(((ByteBufferExtendedCell) right).getRowByteBuffer(),<a name="line.724"></a>
-<span class="sourceLineNo">725</span>          ((ByteBufferExtendedCell) right).getRowPosition(), rrowlength, left.getRowArray(),<a name="line.725"></a>
-<span class="sourceLineNo">726</span>          left.getRowOffset(), lrowlength);<a name="line.726"></a>
-<span class="sourceLineNo">727</span>    }<a name="line.727"></a>
-<span class="sourceLineNo">728</span>    return Bytes.equals(left.getRowArray(), left.getRowOffset(), lrowlength, right.getRowArray(),<a name="line.728"></a>
-<span class="sourceLineNo">729</span>        right.getRowOffset(), rrowlength);<a name="line.729"></a>
-<span class="sourceLineNo">730</span>  }<a name="line.730"></a>
-<span class="sourceLineNo">731</span><a name="line.731"></a>
-<span class="sourceLineNo">732</span>  /**<a name="line.732"></a>
-<span class="sourceLineNo">733</span>   * Compares the row and column of two keyvalues for equality<a name="line.733"></a>
-<span class="sourceLineNo">734</span>   * @param left<a name="line.734"></a>
-<span class="sourceLineNo">735</span>   * @param right<a name="line.735"></a>
-<span class="sourceLineNo">736</span>   * @return True if same row and column.<a name="line.736"></a>
-<span class="sourceLineNo">737</span>   */<a name="line.737"></a>
-<span class="sourceLineNo">738</span>  public static boolean matchingRowColumn(final Cell left, final Cell right) {<a name="line.738"></a>
-<span class="sourceLineNo">739</span>    short lrowlength = left.getRowLength();<a name="line.739"></a>
-<span class="sourceLineNo">740</span>    short rrowlength = right.getRowLength();<a name="line.740"></a>
-<span class="sourceLineNo">741</span>    // match length<a name="line.741"></a>
-<span class="sourceLineNo">742</span>    if (lrowlength != rrowlength) {<a name="line.742"></a>
-<span class="sourceLineNo">743</span>      return false;<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    }<a name="line.744"></a>
-<span class="sourceLineNo">745</span><a name="line.745"></a>
-<span class="sourceLineNo">746</span>    byte lfamlength = left.getFamilyLength();<a name="line.746"></a>
-<span class="sourceLineNo">747</span>    byte rfamlength = right.getFamilyLength();<a name="line.747"></a>
-<span class="sourceLineNo">748</span>    if (lfamlength != rfamlength) {<a name="line.748"></a>
-<span class="sourceLineNo">749</span>      return false;<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
-<span class="sourceLineNo">751</span><a name="line.751"></a>
-<span class="sourceLineNo">752</span>    int lqlength = left.getQualifierLength();<a name="line.752"></a>
-<span class="sourceLineNo">753</span>    int rqlength = right.getQualifierLength();<a name="line.753"></a>
-<span class="sourceLineNo">754</span>    if (lqlength != rqlength) {<a name="line.754"></a>
-<span class="sourceLineNo">755</span>      return false;<a name="line.755"></a>
-<span class="sourceLineNo">756</span>    }<a name="line.756"></a>
-<span class="sourceLineNo">757</span><a name="line.757"></a>
-<span class="sourceLineNo">758</span>    if (!matchingRows(left, lrowlength, right, rrowlength)) {<a name="line.758"></a>
+<span class="sourceLineNo">697</span>  public static boolean matchingTimestamp(Cell a, Cell b) {<a name="line.697"></a>
+<span class="sourceLineNo">698</span>    return CellComparator.getInstance().compareTimestamps(a.getTimestamp(), b.getTimestamp()) == 0;<a name="line.698"></a>
+<span class="sourceLineNo">699</span>  }<a name="line.699"></a>
+<span class="sourceLineNo">700</span><a name="line.700"></a>
+<span class="sourceLineNo">701</span>  /**<a name="line.701"></a>
+<span class="sourceLineNo">702</span>   * Compares the row of two keyvalues for equality<a name="line.702"></a>
+<span class="sourceLineNo">703</span>   * @param left<a name="line.703"></a>
+<span class="sourceLineNo">704</span>   * @param right<a name="line.704"></a>
+<span class="sourceLineNo">705</span>   * @return True if rows match.<a name="line.705"></a>
+<span class="sourceLineNo">706</span>   */<a name="line.706"></a>
+<span class="sourceLineNo">707</span>  public static boolean matchingRows(final Cell left, final Cell right) {<a name="line.707"></a>
+<span class="sourceLineNo">708</span>    short lrowlength = left.getRowLength();<a name="line.708"></a>
+<span class="sourceLineNo">709</span>    short rrowlength = right.getRowLength();<a name="line.709"></a>
+<span class="sourceLineNo">710</span>    return matchingRows(left, lrowlength, right, rrowlength);<a name="line.710"></a>
+<span class="sourceLineNo">711</span>  }<a name="line.711"></a>
+<span class="sourceLineNo">712</span><a name="line.712"></a>
+<span class="sourceLineNo">713</span>  public static boolean matchingRows(final Cell left, final short lrowlength, final Cell right,<a name="line.713"></a>
+<span class="sourceLineNo">714</span>      final short rrowlength) {<a name="line.714"></a>
+<span class="sourceLineNo">715</span>    if (lrowlength != rrowlength) return false;<a name="line.715"></a>
+<span class="sourceLineNo">716</span>    if (left instanceof ByteBufferExtendedCell &amp;&amp; right instanceof ByteBufferExtendedCell) {<a name="line.716"></a>
+<span class="sourceLineNo">717</span>      return ByteBufferUtils.equals(((ByteBufferExtendedCell) left).getRowByteBuffer(),<a name="line.717"></a>
+<span class="sourceLineNo">718</span>          ((ByteBufferExtendedCell) left).getRowPosition(), lrowlength,<a name="line.718"></a>
+<span class="sourceLineNo">719</span>          ((ByteBufferExtendedCell) right).getRowByteBuffer(),<a name="line.719"></a>
+<span class="sourceLineNo">720</span>          ((ByteBufferExtendedCell) right).getRowPosition(), rrowlength);<a name="line.720"></a>
+<span class="sourceLineNo">721</span>    }<a name="line.721"></a>
+<span class="sourceLineNo">722</span>    if (left instanceof ByteBufferExtendedCell) {<a name="line.722"></a>
+<span class="sourceLineNo">723</span>      return ByteBufferUtils.equals(((ByteBufferExtendedCell) left).getRowByteBuffer(),<a name="line.723"></a>
+<span class="sourceLineNo">724</span>          ((ByteBufferExtendedCell) left).getRowPosition(), lrowlength, right.getRowArray(),<a name="line.724"></a>
+<span class="sourceLineNo">725</span>          right.getRowOffset(), rrowlength);<a name="line.725"></a>
+<span class="sourceLineNo">726</span>    }<a name="line.726"></a>
+<span class="sourceLineNo">727</span>    if (right instanceof ByteBufferExtendedCell) {<a name="line.727"></a>
+<span class="sourceLineNo">728</span>      return ByteBufferUtils.equals(((ByteBufferExtendedCell) right).getRowByteBuffer(),<a name="line.728"></a>
+<span class="sourceLineNo">729</span>          ((ByteBufferExtendedCell) right).getRowPosition(), rrowlength, left.getRowArray(),<a name="line.729"></a>
+<span class="sourceLineNo">730</span>          left.getRowOffset(), lrowlength);<a name="line.730"></a>
+<span class="sourceLineNo">731</span>    }<a name="line.731"></a>
+<span class="sourceLineNo">732</span>    return Bytes.equals(left.getRowArray(), left.getRowOffset(), lrowlength, right.getRowArray(),<a name="line.732"></a>
+<span class="sourceLineNo">733</span>        right.getRowOffset(), rrowlength);<a name="line.733"></a>
+<span class="sourceLineNo">734</span>  }<a name="line.734"></a>
+<span class="sourceLineNo">735</span><a name="line.735"></a>
+<span class="sourceLineNo">736</span>  /**<a name="line.736"></a>
+<span class="sourceLineNo">737</span>   * Compares the row and column of two keyvalues for equality<a name="line.737"></a>
+<span class="sourceLineNo">738</span>   * @param left<a name="line.738"></a>
+<span class="sourceLineNo">739</span>   * @param right<a name="line.739"></a>
+<span class="sourceLineNo">740</span>   * @return True if same row and column.<a name="line.740"></a>
+<span class="sourceLineNo">741</span>   */<a name="line.741"></a>
+<span class="sourceLineNo">742</span>  public static boolean matchingRowColumn(final Cell left, final Cell right) {<a name="line.742"></a>
+<span class="sourceLineNo">743</span>    short lrowlength = left.getRowLength();<a name="line.743"></a>
+<span class="sourceLineNo">744</span>    short rrowlength = right.getRowLength();<a name="line.744"></a>
+<span class="sourceLineNo">745</span>    // match length<a name="line.745"></a>
+<span class="sourceLineNo">746</span>    if (lrowlength != rrowlength) {<a name="line.746"></a>
+<span class="sourceLineNo">747</span>      return false;<a name="line.747"></a>
+<span class="sourceLineNo">748</span>    }<a name="line.748"></a>
+<span class="sourceLineNo">749</span><a name="line.749"></a>
+<span class="sourceLineNo">750</span>    byte lfamlength = left.getFamilyLength();<a name="line.750"></a>
+<span class="sourceLineNo">751</span>    byte rfamlength = right.getFamilyLength();<a name="line.751"></a>
+<span class="sourceLineNo">752</span>    if (lfamlength != rfamlength) {<a name="line.752"></a>
+<span class="sourceLineNo">753</span>      return false;<a name="line.753"></a>
+<span class="sourceLineNo">754</span>    }<a name="line.754"></a>
+<span class="sourceLineNo">755</span><a name="line.755"></a>
+<span class="sourceLineNo">756</span>    int lqlength = left.getQualifierLength();<a name="line.756"></a>
+<span class="sourceLineNo">757</span>    int rqlength = right.getQualifierLength();<a name="line.757"></a>
+<span class="sourceLineNo">758</span>    if (lqlength != rqlength) {<a name="line.758"></a>
 <span class="sourceLineNo">759</span>      return false;<a name="line.759"></a>
 <span class="sourceLineNo">760</span>    }<a name="line.760"></a>
-<span class="sourceLineNo">761</span>    return matchingColumn(left, lfamlength, lqlength, right, rfamlength, rqlength);<a name="line.761"></a>
-<span class="sourceLineNo">762</span>  }<a name="line.762"></a>
-<span class="sourceLineNo">763</span><a name="line.763"></a>
-<span class="sourceLineNo">764</span>  public static boolean matchingRowColumnBytes(final Cell left, final Cell right) {<a name="line.764"></a>
-<span class="sourceLineNo">765</span>    int lrowlength = left.getRowLength();<a name="line.765"></a>
-<span class="sourceLineNo">766</span>    int rrowlength = right.getRowLength();<a name="line.766"></a>
-<span class="sourceLineNo">767</span>    int lfamlength = left.getFamilyLength();<a name="line.767"></a>
-<span class="sourceLineNo">768</span>    int rfamlength = right.getFamilyLength();<a name="line.768"></a>
-<span class="sourceLineNo">769</span>    int lqlength = left.getQualifierLength();<a name="line.769"></a>
-<span class="sourceLineNo">770</span>    int rqlength = right.getQualifierLength();<a name="line.770"></a>
-<span class="sourceLineNo">771</span><a name="line.771"></a>
-<span class="sourceLineNo">772</span>    // match length<a name="line.772"></a>
-<span class="sourceLineNo">773</span>    if ((lrowlength != rrowlength) || (lfamlength != rfamlength) || (lqlength != rqlength)) {<a name="line.773"></a>
-<span class="sourceLineNo">774</span>      return false;<a name="line.774"></a>
-<span class="sourceLineNo">775</span>    }<a name="line.775"></a>
-<span class="sourceLineNo">776</span><a name="line.776"></a>
-<span class="sourceLineNo">777</span>    // match row<a name="line.777"></a>
-<span class="sourceLineNo">778</span>    if (!Bytes.equals(left.getRowArray(), left.getRowOffset(), lrowlength, right.getRowArray(),<a name="line.778"></a>
-<span class="sourceLineNo">779</span>        right.getRowOffset(), rrowlength)) {<a name="line.779"></a>
-<span class="sourceLineNo">780</span>      return false;<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    }<a name="line.781"></a>
-<span class="sourceLineNo">782</span>    //match family<a name="line.782"></a>
-<span class="sourceLineNo">783</span>    if (!Bytes.equals(left.getFamilyArray(), left.getFamilyOffset(), lfamlength,<a name="line.783"></a>
-<span class="sourceLineNo">784</span>        right.getFamilyArray(), right.getFamilyOffset(), rfamlength)) {<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      return false;<a name="line.785"></a>
-<span class="sourceLineNo">786</span>    }<a name="line.786"></a>
-<span class="sourceLineNo">787</span>    //match qualifier<a name="line.787"></a>
-<span class="sourceLineNo">788</span>    return Bytes.equals(left.getQualifierArray(), left.getQualifierOffset(),<a name="line.788"></a>
-<span class="sourceLineNo">789</span>        lqlength, right.getQualifierArray(), right.getQualifierOffset(),<a name="line.789"></a>
-<span class="sourceLineNo">790</span>        rqlength);<a name="line.790"></a>
-<span class="sourceLineNo">791</span>  }<a name="line.791"></a>
-<span class="sourceLineNo">792</span><a name="line.792"></a>
-<span class="sourceLineNo">793</span>  /**<a name="line.793"></a>
-<span class="sourceLineNo">794</span>   * Compares the cell's qualifier with the given byte[]<a name="line.794"></a>
-<span class="sourceLineNo">795</span>   * @param left the cell for which the qualifier has to be compared<a name="line.795"></a>
-<span class="sourceLineNo">796</span>   * @param right the byte[] having the qualifier<a name="line.796"></a>
-<span class="sourceLineNo">797</span>   * @param rOffset the offset of the qualifier<a name="line.797"></a>
-<span class="sourceLineNo">798</span>   * @param rLength the length of the qualifier<a name="line.798"></a>
-<span class="sourceLineNo">799</span>   * @return greater than 0 if left cell's qualifier is bigger than byte[], lesser than 0 if left<a name="line.799"></a>
-<span class="sourceLineNo">800</span>   *         cell's qualifier is lesser than byte[] and 0 otherwise<a name="line.800"></a>
-<span class="sourceLineNo">801</span>   */<a name="line.801"></a>
-<span class="sourceLineNo">802</span>  public final static int compareQualifiers(Cell left, byte[] right, int rOffset, int rLength) {<a name="line.802"></a>
-<span class="sourceLineNo">803</span>    if (left instanceof ByteBufferExtendedCell) {<a name="line.803"></a>
-<span class="sourceLineNo">804</span>      return ByteBufferUtils.compareTo(((ByteBufferExtendedCell) left).getQualifierByteBuffer(),<a name="line.804"></a>
-<span class="sourceLineNo">805</span>          ((ByteBufferExtendedCell) left).getQualifierPosition(),<a name="line.805"></a>
-<span class="sourceLineNo">806</span>          left.getQualifierLength(), right, rOffset, rLength);<a name="line.806"></a>
-<span class="sourceLineNo">807</span>    }<a name="line.807"></a>
-<span class="sourceLineNo">808</span>    return Bytes.compareTo(left.getQualifierArray(), left.getQualifierOffset(),<a name="line.808"></a>
-<span class="sourceLineNo">809</span>      left.getQualifierLength(), right, rOffset, rLength);<a name="line.809"></a>
-<span class="sourceLineNo">810</span>  }<a name="line.810"></a>
-<span class="sourceLineNo">811</span><a name="line.811"></a>
-<span class="sourceLineNo">812</span>  /**<a name="line.812"></a>
-<span class="sourceLineNo">813</span>   * Compares the cell's family with the given byte[]<a name="line.813"></a>
-<span class="sourceLineNo">814</span>   * @param left the cell for which the family has to be compared<a name="line.814"></a>
-<span class="sourceLineNo">815</span>   * @param right the byte[] having the family<a name="line.815"></a>
-<span class="sourceLineNo">816</span>   * @param roffset the offset of the family<a name="line.816"></a>
-<span class="sourceLineNo">817</span>   * @param rlength the length of the family<a name="line.817"></a>
-<span class="sourceLineNo">818</span>   * @return greater than 0 if left cell's family is bigger than byte[], lesser than 0 if left<a name="line.818"></a>
-<span class="sourceLineNo">819</span>   *         cell's family is lesser than byte[] and 0 otherwise<a name="line.819"></a>
-<span class="sourceLineNo">820</span>   */<a name="line.820"></a>
-<span class="sourceLineNo">821</span>  public final static int compareFamilies(Cell left, byte[] right, int roffset, int rlength) {<a name="line.821"></a>
-<span class="sourceLineNo">822</span>    if (left instanceof ByteBufferExtendedCell) {<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      return ByteBufferUtils.compareTo(((ByteBufferExtendedCell) left).getFamilyByteBuffer(),<a name="line.823"></a>
-<span class="sourceLineNo">824</span>        ((ByteBufferExtendedCell) left).getFamilyPosition(), left.getFamilyLength(), right, roffset,<a name="line.824"></a>
-<span class="sourceLineNo">825</span>        rlength);<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    }<a name="line.826"></a>
-<span class="sourceLineNo">827</span>    return Bytes.compareTo(left.getFamilyArray(), left.getFamilyOffset(), left.getFamilyLength(),<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      right, roffset, rlength);<a name="line.828"></a>
-<span class="sourceLineNo">829</span>  }<a name="line.829"></a>
-<span class="sourceLineNo">830</span><a name="line.830"></a>
-<span class="sourceLineNo">831</span>  /**<a name="line.831"></a>
-<span class="sourceLineNo">832</span>   * Compares the cell's column (family and qualifier) with the given byte[]<a name="line.832"></a>
-<span class="sourceLineNo">833</span>   * @param left the cell for which the column has to be compared<a name="line.833"></a>
-<span class="sourceLineNo">834</span>   * @param right the byte[] having the column<a name="line.834"></a>
-<span class="sourceLineNo">835</span>   * @param rfoffset the offset of the family<a name="line.835"></a>
-<span class="sourceLineNo">836</span>   * @param rflength the length of the family<a name="line.836"></a>
-<span class="sourceLineNo">837</span>   * @param rqoffset the offset of the qualifier<a name="line.837"></a>
-<span class="sourceLineNo">838</span>   * @param rqlength the length of the qualifier<a name="line.838"></a>
-<span class="sourceLineNo">839</span>   * @return greater than 0 if left cell's column is bigger than byte[], lesser than 0 if left<a name="line.839"></a>
-<span class="sourceLineNo">840</span>   *         cell's column is lesser than byte[] and 0 otherwise<a name="line.840"></a>
-<span class="sourceLineNo">841</span>   */<a name="line.841"></a>
-<span class="sourceLineNo">842</span>  public final static int compareColumns(Cell left, byte[] right, int rfoffset, int rflength,<a name="line.842"></a>
-<span class="sourceLineNo">843</span>      int rqoffset, int rqlength) {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>    int diff = compareFamilies(left, right, rfoffset, rflength);<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    if (diff != 0) return diff;<a name="line.845"></a>
-<span class="sourceLineNo">846</span>    return compareQualifiers(left, right, rqoffset, rqlength);<a name="line.846"></a>
-<span class="sourceLineNo">847</span>  }<a name="line.847"></a>
-<span class="sourceLineNo">848</span>}<a name="line.848"></a>
+<span class="sourceLineNo">761</span><a name="line.761"></a>
+<span class="sourceLineNo">762</span>    if (!matchingRows(left, lrowlength, right, rrowlength)) {<a name="line.762"></a>
+<span class="sourceLineNo">763</span>      return false;<a name="line.763"></a>
+<span class="sourceLineNo">764</span>    }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>    return matchingColumn(left, lfamlength, lqlength, right, rfamlength, rqlength);<a name="line.765"></a>
+<span class="sourceLineNo">766</span>  }<a name="line.766"></a>
+<span class="sourceLineNo">767</span><a name="line.767"></a>
+<span class="sourceLineNo">768</span>  public static boolean matchingRowColumnBytes(final Cell left, final Cell right) {<a name="line.768"></a>
+<span class="sourceLineNo">769</span>    int lrowlength = left.getRowLength();<a name="line.769"></a>
+<span class="sourceLineNo">770</span>    int rrowlength = right.getRowLength();<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    int lfamlength = left.getFamilyLength();<a name="line.771"></a>
+<span class="sourceLineNo">772</span>    int rfamlength = right.getFamilyLength();<a name="line.772"></a>
+<span class="sourceLineNo">773</span>    int lqlength = left.getQualifierLength();<a name="line.773"></a>
+<span class="sourceLineNo">774</span>    int rqlength = right.getQualifierLength();<a name="line.774"></a>
+<span class="sourceLineNo">775</span><a name="line.775"></a>
+<span class="sourceLineNo">776</span>    // match length<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    if ((lrowlength != rrowlength) || (lfamlength != rfamlength) || (lqlength != rqlength)) {<a name="line.777"></a>
+<span class="sourceLineNo">778</span>      return false;<a name="line.778"></a>
+<span class="sourceLineNo">779</span>    }<a name="line.779"></a>
+<span class="sourceLineNo">780</span><a name="line.780"></a>
+<span class="sourceLineNo">781</span>    // match row<a name="line.781"></a>
+<span class="sourceLineNo">782</span>    if (!Bytes.equals(left.getRowArray(), left.getRowOffset(), lrowlength, right.getRowArray(),<a name="line.782"></a>
+<span class="sourceLineNo">783</span>        right.getRowOffset(), rrowlength)) {<a name="line.783"></a>
+<span class="sourceLineNo">784</span>      return false;<a name="line.784"></a>
+<span class="sourceLineNo">785</span>    }<a name="line.785"></a>
+<span class="sourceLineNo">786</span>    //match family<a name="line.786"></a>
+<span class="sourceLineNo">787</span>    if (!Bytes.equals(left.getFamilyArray(), left.getFamilyOffset(), lfamlength,<a name="line.787"></a>
+<span class="sourceLineNo">788</span>        right.getFamilyArray(), right.getFamilyOffset(), rfamlength)) {<a name="line.788"></a>
+<span class="sourceLineNo">789</span>      return false;<a name="line.789"></a>
+<span class="sourceLineNo">790</span>    }<a name="line.790"></a>
+<span class="sourceLineNo">791</span>    //match qualifier<a name="line.791"></a>
+<span class="sourceLineNo">792</span>    return Bytes.equals(left.getQualifierArray(), left.getQualifierOffset(),<a name="line.792"></a>
+<span class="sourceLineNo">793</span>        lqlength, right.getQualifierArray(), right.getQualifierOffset(),<a name="line.793"></a>
+<span class="sourceLineNo">794</span>        rqlength);<a name="line.794"></a>
+<span class="sourceLineNo">795</span>  }<a name="line.795"></a>
+<span class="sourceLineNo">796</span><a name="line.796"></a>
+<span class="sourceLineNo">797</span>  /**<a name="line.797"></a>
+<span class="sourceLineNo">798</span>   * Compares the cell's qualifier with the given byte[]<a name="line.798"></a>
+<span class="sourceLineNo">799</span>   * @param left the cell for which the qualifier has to be compared<a name="line.799"></a>
+<span class="sourceLineNo">800</span>   * @param right the byte[] having the qualifier<a name="line.800"></a>
+<span class="sourceLineNo">801</span>   * @param rOffset the offset of the qualifier<a name="line.801"></a>
+<span class="sourceLineNo">802</span>   * @param rLength the length of the qualifier<a name="line.802"></a>
+<span class="sourceLineNo">803</span>   * @return greater than 0 if left cell's qualifier is bigger than byte[], lesser than 0 if left<a name="line.803"></a>
+<span class="sourceLineNo">804</span>   *         cell's qualifier is lesser than byte[] and 0 otherwise<a name="line.804"></a>
+<span class="sourceLineNo">805</span>   */<a name="line.805"></a>
+<span class="sourceLineNo">806</span>  public final static int compareQualifiers(Cell left, byte[] right, int rOffset, int rLength) {<a name="line.806"></a>
+<span class="sourceLineNo">807</span>    if (left instanceof ByteBufferExtendedCell) {<a name="line.807"></a>
+<span class="sourceLineNo">808</span>      return ByteBufferUtils.compareTo(((ByteBufferExtendedCell) left).getQualifierByteBuffer(),<a name="line.808"></a>
+<span class="sourceLineNo">809</span>          ((ByteBufferExtendedCell) left).getQualifierPosition(),<a name="line.809"></a>
+<span class="sourceLineNo">810</span>          left.getQualifierLength(), right, rOffset, rLength);<a name="line.810"></a>
+<span class="sourceLineNo">811</span>    }<a name="line.811"></a>
+<span class="sourceLineNo">812</span>    return Bytes.compareTo(left.getQualifierArray(), left.getQualifierOffset(),<a name="line.812"></a>
+<span class="sourceLineNo">813</span>      left.getQualifierLength(), right, rOffset, rLength);<a name="line.813"></a>
+<span class="sourceLineNo">814</span>  }<a name="line.814"></a>
+<span class="sourceLineNo">815</span><a name="line.815"></a>
+<span class="sourceLineNo">816</span>  /**<a name="line.816"></a>
+<span class="sourceLineNo">817</span>   * Compares the cell's family with the given byte[]<a name="line.817"></a>
+<span class="sourceLineNo">818</span>   * @param left the cell for which the family has to be compared<a name="line.818"></a>
+<span class="sourceLineNo">819</span>   * @param right the byte[] having the family<a name="line.819"></a>
+<span class="sourceLineNo">820</span>   * @param roffset the offset of the family<a name="line.820"></a>
+<span class="sourceLineNo">821</span>   * @param rlength the length of the family<a name="line.821"></a>
+<span class="sourceLineNo">822</span>   * @return greater than 0 if left cell's family is bigger than byte[], lesser than 0 if left<a name="line.822"></a>
+<span class="sourceLineNo">823</span>   *         cell's family is lesser than byte[] and 0 otherwise<a name="line.823"></a>
+<span class="sourceLineNo">824</span>   */<a name="line.824"></a>
+<span class="sourceLineNo">825</span>  public final static int compareFamilies(Cell left, byte[] right, int roffset, int rlength) {<a name="line.825"></a>
+<span class="sourceLineNo">826</span>    if (left instanceof ByteBufferExtendedCell) {<a name="line.826"></a>
+<span class="sourceLineNo">827</span>      return ByteBufferUtils.compareTo(((ByteBufferExtendedCell) left).getFamilyByteBuffer(),<a name="line.827"></a>
+<span class="sourceLineNo">828</span>        ((ByteBufferExtendedCell) left).getFamilyPosition(), left.getFamilyLength(), right, roffset,<a name="line.828"></a>
+<span class="sourceLineNo">829</span>        rlength);<a name="line.829"></a>
+<span class="sourceLineNo">830</span>    }<a name="line.830"></a>
+<span class="sourceLineNo">831</span>    return Bytes.compareTo(left.getFamilyArray(), left.getFamilyOffset(), left.getFamilyLength(),<a name="line.831"></a>
+<span class="sourceLineNo">832</span>      right, roffset, rlength);<a name="line.832"></a>
+<span class="sourceLineNo">833</span>  }<a name="line.833"></a>
+<span class="sourceLineNo">834</span><a name="line.834"></a>
+<span class="sourceLineNo">835</span>  /**<a name="line.835"></a>
+<span class="sourceLineNo">836</span>   * Compares the cell's column (family and qualifier) with the given byte[]<a name="line.836"></a>
+<span class="sourceLineNo">837</span>   * @param left the cell for which the column has to be compared<a name="line.837"></a>
+<span class="sourceLineNo">838</span>   * @param right the byte[] having the column<a name="line.838"></a>
+<span class="sourceLineNo">839</span>   * @param rfoffset the offset of the family<a name="line.839"></a>
+<span class="sourceLineNo">840</span>   * @param rflength the length of the family<a name="line.840"></a>
+<span class="sourceLineNo">841</span>   * @param rqoffset the offset of the qualifier<a name="line.841"></a>
+<span class="sourceLineNo">842</span>   * @param rqlength the length of the qualifier<a name="line.842"></a>
+<span class="sourceLineNo">843</span>   * @return greater than 0 if left cell's column is bigger than byte[], lesser than 0 if left<a name="line.843"></a>
+<span class="sourceLineNo">844</span>   *         cell's column is lesser than byte[] and 0 otherwise<a name="line.844"></a>
+<span class="sourceLineNo">845</span>   */<a name="line.845"></a>
+<span class="sourceLineNo">846</span>  public final static int compareColumns(Cell left, byte[] right, int rfoffset, int rflength,<a name="line.846"></a>
+<span class="sourceLineNo">847</span>      int rqoffset, int rqlength) {<a name="line.847"></a>
+<span class="sourceLineNo">848</span>    int diff = compareFamilies(left, right, rfoffset, rflength);<a name="line.848"></a>
+<span class="sourceLineNo">849</span>    if (diff != 0) return diff;<a name="line.849"></a>
+<span class="sourceLineNo">850</span>    return compareQualifiers(left, right, rqoffset, rqlength);<a name="line.850"></a>
+<span class="sourceLineNo">851</span>  }<a name="line.851"></a>
+<span class="sourceLineNo">852</span>}<a name="line.852"></a>
 
 
 
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/client/Result.html b/apidocs/src-html/org/apache/hadoop/hbase/client/Result.html
index a35aa85..f7bdd54 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/client/Result.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/client/Result.html
@@ -799,211 +799,212 @@
 <span class="sourceLineNo">791</span>    Cell[] replicatedKVs = res2.rawCells();<a name="line.791"></a>
 <span class="sourceLineNo">792</span>    for (int i = 0; i &lt; res1.size(); i++) {<a name="line.792"></a>
 <span class="sourceLineNo">793</span>      if (!ourKVs[i].equals(replicatedKVs[i]) ||<a name="line.793"></a>
-<span class="sourceLineNo">794</span>          !CellUtil.matchingValue(ourKVs[i], replicatedKVs[i])) {<a name="line.794"></a>
-<span class="sourceLineNo">795</span>        throw new Exception("This result was different: "<a name="line.795"></a>
-<span class="sourceLineNo">796</span>            + res1.toString() + " compared to " + res2.toString());<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      }<a name="line.797"></a>
-<span class="sourceLineNo">798</span>    }<a name="line.798"></a>
-<span class="sourceLineNo">799</span>  }<a name="line.799"></a>
-<span class="sourceLineNo">800</span><a name="line.800"></a>
-<span class="sourceLineNo">801</span>  /**<a name="line.801"></a>
-<span class="sourceLineNo">802</span>   * Forms a single result from the partial results in the partialResults list. This method is<a name="line.802"></a>
-<span class="sourceLineNo">803</span>   * useful for reconstructing partial results on the client side.<a name="line.803"></a>
-<span class="sourceLineNo">804</span>   * @param partialResults list of partial results<a name="line.804"></a>
-<span class="sourceLineNo">805</span>   * @return The complete result that is formed by combining all of the partial results together<a name="line.805"></a>
-<span class="sourceLineNo">806</span>   * @throws IOException A complete result cannot be formed because the results in the partial list<a name="line.806"></a>
-<span class="sourceLineNo">807</span>   *           come from different rows<a name="line.807"></a>
-<span class="sourceLineNo">808</span>   */<a name="line.808"></a>
-<span class="sourceLineNo">809</span>  public static Result createCompleteResult(Iterable&lt;Result&gt; partialResults)<a name="line.809"></a>
-<span class="sourceLineNo">810</span>      throws IOException {<a name="line.810"></a>
-<span class="sourceLineNo">811</span>    if (partialResults == null) {<a name="line.811"></a>
-<span class="sourceLineNo">812</span>      return Result.create(Collections.emptyList(), null, false);<a name="line.812"></a>
-<span class="sourceLineNo">813</span>    }<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    List&lt;Cell&gt; cells = new ArrayList&lt;&gt;();<a name="line.814"></a>
-<span class="sourceLineNo">815</span>    boolean stale = false;<a name="line.815"></a>
-<span class="sourceLineNo">816</span>    byte[] prevRow = null;<a name="line.816"></a>
-<span class="sourceLineNo">817</span>    byte[] currentRow = null;<a name="line.817"></a>
-<span class="sourceLineNo">818</span>    for (Iterator&lt;Result&gt; iter = partialResults.iterator(); iter.hasNext();) {<a name="line.818"></a>
-<span class="sourceLineNo">819</span>      Result r = iter.next();<a name="line.819"></a>
-<span class="sourceLineNo">820</span>      currentRow = r.getRow();<a name="line.820"></a>
-<span class="sourceLineNo">821</span>      if (prevRow != null &amp;&amp; !Bytes.equals(prevRow, currentRow)) {<a name="line.821"></a>
-<span class="sourceLineNo">822</span>        throw new IOException(<a name="line.822"></a>
-<span class="sourceLineNo">823</span>            "Cannot form complete result. Rows of partial results do not match." +<a name="line.823"></a>
-<span class="sourceLineNo">824</span>                " Partial Results: " + partialResults);<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      }<a name="line.825"></a>
-<span class="sourceLineNo">826</span>      // Ensure that all Results except the last one are marked as partials. The last result<a name="line.826"></a>
-<span class="sourceLineNo">827</span>      // may not be marked as a partial because Results are only marked as partials when<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      // the scan on the server side must be stopped due to reaching the maxResultSize.<a name="line.828"></a>
-<span class="sourceLineNo">829</span>      // Visualizing it makes it easier to understand:<a name="line.829"></a>
-<span class="sourceLineNo">830</span>      // maxResultSize: 2 cells<a name="line.830"></a>
-<span class="sourceLineNo">831</span>      // (-x-) represents cell number x in a row<a name="line.831"></a>
-<span class="sourceLineNo">832</span>      // Example: row1: -1- -2- -3- -4- -5- (5 cells total)<a name="line.832"></a>
-<span class="sourceLineNo">833</span>      // How row1 will be returned by the server as partial Results:<a name="line.833"></a>
-<span class="sourceLineNo">834</span>      // Result1: -1- -2- (2 cells, size limit reached, mark as partial)<a name="line.834"></a>
-<span class="sourceLineNo">835</span>      // Result2: -3- -4- (2 cells, size limit reached, mark as partial)<a name="line.835"></a>
-<span class="sourceLineNo">836</span>      // Result3: -5- (1 cell, size limit NOT reached, NOT marked as partial)<a name="line.836"></a>
-<span class="sourceLineNo">837</span>      if (iter.hasNext() &amp;&amp; !r.mayHaveMoreCellsInRow()) {<a name="line.837"></a>
-<span class="sourceLineNo">838</span>        throw new IOException("Cannot form complete result. Result is missing partial flag. " +<a name="line.838"></a>
-<span class="sourceLineNo">839</span>            "Partial Results: " + partialResults);<a name="line.839"></a>
-<span class="sourceLineNo">840</span>      }<a name="line.840"></a>
-<span class="sourceLineNo">841</span>      prevRow = currentRow;<a name="line.841"></a>
-<span class="sourceLineNo">842</span>      stale = stale || r.isStale();<a name="line.842"></a>
-<span class="sourceLineNo">843</span>      for (Cell c : r.rawCells()) {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>        cells.add(c);<a name="line.844"></a>
-<span class="sourceLineNo">845</span>      }<a name="line.845"></a>
-<span class="sourceLineNo">846</span>    }<a name="line.846"></a>
-<span class="sourceLineNo">847</span><a name="line.847"></a>
-<span class="sourceLineNo">848</span>    return Result.create(cells, null, stale);<a name="line.848"></a>
-<span class="sourceLineNo">849</span>  }<a name="line.849"></a>
-<span class="sourceLineNo">850</span><a name="line.850"></a>
-<span class="sourceLineNo">851</span>  /**<a name="line.851"></a>
-<span class="sourceLineNo">852</span>   * Get total size of raw cells<a name="line.852"></a>
-<span class="sourceLineNo">853</span>   * @param result<a name="line.853"></a>
-<span class="sourceLineNo">854</span>   * @return Total size.<a name="line.854"></a>
-<span class="sourceLineNo">855</span>   */<a name="line.855"></a>
-<span class="sourceLineNo">856</span>  public static long getTotalSizeOfCells(Result result) {<a name="line.856"></a>
-<span class="sourceLineNo">857</span>    long size = 0;<a name="line.857"></a>
-<span class="sourceLineNo">858</span>    if (result.isEmpty()) {<a name="line.858"></a>
-<span class="sourceLineNo">859</span>      return size;<a name="line.859"></a>
-<span class="sourceLineNo">860</span>    }<a name="line.860"></a>
-<span class="sourceLineNo">861</span>    for (Cell c : result.rawCells()) {<a name="line.861"></a>
-<span class="sourceLineNo">862</span>      size += c.heapSize();<a name="line.862"></a>
-<span class="sourceLineNo">863</span>    }<a name="line.863"></a>
-<span class="sourceLineNo">864</span>    return size;<a name="line.864"></a>
-<span class="sourceLineNo">865</span>  }<a name="line.865"></a>
-<span class="sourceLineNo">866</span><a name="line.866"></a>
-<span class="sourceLineNo">867</span>  /**<a name="line.867"></a>
-<span class="sourceLineNo">868</span>   * Copy another Result into this one. Needed for the old Mapred framework<a name="line.868"></a>
-<span class="sourceLineNo">869</span>   * @throws UnsupportedOperationException if invoked on instance of EMPTY_RESULT<a name="line.869"></a>
-<span class="sourceLineNo">870</span>   * (which is supposed to be immutable).<a name="line.870"></a>
-<span class="sourceLineNo">871</span>   * @param other<a name="line.871"></a>
-<span class="sourceLineNo">872</span>   */<a name="line.872"></a>
-<span class="sourceLineNo">873</span>  public void copyFrom(Result other) {<a name="line.873"></a>
-<span class="sourceLineNo">874</span>    checkReadonly();<a name="line.874"></a>
-<span class="sourceLineNo">875</span>    this.row = null;<a name="line.875"></a>
-<span class="sourceLineNo">876</span>    this.familyMap = null;<a name="line.876"></a>
-<span class="sourceLineNo">877</span>    this.cells = other.cells;<a name="line.877"></a>
-<span class="sourceLineNo">878</span>  }<a name="line.878"></a>
-<span class="sourceLineNo">879</span><a name="line.879"></a>
-<span class="sourceLineNo">880</span>  @Override<a name="line.880"></a>
-<span class="sourceLineNo">881</span>  public CellScanner cellScanner() {<a name="line.881"></a>
-<span class="sourceLineNo">882</span>    // Reset<a name="line.882"></a>
-<span class="sourceLineNo">883</span>    this.cellScannerIndex = INITIAL_CELLSCANNER_INDEX;<a name="line.883"></a>
-<span class="sourceLineNo">884</span>    return this;<a name="line.884"></a>
-<span class="sourceLineNo">885</span>  }<a name="line.885"></a>
-<span class="sourceLineNo">886</span><a name="line.886"></a>
-<span class="sourceLineNo">887</span>  @Override<a name="line.887"></a>
-<span class="sourceLineNo">888</span>  public Cell current() {<a name="line.888"></a>
-<span class="sourceLineNo">889</span>    if (cells == null<a name="line.889"></a>
-<span class="sourceLineNo">890</span>            || cellScannerIndex == INITIAL_CELLSCANNER_INDEX<a name="line.890"></a>
-<span class="sourceLineNo">891</span>            || cellScannerIndex &gt;= cells.length)<a name="line.891"></a>
-<span class="sourceLineNo">892</span>      return null;<a name="line.892"></a>
-<span class="sourceLineNo">893</span>    return this.cells[cellScannerIndex];<a name="line.893"></a>
-<span class="sourceLineNo">894</span>  }<a name="line.894"></a>
-<span class="sourceLineNo">895</span><a name="line.895"></a>
-<span class="sourceLineNo">896</span>  @Override<a name="line.896"></a>
-<span class="sourceLineNo">897</span>  public boolean advance() {<a name="line.897"></a>
-<span class="sourceLineNo">898</span>    if (cells == null) return false;<a name="line.898"></a>
-<span class="sourceLineNo">899</span>    cellScannerIndex++;<a name="line.899"></a>
-<span class="sourceLineNo">900</span>    if (cellScannerIndex &lt; this.cells.length) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>      return true;<a name="line.901"></a>
-<span class="sourceLineNo">902</span>    } else if (cellScannerIndex == this.cells.length) {<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      return false;<a name="line.903"></a>
-<span class="sourceLineNo">904</span>    }<a name="line.904"></a>
-<span class="sourceLineNo">905</span>    throw new NoSuchElementException("Cannot advance beyond the last cell");<a name="line.905"></a>
-<span class="sourceLineNo">906</span>  }<a name="line.906"></a>
-<span class="sourceLineNo">907</span><a name="line.907"></a>
-<span class="sourceLineNo">908</span>  public Boolean getExists() {<a name="line.908"></a>
-<span class="sourceLineNo">909</span>    return exists;<a name="line.909"></a>
-<span class="sourceLineNo">910</span>  }<a name="line.910"></a>
-<span class="sourceLineNo">911</span><a name="line.911"></a>
-<span class="sourceLineNo">912</span>  public void setExists(Boolean exists) {<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    checkReadonly();<a name="line.913"></a>
-<span class="sourceLineNo">914</span>    this.exists = exists;<a name="line.914"></a>
-<span class="sourceLineNo">915</span>  }<a name="line.915"></a>
-<span class="sourceLineNo">916</span><a name="line.916"></a>
-<span class="sourceLineNo">917</span>  /**<a name="line.917"></a>
-<span class="sourceLineNo">918</span>   * Whether or not the results are coming from possibly stale data. Stale results<a name="line.918"></a>
-<span class="sourceLineNo">919</span>   * might be returned if {@link Consistency} is not STRONG for the query.<a name="line.919"></a>
-<span class="sourceLineNo">920</span>   * @return Whether or not the results are coming from possibly stale data.<a name="line.920"></a>
-<span class="sourceLineNo">921</span>   */<a name="line.921"></a>
-<span class="sourceLineNo">922</span>  public boolean isStale() {<a name="line.922"></a>
-<span class="sourceLineNo">923</span>    return stale;<a name="line.923"></a>
-<span class="sourceLineNo">924</span>  }<a name="line.924"></a>
-<span class="sourceLineNo">925</span><a name="line.925"></a>
-<span class="sourceLineNo">926</span>  /**<a name="line.926"></a>
-<span class="sourceLineNo">927</span>   * For scanning large rows, the RS may choose to return the cells chunk by chunk to prevent OOM<a name="line.927"></a>
-<span class="sourceLineNo">928</span>   * or timeout. This flag is used to tell you if the current Result is the last one of the current<a name="line.928"></a>
-<span class="sourceLineNo">929</span>   * row. False means this Result is the last one. True means there MAY be more cells belonging to<a name="line.929"></a>
-<span class="sourceLineNo">930</span>   * the current row.<a name="line.930"></a>
-<span class="sourceLineNo">931</span>   * If you don't use {@link Scan#setAllowPartialResults(boolean)} or {@link Scan#setBatch(int)},<a name="line.931"></a>
-<span class="sourceLineNo">932</span>   * this method will always return false because the Result must contains all cells in one Row.<a name="line.932"></a>
-<span class="sourceLineNo">933</span>   */<a name="line.933"></a>
-<span class="sourceLineNo">934</span>  public boolean mayHaveMoreCellsInRow() {<a name="line.934"></a>
-<span class="sourceLineNo">935</span>    return mayHaveMoreCellsInRow;<a name="line.935"></a>
-<span class="sourceLineNo">936</span>  }<a name="line.936"></a>
-<span class="sourceLineNo">937</span><a name="line.937"></a>
-<span class="sourceLineNo">938</span>  /**<a name="line.938"></a>
-<span class="sourceLineNo">939</span>   * Set load information about the region to the information about the result<a name="line.939"></a>
-<span class="sourceLineNo">940</span>   * @param loadStats statistics about the current region from which this was returned<a name="line.940"></a>
-<span class="sourceLineNo">941</span>   */<a name="line.941"></a>
-<span class="sourceLineNo">942</span>  @InterfaceAudience.Private<a name="line.942"></a>
-<span class="sourceLineNo">943</span>  public void setStatistics(RegionLoadStats loadStats) {<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    this.stats = loadStats;<a name="line.944"></a>
-<span class="sourceLineNo">945</span>  }<a name="line.945"></a>
-<span class="sourceLineNo">946</span><a name="line.946"></a>
-<span class="sourceLineNo">947</span>  /**<a name="line.947"></a>
-<span class="sourceLineNo">948</span>   * @return the associated statistics about the region from which this was returned. Can be<a name="line.948"></a>
-<span class="sourceLineNo">949</span>   * &lt;tt&gt;null&lt;/tt&gt; if stats are disabled.<a name="line.949"></a>
-<span class="sourceLineNo">950</span>   */<a name="line.950"></a>
-<span class="sourceLineNo">951</span>  public RegionLoadStats getStats() {<a name="line.951"></a>
-<span class="sourceLineNo">952</span>    return stats;<a name="line.952"></a>
-<span class="sourceLineNo">953</span>  }<a name="line.953"></a>
-<span class="sourceLineNo">954</span><a name="line.954"></a>
-<span class="sourceLineNo">955</span>  /**<a name="line.955"></a>
-<span class="sourceLineNo">956</span>   * All methods modifying state of Result object must call this method<a name="line.956"></a>
-<span class="sourceLineNo">957</span>   * to ensure that special purpose immutable Results can't be accidentally modified.<a name="line.957"></a>
-<span class="sourceLineNo">958</span>   */<a name="line.958"></a>
-<span class="sourceLineNo">959</span>  private void checkReadonly() {<a name="line.959"></a>
-<span class="sourceLineNo">960</span>    if (readonly == true) {<a name="line.960"></a>
-<span class="sourceLineNo">961</span>      throw new UnsupportedOperationException("Attempting to modify readonly EMPTY_RESULT!");<a name="line.961"></a>
-<span class="sourceLineNo">962</span>    }<a name="line.962"></a>
-<span class="sourceLineNo">963</span>  }<a name="line.963"></a>
-<span class="sourceLineNo">964</span><a name="line.964"></a>
-<span class="sourceLineNo">965</span>  /**<a name="line.965"></a>
-<span class="sourceLineNo">966</span>   * Return true if this Result is a cursor to tell users where the server has scanned.<a name="line.966"></a>
-<span class="sourceLineNo">967</span>   * In this Result the only meaningful method is {@link #getCursor()}.<a name="line.967"></a>
-<span class="sourceLineNo">968</span>   *<a name="line.968"></a>
-<span class="sourceLineNo">969</span>   * {@code<a name="line.969"></a>
-<span class="sourceLineNo">970</span>   *  while (r = scanner.next() &amp;&amp; r != null) {<a name="line.970"></a>
-<span class="sourceLineNo">971</span>   *    if(r.isCursor()){<a name="line.971"></a>
-<span class="sourceLineNo">972</span>   *    // scanning is not end, it is a cursor, save its row key and close scanner if you want, or<a name="line.972"></a>
-<span class="sourceLineNo">973</span>   *    // just continue the loop to call next().<a name="line.973"></a>
-<span class="sourceLineNo">974</span>   *    } else {<a name="line.974"></a>
-<span class="sourceLineNo">975</span>   *    // just like before<a name="line.975"></a>
-<span class="sourceLineNo">976</span>   *    }<a name="line.976"></a>
-<span class="sourceLineNo">977</span>   *  }<a name="line.977"></a>
-<span class="sourceLineNo">978</span>   *  // scanning is end<a name="line.978"></a>
-<span class="sourceLineNo">979</span>   *<a name="line.979"></a>
-<span class="sourceLineNo">980</span>   * }<a name="line.980"></a>
-<span class="sourceLineNo">981</span>   * {@link Scan#setNeedCursorResult(boolean)}<a name="line.981"></a>
-<span class="sourceLineNo">982</span>   * {@link Cursor}<a name="line.982"></a>
-<span class="sourceLineNo">983</span>   * {@link #getCursor()}<a name="line.983"></a>
-<span class="sourceLineNo">984</span>   */<a name="line.984"></a>
-<span class="sourceLineNo">985</span>  public boolean isCursor() {<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    return cursor != null ;<a name="line.986"></a>
-<span class="sourceLineNo">987</span>  }<a name="line.987"></a>
-<span class="sourceLineNo">988</span><a name="line.988"></a>
-<span class="sourceLineNo">989</span>  /**<a name="line.989"></a>
-<span class="sourceLineNo">990</span>   * Return the cursor if this Result is a cursor result.<a name="line.990"></a>
-<span class="sourceLineNo">991</span>   * {@link Scan#setNeedCursorResult(boolean)}<a name="line.991"></a>
-<span class="sourceLineNo">992</span>   * {@link Cursor}<a name="line.992"></a>
-<span class="sourceLineNo">993</span>   * {@link #isCursor()}<a name="line.993"></a>
-<span class="sourceLineNo">994</span>   */<a name="line.994"></a>
-<span class="sourceLineNo">995</span>  public Cursor getCursor(){<a name="line.995"></a>
-<span class="sourceLineNo">996</span>    return cursor;<a name="line.996"></a>
-<span class="sourceLineNo">997</span>  }<a name="line.997"></a>
-<span class="sourceLineNo">998</span>}<a name="line.998"></a>
+<span class="sourceLineNo">794</span>          !CellUtil.matchingValue(ourKVs[i], replicatedKVs[i]) ||<a name="line.794"></a>
+<span class="sourceLineNo">795</span>          !CellUtil.matchingTags(ourKVs[i], replicatedKVs[i])) {<a name="line.795"></a>
+<span class="sourceLineNo">796</span>        throw new Exception("This result was different: "<a name="line.796"></a>
+<span class="sourceLineNo">797</span>            + res1.toString() + " compared to " + res2.toString());<a name="line.797"></a>
+<span class="sourceLineNo">798</span>      }<a name="line.798"></a>
+<span class="sourceLineNo">799</span>    }<a name="line.799"></a>
+<span class="sourceLineNo">800</span>  }<a name="line.800"></a>
+<span class="sourceLineNo">801</span><a name="line.801"></a>
+<span class="sourceLineNo">802</span>  /**<a name="line.802"></a>
+<span class="sourceLineNo">803</span>   * Forms a single result from the partial results in the partialResults list. This method is<a name="line.803"></a>
+<span class="sourceLineNo">804</span>   * useful for reconstructing partial results on the client side.<a name="line.804"></a>
+<span class="sourceLineNo">805</span>   * @param partialResults list of partial results<a name="line.805"></a>
+<span class="sourceLineNo">806</span>   * @return The complete result that is formed by combining all of the partial results together<a name="line.806"></a>
+<span class="sourceLineNo">807</span>   * @throws IOException A complete result cannot be formed because the results in the partial list<a name="line.807"></a>
+<span class="sourceLineNo">808</span>   *           come from different rows<a name="line.808"></a>
+<span class="sourceLineNo">809</span>   */<a name="line.809"></a>
+<span class="sourceLineNo">810</span>  public static Result createCompleteResult(Iterable&lt;Result&gt; partialResults)<a name="line.810"></a>
+<span class="sourceLineNo">811</span>      throws IOException {<a name="line.811"></a>
+<span class="sourceLineNo">812</span>    if (partialResults == null) {<a name="line.812"></a>
+<span class="sourceLineNo">813</span>      return Result.create(Collections.emptyList(), null, false);<a name="line.813"></a>
+<span class="sourceLineNo">814</span>    }<a name="line.814"></a>
+<span class="sourceLineNo">815</span>    List&lt;Cell&gt; cells = new ArrayList&lt;&gt;();<a name="line.815"></a>
+<span class="sourceLineNo">816</span>    boolean stale = false;<a name="line.816"></a>
+<span class="sourceLineNo">817</span>    byte[] prevRow = null;<a name="line.817"></a>
+<span class="sourceLineNo">818</span>    byte[] currentRow = null;<a name="line.818"></a>
+<span class="sourceLineNo">819</span>    for (Iterator&lt;Result&gt; iter = partialResults.iterator(); iter.hasNext();) {<a name="line.819"></a>
+<span class="sourceLineNo">820</span>      Result r = iter.next();<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      currentRow = r.getRow();<a name="line.821"></a>
+<span class="sourceLineNo">822</span>      if (prevRow != null &amp;&amp; !Bytes.equals(prevRow, currentRow)) {<a name="line.822"></a>
+<span class="sourceLineNo">823</span>        throw new IOException(<a name="line.823"></a>
+<span class="sourceLineNo">824</span>            "Cannot form complete result. Rows of partial results do not match." +<a name="line.824"></a>
+<span class="sourceLineNo">825</span>                " Partial Results: " + partialResults);<a name="line.825"></a>
+<span class="sourceLineNo">826</span>      }<a name="line.826"></a>
+<span class="sourceLineNo">827</span>      // Ensure that all Results except the last one are marked as partials. The last result<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      // may not be marked as a partial because Results are only marked as partials when<a name="line.828"></a>
+<span class="sourceLineNo">829</span>      // the scan on the server side must be stopped due to reaching the maxResultSize.<a name="line.829"></a>
+<span class="sourceLineNo">830</span>      // Visualizing it makes it easier to understand:<a name="line.830"></a>
+<span class="sourceLineNo">831</span>      // maxResultSize: 2 cells<a name="line.831"></a>
+<span class="sourceLineNo">832</span>      // (-x-) represents cell number x in a row<a name="line.832"></a>
+<span class="sourceLineNo">833</span>      // Example: row1: -1- -2- -3- -4- -5- (5 cells total)<a name="line.833"></a>
+<span class="sourceLineNo">834</span>      // How row1 will be returned by the server as partial Results:<a name="line.834"></a>
+<span class="sourceLineNo">835</span>      // Result1: -1- -2- (2 cells, size limit reached, mark as partial)<a name="line.835"></a>
+<span class="sourceLineNo">836</span>      // Result2: -3- -4- (2 cells, size limit reached, mark as partial)<a name="line.836"></a>
+<span class="sourceLineNo">837</span>      // Result3: -5- (1 cell, size limit NOT reached, NOT marked as partial)<a name="line.837"></a>
+<span class="sourceLineNo">838</span>      if (iter.hasNext() &amp;&amp; !r.mayHaveMoreCellsInRow()) {<a name="line.838"></a>
+<span class="sourceLineNo">839</span>        throw new IOException("Cannot form complete result. Result is missing partial flag. " +<a name="line.839"></a>
+<span class="sourceLineNo">840</span>            "Partial Results: " + partialResults);<a name="line.840"></a>
+<span class="sourceLineNo">841</span>      }<a name="line.841"></a>
+<span class="sourceLineNo">842</span>      prevRow = currentRow;<a name="line.842"></a>
+<span class="sourceLineNo">843</span>      stale = stale || r.isStale();<a name="line.843"></a>
+<span class="sourceLineNo">844</span>      for (Cell c : r.rawCells()) {<a name="line.844"></a>
+<span class="sourceLineNo">845</span>        cells.add(c);<a name="line.845"></a>
+<span class="sourceLineNo">846</span>      }<a name="line.846"></a>
+<span class="sourceLineNo">847</span>    }<a name="line.847"></a>
+<span class="sourceLineNo">848</span><a name="line.848"></a>
+<span class="sourceLineNo">849</span>    return Result.create(cells, null, stale);<a name="line.849"></a>
+<span class="sourceLineNo">850</span>  }<a name="line.850"></a>
+<span class="sourceLineNo">851</span><a name="line.851"></a>
+<span class="sourceLineNo">852</span>  /**<a name="line.852"></a>
+<span class="sourceLineNo">853</span>   * Get total size of raw cells<a name="line.853"></a>
+<span class="sourceLineNo">854</span>   * @param result<a name="line.854"></a>
+<span class="sourceLineNo">855</span>   * @return Total size.<a name="line.855"></a>
+<span class="sourceLineNo">856</span>   */<a name="line.856"></a>
+<span class="sourceLineNo">857</span>  public static long getTotalSizeOfCells(Result result) {<a name="line.857"></a>
+<span class="sourceLineNo">858</span>    long size = 0;<a name="line.858"></a>
+<span class="sourceLineNo">859</span>    if (result.isEmpty()) {<a name="line.859"></a>
+<span class="sourceLineNo">860</span>      return size;<a name="line.860"></a>
+<span class="sourceLineNo">861</span>    }<a name="line.861"></a>
+<span class="sourceLineNo">862</span>    for (Cell c : result.rawCells()) {<a name="line.862"></a>
+<span class="sourceLineNo">863</span>      size += c.heapSize();<a name="line.863"></a>
+<span class="sourceLineNo">864</span>    }<a name="line.864"></a>
+<span class="sourceLineNo">865</span>    return size;<a name="line.865"></a>
+<span class="sourceLineNo">866</span>  }<a name="line.866"></a>
+<span class="sourceLineNo">867</span><a name="line.867"></a>
+<span class="sourceLineNo">868</span>  /**<a name="line.868"></a>
+<span class="sourceLineNo">869</span>   * Copy another Result into this one. Needed for the old Mapred framework<a name="line.869"></a>
+<span class="sourceLineNo">870</span>   * @throws UnsupportedOperationException if invoked on instance of EMPTY_RESULT<a name="line.870"></a>
+<span class="sourceLineNo">871</span>   * (which is supposed to be immutable).<a name="line.871"></a>
+<span class="sourceLineNo">872</span>   * @param other<a name="line.872"></a>
+<span class="sourceLineNo">873</span>   */<a name="line.873"></a>
+<span class="sourceLineNo">874</span>  public void copyFrom(Result other) {<a name="line.874"></a>
+<span class="sourceLineNo">875</span>    checkReadonly();<a name="line.875"></a>
+<span class="sourceLineNo">876</span>    this.row = null;<a name="line.876"></a>
+<span class="sourceLineNo">877</span>    this.familyMap = null;<a name="line.877"></a>
+<span class="sourceLineNo">878</span>    this.cells = other.cells;<a name="line.878"></a>
+<span class="sourceLineNo">879</span>  }<a name="line.879"></a>
+<span class="sourceLineNo">880</span><a name="line.880"></a>
+<span class="sourceLineNo">881</span>  @Override<a name="line.881"></a>
+<span class="sourceLineNo">882</span>  public CellScanner cellScanner() {<a name="line.882"></a>
+<span class="sourceLineNo">883</span>    // Reset<a name="line.883"></a>
+<span class="sourceLineNo">884</span>    this.cellScannerIndex = INITIAL_CELLSCANNER_INDEX;<a name="line.884"></a>
+<span class="sourceLineNo">885</span>    return this;<a name="line.885"></a>
+<span class="sourceLineNo">886</span>  }<a name="line.886"></a>
+<span class="sourceLineNo">887</span><a name="line.887"></a>
+<span class="sourceLineNo">888</span>  @Override<a name="line.888"></a>
+<span class="sourceLineNo">889</span>  public Cell current() {<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    if (cells == null<a name="line.890"></a>
+<span class="sourceLineNo">891</span>            || cellScannerIndex == INITIAL_CELLSCANNER_INDEX<a name="line.891"></a>
+<span class="sourceLineNo">892</span>            || cellScannerIndex &gt;= cells.length)<a name="line.892"></a>
+<span class="sourceLineNo">893</span>      return null;<a name="line.893"></a>
+<span class="sourceLineNo">894</span>    return this.cells[cellScannerIndex];<a name="line.894"></a>
+<span class="sourceLineNo">895</span>  }<a name="line.895"></a>
+<span class="sourceLineNo">896</span><a name="line.896"></a>
+<span class="sourceLineNo">897</span>  @Override<a name="line.897"></a>
+<span class="sourceLineNo">898</span>  public boolean advance() {<a name="line.898"></a>
+<span class="sourceLineNo">899</span>    if (cells == null) return false;<a name="line.899"></a>
+<span class="sourceLineNo">900</span>    cellScannerIndex++;<a name="line.900"></a>
+<span class="sourceLineNo">901</span>    if (cellScannerIndex &lt; this.cells.length) {<a name="line.901"></a>
+<span class="sourceLineNo">902</span>      return true;<a name="line.902"></a>
+<span class="sourceLineNo">903</span>    } else if (cellScannerIndex == this.cells.length) {<a name="line.903"></a>
+<span class="sourceLineNo">904</span>      return false;<a name="line.904"></a>
+<span class="sourceLineNo">905</span>    }<a name="line.905"></a>
+<span class="sourceLineNo">906</span>    throw new NoSuchElementException("Cannot advance beyond the last cell");<a name="line.906"></a>
+<span class="sourceLineNo">907</span>  }<a name="line.907"></a>
+<span class="sourceLineNo">908</span><a name="line.908"></a>
+<span class="sourceLineNo">909</span>  public Boolean getExists() {<a name="line.909"></a>
+<span class="sourceLineNo">910</span>    return exists;<a name="line.910"></a>
+<span class="sourceLineNo">911</span>  }<a name="line.911"></a>
+<span class="sourceLineNo">912</span><a name="line.912"></a>
+<span class="sourceLineNo">913</span>  public void setExists(Boolean exists) {<a name="line.913"></a>
+<span class="sourceLineNo">914</span>    checkReadonly();<a name="line.914"></a>
+<span class="sourceLineNo">915</span>    this.exists = exists;<a name="line.915"></a>
+<span class="sourceLineNo">916</span>  }<a name="line.916"></a>
+<span class="sourceLineNo">917</span><a name="line.917"></a>
+<span class="sourceLineNo">918</span>  /**<a name="line.918"></a>
+<span class="sourceLineNo">919</span>   * Whether or not the results are coming from possibly stale data. Stale results<a name="line.919"></a>
+<span class="sourceLineNo">920</span>   * might be returned if {@link Consistency} is not STRONG for the query.<a name="line.920"></a>
+<span class="sourceLineNo">921</span>   * @return Whether or not the results are coming from possibly stale data.<a name="line.921"></a>
+<span class="sourceLineNo">922</span>   */<a name="line.922"></a>
+<span class="sourceLineNo">923</span>  public boolean isStale() {<a name="line.923"></a>
+<span class="sourceLineNo">924</span>    return stale;<a name="line.924"></a>
+<span class="sourceLineNo">925</span>  }<a name="line.925"></a>
+<span class="sourceLineNo">926</span><a name="line.926"></a>
+<span class="sourceLineNo">927</span>  /**<a name="line.927"></a>
+<span class="sourceLineNo">928</span>   * For scanning large rows, the RS may choose to return the cells chunk by chunk to prevent OOM<a name="line.928"></a>
+<span class="sourceLineNo">929</span>   * or timeout. This flag is used to tell you if the current Result is the last one of the current<a name="line.929"></a>
+<span class="sourceLineNo">930</span>   * row. False means this Result is the last one. True means there MAY be more cells belonging to<a name="line.930"></a>
+<span class="sourceLineNo">931</span>   * the current row.<a name="line.931"></a>
+<span class="sourceLineNo">932</span>   * If you don't use {@link Scan#setAllowPartialResults(boolean)} or {@link Scan#setBatch(int)},<a name="line.932"></a>
+<span class="sourceLineNo">933</span>   * this method will always return false because the Result must contains all cells in one Row.<a name="line.933"></a>
+<span class="sourceLineNo">934</span>   */<a name="line.934"></a>
+<span class="sourceLineNo">935</span>  public boolean mayHaveMoreCellsInRow() {<a name="line.935"></a>
+<span class="sourceLineNo">936</span>    return mayHaveMoreCellsInRow;<a name="line.936"></a>
+<span class="sourceLineNo">937</span>  }<a name="line.937"></a>
+<span class="sourceLineNo">938</span><a name="line.938"></a>
+<span class="sourceLineNo">939</span>  /**<a name="line.939"></a>
+<span class="sourceLineNo">940</span>   * Set load information about the region to the information about the result<a name="line.940"></a>
+<span class="sourceLineNo">941</span>   * @param loadStats statistics about the current region from which this was returned<a name="line.941"></a>
+<span class="sourceLineNo">942</span>   */<a name="line.942"></a>
+<span class="sourceLineNo">943</span>  @InterfaceAudience.Private<a name="line.943"></a>
+<span class="sourceLineNo">944</span>  public void setStatistics(RegionLoadStats loadStats) {<a name="line.944"></a>
+<span class="sourceLineNo">945</span>    this.stats = loadStats;<a name="line.945"></a>
+<span class="sourceLineNo">946</span>  }<a name="line.946"></a>
+<span class="sourceLineNo">947</span><a name="line.947"></a>
+<span class="sourceLineNo">948</span>  /**<a name="line.948"></a>
+<span class="sourceLineNo">949</span>   * @return the associated statistics about the region from which this was returned. Can be<a name="line.949"></a>
+<span class="sourceLineNo">950</span>   * &lt;tt&gt;null&lt;/tt&gt; if stats are disabled.<a name="line.950"></a>
+<span class="sourceLineNo">951</span>   */<a name="line.951"></a>
+<span class="sourceLineNo">952</span>  public RegionLoadStats getStats() {<a name="line.952"></a>
+<span class="sourceLineNo">953</span>    return stats;<a name="line.953"></a>
+<span class="sourceLineNo">954</span>  }<a name="line.954"></a>
+<span class="sourceLineNo">955</span><a name="line.955"></a>
+<span class="sourceLineNo">956</span>  /**<a name="line.956"></a>
+<span class="sourceLineNo">957</span>   * All methods modifying state of Result object must call this method<a name="line.957"></a>
+<span class="sourceLineNo">958</span>   * to ensure that special purpose immutable Results can't be accidentally modified.<a name="line.958"></a>
+<span class="sourceLineNo">959</span>   */<a name="line.959"></a>
+<span class="sourceLineNo">960</span>  private void checkReadonly() {<a name="line.960"></a>
+<span class="sourceLineNo">961</span>    if (readonly == true) {<a name="line.961"></a>
+<span class="sourceLineNo">962</span>      throw new UnsupportedOperationException("Attempting to modify readonly EMPTY_RESULT!");<a name="line.962"></a>
+<span class="sourceLineNo">963</span>    }<a name="line.963"></a>
+<span class="sourceLineNo">964</span>  }<a name="line.964"></a>
+<span class="sourceLineNo">965</span><a name="line.965"></a>
+<span class="sourceLineNo">966</span>  /**<a name="line.966"></a>
+<span class="sourceLineNo">967</span>   * Return true if this Result is a cursor to tell users where the server has scanned.<a name="line.967"></a>
+<span class="sourceLineNo">968</span>   * In this Result the only meaningful method is {@link #getCursor()}.<a name="line.968"></a>
+<span class="sourceLineNo">969</span>   *<a name="line.969"></a>
+<span class="sourceLineNo">970</span>   * {@code<a name="line.970"></a>
+<span class="sourceLineNo">971</span>   *  while (r = scanner.next() &amp;&amp; r != null) {<a name="line.971"></a>
+<span class="sourceLineNo">972</span>   *    if(r.isCursor()){<a name="line.972"></a>
+<span class="sourceLineNo">973</span>   *    // scanning is not end, it is a cursor, save its row key and close scanner if you want, or<a name="line.973"></a>
+<span class="sourceLineNo">974</span>   *    // just continue the loop to call next().<a name="line.974"></a>
+<span class="sourceLineNo">975</span>   *    } else {<a name="line.975"></a>
+<span class="sourceLineNo">976</span>   *    // just like before<a name="line.976"></a>
+<span class="sourceLineNo">977</span>   *    }<a name="line.977"></a>
+<span class="sourceLineNo">978</span>   *  }<a name="line.978"></a>
+<span class="sourceLineNo">979</span>   *  // scanning is end<a name="line.979"></a>
+<span class="sourceLineNo">980</span>   *<a name="line.980"></a>
+<span class="sourceLineNo">981</span>   * }<a name="line.981"></a>
+<span class="sourceLineNo">982</span>   * {@link Scan#setNeedCursorResult(boolean)}<a name="line.982"></a>
+<span class="sourceLineNo">983</span>   * {@link Cursor}<a name="line.983"></a>
+<span class="sourceLineNo">984</span>   * {@link #getCursor()}<a name="line.984"></a>
+<span class="sourceLineNo">985</span>   */<a name="line.985"></a>
+<span class="sourceLineNo">986</span>  public boolean isCursor() {<a name="line.986"></a>
+<span class="sourceLineNo">987</span>    return cursor != null ;<a name="line.987"></a>
+<span class="sourceLineNo">988</span>  }<a name="line.988"></a>
+<span class="sourceLineNo">989</span><a name="line.989"></a>
+<span class="sourceLineNo">990</span>  /**<a name="line.990"></a>
+<span class="sourceLineNo">991</span>   * Return the cursor if this Result is a cursor result.<a name="line.991"></a>
+<span class="sourceLineNo">992</span>   * {@link Scan#setNeedCursorResult(boolean)}<a name="line.992"></a>
+<span class="sourceLineNo">993</span>   * {@link Cursor}<a name="line.993"></a>
+<span class="sourceLineNo">994</span>   * {@link #isCursor()}<a name="line.994"></a>
+<span class="sourceLineNo">995</span>   */<a name="line.995"></a>
+<span class="sourceLineNo">996</span>  public Cursor getCursor(){<a name="line.996"></a>
+<span class="sourceLineNo">997</span>    return cursor;<a name="line.997"></a>
+<span class="sourceLineNo">998</span>  }<a name="line.998"></a>
+<span class="sourceLineNo">999</span>}<a name="line.999"></a>
 
 
 
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/RoundRobinTableInputFormat.html b/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/RoundRobinTableInputFormat.html
new file mode 100644
index 0000000..baecc4c
--- /dev/null
+++ b/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/RoundRobinTableInputFormat.html
@@ -0,0 +1,245 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html lang="en">
+<head>
+<title>Source code</title>
+<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
+</head>
+<body>
+<div class="sourceContainer">
+<pre><span class="sourceLineNo">001</span>/*<a name="line.1"></a>
+<span class="sourceLineNo">002</span> * Licensed to the Apache Software Foundation (ASF) under one<a name="line.2"></a>
+<span class="sourceLineNo">003</span> * or more contributor license agreements.  See the NOTICE file<a name="line.3"></a>
+<span class="sourceLineNo">004</span> * distributed with this work for additional information<a name="line.4"></a>
+<span class="sourceLineNo">005</span> * regarding copyright ownership.  The ASF licenses this file<a name="line.5"></a>
+<span class="sourceLineNo">006</span> * to you under the Apache License, Version 2.0 (the<a name="line.6"></a>
+<span class="sourceLineNo">007</span> * "License"); you may not use this file except in compliance<a name="line.7"></a>
+<span class="sourceLineNo">008</span> * with the License.  You may obtain a copy of the License at<a name="line.8"></a>
+<span class="sourceLineNo">009</span> *<a name="line.9"></a>
+<span class="sourceLineNo">010</span> *     http://www.apache.org/licenses/LICENSE-2.0<a name="line.10"></a>
+<span class="sourceLineNo">011</span> *<a name="line.11"></a>
+<span class="sourceLineNo">012</span> * Unless required by applicable law or agreed to in writing, software<a name="line.12"></a>
+<span class="sourceLineNo">013</span> * distributed under the License is distributed on an "AS IS" BASIS,<a name="line.13"></a>
+<span class="sourceLineNo">014</span> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<a name="line.14"></a>
+<span class="sourceLineNo">015</span> * See the License for the specific language governing permissions and<a name="line.15"></a>
+<span class="sourceLineNo">016</span> * limitations under the License.<a name="line.16"></a>
+<span class="sourceLineNo">017</span> */<a name="line.17"></a>
+<span class="sourceLineNo">018</span>package org.apache.hadoop.hbase.mapreduce;<a name="line.18"></a>
+<span class="sourceLineNo">019</span><a name="line.19"></a>
+<span class="sourceLineNo">020</span>import java.io.IOException;<a name="line.20"></a>
+<span class="sourceLineNo">021</span>import java.util.ArrayList;<a name="line.21"></a>
+<span class="sourceLineNo">022</span>import java.util.Iterator;<a name="line.22"></a>
+<span class="sourceLineNo">023</span>import java.util.LinkedList;<a name="line.23"></a>
+<span class="sourceLineNo">024</span>import java.util.Map;<a name="line.24"></a>
+<span class="sourceLineNo">025</span>import java.util.HashMap;<a name="line.25"></a>
+<span class="sourceLineNo">026</span>import java.util.List;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import org.apache.hadoop.conf.Configuration;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.HBaseConfiguration;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.HConstants;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import org.apache.hadoop.mapreduce.InputSplit;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import org.apache.hadoop.mapreduce.JobContext;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import org.apache.hadoop.mapreduce.JobID;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.apache.hadoop.mapreduce.task.JobContextImpl;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.34"></a>
+<span class="sourceLineNo">035</span><a name="line.35"></a>
+<span class="sourceLineNo">036</span>/**<a name="line.36"></a>
+<span class="sourceLineNo">037</span> * Process the return from super-class {@link TableInputFormat} (TIF) so as to undo any clumping of<a name="line.37"></a>
+<span class="sourceLineNo">038</span> * {@link InputSplit}s around RegionServers. Spread splits broadly to distribute read-load over<a name="line.38"></a>
+<span class="sourceLineNo">039</span> * RegionServers in the cluster. The super-class TIF returns splits in hbase:meta table order.<a name="line.39"></a>
+<span class="sourceLineNo">040</span> * Adjacent or near-adjacent hbase:meta Regions can be hosted on the same RegionServer -- nothing<a name="line.40"></a>
+<span class="sourceLineNo">041</span> * prevents this. This hbase:maeta ordering of InputSplit placement can be lumpy making it so some<a name="line.41"></a>
+<span class="sourceLineNo">042</span> * RegionServers end up hosting lots of InputSplit scans while contemporaneously other RegionServers<a name="line.42"></a>
+<span class="sourceLineNo">043</span> * host few or none. This class does a pass over the return from the super-class to better spread<a name="line.43"></a>
+<span class="sourceLineNo">044</span> * the load. See the below helpful Flipkart blog post for a description and from where the base of<a name="line.44"></a>
+<span class="sourceLineNo">045</span> * this code comes from (with permission).<a name="line.45"></a>
+<span class="sourceLineNo">046</span> * @see https://tech.flipkart.com/is-data-locality-always-out-of-the-box-in-hadoop-not-really-2ae9c95163cb<a name="line.46"></a>
+<span class="sourceLineNo">047</span> */<a name="line.47"></a>
+<span class="sourceLineNo">048</span>@InterfaceAudience.Public<a name="line.48"></a>
+<span class="sourceLineNo">049</span>public class RoundRobinTableInputFormat extends TableInputFormat {<a name="line.49"></a>
+<span class="sourceLineNo">050</span>  private Boolean hbaseRegionsizecalculatorEnableOriginalValue = null;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>  /**<a name="line.51"></a>
+<span class="sourceLineNo">052</span>   * Boolean config for whether superclass should produce InputSplits with 'lengths'. If true, TIF<a name="line.52"></a>
+<span class="sourceLineNo">053</span>   * will query every RegionServer to get the 'size' of all involved Regions and this 'size' will<a name="line.53"></a>
+<span class="sourceLineNo">054</span>   * be used the the InputSplit length. If false, we skip this query and the super-classes<a name="line.54"></a>
+<span class="sourceLineNo">055</span>   * returned InputSplits will have lenghths of zero. This override will set the flag to false.<a name="line.55"></a>
+<span class="sourceLineNo">056</span>   * All returned lengths will be zero. Makes it so sorting on 'length' becomes a noop. The sort<a name="line.56"></a>
+<span class="sourceLineNo">057</span>   * returned by this override will prevail. Thats what we want.<a name="line.57"></a>
+<span class="sourceLineNo">058</span>   */<a name="line.58"></a>
+<span class="sourceLineNo">059</span>  static String HBASE_REGIONSIZECALCULATOR_ENABLE = "hbase.regionsizecalculator.enable";<a name="line.59"></a>
+<span class="sourceLineNo">060</span><a name="line.60"></a>
+<span class="sourceLineNo">061</span>  @Override<a name="line.61"></a>
+<span class="sourceLineNo">062</span>  public List&lt;InputSplit&gt; getSplits(JobContext context) throws IOException {<a name="line.62"></a>
+<span class="sourceLineNo">063</span>    try {<a name="line.63"></a>
+<span class="sourceLineNo">064</span>      // Do a round robin on what we get back from the super-class.<a name="line.64"></a>
+<span class="sourceLineNo">065</span>      configure();<a name="line.65"></a>
+<span class="sourceLineNo">066</span>      return roundRobin(getSuperSplits(context));<a name="line.66"></a>
+<span class="sourceLineNo">067</span>    } finally {<a name="line.67"></a>
+<span class="sourceLineNo">068</span>      unconfigure();<a name="line.68"></a>
+<span class="sourceLineNo">069</span>    }<a name="line.69"></a>
+<span class="sourceLineNo">070</span>  }<a name="line.70"></a>
+<span class="sourceLineNo">071</span><a name="line.71"></a>
+<span class="sourceLineNo">072</span>  /**<a name="line.72"></a>
+<span class="sourceLineNo">073</span>   * Call super-classes' getSplits. Have it out here as its own method so can be overridden.<a name="line.73"></a>
+<span class="sourceLineNo">074</span>   */<a name="line.74"></a>
+<span class="sourceLineNo">075</span>  List&lt;InputSplit&gt; getSuperSplits(JobContext context) throws IOException {<a name="line.75"></a>
+<span class="sourceLineNo">076</span>    return super.getSplits(context);<a name="line.76"></a>
+<span class="sourceLineNo">077</span>  }<a name="line.77"></a>
+<span class="sourceLineNo">078</span><a name="line.78"></a>
+<span class="sourceLineNo">079</span>  /**<a name="line.79"></a>
+<span class="sourceLineNo">080</span>   * Spread the splits list so as to avoid clumping on RegionServers. Order splits so every server<a name="line.80"></a>
+<span class="sourceLineNo">081</span>   * gets one split before a server gets a second, and so on; i.e. round-robin the splits amongst<a name="line.81"></a>
+<span class="sourceLineNo">082</span>   * the servers in the cluster.<a name="line.82"></a>
+<span class="sourceLineNo">083</span>   */<a name="line.83"></a>
+<span class="sourceLineNo">084</span>  List&lt;InputSplit&gt; roundRobin(List&lt;InputSplit&gt; inputs) throws IOException {<a name="line.84"></a>
+<span class="sourceLineNo">085</span>    if ((inputs == null) || inputs.isEmpty()) {<a name="line.85"></a>
+<span class="sourceLineNo">086</span>      return inputs;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>    }<a name="line.87"></a>
+<span class="sourceLineNo">088</span>    List&lt;InputSplit&gt; result = new ArrayList&lt;&gt;(inputs.size());<a name="line.88"></a>
+<span class="sourceLineNo">089</span>    // Prepare a hashmap with each region server as key and list of Input Splits as value<a name="line.89"></a>
+<span class="sourceLineNo">090</span>    Map&lt;String, List&lt;InputSplit&gt;&gt; regionServerSplits = new HashMap&lt;&gt;();<a name="line.90"></a>
+<span class="sourceLineNo">091</span>    for (InputSplit is: inputs) {<a name="line.91"></a>
+<span class="sourceLineNo">092</span>      if (is instanceof TableSplit) {<a name="line.92"></a>
+<span class="sourceLineNo">093</span>        String regionServer = ((TableSplit)is).getRegionLocation();<a name="line.93"></a>
+<span class="sourceLineNo">094</span>        if (regionServer != null &amp;&amp; !regionServer.isEmpty()) {<a name="line.94"></a>
+<span class="sourceLineNo">095</span>          regionServerSplits.computeIfAbsent(regionServer, k -&gt; new LinkedList&lt;&gt;()).add(is);<a name="line.95"></a>
+<span class="sourceLineNo">096</span>          continue;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>        }<a name="line.97"></a>
+<span class="sourceLineNo">098</span>      }<a name="line.98"></a>
+<span class="sourceLineNo">099</span>      // If TableSplit or region server not found, add it anyways.<a name="line.99"></a>
+<span class="sourceLineNo">100</span>      result.add(is);<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    }<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    // Write out splits in a manner that spreads splits for a RegionServer to avoid 'clumping'.<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    while (!regionServerSplits.isEmpty()) {<a name="line.103"></a>
+<span class="sourceLineNo">104</span>      Iterator&lt;String&gt; iterator = regionServerSplits.keySet().iterator();<a name="line.104"></a>
+<span class="sourceLineNo">105</span>      while (iterator.hasNext()) {<a name="line.105"></a>
+<span class="sourceLineNo">106</span>        String regionServer = iterator.next();<a name="line.106"></a>
+<span class="sourceLineNo">107</span>        List&lt;InputSplit&gt; inputSplitListForRegion = regionServerSplits.get(regionServer);<a name="line.107"></a>
+<span class="sourceLineNo">108</span>        if (!inputSplitListForRegion.isEmpty()) {<a name="line.108"></a>
+<span class="sourceLineNo">109</span>          result.add(inputSplitListForRegion.remove(0));<a name="line.109"></a>
+<span class="sourceLineNo">110</span>        }<a name="line.110"></a>
+<span class="sourceLineNo">111</span>        if (inputSplitListForRegion.isEmpty()) {<a name="line.111"></a>
+<span class="sourceLineNo">112</span>          iterator.remove();<a name="line.112"></a>
+<span class="sourceLineNo">113</span>        }<a name="line.113"></a>
+<span class="sourceLineNo">114</span>      }<a name="line.114"></a>
+<span class="sourceLineNo">115</span>    }<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    return result;<a name="line.116"></a>
+<span class="sourceLineNo">117</span>  }<a name="line.117"></a>
+<span class="sourceLineNo">118</span><a name="line.118"></a>
+<span class="sourceLineNo">119</span>  /**<a name="line.119"></a>
+<span class="sourceLineNo">120</span>   * Adds a configuration to the Context disabling remote rpc'ing to figure Region size<a name="line.120"></a>
+<span class="sourceLineNo">121</span>   * when calculating InputSplits. See up in super-class TIF where we rpc to every server to find<a name="line.121"></a>
+<span class="sourceLineNo">122</span>   * the size of all involved Regions. Here we disable this super-class action. This means<a name="line.122"></a>
+<span class="sourceLineNo">123</span>   * InputSplits will have a length of zero. If all InputSplits have zero-length InputSplits, the<a name="line.123"></a>
+<span class="sourceLineNo">124</span>   * ordering done in here will 'pass-through' Hadoop's length-first sort. The superclass TIF will<a name="line.124"></a>
+<span class="sourceLineNo">125</span>   * ask every node for the current size of each of the participating Table Regions. It does this<a name="line.125"></a>
+<span class="sourceLineNo">126</span>   * because it wants to schedule the biggest Regions first (This fixation comes of hadoop itself<a name="line.126"></a>
+<span class="sourceLineNo">127</span>   * -- see JobSubmitter where it sorts inputs by size). This extra diligence takes time and is of<a name="line.127"></a>
+<span class="sourceLineNo">128</span>   * no utility in this RRTIF where spread is of more import than size-first. Also, if a rolling<a name="line.128"></a>
+<span class="sourceLineNo">129</span>   * restart is happening when we go to launch the job, the job launch may fail because the request<a name="line.129"></a>
+<span class="sourceLineNo">130</span>   * for Region size fails -- even after retries -- because rolled RegionServer may take a while to<a name="line.130"></a>
+<span class="sourceLineNo">131</span>   * come online: e.g. it takes java 90 seconds to allocate a 160G. RegionServer is offline during<a name="line.131"></a>
+<span class="sourceLineNo">132</span>   * this time. The job launch will fail with 'Connection rejected'. So, we set<a name="line.132"></a>
+<span class="sourceLineNo">133</span>   * 'hbase.regionsizecalculator.enable' to false here in RRTIF.<a name="line.133"></a>
+<span class="sourceLineNo">134</span>   * @see #unconfigure()<a name="line.134"></a>
+<span class="sourceLineNo">135</span>   */<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  void configure() {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    if (getConf().get(HBASE_REGIONSIZECALCULATOR_ENABLE) != null) {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>      this.hbaseRegionsizecalculatorEnableOriginalValue = getConf().<a name="line.138"></a>
+<span class="sourceLineNo">139</span>        getBoolean(HBASE_REGIONSIZECALCULATOR_ENABLE, true);<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    }<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    getConf().setBoolean(HBASE_REGIONSIZECALCULATOR_ENABLE, false);<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  }<a name="line.142"></a>
+<span class="sourceLineNo">143</span><a name="line.143"></a>
+<span class="sourceLineNo">144</span>  /**<a name="line.144"></a>
+<span class="sourceLineNo">145</span>   * @see #configure()<a name="line.145"></a>
+<span class="sourceLineNo">146</span>   */<a name="line.146"></a>
+<span class="sourceLineNo">147</span>  void unconfigure() {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    if (this.hbaseRegionsizecalculatorEnableOriginalValue == null) {<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      getConf().unset(HBASE_REGIONSIZECALCULATOR_ENABLE);<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    } else {<a name="line.150"></a>
+<span class="sourceLineNo">151</span>      getConf().setBoolean(HBASE_REGIONSIZECALCULATOR_ENABLE,<a name="line.151"></a>
+<span class="sourceLineNo">152</span>        this.hbaseRegionsizecalculatorEnableOriginalValue);<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    }<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  }<a name="line.154"></a>
+<span class="sourceLineNo">155</span><a name="line.155"></a>
+<span class="sourceLineNo">156</span>  /**<a name="line.156"></a>
+<span class="sourceLineNo">157</span>   * Pass table name as argument. Set the zk ensemble to use with the System property<a name="line.157"></a>
+<span class="sourceLineNo">158</span>   * 'hbase.zookeeper.quorum'<a name="line.158"></a>
+<span class="sourceLineNo">159</span>   */<a name="line.159"></a>
+<span class="sourceLineNo">160</span>  public static void main(String[] args) throws IOException {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    TableInputFormat tif = new RoundRobinTableInputFormat();<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    final Configuration configuration = HBaseConfiguration.create();<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    configuration.setBoolean("hbase.regionsizecalculator.enable", false);<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    configuration.set(HConstants.ZOOKEEPER_QUORUM,<a name="line.164"></a>
+<span class="sourceLineNo">165</span>      System.getProperty(HConstants.ZOOKEEPER_QUORUM, "localhost"));<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    configuration.set(TableInputFormat.INPUT_TABLE, args[0]);<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    tif.setConf(configuration);<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    List&lt;InputSplit&gt; splits = tif.getSplits(new JobContextImpl(configuration, new JobID()));<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    for (InputSplit split: splits) {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>      System.out.println(split);<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    }<a name="line.171"></a>
+<span class="sourceLineNo">172</span>  }<a name="line.172"></a>
+<span class="sourceLineNo">173</span>}<a name="line.173"></a>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+</pre>
+</div>
+</body>
+</html>
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html b/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html
index b795370..6c40553 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html
@@ -79,995 +79,1005 @@
 <span class="sourceLineNo">071</span>@InterfaceAudience.Public<a name="line.71"></a>
 <span class="sourceLineNo">072</span>public class TableMapReduceUtil {<a name="line.72"></a>
 <span class="sourceLineNo">073</span>  private static final Logger LOG = LoggerFactory.getLogger(TableMapReduceUtil.class);<a name="line.73"></a>
-<span class="sourceLineNo">074</span><a name="line.74"></a>
-<span class="sourceLineNo">075</span>  /**<a name="line.75"></a>
-<span class="sourceLineNo">076</span>   * Use this before submitting a TableMap job. It will appropriately set up<a name="line.76"></a>
-<span class="sourceLineNo">077</span>   * the job.<a name="line.77"></a>
-<span class="sourceLineNo">078</span>   *<a name="line.78"></a>
-<span class="sourceLineNo">079</span>   * @param table  The table name to read from.<a name="line.79"></a>
-<span class="sourceLineNo">080</span>   * @param scan  The scan instance with the columns, time range etc.<a name="line.80"></a>
-<span class="sourceLineNo">081</span>   * @param mapper  The mapper class to use.<a name="line.81"></a>
-<span class="sourceLineNo">082</span>   * @param outputKeyClass  The class of the output key.<a name="line.82"></a>
-<span class="sourceLineNo">083</span>   * @param outputValueClass  The class of the output value.<a name="line.83"></a>
-<span class="sourceLineNo">084</span>   * @param job  The current job to adjust.  Make sure the passed job is<a name="line.84"></a>
-<span class="sourceLineNo">085</span>   * carrying all necessary HBase configuration.<a name="line.85"></a>
-<span class="sourceLineNo">086</span>   * @throws IOException When setting up the details fails.<a name="line.86"></a>
-<span class="sourceLineNo">087</span>   */<a name="line.87"></a>
-<span class="sourceLineNo">088</span>  public static void initTableMapperJob(String table, Scan scan,<a name="line.88"></a>
-<span class="sourceLineNo">089</span>      Class&lt;? extends TableMapper&gt; mapper,<a name="line.89"></a>
-<span class="sourceLineNo">090</span>      Class&lt;?&gt; outputKeyClass,<a name="line.90"></a>
-<span class="sourceLineNo">091</span>      Class&lt;?&gt; outputValueClass, Job job)<a name="line.91"></a>
-<span class="sourceLineNo">092</span>  throws IOException {<a name="line.92"></a>
-<span class="sourceLineNo">093</span>    initTableMapperJob(table, scan, mapper, outputKeyClass, outputValueClass,<a name="line.93"></a>
-<span class="sourceLineNo">094</span>        job, true);<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  }<a name="line.95"></a>
-<span class="sourceLineNo">096</span><a name="line.96"></a>
+<span class="sourceLineNo">074</span>  public static final String TABLE_INPUT_CLASS_KEY = "hbase.table.input.class";<a name="line.74"></a>
+<span class="sourceLineNo">075</span><a name="line.75"></a>
+<span class="sourceLineNo">076</span>  /**<a name="line.76"></a>
+<span class="sourceLineNo">077</span>   * Use this before submitting a TableMap job. It will appropriately set up<a name="line.77"></a>
+<span class="sourceLineNo">078</span>   * the job.<a name="line.78"></a>
+<span class="sourceLineNo">079</span>   *<a name="line.79"></a>
+<span class="sourceLineNo">080</span>   * @param table  The table name to read from.<a name="line.80"></a>
+<span class="sourceLineNo">081</span>   * @param scan  The scan instance with the columns, time range etc.<a name="line.81"></a>
+<span class="sourceLineNo">082</span>   * @param mapper  The mapper class to use.<a name="line.82"></a>
+<span class="sourceLineNo">083</span>   * @param outputKeyClass  The class of the output key.<a name="line.83"></a>
+<span class="sourceLineNo">084</span>   * @param outputValueClass  The class of the output value.<a name="line.84"></a>
+<span class="sourceLineNo">085</span>   * @param job  The current job to adjust.  Make sure the passed job is<a name="line.85"></a>
+<span class="sourceLineNo">086</span>   * carrying all necessary HBase configuration.<a name="line.86"></a>
+<span class="sourceLineNo">087</span>   * @throws IOException When setting up the details fails.<a name="line.87"></a>
+<span class="sourceLineNo">088</span>   */<a name="line.88"></a>
+<span class="sourceLineNo">089</span>  public static void initTableMapperJob(String table, Scan scan,<a name="line.89"></a>
+<span class="sourceLineNo">090</span>      Class&lt;? extends TableMapper&gt; mapper,<a name="line.90"></a>
+<span class="sourceLineNo">091</span>      Class&lt;?&gt; outputKeyClass,<a name="line.91"></a>
+<span class="sourceLineNo">092</span>      Class&lt;?&gt; outputValueClass, Job job)<a name="line.92"></a>
+<span class="sourceLineNo">093</span>  throws IOException {<a name="line.93"></a>
+<span class="sourceLineNo">094</span>    initTableMapperJob(table, scan, mapper, outputKeyClass, outputValueClass,<a name="line.94"></a>
+<span class="sourceLineNo">095</span>        job, true);<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  }<a name="line.96"></a>
 <span class="sourceLineNo">097</span><a name="line.97"></a>
-<span class="sourceLineNo">098</span>  /**<a name="line.98"></a>
-<span class="sourceLineNo">099</span>   * Use this before submitting a TableMap job. It will appropriately set up<a name="line.99"></a>
-<span class="sourceLineNo">100</span>   * the job.<a name="line.100"></a>
-<span class="sourceLineNo">101</span>   *<a name="line.101"></a>
-<span class="sourceLineNo">102</span>   * @param table  The table name to read from.<a name="line.102"></a>
-<span class="sourceLineNo">103</span>   * @param scan  The scan instance with the columns, time range etc.<a name="line.103"></a>
-<span class="sourceLineNo">104</span>   * @param mapper  The mapper class to use.<a name="line.104"></a>
-<span class="sourceLineNo">105</span>   * @param outputKeyClass  The class of the output key.<a name="line.105"></a>
-<span class="sourceLineNo">106</span>   * @param outputValueClass  The class of the output value.<a name="line.106"></a>
-<span class="sourceLineNo">107</span>   * @param job  The current job to adjust.  Make sure the passed job is<a name="line.107"></a>
-<span class="sourceLineNo">108</span>   * carrying all necessary HBase configuration.<a name="line.108"></a>
-<span class="sourceLineNo">109</span>   * @throws IOException When setting up the details fails.<a name="line.109"></a>
-<span class="sourceLineNo">110</span>   */<a name="line.110"></a>
-<span class="sourceLineNo">111</span>  public static void initTableMapperJob(TableName table,<a name="line.111"></a>
-<span class="sourceLineNo">112</span>      Scan scan,<a name="line.112"></a>
-<span class="sourceLineNo">113</span>      Class&lt;? extends TableMapper&gt; mapper,<a name="line.113"></a>
-<span class="sourceLineNo">114</span>      Class&lt;?&gt; outputKeyClass,<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      Class&lt;?&gt; outputValueClass,<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      Job job) throws IOException {<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    initTableMapperJob(table.getNameAsString(),<a name="line.117"></a>
-<span class="sourceLineNo">118</span>        scan,<a name="line.118"></a>
-<span class="sourceLineNo">119</span>        mapper,<a name="line.119"></a>
-<span class="sourceLineNo">120</span>        outputKeyClass,<a name="line.120"></a>
-<span class="sourceLineNo">121</span>        outputValueClass,<a name="line.121"></a>
-<span class="sourceLineNo">122</span>        job,<a name="line.122"></a>
-<span class="sourceLineNo">123</span>        true);<a name="line.123"></a>
-<span class="sourceLineNo">124</span>  }<a name="line.124"></a>
-<span class="sourceLineNo">125</span><a name="line.125"></a>
-<span class="sourceLineNo">126</span>  /**<a name="line.126"></a>
-<span class="sourceLineNo">127</span>   * Use this before submitting a TableMap job. It will appropriately set up<a name="line.127"></a>
-<span class="sourceLineNo">128</span>   * the job.<a name="line.128"></a>
-<span class="sourceLineNo">129</span>   *<a name="line.129"></a>
-<span class="sourceLineNo">130</span>   * @param table Binary representation of the table name to read from.<a name="line.130"></a>
-<span class="sourceLineNo">131</span>   * @param scan  The scan instance with the columns, time range etc.<a name="line.131"></a>
-<span class="sourceLineNo">132</span>   * @param mapper  The mapper class to use.<a name="line.132"></a>
-<span class="sourceLineNo">133</span>   * @param outputKeyClass  The class of the output key.<a name="line.133"></a>
-<span class="sourceLineNo">134</span>   * @param outputValueClass  The class of the output value.<a name="line.134"></a>
-<span class="sourceLineNo">135</span>   * @param job  The current job to adjust.  Make sure the passed job is<a name="line.135"></a>
-<span class="sourceLineNo">136</span>   * carrying all necessary HBase configuration.<a name="line.136"></a>
-<span class="sourceLineNo">137</span>   * @throws IOException When setting up the details fails.<a name="line.137"></a>
-<span class="sourceLineNo">138</span>   */<a name="line.138"></a>
-<span class="sourceLineNo">139</span>   public static void initTableMapperJob(byte[] table, Scan scan,<a name="line.139"></a>
-<span class="sourceLineNo">140</span>      Class&lt;? extends TableMapper&gt; mapper,<a name="line.140"></a>
-<span class="sourceLineNo">141</span>      Class&lt;?&gt; outputKeyClass,<a name="line.141"></a>
-<span class="sourceLineNo">142</span>      Class&lt;?&gt; outputValueClass, Job job)<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  throws IOException {<a name="line.143"></a>
-<span class="sourceLineNo">144</span>      initTableMapperJob(Bytes.toString(table), scan, mapper, outputKeyClass, outputValueClass,<a name="line.144"></a>
-<span class="sourceLineNo">145</span>              job, true);<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  }<a name="line.146"></a>
-<span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>   /**<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    * Use this before submitting a TableMap job. It will appropriately set up<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    * the job.<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    *<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    * @param table  The table name to read from.<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    * @param scan  The scan instance with the columns, time range etc.<a name="line.153"></a>
-<span class="sourceLineNo">154</span>    * @param mapper  The mapper class to use.<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    * @param outputKeyClass  The class of the output key.<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    * @param outputValueClass  The class of the output value.<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    * @param job  The current job to adjust.  Make sure the passed job is<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    * carrying all necessary HBase configuration.<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    * @param addDependencyJars upload HBase jars and jars for any of the configured<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    *           job classes via the distributed cache (tmpjars).<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    * @throws IOException When setting up the details fails.<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    */<a name="line.162"></a>
-<span class="sourceLineNo">163</span>   public static void initTableMapperJob(String table, Scan scan,<a name="line.163"></a>
-<span class="sourceLineNo">164</span>       Class&lt;? extends TableMapper&gt; mapper,<a name="line.164"></a>
-<span class="sourceLineNo">165</span>       Class&lt;?&gt; outputKeyClass,<a name="line.165"></a>
-<span class="sourceLineNo">166</span>       Class&lt;?&gt; outputValueClass, Job job,<a name="line.166"></a>
-<span class="sourceLineNo">167</span>       boolean addDependencyJars, Class&lt;? extends InputFormat&gt; inputFormatClass)<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   throws IOException {<a name="line.168"></a>
-<span class="sourceLineNo">169</span>     initTableMapperJob(table, scan, mapper, outputKeyClass, outputValueClass, job,<a name="line.169"></a>
-<span class="sourceLineNo">170</span>         addDependencyJars, true, inputFormatClass);<a name="line.170"></a>
-<span class="sourceLineNo">171</span>   }<a name="line.171"></a>
-<span class="sourceLineNo">172</span><a name="line.172"></a>
+<span class="sourceLineNo">098</span><a name="line.98"></a>
+<span class="sourceLineNo">099</span>  /**<a name="line.99"></a>
+<span class="sourceLineNo">100</span>   * Use this before submitting a TableMap job. It will appropriately set up<a name="line.100"></a>
+<span class="sourceLineNo">101</span>   * the job.<a name="line.101"></a>
+<span class="sourceLineNo">102</span>   *<a name="line.102"></a>
+<span class="sourceLineNo">103</span>   * @param table  The table name to read from.<a name="line.103"></a>
+<span class="sourceLineNo">104</span>   * @param scan  The scan instance with the columns, time range etc.<a name="line.104"></a>
+<span class="sourceLineNo">105</span>   * @param mapper  The mapper class to use.<a name="line.105"></a>
+<span class="sourceLineNo">106</span>   * @param outputKeyClass  The class of the output key.<a name="line.106"></a>
+<span class="sourceLineNo">107</span>   * @param outputValueClass  The class of the output value.<a name="line.107"></a>
+<span class="sourceLineNo">108</span>   * @param job  The current job to adjust.  Make sure the passed job is<a name="line.108"></a>
+<span class="sourceLineNo">109</span>   * carrying all necessary HBase configuration.<a name="line.109"></a>
+<span class="sourceLineNo">110</span>   * @throws IOException When setting up the details fails.<a name="line.110"></a>
+<span class="sourceLineNo">111</span>   */<a name="line.111"></a>
+<span class="sourceLineNo">112</span>  public static void initTableMapperJob(TableName table,<a name="line.112"></a>
+<span class="sourceLineNo">113</span>      Scan scan,<a name="line.113"></a>
+<span class="sourceLineNo">114</span>      Class&lt;? extends TableMapper&gt; mapper,<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      Class&lt;?&gt; outputKeyClass,<a name="line.115"></a>
+<span class="sourceLineNo">116</span>      Class&lt;?&gt; outputValueClass,<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      Job job) throws IOException {<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    initTableMapperJob(table.getNameAsString(),<a name="line.118"></a>
+<span class="sourceLineNo">119</span>        scan,<a name="line.119"></a>
+<span class="sourceLineNo">120</span>        mapper,<a name="line.120"></a>
+<span class="sourceLineNo">121</span>        outputKeyClass,<a name="line.121"></a>
+<span class="sourceLineNo">122</span>        outputValueClass,<a name="line.122"></a>
+<span class="sourceLineNo">123</span>        job,<a name="line.123"></a>
+<span class="sourceLineNo">124</span>        true);<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  }<a name="line.125"></a>
+<span class="sourceLineNo">126</span><a name="line.126"></a>
+<span class="sourceLineNo">127</span>  /**<a name="line.127"></a>
+<span class="sourceLineNo">128</span>   * Use this before submitting a TableMap job. It will appropriately set up<a name="line.128"></a>
+<span class="sourceLineNo">129</span>   * the job.<a name="line.129"></a>
+<span class="sourceLineNo">130</span>   *<a name="line.130"></a>
+<span class="sourceLineNo">131</span>   * @param table Binary representation of the table name to read from.<a name="line.131"></a>
+<span class="sourceLineNo">132</span>   * @param scan  The scan instance with the columns, time range etc.<a name="line.132"></a>
+<span class="sourceLineNo">133</span>   * @param mapper  The mapper class to use.<a name="line.133"></a>
+<span class="sourceLineNo">134</span>   * @param outputKeyClass  The class of the output key.<a name="line.134"></a>
+<span class="sourceLineNo">135</span>   * @param outputValueClass  The class of the output value.<a name="line.135"></a>
+<span class="sourceLineNo">136</span>   * @param job  The current job to adjust.  Make sure the passed job is<a name="line.136"></a>
+<span class="sourceLineNo">137</span>   * carrying all necessary HBase configuration.<a name="line.137"></a>
+<span class="sourceLineNo">138</span>   * @throws IOException When setting up the details fails.<a name="line.138"></a>
+<span class="sourceLineNo">139</span>   */<a name="line.139"></a>
+<span class="sourceLineNo">140</span>   public static void initTableMapperJob(byte[] table, Scan scan,<a name="line.140"></a>
+<span class="sourceLineNo">141</span>      Class&lt;? extends TableMapper&gt; mapper,<a name="line.141"></a>
+<span class="sourceLineNo">142</span>      Class&lt;?&gt; outputKeyClass,<a name="line.142"></a>
+<span class="sourceLineNo">143</span>      Class&lt;?&gt; outputValueClass, Job job)<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  throws IOException {<a name="line.144"></a>
+<span class="sourceLineNo">145</span>      initTableMapperJob(Bytes.toString(table), scan, mapper, outputKeyClass, outputValueClass,<a name="line.145"></a>
+<span class="sourceLineNo">146</span>              job, true);<a name="line.146"></a>
+<span class="sourceLineNo">147</span>  }<a name="line.147"></a>
+<span class="sourceLineNo">148</span><a name="line.148"></a>
+<span class="sourceLineNo">149</span>   /**<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    * Use this before submitting a TableMap job. It will appropriately set up<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    * the job.<a name="line.151"></a>
+<span class="sourceLineNo">152</span>    *<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    * @param table  The table name to read from.<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    * @param scan  The scan instance with the columns, time range etc.<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    * @param mapper  The mapper class to use.<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    * @param outputKeyClass  The class of the output key.<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    * @param outputValueClass  The class of the output value.<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    * @param job  The current job to adjust.  Make sure the passed job is<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    * carrying all necessary HBase configuration.<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    * @param addDependencyJars upload HBase jars and jars for any of the configured<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    *           job classes via the distributed cache (tmpjars).<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    * @throws IOException When setting up the details fails.<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    */<a name="line.163"></a>
+<span class="sourceLineNo">164</span>   public static void initTableMapperJob(String table, Scan scan,<a name="line.164"></a>
+<span class="sourceLineNo">165</span>       Class&lt;? extends TableMapper&gt; mapper,<a name="line.165"></a>
+<span class="sourceLineNo">166</span>       Class&lt;?&gt; outputKeyClass,<a name="line.166"></a>
+<span class="sourceLineNo">167</span>       Class&lt;?&gt; outputValueClass, Job job,<a name="line.167"></a>
+<span class="sourceLineNo">168</span>       boolean addDependencyJars, Class&lt;? extends InputFormat&gt; inputFormatClass)<a name="line.168"></a>
+<span class="sourceLineNo">169</span>   throws IOException {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>     initTableMapperJob(table, scan, mapper, outputKeyClass, outputValueClass, job,<a name="line.170"></a>
+<span class="sourceLineNo">171</span>         addDependencyJars, true, inputFormatClass);<a name="line.171"></a>
+<span class="sourceLineNo">172</span>   }<a name="line.172"></a>
 <span class="sourceLineNo">173</span><a name="line.173"></a>
-<span class="sourceLineNo">174</span>  /**<a name="line.174"></a>
-<span class="sourceLineNo">175</span>   * Use this before submitting a TableMap job. It will appropriately set up<a name="line.175"></a>
-<span class="sourceLineNo">176</span>   * the job.<a name="line.176"></a>
-<span class="sourceLineNo">177</span>   *<a name="line.177"></a>
-<span class="sourceLineNo">178</span>   * @param table  The table name to read from.<a name="line.178"></a>
-<span class="sourceLineNo">179</span>   * @param scan  The scan instance with the columns, time range etc.<a name="line.179"></a>
-<span class="sourceLineNo">180</span>   * @param mapper  The mapper class to use.<a name="line.180"></a>
-<span class="sourceLineNo">181</span>   * @param outputKeyClass  The class of the output key.<a name="line.181"></a>
-<span class="sourceLineNo">182</span>   * @param outputValueClass  The class of the output value.<a name="line.182"></a>
-<span class="sourceLineNo">183</span>   * @param job  The current job to adjust.  Make sure the passed job is<a name="line.183"></a>
-<span class="sourceLineNo">184</span>   * carrying all necessary HBase configuration.<a name="line.184"></a>
-<span class="sourceLineNo">185</span>   * @param addDependencyJars upload HBase jars and jars for any of the configured<a name="line.185"></a>
-<span class="sourceLineNo">186</span>   *           job classes via the distributed cache (tmpjars).<a name="line.186"></a>
-<span class="sourceLineNo">187</span>   * @param initCredentials whether to initialize hbase auth credentials for the job<a name="line.187"></a>
-<span class="sourceLineNo">188</span>   * @param inputFormatClass the input format<a name="line.188"></a>
-<span class="sourceLineNo">189</span>   * @throws IOException When setting up the details fails.<a name="line.189"></a>
-<span class="sourceLineNo">190</span>   */<a name="line.190"></a>
-<span class="sourceLineNo">191</span>  public static void initTableMapperJob(String table, Scan scan,<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      Class&lt;? extends TableMapper&gt; mapper,<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      Class&lt;?&gt; outputKeyClass,<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      Class&lt;?&gt; outputValueClass, Job job,<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      boolean addDependencyJars, boolean initCredentials,<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      Class&lt;? extends InputFormat&gt; inputFormatClass)<a name="line.196"></a>
-<span class="sourceLineNo">197</span>  throws IOException {<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    job.setInputFormatClass(inputFormatClass);<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    if (outputValueClass != null) job.setMapOutputValueClass(outputValueClass);<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    if (outputKeyClass != null) job.setMapOutputKeyClass(outputKeyClass);<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    job.setMapperClass(mapper);<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    if (Put.class.equals(outputValueClass)) {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      job.setCombinerClass(PutCombiner.class);<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    }<a name="line.204"></a>
-<span class="sourceLineNo">205</span>    Configuration conf = job.getConfiguration();<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    HBaseConfiguration.merge(conf, HBaseConfiguration.create(conf));<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    conf.set(TableInputFormat.INPUT_TABLE, table);<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    conf.set(TableInputFormat.SCAN, convertScanToString(scan));<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    conf.setStrings("io.serializations", conf.get("io.serializations"),<a name="line.209"></a>
-<span class="sourceLineNo">210</span>        MutationSerialization.class.getName(), ResultSerialization.class.getName(),<a name="line.210"></a>
-<span class="sourceLineNo">211</span>        CellSerialization.class.getName());<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    if (addDependencyJars) {<a name="line.212"></a>
-<span class="sourceLineNo">213</span>      addDependencyJars(job);<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    }<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    if (initCredentials) {<a name="line.215"></a>
-<span class="sourceLineNo">216</span>      initCredentials(job);<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    }<a name="line.217"></a>
-<span class="sourceLineNo">218</span>  }<a name="line.218"></a>
-<span class="sourceLineNo">219</span><a name="line.219"></a>
-<span class="sourceLineNo">220</span>  /**<a name="line.220"></a>
-<span class="sourceLineNo">221</span>   * Use this before submitting a TableMap job. It will appropriately set up<a name="line.221"></a>
-<span class="sourceLineNo">222</span>   * the job.<a name="line.222"></a>
-<span class="sourceLineNo">223</span>   *<a name="line.223"></a>
-<span class="sourceLineNo">224</span>   * @param table Binary representation of the table name to read from.<a name="line.224"></a>
-<span class="sourceLineNo">225</span>   * @param scan  The scan instance with the columns, time range etc.<a name="line.225"></a>
-<span class="sourceLineNo">226</span>   * @param mapper  The mapper class to use.<a name="line.226"></a>
-<span class="sourceLineNo">227</span>   * @param outputKeyClass  The class of the output key.<a name="line.227"></a>
-<span class="sourceLineNo">228</span>   * @param outputValueClass  The class of the output value.<a name="line.228"></a>
-<span class="sourceLineNo">229</span>   * @param job  The current job to adjust.  Make sure the passed job is<a name="line.229"></a>
-<span class="sourceLineNo">230</span>   * carrying all necessary HBase configuration.<a name="line.230"></a>
-<span class="sourceLineNo">231</span>   * @param addDependencyJars upload HBase jars and jars for any of the configured<a name="line.231"></a>
-<span class="sourceLineNo">232</span>   *           job classes via the distributed cache (tmpjars).<a name="line.232"></a>
-<span class="sourceLineNo">233</span>   * @param inputFormatClass The class of the input format<a name="line.233"></a>
-<span class="sourceLineNo">234</span>   * @throws IOException When setting up the details fails.<a name="line.234"></a>
-<span class="sourceLineNo">235</span>   */<a name="line.235"></a>
-<span class="sourceLineNo">236</span>  public static void initTableMapperJob(byte[] table, Scan scan,<a name="line.236"></a>
-<span class="sourceLineNo">237</span>      Class&lt;? extends TableMapper&gt; mapper,<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      Class&lt;?&gt; outputKeyClass,<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      Class&lt;?&gt; outputValueClass, Job job,<a name="line.239"></a>
-<span class="sourceLineNo">240</span>      boolean addDependencyJars, Class&lt;? extends InputFormat&gt; inputFormatClass)<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  throws IOException {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>      initTableMapperJob(Bytes.toString(table), scan, mapper, outputKeyClass,<a name="line.242"></a>
-<span class="sourceLineNo">243</span>              outputValueClass, job, addDependencyJars, inputFormatClass);<a name="line.243"></a>
-<span class="sourceLineNo">244</span>  }<a name="line.244"></a>
-<span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>  /**<a name="line.246"></a>
-<span class="sourceLineNo">247</span>   * Use this before submitting a TableMap job. It will appropriately set up<a name="line.247"></a>
-<span class="sourceLineNo">248</span>   * the job.<a name="line.248"></a>
-<span class="sourceLineNo">249</span>   *<a name="line.249"></a>
-<span class="sourceLineNo">250</span>   * @param table Binary representation of the table name to read from.<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   * @param scan  The scan instance with the columns, time range etc.<a name="line.251"></a>
-<span class="sourceLineNo">252</span>   * @param mapper  The mapper class to use.<a name="line.252"></a>
-<span class="sourceLineNo">253</span>   * @param outputKeyClass  The class of the output key.<a name="line.253"></a>
-<span class="sourceLineNo">254</span>   * @param outputValueClass  The class of the output value.<a name="line.254"></a>
-<span class="sourceLineNo">255</span>   * @param job  The current job to adjust.  Make sure the passed job is<a name="line.255"></a>
-<span class="sourceLineNo">256</span>   * carrying all necessary HBase configuration.<a name="line.256"></a>
-<span class="sourceLineNo">257</span>   * @param addDependencyJars upload HBase jars and jars for any of the configured<a name="line.257"></a>
-<span class="sourceLineNo">258</span>   *           job classes via the distributed cache (tmpjars).<a name="line.258"></a>
-<span class="sourceLineNo">259</span>   * @throws IOException When setting up the details fails.<a name="line.259"></a>
-<span class="sourceLineNo">260</span>   */<a name="line.260"></a>
-<span class="sourceLineNo">261</span>  public static void initTableMapperJob(byte[] table, Scan scan,<a name="line.261"></a>
-<span class="sourceLineNo">262</span>      Class&lt;? extends TableMapper&gt; mapper,<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      Class&lt;?&gt; outputKeyClass,<a name="line.263"></a>
-<span class="sourceLineNo">264</span>      Class&lt;?&gt; outputValueClass, Job job,<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      boolean addDependencyJars)<a name="line.265"></a>
-<span class="sourceLineNo">266</span>  throws IOException {<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      initTableMapperJob(Bytes.toString(table), scan, mapper, outputKeyClass,<a name="line.267"></a>
-<span class="sourceLineNo">268</span>              outputValueClass, job, addDependencyJars, TableInputFormat.class);<a name="line.268"></a>
-<span class="sourceLineNo">269</span>  }<a name="line.269"></a>
-<span class="sourceLineNo">270</span><a name="line.270"></a>
-<span class="sourceLineNo">271</span>  /**<a name="line.271"></a>
-<span class="sourceLineNo">272</span>   * Use this before submitting a TableMap job. It will appropriately set up<a name="line.272"></a>
-<span class="sourceLineNo">273</span>   * the job.<a name="line.273"></a>
-<span class="sourceLineNo">274</span>   *<a name="line.274"></a>
-<span class="sourceLineNo">275</span>   * @param table The table name to read from.<a name="line.275"></a>
-<span class="sourceLineNo">276</span>   * @param scan  The scan instance with the columns, time range etc.<a name="line.276"></a>
-<span class="sourceLineNo">277</span>   * @param mapper  The mapper class to use.<a name="line.277"></a>
-<span class="sourceLineNo">278</span>   * @param outputKeyClass  The class of the output key.<a name="line.278"></a>
-<span class="sourceLineNo">279</span>   * @param outputValueClass  The class of the output value.<a name="line.279"></a>
-<span class="sourceLineNo">280</span>   * @param job  The current job to adjust.  Make sure the passed job is<a name="line.280"></a>
-<span class="sourceLineNo">281</span>   * carrying all necessary HBase configuration.<a name="line.281"></a>
-<span class="sourceLineNo">282</span>   * @param addDependencyJars upload HBase jars and jars for any of the configured<a name="line.282"></a>
-<span class="sourceLineNo">283</span>   *           job classes via the distributed cache (tmpjars).<a name="line.283"></a>
-<span class="sourceLineNo">284</span>   * @throws IOException When setting up the details fails.<a name="line.284"></a>
-<span class="sourceLineNo">285</span>   */<a name="line.285"></a>
-<span class="sourceLineNo">286</span>  public static void initTableMapperJob(String table, Scan scan,<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      Class&lt;? extends TableMapper&gt; mapper,<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      Class&lt;?&gt; outputKeyClass,<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      Class&lt;?&gt; outputValueClass, Job job,<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      boolean addDependencyJars)<a name="line.290"></a>
-<span class="sourceLineNo">291</span>  throws IOException {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      initTableMapperJob(table, scan, mapper, outputKeyClass,<a name="line.292"></a>
-<span class="sourceLineNo">293</span>              outputValueClass, job, addDependencyJars, TableInputFormat.class);<a name="line.293"></a>
-<span class="sourceLineNo">294</span>  }<a name="line.294"></a>
-<span class="sourceLineNo">295</span><a name="line.295"></a>
-<span class="sourceLineNo">296</span>  /**<a name="line.296"></a>
-<span class="sourceLineNo">297</span>   * Enable a basic on-heap cache for these jobs. Any BlockCache implementation based on<a name="line.297"></a>
-<span class="sourceLineNo">298</span>   * direct memory will likely cause the map tasks to OOM when opening the region. This<a name="line.298"></a>
-<span class="sourceLineNo">299</span>   * is done here instead of in TableSnapshotRegionRecordReader in case an advanced user<a name="line.299"></a>
-<span class="sourceLineNo">300</span>   * wants to override this behavior in their job.<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   */<a name="line.301"></a>
-<span class="sourceLineNo">302</span>  public static void resetCacheConfig(Configuration conf) {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    conf.setFloat(<a name="line.303"></a>
-<span class="sourceLineNo">304</span>      HConstants.HFILE_BLOCK_CACHE_SIZE_KEY, HConstants.HFILE_BLOCK_CACHE_SIZE_DEFAULT);<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    conf.setFloat(HConstants.BUCKET_CACHE_SIZE_KEY, 0f);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    conf.unset(HConstants.BUCKET_CACHE_IOENGINE_KEY);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>  }<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>  /**<a name="line.309"></a>
-<span class="sourceLineNo">310</span>   * Sets up the job for reading from one or more table snapshots, with one or more scans<a name="line.310"></a>
-<span class="sourceLineNo">311</span>   * per snapshot.<a name="line.311"></a>
-<span class="sourceLineNo">312</span>   * It bypasses hbase servers and read directly from snapshot files.<a name="line.312"></a>
-<span class="sourceLineNo">313</span>   *<a name="line.313"></a>
-<span class="sourceLineNo">314</span>   * @param snapshotScans     map of snapshot name to scans on that snapshot.<a name="line.314"></a>
-<span class="sourceLineNo">315</span>   * @param mapper            The mapper class to use.<a name="line.315"></a>
-<span class="sourceLineNo">316</span>   * @param outputKeyClass    The class of the output key.<a name="line.316"></a>
-<span class="sourceLineNo">317</span>   * @param outputValueClass  The class of the output value.<a name="line.317"></a>
-<span class="sourceLineNo">318</span>   * @param job               The current job to adjust.  Make sure the passed job is<a name="line.318"></a>
-<span class="sourceLineNo">319</span>   *                          carrying all necessary HBase configuration.<a name="line.319"></a>
-<span class="sourceLineNo">320</span>   * @param addDependencyJars upload HBase jars and jars for any of the configured<a name="line.320"></a>
-<span class="sourceLineNo">321</span>   *                          job classes via the distributed cache (tmpjars).<a name="line.321"></a>
-<span class="sourceLineNo">322</span>   */<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  public static void initMultiTableSnapshotMapperJob(Map&lt;String, Collection&lt;Scan&gt;&gt; snapshotScans,<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      Class&lt;? extends TableMapper&gt; mapper, Class&lt;?&gt; outputKeyClass, Class&lt;?&gt; outputValueClass,<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      Job job, boolean addDependencyJars, Path tmpRestoreDir) throws IOException {<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    MultiTableSnapshotInputFormat.setInput(job.getConfiguration(), snapshotScans, tmpRestoreDir);<a name="line.326"></a>
-<span class="sourceLineNo">327</span><a name="line.327"></a>
-<span class="sourceLineNo">328</span>    job.setInputFormatClass(MultiTableSnapshotInputFormat.class);<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    if (outputValueClass != null) {<a name="line.329"></a>
-<span class="sourceLineNo">330</span>      job.setMapOutputValueClass(outputValueClass);<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    }<a name="line.331"></a>
-<span class="sourceLineNo">332</span>    if (outputKeyClass != null) {<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      job.setMapOutputKeyClass(outputKeyClass);<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    }<a name="line.334"></a>
-<span class="sourceLineNo">335</span>    job.setMapperClass(mapper);<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    Configuration conf = job.getConfiguration();<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    HBaseConfiguration.merge(conf, HBaseConfiguration.create(conf));<a name="line.337"></a>
-<span class="sourceLineNo">338</span><a name="line.338"></a>
-<span class="sourceLineNo">339</span>    if (addDependencyJars) {<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      addDependencyJars(job);<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      addDependencyJarsForClasses(job.getConfiguration(), MetricRegistry.class);<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    }<a name="line.342"></a>
-<span class="sourceLineNo">343</span><a name="line.343"></a>
-<span class="sourceLineNo">344</span>    resetCacheConfig(job.getConfiguration());<a name="line.344"></a>
-<span class="sourceLineNo">345</span>  }<a name="line.345"></a>
-<span class="sourceLineNo">346</span><a name="line.346"></a>
-<span class="sourceLineNo">347</span>  /**<a name="line.347"></a>
-<span class="sourceLineNo">348</span>   * Sets up the job for reading from a table snapshot. It bypasses hbase servers and read directly<a name="line.348"></a>
-<span class="sourceLineNo">349</span>   * from snapshot files.<a name="line.349"></a>
-<span class="sourceLineNo">350</span>   * @param snapshotName The name of the snapshot (of a table) to read from.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>   * @param scan The scan instance with the columns, time range etc.<a name="line.351"></a>
-<span class="sourceLineNo">352</span>   * @param mapper The mapper class to use.<a name="line.352"></a>
-<span class="sourceLineNo">353</span>   * @param outputKeyClass The class of the output key.<a name="line.353"></a>
-<span class="sourceLineNo">354</span>   * @param outputValueClass The class of the output value.<a name="line.354"></a>
-<span class="sourceLineNo">355</span>   * @param job The current job to adjust. Make sure the passed job is carrying all necessary HBase<a name="line.355"></a>
-<span class="sourceLineNo">356</span>   *          configuration.<a name="line.356"></a>
-<span class="sourceLineNo">357</span>   * @param addDependencyJars upload HBase jars and jars for any of the configured job classes via<a name="line.357"></a>
-<span class="sourceLineNo">358</span>   *          the distributed cache (tmpjars).<a name="line.358"></a>
-<span class="sourceLineNo">359</span>   * @param tmpRestoreDir a temporary directory to copy the snapshot files into. Current user should<a name="line.359"></a>
-<span class="sourceLineNo">360</span>   *          have write permissions to this directory, and this should not be a subdirectory of<a name="line.360"></a>
-<span class="sourceLineNo">361</span>   *          rootdir. After the job is finished, restore directory can be deleted.<a name="line.361"></a>
-<span class="sourceLineNo">362</span>   * @throws IOException When setting up the details fails.<a name="line.362"></a>
-<span class="sourceLineNo">363</span>   * @see TableSnapshotInputFormat<a name="line.363"></a>
-<span class="sourceLineNo">364</span>   */<a name="line.364"></a>
-<span class="sourceLineNo">365</span>  public static void initTableSnapshotMapperJob(String snapshotName, Scan scan,<a name="line.365"></a>
-<span class="sourceLineNo">366</span>      Class&lt;? extends TableMapper&gt; mapper,<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      Class&lt;?&gt; outputKeyClass,<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      Class&lt;?&gt; outputValueClass, Job job,<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      boolean addDependencyJars, Path tmpRestoreDir)<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      throws IOException {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    TableSnapshotInputFormat.setInput(job, snapshotName, tmpRestoreDir);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    initTableMapperJob(snapshotName, scan, mapper, outputKeyClass, outputValueClass, job,<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      addDependencyJars, false, TableSnapshotInputFormat.class);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    resetCacheConfig(job.getConfiguration());<a name="line.374"></a>
-<span class="sourceLineNo">375</span>  }<a name="line.375"></a>
-<span class="sourceLineNo">376</span><a name="line.376"></a>
-<span class="sourceLineNo">377</span>  /**<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   * Sets up the job for reading from a table snapshot. It bypasses hbase servers<a name="line.378"></a>
-<span class="sourceLineNo">379</span>   * and read directly from snapshot files.<a name="line.379"></a>
-<span class="sourceLineNo">380</span>   *<a name="line.380"></a>
-<span class="sourceLineNo">381</span>   * @param snapshotName The name of the snapshot (of a table) to read from.<a name="line.381"></a>
-<span class="sourceLineNo">382</span>   * @param scan  The scan instance with the columns, time range etc.<a name="line.382"></a>
-<span class="sourceLineNo">383</span>   * @param mapper  The mapper class to use.<a name="line.383"></a>
-<span class="sourceLineNo">384</span>   * @param outputKeyClass  The class of the output key.<a name="line.384"></a>
-<span class="sourceLineNo">385</span>   * @param outputValueClass  The class of the output value.<a name="line.385"></a>
-<span class="sourceLineNo">386</span>   * @param job  The current job to adjust.  Make sure the passed job is<a name="line.386"></a>
-<span class="sourceLineNo">387</span>   * carrying all necessary HBase configuration.<a name="line.387"></a>
-<span class="sourceLineNo">388</span>   * @param addDependencyJars upload HBase jars and jars for any of the configured<a name="line.388"></a>
-<span class="sourceLineNo">389</span>   *           job classes via the distributed cache (tmpjars).<a name="line.389"></a>
+<span class="sourceLineNo">174</span><a name="line.174"></a>
+<span class="sourceLineNo">175</span>  /**<a name="line.175"></a>
+<span class="sourceLineNo">176</span>   * Use this before submitting a TableMap job. It will appropriately set up<a name="line.176"></a>
+<span class="sourceLineNo">177</span>   * the job.<a name="line.177"></a>
+<span class="sourceLineNo">178</span>   *<a name="line.178"></a>
+<span class="sourceLineNo">179</span>   * @param table  The table name to read from.<a name="line.179"></a>
+<span class="sourceLineNo">180</span>   * @param scan  The scan instance with the columns, time range etc.<a name="line.180"></a>
+<span class="sourceLineNo">181</span>   * @param mapper  The mapper class to use.<a name="line.181"></a>
+<span class="sourceLineNo">182</span>   * @param outputKeyClass  The class of the output key.<a name="line.182"></a>
+<span class="sourceLineNo">183</span>   * @param outputValueClass  The class of the output value.<a name="line.183"></a>
+<span class="sourceLineNo">184</span>   * @param job  The current job to adjust.  Make sure the passed job is<a name="line.184"></a>
+<span class="sourceLineNo">185</span>   * carrying all necessary HBase configuration.<a name="line.185"></a>
+<span class="sourceLineNo">186</span>   * @param addDependencyJars upload HBase jars and jars for any of the configured<a name="line.186"></a>
+<span class="sourceLineNo">187</span>   *           job classes via the distributed cache (tmpjars).<a name="line.187"></a>
+<span class="sourceLineNo">188</span>   * @param initCredentials whether to initialize hbase auth credentials for the job<a name="line.188"></a>
+<span class="sourceLineNo">189</span>   * @param inputFormatClass the input format<a name="line.189"></a>
+<span class="sourceLineNo">190</span>   * @throws IOException When setting up the details fails.<a name="line.190"></a>
+<span class="sourceLineNo">191</span>   */<a name="line.191"></a>
+<span class="sourceLineNo">192</span>  public static void initTableMapperJob(String table, Scan scan,<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      Class&lt;? extends TableMapper&gt; mapper,<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      Class&lt;?&gt; outputKeyClass,<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      Class&lt;?&gt; outputValueClass, Job job,<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      boolean addDependencyJars, boolean initCredentials,<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      Class&lt;? extends InputFormat&gt; inputFormatClass)<a name="line.197"></a>
+<span class="sourceLineNo">198</span>  throws IOException {<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    job.setInputFormatClass(inputFormatClass);<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    if (outputValueClass != null) job.setMapOutputValueClass(outputValueClass);<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    if (outputKeyClass != null) job.setMapOutputKeyClass(outputKeyClass);<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    job.setMapperClass(mapper);<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    if (Put.class.equals(outputValueClass)) {<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      job.setCombinerClass(PutCombiner.class);<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    }<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    Configuration conf = job.getConfiguration();<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    HBaseConfiguration.merge(conf, HBaseConfiguration.create(conf));<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    conf.set(TableInputFormat.INPUT_TABLE, table);<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    conf.set(TableInputFormat.SCAN, convertScanToString(scan));<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    conf.setStrings("io.serializations", conf.get("io.serializations"),<a name="line.210"></a>
+<span class="sourceLineNo">211</span>        MutationSerialization.class.getName(), ResultSerialization.class.getName(),<a name="line.211"></a>
+<span class="sourceLineNo">212</span>        CellSerialization.class.getName());<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    if (addDependencyJars) {<a name="line.213"></a>
+<span class="sourceLineNo">214</span>      addDependencyJars(job);<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    }<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    if (initCredentials) {<a name="line.216"></a>
+<span class="sourceLineNo">217</span>      initCredentials(job);<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    }<a name="line.218"></a>
+<span class="sourceLineNo">219</span>  }<a name="line.219"></a>
+<span class="sourceLineNo">220</span><a name="line.220"></a>
+<span class="sourceLineNo">221</span>  /**<a name="line.221"></a>
+<span class="sourceLineNo">222</span>   * Use this before submitting a TableMap job. It will appropriately set up<a name="line.222"></a>
+<span class="sourceLineNo">223</span>   * the job.<a name="line.223"></a>
+<span class="sourceLineNo">224</span>   *<a name="line.224"></a>
+<span class="sourceLineNo">225</span>   * @param table Binary representation of the table name to read from.<a name="line.225"></a>
+<span class="sourceLineNo">226</span>   * @param scan  The scan instance with the columns, time range etc.<a name="line.226"></a>
+<span class="sourceLineNo">227</span>   * @param mapper  The mapper class to use.<a name="line.227"></a>
+<span class="sourceLineNo">228</span>   * @param outputKeyClass  The class of the output key.<a name="line.228"></a>
+<span class="sourceLineNo">229</span>   * @param outputValueClass  The class of the output value.<a name="line.229"></a>
+<span class="sourceLineNo">230</span>   * @param job  The current job to adjust.  Make sure the passed job is<a name="line.230"></a>
+<span class="sourceLineNo">231</span>   * carrying all necessary HBase configuration.<a name="line.231"></a>
+<span class="sourceLineNo">232</span>   * @param addDependencyJars upload HBase jars and jars for any of the configured<a name="line.232"></a>
+<span class="sourceLineNo">233</span>   *           job classes via the distributed cache (tmpjars).<a name="line.233"></a>
+<span class="sourceLineNo">234</span>   * @param inputFormatClass The class of the input format<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   * @throws IOException When setting up the details fails.<a name="line.235"></a>
+<span class="sourceLineNo">236</span>   */<a name="line.236"></a>
+<span class="sourceLineNo">237</span>  public static void initTableMapperJob(byte[] table, Scan scan,<a name="line.237"></a>
+<span class="sourceLineNo">238</span>      Class&lt;? extends TableMapper&gt; mapper,<a name="line.238"></a>
+<span class="sourceLineNo">239</span>      Class&lt;?&gt; outputKeyClass,<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      Class&lt;?&gt; outputValueClass, Job job,<a name="line.240"></a>
+<span class="sourceLineNo">241</span>      boolean addDependencyJars, Class&lt;? extends InputFormat&gt; inputFormatClass)<a name="line.241"></a>
+<span class="sourceLineNo">242</span>  throws IOException {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      initTableMapperJob(Bytes.toString(table), scan, mapper, outputKeyClass,<a name="line.243"></a>
+<span class="sourceLineNo">244</span>              outputValueClass, job, addDependencyJars, inputFormatClass);<a name="line.244"></a>
+<span class="sourceLineNo">245</span>  }<a name="line.245"></a>
+<span class="sourceLineNo">246</span><a name="line.246"></a>
+<span class="sourceLineNo">247</span>  /**<a name="line.247"></a>
+<span class="sourceLineNo">248</span>   * Use this before submitting a TableMap job. It will appropriately set up<a name="line.248"></a>
+<span class="sourceLineNo">249</span>   * the job.<a name="line.249"></a>
+<span class="sourceLineNo">250</span>   *<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * @param table Binary representation of the table name to read from.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   * @param scan  The scan instance with the columns, time range etc.<a name="line.252"></a>
+<span class="sourceLineNo">253</span>   * @param mapper  The mapper class to use.<a name="line.253"></a>
+<span class="sourceLineNo">254</span>   * @param outputKeyClass  The class of the output key.<a name="line.254"></a>
+<span class="sourceLineNo">255</span>   * @param outputValueClass  The class of the output value.<a name="line.255"></a>
+<span class="sourceLineNo">256</span>   * @param job  The current job to adjust.  Make sure the passed job is<a name="line.256"></a>
+<span class="sourceLineNo">257</span>   * carrying all necessary HBase configuration.<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   * @param addDependencyJars upload HBase jars and jars for any of the configured<a name="line.258"></a>
+<span class="sourceLineNo">259</span>   *           job classes via the distributed cache (tmpjars).<a name="line.259"></a>
+<span class="sourceLineNo">260</span>   * @throws IOException When setting up the details fails.<a name="line.260"></a>
+<span class="sourceLineNo">261</span>   */<a name="line.261"></a>
+<span class="sourceLineNo">262</span>  public static void initTableMapperJob(byte[] table, Scan scan,<a name="line.262"></a>
+<span class="sourceLineNo">263</span>      Class&lt;? extends TableMapper&gt; mapper,<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      Class&lt;?&gt; outputKeyClass,<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      Class&lt;?&gt; outputValueClass, Job job,<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      boolean addDependencyJars)<a name="line.266"></a>
+<span class="sourceLineNo">267</span>  throws IOException {<a name="line.267"></a>
+<span class="sourceLineNo">268</span>      initTableMapperJob(Bytes.toString(table), scan, mapper, outputKeyClass, outputValueClass, job,<a name="line.268"></a>
+<span class="sourceLineNo">269</span>        addDependencyJars, getConfiguredInputFormat(job));<a name="line.269"></a>
+<span class="sourceLineNo">270</span>  }<a name="line.270"></a>
+<span class="sourceLineNo">271</span><a name="line.271"></a>
+<span class="sourceLineNo">272</span>  /**<a name="line.272"></a>
+<span class="sourceLineNo">273</span>   * @return {@link TableInputFormat} .class unless Configuration has something else at<a name="line.273"></a>
+<span class="sourceLineNo">274</span>   *   {@link #TABLE_INPUT_CLASS_KEY}.<a name="line.274"></a>
+<span class="sourceLineNo">275</span>   */<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  private static Class&lt;? extends InputFormat&gt; getConfiguredInputFormat(Job job) {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    return (Class&lt;? extends InputFormat&gt;)job.getConfiguration().<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      getClass(TABLE_INPUT_CLASS_KEY, TableInputFormat.class);<a name="line.278"></a>
+<span class="sourceLineNo">279</span>  }<a name="line.279"></a>
+<span class="sourceLineNo">280</span><a name="line.280"></a>
+<span class="sourceLineNo">281</span>  /**<a name="line.281"></a>
+<span class="sourceLineNo">282</span>   * Use this before submitting a TableMap job. It will appropriately set up<a name="line.282"></a>
+<span class="sourceLineNo">283</span>   * the job.<a name="line.283"></a>
+<span class="sourceLineNo">284</span>   *<a name="line.284"></a>
+<span class="sourceLineNo">285</span>   * @param table The table name to read from.<a name="line.285"></a>
+<span class="sourceLineNo">286</span>   * @param scan  The scan instance with the columns, time range etc.<a name="line.286"></a>
+<span class="sourceLineNo">287</span>   * @param mapper  The mapper class to use.<a name="line.287"></a>
+<span class="sourceLineNo">288</span>   * @param outputKeyClass  The class of the output key.<a name="line.288"></a>
+<span class="sourceLineNo">289</span>   * @param outputValueClass  The class of the output value.<a name="line.289"></a>
+<span class="sourceLineNo">290</span>   * @param job  The current job to adjust.  Make sure the passed job is<a name="line.290"></a>
+<span class="sourceLineNo">291</span>   * carrying all necessary HBase configuration.<a name="line.291"></a>
+<span class="sourceLineNo">292</span>   * @param addDependencyJars upload HBase jars and jars for any of the configured<a name="line.292"></a>
+<span class="sourceLineNo">293</span>   *           job classes via the distributed cache (tmpjars).<a name="line.293"></a>
+<span class="sourceLineNo">294</span>   * @throws IOException When setting up the details fails.<a name="line.294"></a>
+<span class="sourceLineNo">295</span>   */<a name="line.295"></a>
+<span class="sourceLineNo">296</span>  public static void initTableMapperJob(String table, Scan scan,<a name="line.296"></a>
+<span class="sourceLineNo">297</span>      Class&lt;? extends TableMapper&gt; mapper,<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      Class&lt;?&gt; outputKeyClass,<a name="line.298"></a>
+<span class="sourceLineNo">299</span>      Class&lt;?&gt; outputValueClass, Job job,<a name="line.299"></a>
+<span class="sourceLineNo">300</span>      boolean addDependencyJars)<a name="line.300"></a>
+<span class="sourceLineNo">301</span>  throws IOException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>      initTableMapperJob(table, scan, mapper, outputKeyClass,<a name="line.302"></a>
+<span class="sourceLineNo">303</span>              outputValueClass, job, addDependencyJars, getConfiguredInputFormat(job));<a name="line.303"></a>
+<span class="sourceLineNo">304</span>  }<a name="line.304"></a>
+<span class="sourceLineNo">305</span><a name="line.305"></a>
+<span class="sourceLineNo">306</span>  /**<a name="line.306"></a>
+<span class="sourceLineNo">307</span>   * Enable a basic on-heap cache for these jobs. Any BlockCache implementation based on<a name="line.307"></a>
+<span class="sourceLineNo">308</span>   * direct memory will likely cause the map tasks to OOM when opening the region. This<a name="line.308"></a>
+<span class="sourceLineNo">309</span>   * is done here instead of in TableSnapshotRegionRecordReader in case an advanced user<a name="line.309"></a>
+<span class="sourceLineNo">310</span>   * wants to override this behavior in their job.<a name="line.310"></a>
+<span class="sourceLineNo">311</span>   */<a name="line.311"></a>
+<span class="sourceLineNo">312</span>  public static void resetCacheConfig(Configuration conf) {<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    conf.setFloat(<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      HConstants.HFILE_BLOCK_CACHE_SIZE_KEY, HConstants.HFILE_BLOCK_CACHE_SIZE_DEFAULT);<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    conf.setFloat(HConstants.BUCKET_CACHE_SIZE_KEY, 0f);<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    conf.unset(HConstants.BUCKET_CACHE_IOENGINE_KEY);<a name="line.316"></a>
+<span class="sourceLineNo">317</span>  }<a name="line.317"></a>
+<span class="sourceLineNo">318</span><a name="line.318"></a>
+<span class="sourceLineNo">319</span>  /**<a name="line.319"></a>
+<span class="sourceLineNo">320</span>   * Sets up the job for reading from one or more table snapshots, with one or more scans<a name="line.320"></a>
+<span class="sourceLineNo">321</span>   * per snapshot.<a name="line.321"></a>
+<span class="sourceLineNo">322</span>   * It bypasses hbase servers and read directly from snapshot files.<a name="line.322"></a>
+<span class="sourceLineNo">323</span>   *<a name="line.323"></a>
+<span class="sourceLineNo">324</span>   * @param snapshotScans     map of snapshot name to scans on that snapshot.<a name="line.324"></a>
+<span class="sourceLineNo">325</span>   * @param mapper            The mapper class to use.<a name="line.325"></a>
+<span class="sourceLineNo">326</span>   * @param outputKeyClass    The class of the output key.<a name="line.326"></a>
+<span class="sourceLineNo">327</span>   * @param outputValueClass  The class of the output value.<a name="line.327"></a>
+<span class="sourceLineNo">328</span>   * @param job               The current job to adjust.  Make sure the passed job is<a name="line.328"></a>
+<span class="sourceLineNo">329</span>   *                          carrying all necessary HBase configuration.<a name="line.329"></a>
+<span class="sourceLineNo">330</span>   * @param addDependencyJars upload HBase jars and jars for any of the configured<a name="line.330"></a>
+<span class="sourceLineNo">331</span>   *                          job classes via the distributed cache (tmpjars).<a name="line.331"></a>
+<span class="sourceLineNo">332</span>   */<a name="line.332"></a>
+<span class="sourceLineNo">333</span>  public static void initMultiTableSnapshotMapperJob(Map&lt;String, Collection&lt;Scan&gt;&gt; snapshotScans,<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      Class&lt;? extends TableMapper&gt; mapper, Class&lt;?&gt; outputKeyClass, Class&lt;?&gt; outputValueClass,<a name="line.334"></a>
+<span class="sourceLineNo">335</span>      Job job, boolean addDependencyJars, Path tmpRestoreDir) throws IOException {<a name="line.335"></a>
+<span class="sourceLineNo">336</span>    MultiTableSnapshotInputFormat.setInput(job.getConfiguration(), snapshotScans, tmpRestoreDir);<a name="line.336"></a>
+<span class="sourceLineNo">337</span><a name="line.337"></a>
+<span class="sourceLineNo">338</span>    job.setInputFormatClass(MultiTableSnapshotInputFormat.class);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    if (outputValueClass != null) {<a name="line.339"></a>
+<span class="sourceLineNo">340</span>      job.setMapOutputValueClass(outputValueClass);<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    }<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    if (outputKeyClass != null) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      job.setMapOutputKeyClass(outputKeyClass);<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    job.setMapperClass(mapper);<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    Configuration conf = job.getConfiguration();<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    HBaseConfiguration.merge(conf, HBaseConfiguration.create(conf));<a name="line.347"></a>
+<span class="sourceLineNo">348</span><a name="line.348"></a>
+<span class="sourceLineNo">349</span>    if (addDependencyJars) {<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      addDependencyJars(job);<a name="line.350"></a>
+<span class="sourceLineNo">351</span>      addDependencyJarsForClasses(job.getConfiguration(), MetricRegistry.class);<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    }<a name="line.352"></a>
+<span class="sourceLineNo">353</span><a name="line.353"></a>
+<span class="sourceLineNo">354</span>    resetCacheConfig(job.getConfiguration());<a name="line.354"></a>
+<span class="sourceLineNo">355</span>  }<a name="line.355"></a>
+<span class="sourceLineNo">356</span><a name="line.356"></a>
+<span class="sourceLineNo">357</span>  /**<a name="line.357"></a>
+<span class="sourceLineNo">358</span>   * Sets up the job for reading from a table snapshot. It bypasses hbase servers and read directly<a name="line.358"></a>
+<span class="sourceLineNo">359</span>   * from snapshot files.<a name="line.359"></a>
+<span class="sourceLineNo">360</span>   * @param snapshotName The name of the snapshot (of a table) to read from.<a name="line.360"></a>
+<span class="sourceLineNo">361</span>   * @param scan The scan instance with the columns, time range etc.<a name="line.361"></a>
+<span class="sourceLineNo">362</span>   * @param mapper The mapper class to use.<a name="line.362"></a>
+<span class="sourceLineNo">363</span>   * @param outputKeyClass The class of the output key.<a name="line.363"></a>
+<span class="sourceLineNo">364</span>   * @param outputValueClass The class of the output value.<a name="line.364"></a>
+<span class="sourceLineNo">365</span>   * @param job The current job to adjust. Make sure the passed job is carrying all necessary HBase<a name="line.365"></a>
+<span class="sourceLineNo">366</span>   *          configuration.<a name="line.366"></a>
+<span class="sourceLineNo">367</span>   * @param addDependencyJars upload HBase jars and jars for any of the configured job classes via<a name="line.367"></a>
+<span class="sourceLineNo">368</span>   *          the distributed cache (tmpjars).<a name="line.368"></a>
+<span class="sourceLineNo">369</span>   * @param tmpRestoreDir a temporary directory to copy the snapshot files into. Current user should<a name="line.369"></a>
+<span class="sourceLineNo">370</span>   *          have write permissions to this directory, and this should not be a subdirectory of<a name="line.370"></a>
+<span class="sourceLineNo">371</span>   *          rootdir. After the job is finished, restore directory can be deleted.<a name="line.371"></a>
+<span class="sourceLineNo">372</span>   * @throws IOException When setting up the details fails.<a name="line.372"></a>
+<span class="sourceLineNo">373</span>   * @see TableSnapshotInputFormat<a name="line.373"></a>
+<span class="sourceLineNo">374</span>   */<a name="line.374"></a>
+<span class="sourceLineNo">375</span>  public static void initTableSnapshotMapperJob(String snapshotName, Scan scan,<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      Class&lt;? extends TableMapper&gt; mapper,<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      Class&lt;?&gt; outputKeyClass,<a name="line.377"></a>
+<span class="sourceLineNo">378</span>      Class&lt;?&gt; outputValueClass, Job job,<a name="line.378"></a>
+<span class="sourceLineNo">379</span>      boolean addDependencyJars, Path tmpRestoreDir)<a name="line.379"></a>
+<span class="sourceLineNo">380</span>      throws IOException {<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    TableSnapshotInputFormat.setInput(job, snapshotName, tmpRestoreDir);<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    initTableMapperJob(snapshotName, scan, mapper, outputKeyClass, outputValueClass, job,<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      addDependencyJars, false, TableSnapshotInputFormat.class);<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    resetCacheConfig(job.getConfiguration());<a name="line.384"></a>
+<span class="sourceLineNo">385</span>  }<a name="line.385"></a>
+<span class="sourceLineNo">386</span><a name="line.386"></a>
+<span class="sourceLineNo">387</span>  /**<a name="line.387"></a>
+<span class="sourceLineNo">388</span>   * Sets up the job for reading from a table snapshot. It bypasses hbase servers<a name="line.388"></a>
+<span class="sourceLineNo">389</span>   * and read directly from snapshot files.<a name="line.389"></a>
 <span class="sourceLineNo">390</span>   *<a name="line.390"></a>
-<span class="sourceLineNo">391</span>   * @param tmpRestoreDir a temporary directory to copy the snapshot files into. Current user should<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * have write permissions to this directory, and this should not be a subdirectory of rootdir.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   * After the job is finished, restore directory can be deleted.<a name="line.393"></a>
-<span class="sourceLineNo">394</span>   * @param splitAlgo algorithm to split<a name="line.394"></a>
-<span class="sourceLineNo">395</span>   * @param numSplitsPerRegion how many input splits to generate per one region<a name="line.395"></a>
-<span class="sourceLineNo">396</span>   * @throws IOException When setting up the details fails.<a name="line.396"></a>
-<span class="sourceLineNo">397</span>   * @see TableSnapshotInputFormat<a name="line.397"></a>
-<span class="sourceLineNo">398</span>   */<a name="line.398"></a>
-<span class="sourceLineNo">399</span>  public static void initTableSnapshotMapperJob(String snapshotName, Scan scan,<a name="line.399"></a>
-<span class="sourceLineNo">400</span>                                                Class&lt;? extends TableMapper&gt; mapper,<a name="line.400"></a>
-<span class="sourceLineNo">401</span>                                                Class&lt;?&gt; outputKeyClass,<a name="line.401"></a>
-<span class="sourceLineNo">402</span>                                                Class&lt;?&gt; outputValueClass, Job job,<a name="line.402"></a>
-<span class="sourceLineNo">403</span>                                                boolean addDependencyJars, Path tmpRestoreDir,<a name="line.403"></a>
-<span class="sourceLineNo">404</span>                                                RegionSplitter.SplitAlgorithm splitAlgo,<a name="line.404"></a>
-<span class="sourceLineNo">405</span>                                                int numSplitsPerRegion)<a name="line.405"></a>
-<span class="sourceLineNo">406</span>          throws IOException {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    TableSnapshotInputFormat.setInput(job, snapshotName, tmpRestoreDir, splitAlgo,<a name="line.407"></a>
-<span class="sourceLineNo">408</span>            numSplitsPerRegion);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    initTableMapperJob(snapshotName, scan, mapper, outputKeyClass,<a name="line.409"></a>
-<span class="sourceLineNo">410</span>            outputValueClass, job, addDependencyJars, false, TableSnapshotInputFormat.class);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    resetCacheConfig(job.getConfiguration());<a name="line.411"></a>
-<span class="sourceLineNo">412</span>  }<a name="line.412"></a>
-<span class="sourceLineNo">413</span><a name="line.413"></a>
-<span class="sourceLineNo">414</span>  /**<a name="line.414"></a>
-<span class="sourceLineNo">415</span>   * Use this before submitting a Multi TableMap job. It will appropriately set<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   * up the job.<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   *<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   * @param scans The list of {@link Scan} objects to read from.<a name="line.418"></a>
-<span class="sourceLineNo">419</span>   * @param mapper The mapper class to use.<a name="line.419"></a>
-<span class="sourceLineNo">420</span>   * @param outputKeyClass The class of the output key.<a name="line.420"></a>
-<span class="sourceLineNo">421</span>   * @param outputValueClass The class of the output value.<a name="line.421"></a>
-<span class="sourceLineNo">422</span>   * @param job The current job to adjust. Make sure the passed job is carrying<a name="line.422"></a>
-<span class="sourceLineNo">423</span>   *          all necessary HBase configuration.<a name="line.423"></a>
-<span class="sourceLineNo">424</span>   * @throws IOException When setting up the details fails.<a name="line.424"></a>
-<span class="sourceLineNo">425</span>   */<a name="line.425"></a>
-<span class="sourceLineNo">426</span>  public static void initTableMapperJob(List&lt;Scan&gt; scans,<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      Class&lt;? extends TableMapper&gt; mapper,<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      Class&lt;?&gt; outputKeyClass,<a name="line.428"></a>
-<span class="sourceLineNo">429</span>      Class&lt;?&gt; outputValueClass, Job job) throws IOException {<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    initTableMapperJob(scans, mapper, outputKeyClass, outputValueClass, job,<a name="line.430"></a>
-<span class="sourceLineNo">431</span>        true);<a name="line.431"></a>
-<span class="sourceLineNo">432</span>  }<a name="line.432"></a>
-<span class="sourceLineNo">433</span><a name="line.433"></a>
-<span class="sourceLineNo">434</span>  /**<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   * Use this before submitting a Multi TableMap job. It will appropriately set<a name="line.435"></a>
-<span class="sourceLineNo">436</span>   * up the job.<a name="line.436"></a>
-<span class="sourceLineNo">437</span>   *<a name="line.437"></a>
-<span class="sourceLineNo">438</span>   * @param scans The list of {@link Scan} objects to read from.<a name="line.438"></a>
-<span class="sourceLineNo">439</span>   * @param mapper The mapper class to use.<a name="line.439"></a>
-<span class="sourceLineNo">440</span>   * @param outputKeyClass The class of the output key.<a name="line.440"></a>
-<span class="sourceLineNo">441</span>   * @param outputValueClass The class of the output value.<a name="line.441"></a>
-<span class="sourceLineNo">442</span>   * @param job The current job to adjust. Make sure the passed job is carrying<a name="line.442"></a>
-<span class="sourceLineNo">443</span>   *          all necessary HBase configuration.<a name="line.443"></a>
-<span class="sourceLineNo">444</span>   * @param addDependencyJars upload HBase jars and jars for any of the<a name="line.444"></a>
-<span class="sourceLineNo">445</span>   *          configured job classes via the distributed cache (tmpjars).<a name="line.445"></a>
-<span class="sourceLineNo">446</span>   * @throws IOException When setting up the details fails.<a name="line.446"></a>
-<span class="sourceLineNo">447</span>   */<a name="line.447"></a>
-<span class="sourceLineNo">448</span>  public static void initTableMapperJob(List&lt;Scan&gt; scans,<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      Class&lt;? extends TableMapper&gt; mapper,<a name="line.449"></a>
-<span class="sourceLineNo">450</span>      Class&lt;?&gt; outputKeyClass,<a name="line.450"></a>
-<span class="sourceLineNo">451</span>      Class&lt;?&gt; outputValueClass, Job job,<a name="line.451"></a>
-<span class="sourceLineNo">452</span>      boolean addDependencyJars) throws IOException {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    initTableMapperJob(scans, mapper, outputKeyClass, outputValueClass, job,<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      addDependencyJars, true);<a name="line.454"></a>
-<span class="sourceLineNo">455</span>  }<a name="line.455"></a>
-<span class="sourceLineNo">456</span><a name="line.456"></a>
-<span class="sourceLineNo">457</span>  /**<a name="line.457"></a>
-<span class="sourceLineNo">458</span>   * Use this before submitting a Multi TableMap job. It will appropriately set<a name="line.458"></a>
-<span class="sourceLineNo">459</span>   * up the job.<a name="line.459"></a>
-<span class="sourceLineNo">460</span>   *<a name="line.460"></a>
-<span class="sourceLineNo">461</span>   * @param scans The list of {@link Scan} objects to read from.<a name="line.461"></a>
-<span class="sourceLineNo">462</span>   * @param mapper The mapper class to use.<a name="line.462"></a>
-<span class="sourceLineNo">463</span>   * @param outputKeyClass The class of the output key.<a name="line.463"></a>
-<span class="sourceLineNo">464</span>   * @param outputValueClass The class of the output value.<a name="line.464"></a>
-<span class="sourceLineNo">465</span>   * @param job The current job to adjust. Make sure the passed job is carrying<a name="line.465"></a>
-<span class="sourceLineNo">466</span>   *          all necessary HBase configuration.<a name="line.466"></a>
-<span class="sourceLineNo">467</span>   * @param addDependencyJars upload HBase jars and jars for any of the<a name="line.467"></a>
-<span class="sourceLineNo">468</span>   *          configured job classes via the distributed cache (tmpjars).<a name="line.468"></a>
-<span class="sourceLineNo">469</span>   * @param initCredentials whether to initialize hbase auth credentials for the job<a name="line.469"></a>
-<span class="sourceLineNo">470</span>   * @throws IOException When setting up the details fails.<a name="line.470"></a>
-<span class="sourceLineNo">471</span>   */<a name="line.471"></a>
-<span class="sourceLineNo">472</span>  public static void initTableMapperJob(List&lt;Scan&gt; scans,<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      Class&lt;? extends TableMapper&gt; mapper,<a name="line.473"></a>
-<span class="sourceLineNo">474</span>      Class&lt;?&gt; outputKeyClass,<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      Class&lt;?&gt; outputValueClass, Job job,<a name="line.475"></a>
-<span class="sourceLineNo">476</span>      boolean addDependencyJars,<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      boolean initCredentials) throws IOException {<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    job.setInputFormatClass(MultiTableInputFormat.class);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    if (outputValueClass != null) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      job.setMapOutputValueClass(outputValueClass);<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    if (outputKeyClass != null) {<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      job.setMapOutputKeyClass(outputKeyClass);<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    }<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    job.setMapperClass(mapper);<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    Configuration conf = job.getConfiguration();<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    HBaseConfiguration.merge(conf, HBaseConfiguration.create(conf));<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    List&lt;String&gt; scanStrings = new ArrayList&lt;&gt;();<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    for (Scan scan : scans) {<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      scanStrings.add(convertScanToString(scan));<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    }<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    job.getConfiguration().setStrings(MultiTableInputFormat.SCANS,<a name="line.493"></a>
-<span class="sourceLineNo">494</span>      scanStrings.toArray(new String[scanStrings.size()]));<a name="line.494"></a>
-<span class="sourceLineNo">495</span><a name="line.495"></a>
-<span class="sourceLineNo">496</span>    if (addDependencyJars) {<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      addDependencyJars(job);<a name="line.497"></a>
-<span class="sourceLineNo">498</span>    }<a name="line.498"></a>
+<span class="sourceLineNo">391</span>   * @param snapshotName The name of the snapshot (of a table) to read from.<a name="line.391"></a>
+<span class="sourceLineNo">392</span>   * @param scan  The scan instance with the columns, time range etc.<a name="line.392"></a>
+<span class="sourceLineNo">393</span>   * @param mapper  The mapper class to use.<a name="line.393"></a>
+<span class="sourceLineNo">394</span>   * @param outputKeyClass  The class of the output key.<a name="line.394"></a>
+<span class="sourceLineNo">395</span>   * @param outputValueClass  The class of the output value.<a name="line.395"></a>
+<span class="sourceLineNo">396</span>   * @param job  The current job to adjust.  Make sure the passed job is<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   * carrying all necessary HBase configuration.<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   * @param addDependencyJars upload HBase jars and jars for any of the configured<a name="line.398"></a>
+<span class="sourceLineNo">399</span>   *           job classes via the distributed cache (tmpjars).<a name="line.399"></a>
+<span class="sourceLineNo">400</span>   *<a name="line.400"></a>
+<span class="sourceLineNo">401</span>   * @param tmpRestoreDir a temporary directory to copy the snapshot files into. Current user should<a name="line.401"></a>
+<span class="sourceLineNo">402</span>   * have write permissions to this directory, and this should not be a subdirectory of rootdir.<a name="line.402"></a>
+<span class="sourceLineNo">403</span>   * After the job is finished, restore directory can be deleted.<a name="line.403"></a>
+<span class="sourceLineNo">404</span>   * @param splitAlgo algorithm to split<a name="line.404"></a>
+<span class="sourceLineNo">405</span>   * @param numSplitsPerRegion how many input splits to generate per one region<a name="line.405"></a>
+<span class="sourceLineNo">406</span>   * @throws IOException When setting up the details fails.<a name="line.406"></a>
+<span class="sourceLineNo">407</span>   * @see TableSnapshotInputFormat<a name="line.407"></a>
+<span class="sourceLineNo">408</span>   */<a name="line.408"></a>
+<span class="sourceLineNo">409</span>  public static void initTableSnapshotMapperJob(String snapshotName, Scan scan,<a name="line.409"></a>
+<span class="sourceLineNo">410</span>                                                Class&lt;? extends TableMapper&gt; mapper,<a name="line.410"></a>
+<span class="sourceLineNo">411</span>                                                Class&lt;?&gt; outputKeyClass,<a name="line.411"></a>
+<span class="sourceLineNo">412</span>                                                Class&lt;?&gt; outputValueClass, Job job,<a name="line.412"></a>
+<span class="sourceLineNo">413</span>                                                boolean addDependencyJars, Path tmpRestoreDir,<a name="line.413"></a>
+<span class="sourceLineNo">414</span>                                                RegionSplitter.SplitAlgorithm splitAlgo,<a name="line.414"></a>
+<span class="sourceLineNo">415</span>                                                int numSplitsPerRegion)<a name="line.415"></a>
+<span class="sourceLineNo">416</span>          throws IOException {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    TableSnapshotInputFormat.setInput(job, snapshotName, tmpRestoreDir, splitAlgo,<a name="line.417"></a>
+<span class="sourceLineNo">418</span>            numSplitsPerRegion);<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    initTableMapperJob(snapshotName, scan, mapper, outputKeyClass,<a name="line.419"></a>
+<span class="sourceLineNo">420</span>            outputValueClass, job, addDependencyJars, false, TableSnapshotInputFormat.class);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    resetCacheConfig(job.getConfiguration());<a name="line.421"></a>
+<span class="sourceLineNo">422</span>  }<a name="line.422"></a>
+<span class="sourceLineNo">423</span><a name="line.423"></a>
+<span class="sourceLineNo">424</span>  /**<a name="line.424"></a>
+<span class="sourceLineNo">425</span>   * Use this before submitting a Multi TableMap job. It will appropriately set<a name="line.425"></a>
+<span class="sourceLineNo">426</span>   * up the job.<a name="line.426"></a>
+<span class="sourceLineNo">427</span>   *<a name="line.427"></a>
+<span class="sourceLineNo">428</span>   * @param scans The list of {@link Scan} objects to read from.<a name="line.428"></a>
+<span class="sourceLineNo">429</span>   * @param mapper The mapper class to use.<a name="line.429"></a>
+<span class="sourceLineNo">430</span>   * @param outputKeyClass The class of the output key.<a name="line.430"></a>
+<span class="sourceLineNo">431</span>   * @param outputValueClass The class of the output value.<a name="line.431"></a>
+<span class="sourceLineNo">432</span>   * @param job The current job to adjust. Make sure the passed job is carrying<a name="line.432"></a>
+<span class="sourceLineNo">433</span>   *          all necessary HBase configuration.<a name="line.433"></a>
+<span class="sourceLineNo">434</span>   * @throws IOException When setting up the details fails.<a name="line.434"></a>
+<span class="sourceLineNo">435</span>   */<a name="line.435"></a>
+<span class="sourceLineNo">436</span>  public static void initTableMapperJob(List&lt;Scan&gt; scans,<a name="line.436"></a>
+<span class="sourceLineNo">437</span>      Class&lt;? extends TableMapper&gt; mapper,<a name="line.437"></a>
+<span class="sourceLineNo">438</span>      Class&lt;?&gt; outputKeyClass,<a name="line.438"></a>
+<span class="sourceLineNo">439</span>      Class&lt;?&gt; outputValueClass, Job job) throws IOException {<a name="line.439"></a>
+<span class="sourceLineNo">440</span>    initTableMapperJob(scans, mapper, outputKeyClass, outputValueClass, job,<a name="line.440"></a>
+<span class="sourceLineNo">441</span>        true);<a name="line.441"></a>
+<span class="sourceLineNo">442</span>  }<a name="line.442"></a>
+<span class="sourceLineNo">443</span><a name="line.443"></a>
+<span class="sourceLineNo">444</span>  /**<a name="line.444"></a>
+<span class="sourceLineNo">445</span>   * Use this before submitting a Multi TableMap job. It will appropriately set<a name="line.445"></a>
+<span class="sourceLineNo">446</span>   * up the job.<a name="line.446"></a>
+<span class="sourceLineNo">447</span>   *<a name="line.447"></a>
+<span class="sourceLineNo">448</span>   * @param scans The list of {@link Scan} objects to read from.<a name="line.448"></a>
+<span class="sourceLineNo">449</span>   * @param mapper The mapper class to use.<a name="line.449"></a>
+<span class="sourceLineNo">450</span>   * @param outputKeyClass The class of the output key.<a name="line.450"></a>
+<span class="sourceLineNo">451</span>   * @param outputValueClass The class of the output value.<a name="line.451"></a>
+<span class="sourceLineNo">452</span>   * @param job The current job to adjust. Make sure the passed job is carrying<a name="line.452"></a>
+<span class="sourceLineNo">453</span>   *          all necessary HBase configuration.<a name="line.453"></a>
+<span class="sourceLineNo">454</span>   * @param addDependencyJars upload HBase jars and jars for any of the<a name="line.454"></a>
+<span class="sourceLineNo">455</span>   *          configured job classes via the distributed cache (tmpjars).<a name="line.455"></a>
+<span class="sourceLineNo">456</span>   * @throws IOException When setting up the details fails.<a name="line.456"></a>
+<span class="sourceLineNo">457</span>   */<a name="line.457"></a>
+<span class="sourceLineNo">458</span>  public static void initTableMapperJob(List&lt;Scan&gt; scans,<a name="line.458"></a>
+<span class="sourceLineNo">459</span>      Class&lt;? extends TableMapper&gt; mapper,<a name="line.459"></a>
+<span class="sourceLineNo">460</span>      Class&lt;?&gt; outputKeyClass,<a name="line.460"></a>
+<span class="sourceLineNo">461</span>      Class&lt;?&gt; outputValueClass, Job job,<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      boolean addDependencyJars) throws IOException {<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    initTableMapperJob(scans, mapper, outputKeyClass, outputValueClass, job,<a name="line.463"></a>
+<span class="sourceLineNo">464</span>      addDependencyJars, true);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>  }<a name="line.465"></a>
+<span class="sourceLineNo">466</span><a name="line.466"></a>
+<span class="sourceLineNo">467</span>  /**<a name="line.467"></a>
+<span class="sourceLineNo">468</span>   * Use this before submitting a Multi TableMap job. It will appropriately set<a name="line.468"></a>
+<span class="sourceLineNo">469</span>   * up the job.<a name="line.469"></a>
+<span class="sourceLineNo">470</span>   *<a name="line.470"></a>
+<span class="sourceLineNo">471</span>   * @param scans The list of {@link Scan} objects to read from.<a name="line.471"></a>
+<span class="sourceLineNo">472</span>   * @param mapper The mapper class to use.<a name="line.472"></a>
+<span class="sourceLineNo">473</span>   * @param outputKeyClass The class of the output key.<a name="line.473"></a>
+<span class="sourceLineNo">474</span>   * @param outputValueClass The class of the output value.<a name="line.474"></a>
+<span class="sourceLineNo">475</span>   * @param job The current job to adjust. Make sure the passed job is carrying<a name="line.475"></a>
+<span class="sourceLineNo">476</span>   *          all necessary HBase configuration.<a name="line.476"></a>
+<span class="sourceLineNo">477</span>   * @param addDependencyJars upload HBase jars and jars for any of the<a name="line.477"></a>
+<span class="sourceLineNo">478</span>   *          configured job classes via the distributed cache (tmpjars).<a name="line.478"></a>
+<span class="sourceLineNo">479</span>   * @param initCredentials whether to initialize hbase auth credentials for the job<a name="line.479"></a>
+<span class="sourceLineNo">480</span>   * @throws IOException When setting up the details fails.<a name="line.480"></a>
+<span class="sourceLineNo">481</span>   */<a name="line.481"></a>
+<span class="sourceLineNo">482</span>  public static void initTableMapperJob(List&lt;Scan&gt; scans,<a name="line.482"></a>
+<span class="sourceLineNo">483</span>      Class&lt;? extends TableMapper&gt; mapper,<a name="line.483"></a>
+<span class="sourceLineNo">484</span>      Class&lt;?&gt; outputKeyClass,<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      Class&lt;?&gt; outputValueClass, Job job,<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      boolean addDependencyJars,<a name="line.486"></a>
+<span class="sourceLineNo">487</span>      boolean initCredentials) throws IOException {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    job.setInputFormatClass(MultiTableInputFormat.class);<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    if (outputValueClass != null) {<a name="line.489"></a>
+<span class="sourceLineNo">490</span>      job.setMapOutputValueClass(outputValueClass);<a name="line.490"></a>
+<span class="sourceLineNo">491</span>    }<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    if (outputKeyClass != null) {<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      job.setMapOutputKeyClass(outputKeyClass);<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    }<a name="line.494"></a>
+<span class="sourceLineNo">495</span>    job.setMapperClass(mapper);<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    Configuration conf = job.getConfiguration();<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    HBaseConfiguration.merge(conf, HBaseConfiguration.create(conf));<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    List&lt;String&gt; scanStrings = new ArrayList&lt;&gt;();<a name="line.498"></a>
 <span class="sourceLineNo">499</span><a name="line.499"></a>
-<span class="sourceLineNo">500</span>    if (initCredentials) {<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      initCredentials(job);<a name="line.501"></a>
+<span class="sourceLineNo">500</span>    for (Scan scan : scans) {<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      scanStrings.add(convertScanToString(scan));<a name="line.501"></a>
 <span class="sourceLineNo">502</span>    }<a name="line.502"></a>
-<span class="sourceLineNo">503</span>  }<a name="line.503"></a>
-<span class="sourceLineNo">504</span><a name="line.504"></a>
-<span class="sourceLineNo">505</span>  public static void initCredentials(Job job) throws IOException {<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    UserProvider userProvider = UserProvider.instantiate(job.getConfiguration());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    if (userProvider.isHadoopSecurityEnabled()) {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>      // propagate delegation related props from launcher job to MR job<a name="line.508"></a>
-<span class="sourceLineNo">509</span>      if (System.getenv("HADOOP_TOKEN_FILE_LOCATION") != null) {<a name="line.509"></a>
-<span class="sourceLineNo">510</span>        job.getConfiguration().set("mapreduce.job.credentials.binary",<a name="line.510"></a>
-<span class="sourceLineNo">511</span>                                   System.getenv("HADOOP_TOKEN_FILE_LOCATION"));<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      }<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    }<a name="line.513"></a>
+<span class="sourceLineNo">503</span>    job.getConfiguration().setStrings(MultiTableInputFormat.SCANS,<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      scanStrings.toArray(new String[scanStrings.size()]));<a name="line.504"></a>
+<span class="sourceLineNo">505</span><a name="line.505"></a>
+<span class="sourceLineNo">506</span>    if (addDependencyJars) {<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      addDependencyJars(job);<a name="line.507"></a>
+<span class="sourceLineNo">508</span>    }<a name="line.508"></a>
+<span class="sourceLineNo">509</span><a name="line.509"></a>
+<span class="sourceLineNo">510</span>    if (initCredentials) {<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      initCredentials(job);<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    }<a name="line.512"></a>
+<span class="sourceLineNo">513</span>  }<a name="line.513"></a>
 <span class="sourceLineNo">514</span><a name="line.514"></a>
-<span class="sourceLineNo">515</span>    if (userProvider.isHBaseSecurityEnabled()) {<a name="line.515"></a>
-<span class="sourceLineNo">516</span>      try {<a name="line.516"></a>
-<span class="sourceLineNo">517</span>        // init credentials for remote cluster<a name="line.517"></a>
-<span class="sourceLineNo">518</span>        String quorumAddress = job.getConfiguration().get(TableOutputFormat.QUORUM_ADDRESS);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>        User user = userProvider.getCurrent();<a name="line.519"></a>
-<span class="sourceLineNo">520</span>        if (quorumAddress != null) {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          Configuration peerConf = HBaseConfiguration.createClusterConf(job.getConfiguration(),<a name="line.521"></a>
-<span class="sourceLineNo">522</span>              quorumAddress, TableOutputFormat.OUTPUT_CONF_PREFIX);<a name="line.522"></a>
-<span class="sourceLineNo">523</span>          Connection peerConn = ConnectionFactory.createConnection(peerConf);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>          try {<a name="line.524"></a>
-<span class="sourceLineNo">525</span>            TokenUtil.addTokenForJob(peerConn, user, job);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>          } finally {<a name="line.526"></a>
-<span class="sourceLineNo">527</span>            peerConn.close();<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          }<a name="line.528"></a>
-<span class="sourceLineNo">529</span>        }<a name="line.529"></a>
-<span class="sourceLineNo">530</span><a name="line.530"></a>
-<span class="sourceLineNo">531</span>        Connection conn = ConnectionFactory.createConnection(job.getConfiguration());<a name="line.531"></a>
-<span class="sourceLineNo">532</span>        try {<a name="line.532"></a>
-<span class="sourceLineNo">533</span>          TokenUtil.addTokenForJob(conn, user, job);<a name="line.533"></a>
-<span class="sourceLineNo">534</span>        } finally {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          conn.close();<a name="line.535"></a>
-<span class="sourceLineNo">536</span>        }<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      } catch (InterruptedException ie) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>        LOG.info("Interrupted obtaining user authentication token");<a name="line.538"></a>
-<span class="sourceLineNo">539</span>        Thread.currentThread().interrupt();<a name="line.539"></a>
-<span class="sourceLineNo">540</span>      }<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    }<a name="line.541"></a>
-<span class="sourceLineNo">542</span>  }<a name="line.542"></a>
-<span class="sourceLineNo">543</span><a name="line.543"></a>
-<span class="sourceLineNo">544</span>  /**<a name="line.544"></a>
-<span class="sourceLineNo">545</span>   * Obtain an authentication token, for the specified cluster, on behalf of the current user<a name="line.545"></a>
-<span class="sourceLineNo">546</span>   * and add it to the credentials for the given map reduce job.<a name="line.546"></a>
-<span class="sourceLineNo">547</span>   *<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * The quorumAddress is the key to the ZK ensemble, which contains:<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * hbase.zookeeper.quorum, hbase.zookeeper.client.port and<a name="line.549"></a>
-<span class="sourceLineNo">550</span>   * zookeeper.znode.parent<a name="line.550"></a>
-<span class="sourceLineNo">551</span>   *<a name="line.551"></a>
-<span class="sourceLineNo">552</span>   * @param job The job that requires the permission.<a name="line.552"></a>
-<span class="sourceLineNo">553</span>   * @param quorumAddress string that contains the 3 required configuratins<a name="line.553"></a>
-<span class="sourceLineNo">554</span>   * @throws IOException When the authentication token cannot be obtained.<a name="line.554"></a>
-<span class="sourceLineNo">555</span>   * @deprecated Since 1.2.0 and will be removed in 3.0.0. Use<a name="line.555"></a>
-<span class="sourceLineNo">556</span>   *   {@link #initCredentialsForCluster(Job, Configuration)} instead.<a name="line.556"></a>
-<span class="sourceLineNo">557</span>   * @see #initCredentialsForCluster(Job, Configuration)<a name="line.557"></a>
-<span class="sourceLineNo">558</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-14886"&gt;HBASE-14886&lt;/a&gt;<a name="line.558"></a>
-<span class="sourceLineNo">559</span>   */<a name="line.559"></a>
-<span class="sourceLineNo">560</span>  @Deprecated<a name="line.560"></a>
-<span class="sourceLineNo">561</span>  public static void initCredentialsForCluster(Job job, String quorumAddress)<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      throws IOException {<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    Configuration peerConf = HBaseConfiguration.createClusterConf(job.getConfiguration(),<a name="line.563"></a>
-<span class="sourceLineNo">564</span>        quorumAddress);<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    initCredentialsForCluster(job, peerConf);<a name="line.565"></a>
-<span class="sourceLineNo">566</span>  }<a name="line.566"></a>
-<span class="sourceLineNo">567</span><a name="line.567"></a>
-<span class="sourceLineNo">568</span>  /**<a name="line.568"></a>
-<span class="sourceLineNo">569</span>   * Obtain an authentication token, for the specified cluster, on behalf of the current user<a name="line.569"></a>
-<span class="sourceLineNo">570</span>   * and add it to the credentials for the given map reduce job.<a name="line.570"></a>
-<span class="sourceLineNo">571</span>   *<a name="line.571"></a>
-<span class="sourceLineNo">572</span>   * @param job The job that requires the permission.<a name="line.572"></a>
-<span class="sourceLineNo">573</span>   * @param conf The configuration to use in connecting to the peer cluster<a name="line.573"></a>
-<span class="sourceLineNo">574</span>   * @throws IOException When the authentication token cannot be obtained.<a name="line.574"></a>
-<span class="sourceLineNo">575</span>   */<a name="line.575"></a>
-<span class="sourceLineNo">576</span>  public static void initCredentialsForCluster(Job job, Configuration conf)<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      throws IOException {<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    UserProvider userProvider = UserProvider.instantiate(job.getConfiguration());<a name="line.578"></a>
-<span class="sourceLineNo">579</span>    if (userProvider.isHBaseSecurityEnabled()) {<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      try {<a name="line.580"></a>
-<span class="sourceLineNo">581</span>        Connection peerConn = ConnectionFactory.createConnection(conf);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>        try {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>          TokenUtil.addTokenForJob(peerConn, userProvider.getCurrent(), job);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>        } finally {<a name="line.584"></a>
-<span class="sourceLineNo">585</span>          peerConn.close();<a name="line.585"></a>
-<span class="sourceLineNo">586</span>        }<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      } catch (InterruptedException e) {<a name="line.587"></a>
-<span class="sourceLineNo">588</span>        LOG.info("Interrupted obtaining user authentication token");<a name="line.588"></a>
-<span class="sourceLineNo">589</span>        Thread.interrupted();<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      }<a name="line.590"></a>
-<span class="sourceLineNo">591</span>    }<a name="line.591"></a>
-<span class="sourceLineNo">592</span>  }<a name="line.592"></a>
-<span class="sourceLineNo">593</span><a name="line.593"></a>
-<span class="sourceLineNo">594</span>  /**<a name="line.594"></a>
-<span class="sourceLineNo">595</span>   * Writes the given scan into a Base64 encoded string.<a name="line.595"></a>
-<span class="sourceLineNo">596</span>   *<a name="line.596"></a>
-<span class="sourceLineNo">597</span>   * @param scan  The scan to write out.<a name="line.597"></a>
-<span class="sourceLineNo">598</span>   * @return The scan saved in a Base64 encoded string.<a name="line.598"></a>
-<span class="sourceLineNo">599</span>   * @throws IOException When writing the scan fails.<a name="line.599"></a>
-<span class="sourceLineNo">600</span>   */<a name="line.600"></a>
-<span class="sourceLineNo">601</span>  public static String convertScanToString(Scan scan) throws IOException {<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    ClientProtos.Scan proto = ProtobufUtil.toScan(scan);<a name="line.602"></a>
-<span class="sourceLineNo">603</span>    return Bytes.toString(Base64.getEncoder().encode(proto.toByteArray()));<a name="line.603"></a>
-<span class="sourceLineNo">604</span>  }<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>  /**<a name="line.606"></a>
-<span class="sourceLineNo">607</span>   * Converts the given Base64 string back into a Scan instance.<a name="line.607"></a>
-<span class="sourceLineNo">608</span>   *<a name="line.608"></a>
-<span class="sourceLineNo">609</span>   * @param base64  The scan details.<a name="line.609"></a>
-<span class="sourceLineNo">610</span>   * @return The newly created Scan instance.<a name="line.610"></a>
-<span class="sourceLineNo">611</span>   * @throws IOException When reading the scan instance fails.<a name="line.611"></a>
-<span class="sourceLineNo">612</span>   */<a name="line.612"></a>
-<span class="sourceLineNo">613</span>  public static Scan convertStringToScan(String base64) throws IOException {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    byte [] decoded = Base64.getDecoder().decode(base64);<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    return ProtobufUtil.toScan(ClientProtos.Scan.parseFrom(decoded));<a name="line.615"></a>
-<span class="sourceLineNo">616</span>  }<a name="line.616"></a>
-<span class="sourceLineNo">617</span><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Use this before submitting a TableReduce job. It will<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * appropriately set up the JobConf.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   *<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * @param table  The output table.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * @param reducer  The reducer class to use.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   * @param job  The current job to adjust.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>   * @throws IOException When determining the region count fails.<a name="line.625"></a>
-<span class="sourceLineNo">626</span>   */<a name="line.626"></a>
-<span class="sourceLineNo">627</span>  public static void initTableReducerJob(String table,<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    Class&lt;? extends TableReducer&gt; reducer, Job job)<a name="line.628"></a>
-<span class="sourceLineNo">629</span>  throws IOException {<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    initTableReducerJob(table, reducer, job, null);<a name="line.630"></a>
-<span class="sourceLineNo">631</span>  }<a name="line.631"></a>
-<span class="sourceLineNo">632</span><a name="line.632"></a>
-<span class="sourceLineNo">633</span>  /**<a name="line.633"></a>
-<span class="sourceLineNo">634</span>   * Use this before submitting a TableReduce job. It will<a name="line.634"></a>
-<span class="sourceLineNo">635</span>   * appropriately set up the JobConf.<a name="line.635"></a>
-<span class="sourceLineNo">636</span>   *<a name="line.636"></a>
-<span class="sourceLineNo">637</span>   * @param table  The output table.<a name="line.637"></a>
-<span class="sourceLineNo">638</span>   * @param reducer  The reducer class to use.<a name="line.638"></a>
-<span class="sourceLineNo">639</span>   * @param job  The current job to adjust.<a name="line.639"></a>
-<span class="sourceLineNo">640</span>   * @param partitioner  Partitioner to use. Pass &lt;code&gt;null&lt;/code&gt; to use<a name="line.640"></a>
-<span class="sourceLineNo">641</span>   * default partitioner.<a name="line.641"></a>
-<span class="sourceLineNo">642</span>   * @throws IOException When determining the region count fails.<a name="line.642"></a>
-<span class="sourceLineNo">643</span>   */<a name="line.643"></a>
-<span class="sourceLineNo">644</span>  public static void initTableReducerJob(String table,<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    Class&lt;? extends TableReducer&gt; reducer, Job job,<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    Class partitioner) throws IOException {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    initTableReducerJob(table, reducer, job, partitioner, null, null, null);<a name="line.647"></a>
-<span class="sourceLineNo">648</span>  }<a name="line.648"></a>
-<span class="sourceLineNo">649</span><a name="line.649"></a>
-<span class="sourceLineNo">650</span>  /**<a name="line.650"></a>
-<span class="sourceLineNo">651</span>   * Use this before submitting a TableReduce job. It will<a name="line.651"></a>
-<span class="sourceLineNo">652</span>   * appropriately set up the JobConf.<a name="line.652"></a>
-<span class="sourceLineNo">653</span>   *<a name="line.653"></a>
-<span class="sourceLineNo">654</span>   * @param table  The output table.<a name="line.654"></a>
-<span class="sourceLineNo">655</span>   * @param reducer  The reducer class to use.<a name="line.655"></a>
-<span class="sourceLineNo">656</span>   * @param job  The current job to adjust.  Make sure the passed job is<a name="line.656"></a>
-<span class="sourceLineNo">657</span>   * carrying all necessary HBase configuration.<a name="line.657"></a>
-<span class="sourceLineNo">658</span>   * @param partitioner  Partitioner to use. Pass &lt;code&gt;null&lt;/code&gt; to use<a name="line.658"></a>
-<span class="sourceLineNo">659</span>   * default partitioner.<a name="line.659"></a>
-<span class="sourceLineNo">660</span>   * @param quorumAddress Distant cluster to write to; default is null for<a name="line.660"></a>
-<span class="sourceLineNo">661</span>   * output to the cluster that is designated in &lt;code&gt;hbase-site.xml&lt;/code&gt;.<a name="line.661"></a>
-<span class="sourceLineNo">662</span>   * Set this String to the zookeeper ensemble of an alternate remote cluster<a name="line.662"></a>
-<span class="sourceLineNo">663</span>   * when you would have the reduce write a cluster that is other than the<a name="line.663"></a>
-<span class="sourceLineNo">664</span>   * default; e.g. copying tables between clusters, the source would be<a name="line.664"></a>
-<span class="sourceLineNo">665</span>   * designated by &lt;code&gt;hbase-site.xml&lt;/code&gt; and this param would have the<a name="line.665"></a>
-<span class="sourceLineNo">666</span>   * ensemble address of the remote cluster.  The format to pass is particular.<a name="line.666"></a>
-<span class="sourceLineNo">667</span>   * Pass &lt;code&gt; &amp;lt;hbase.zookeeper.quorum&amp;gt;:&amp;lt;<a name="line.667"></a>
-<span class="sourceLineNo">668</span>   *             hbase.zookeeper.client.port&amp;gt;:&amp;lt;zookeeper.znode.parent&amp;gt;<a name="line.668"></a>
-<span class="sourceLineNo">669</span>   * &lt;/code&gt; such as &lt;code&gt;server,server2,server3:2181:/hbase&lt;/code&gt;.<a name="line.669"></a>
-<span class="sourceLineNo">670</span>   * @param serverClass redefined hbase.regionserver.class<a name="line.670"></a>
-<span class="sourceLineNo">671</span>   * @param serverImpl redefined hbase.regionserver.impl<a name="line.671"></a>
-<span class="sourceLineNo">672</span>   * @throws IOException When determining the region count fails.<a name="line.672"></a>
-<span class="sourceLineNo">673</span>   */<a name="line.673"></a>
-<span class="sourceLineNo">674</span>  public static void initTableReducerJob(String table,<a name="line.674"></a>
-<span class="sourceLineNo">675</span>    Class&lt;? extends TableReducer&gt; reducer, Job job,<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    Class partitioner, String quorumAddress, String serverClass,<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    String serverImpl) throws IOException {<a name="line.677"></a>
-<span class="sourceLineNo">678</span>    initTableReducerJob(table, reducer, job, partitioner, quorumAddress,<a name="line.678"></a>
-<span class="sourceLineNo">679</span>        serverClass, serverImpl, true);<a name="line.679"></a>
-<span class="sourceLineNo">680</span>  }<a name="line.680"></a>
-<span class="sourceLineNo">681</span><a name="line.681"></a>
-<span class="sourceLineNo">682</span>  /**<a name="line.682"></a>
-<span class="sourceLineNo">683</span>   * Use this before submitting a TableReduce job. It will<a name="line.683"></a>
-<span class="sourceLineNo">684</span>   * appropriately set up the JobConf.<a name="line.684"></a>
-<span class="sourceLineNo">685</span>   *<a name="line.685"></a>
-<span class="sourceLineNo">686</span>   * @param table  The output table.<a name="line.686"></a>
-<span class="sourceLineNo">687</span>   * @param reducer  The reducer class to use.<a name="line.687"></a>
-<span class="sourceLineNo">688</span>   * @param job  The current job to adjust.  Make sure the passed job is<a name="line.688"></a>
-<span class="sourceLineNo">689</span>   * carrying all necessary HBase configuration.<a name="line.689"></a>
-<span class="sourceLineNo">690</span>   * @param partitioner  Partitioner to use. Pass &lt;code&gt;null&lt;/code&gt; to use<a name="line.690"></a>
-<span class="sourceLineNo">691</span>   * default partitioner.<a name="line.691"></a>
-<span class="sourceLineNo">692</span>   * @param quorumAddress Distant cluster to write to; default is null for<a name="line.692"></a>
-<span class="sourceLineNo">693</span>   * output to the cluster that is designated in &lt;code&gt;hbase-site.xml&lt;/code&gt;.<a name="line.693"></a>
-<span class="sourceLineNo">694</span>   * Set this String to the zookeeper ensemble of an alternate remote cluster<a name="line.694"></a>
-<span class="sourceLineNo">695</span>   * when you would have the reduce write a cluster that is other than the<a name="line.695"></a>
-<span class="sourceLineNo">696</span>   * default; e.g. copying tables between clusters, the source would be<a name="line.696"></a>
-<span class="sourceLineNo">697</span>   * designated by &lt;code&gt;hbase-site.xml&lt;/code&gt; and this param would have the<a name="line.697"></a>
-<span class="sourceLineNo">698</span>   * ensemble address of the remote cluster.  The format to pass is particular.<a name="line.698"></a>
-<span class="sourceLineNo">699</span>   * Pass &lt;code&gt; &amp;lt;hbase.zookeeper.quorum&amp;gt;:&amp;lt;<a name="line.699"></a>
-<span class="sourceLineNo">700</span>   *             hbase.zookeeper.client.port&amp;gt;:&amp;lt;zookeeper.znode.parent&amp;gt;<a name="line.700"></a>
-<span class="sourceLineNo">701</span>   * &lt;/code&gt; such as &lt;code&gt;server,server2,server3:2181:/hbase&lt;/code&gt;.<a name="line.701"></a>
-<span class="sourceLineNo">702</span>   * @param serverClass redefined hbase.regionserver.class<a name="line.702"></a>
-<span class="sourceLineNo">703</span>   * @param serverImpl redefined hbase.regionserver.impl<a name="line.703"></a>
-<span class="sourceLineNo">704</span>   * @param addDependencyJars upload HBase jars and jars for any of the configured<a name="line.704"></a>
-<span class="sourceLineNo">705</span>   *           job classes via the distributed cache (tmpjars).<a name="line.705"></a>
-<span class="sourceLineNo">706</span>   * @throws IOException When determining the region count fails.<a name="line.706"></a>
-<span class="sourceLineNo">707</span>   */<a name="line.707"></a>
-<span class="sourceLineNo">708</span>  public static void initTableReducerJob(String table,<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    Class&lt;? extends TableReducer&gt; reducer, Job job,<a name="line.709"></a>
-<span class="sourceLineNo">710</span>    Class partitioner, String quorumAddress, String serverClass,<a name="line.710"></a>
-<span class="sourceLineNo">711</span>    String serverImpl, boolean addDependencyJars) throws IOException {<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>    Configuration conf = job.getConfiguration();<a name="line.713"></a>
-<span class="sourceLineNo">714</span>    HBaseConfiguration.merge(conf, HBaseConfiguration.create(conf));<a name="line.714"></a>
-<span class="sourceLineNo">715</span>    job.setOutputFormatClass(TableOutputFormat.class);<a name="line.715"></a>
-<span class="sourceLineNo">716</span>    if (reducer != null) job.setReducerClass(reducer);<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    conf.set(TableOutputFormat.OUTPUT_TABLE, table);<a name="line.717"></a>
-<span class="sourceLineNo">718</span>    conf.setStrings("io.serializations", conf.get("io.serializations"),<a name="line.718"></a>
-<span class="sourceLineNo">719</span>        MutationSerialization.class.getName(), ResultSerialization.class.getName());<a name="line.719"></a>
-<span class="sourceLineNo">720</span>    // If passed a quorum/ensemble address, pass it on to TableOutputFormat.<a name="line.720"></a>
-<span class="sourceLineNo">721</span>    if (quorumAddress != null) {<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      // Calling this will validate the format<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      ZKConfig.validateClusterKey(quorumAddress);<a name="line.723"></a>
-<span class="sourceLineNo">724</span>      conf.set(TableOutputFormat.QUORUM_ADDRESS,quorumAddress);<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    }<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    if (serverClass != null &amp;&amp; serverImpl != null) {<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      conf.set(TableOutputFormat.REGION_SERVER_CLASS, serverClass);<a name="line.727"></a>
-<span class="sourceLineNo">728</span>      conf.set(TableOutputFormat.REGION_SERVER_IMPL, serverImpl);<a name="line.728"></a>
-<span class="sourceLineNo">729</span>    }<a name="line.729"></a>
-<span class="sourceLineNo">730</span>    job.setOutputKeyClass(ImmutableBytesWritable.class);<a name="line.730"></a>
-<span class="sourceLineNo">731</span>    job.setOutputValueClass(Writable.class);<a name="line.731"></a>
-<span class="sourceLineNo">732</span>    if (partitioner == HRegionPartitioner.class) {<a name="line.732"></a>
-<span class="sourceLineNo">733</span>      job.setPartitionerClass(HRegionPartitioner.class);<a name="line.733"></a>
-<span class="sourceLineNo">734</span>      int regions = getRegionCount(conf, TableName.valueOf(table));<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      if (job.getNumReduceTasks() &gt; regions) {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>        job.setNumReduceTasks(regions);<a name="line.736"></a>
-<span class="sourceLineNo">737</span>      }<a name="line.737"></a>
-<span class="sourceLineNo">738</span>    } else if (partitioner != null) {<a name="line.738"></a>
-<span class="sourceLineNo">739</span>      job.setPartitionerClass(partitioner);<a name="line.739"></a>
-<span class="sourceLineNo">740</span>    }<a name="line.740"></a>
-<span class="sourceLineNo">741</span><a name="line.741"></a>
-<span class="sourceLineNo">742</span>    if (addDependencyJars) {<a name="line.742"></a>
-<span class="sourceLineNo">743</span>      addDependencyJars(job);<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    }<a name="line.744"></a>
-<span class="sourceLineNo">745</span><a name="line.745"></a>
-<span class="sourceLineNo">746</span>    initCredentials(job);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>  }<a name="line.747"></a>
-<span class="sourceLineNo">748</span><a name="line.748"></a>
-<span class="sourceLineNo">749</span>  /**<a name="line.749"></a>
-<span class="sourceLineNo">750</span>   * Ensures that the given number of reduce tasks for the given job<a name="line.750"></a>
-<span class="sourceLineNo">751</span>   * configuration does not exceed the number of regions for the given table.<a name="line.751"></a>
-<span class="sourceLineNo">752</span>   *<a name="line.752"></a>
-<span class="sourceLineNo">753</span>   * @param table  The table to get the region count for.<a name="line.753"></a>
-<span class="sourceLineNo">754</span>   * @param job  The current job to adjust.<a name="line.754"></a>
-<span class="sourceLineNo">755</span>   * @throws IOException When retrieving the table details fails.<a name="line.755"></a>
-<span class="sourceLineNo">756</span>   */<a name="line.756"></a>
-<span class="sourceLineNo">757</span>  public static void limitNumReduceTasks(String table, Job job) throws IOException {<a name="line.757"></a>
-<span class="sourceLineNo">758</span>    int regions = getRegionCount(job.getConfiguration(), TableName.valueOf(table));<a name="line.758"></a>
-<span class="sourceLineNo">759</span>    if (job.getNumReduceTasks() &gt; regions) {<a name="line.759"></a>
-<span class="sourceLineNo">760</span>      job.setNumReduceTasks(regions);<a name="line.760"></a>
-<span class="sourceLineNo">761</span>    }<a name="line.761"></a>
-<span class="sourceLineNo">762</span>  }<a name="line.762"></a>
-<span class="sourceLineNo">763</span><a name="line.763"></a>
-<span class="sourceLineNo">764</span>  /**<a name="line.764"></a>
-<span class="sourceLineNo">765</span>   * Sets the number of reduce tasks for the given job configuration to the<a name="line.765"></a>
-<span class="sourceLineNo">766</span>   * number of regions the given table has.<a name="line.766"></a>
-<span class="sourceLineNo">767</span>   *<a name="line.767"></a>
-<span class="sourceLineNo">768</span>   * @param table  The table to get the region count for.<a name="line.768"></a>
-<span class="sourceLineNo">769</span>   * @param job  The current job to adjust.<a name="line.769"></a>
-<span class="sourceLineNo">770</span>   * @throws IOException When retrieving the table details fails.<a name="line.770"></a>
-<span class="sourceLineNo">771</span>   */<a name="line.771"></a>
-<span class="sourceLineNo">772</span>  public static void setNumReduceTasks(String table, Job job) throws IOException {<a name="line.772"></a>
-<span class="sourceLineNo">773</span>    job.setNumReduceTasks(getRegionCount(job.getConfiguration(), TableName.valueOf(table)));<a name="line.773"></a>
-<span class="sourceLineNo">774</span>  }<a name="line.774"></a>
-<span class="sourceLineNo">775</span><a name="line.775"></a>
-<span class="sourceLineNo">776</span>  /**<a name="line.776"></a>
-<span class="sourceLineNo">777</span>   * Sets the number of rows to return and cache with each scanner iteration.<a name="line.777"></a>
-<span class="sourceLineNo">778</span>   * Higher caching values will enable faster mapreduce jobs at the expense of<a name="line.778"></a>
-<span class="sourceLineNo">779</span>   * requiring more heap to contain the cached rows.<a name="line.779"></a>
-<span class="sourceLineNo">780</span>   *<a name="line.780"></a>
-<span class="sourceLineNo">781</span>   * @param job The current job to adjust.<a name="line.781"></a>
-<span class="sourceLineNo">782</span>   * @param batchSize The number of rows to return in batch with each scanner<a name="line.782"></a>
-<span class="sourceLineNo">783</span>   * iteration.<a name="line.783"></a>
-<span class="sourceLineNo">784</span>   */<a name="line.784"></a>
-<span class="sourceLineNo">785</span>  public static void setScannerCaching(Job job, int batchSize) {<a name="line.785"></a>
-<span class="sourceLineNo">786</span>    job.getConfiguration().setInt("hbase.client.scanner.caching", batchSize);<a name="line.786"></a>
-<span class="sourceLineNo">787</span>  }<a name="line.787"></a>
-<span class="sourceLineNo">788</span><a name="line.788"></a>
-<span class="sourceLineNo">789</span>  /**<a name="line.789"></a>
-<span class="sourceLineNo">790</span>   * Add HBase and its dependencies (only) to the job configuration.<a name="line.790"></a>
-<span class="sourceLineNo">791</span>   * &lt;p&gt;<a name="line.791"></a>
-<span class="sourceLineNo">792</span>   * This is intended as a low-level API, facilitating code reuse between this<a name="line.792"></a>
-<span class="sourceLineNo">793</span>   * class and its mapred counterpart. It also of use to external tools that<a name="line.793"></a>
-<span class="sourceLineNo">794</span>   * need to build a MapReduce job that interacts with HBase but want<a name="line.794"></a>
-<span class="sourceLineNo">795</span>   * fine-grained control over the jars shipped to the cluster.<a name="line.795"></a>
-<span class="sourceLineNo">796</span>   * &lt;/p&gt;<a name="line.796"></a>
-<span class="sourceLineNo">797</span>   * @param conf The Configuration object to extend with dependencies.<a name="line.797"></a>
-<span class="sourceLineNo">798</span>   * @see org.apache.hadoop.hbase.mapred.TableMapReduceUtil<a name="line.798"></a>
-<span class="sourceLineNo">799</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/PIG-3285"&gt;PIG-3285&lt;/a&gt;<a name="line.799"></a>
-<span class="sourceLineNo">800</span>   */<a name="line.800"></a>
-<span class="sourceLineNo">801</span>  public static void addHBaseDependencyJars(Configuration conf) throws IOException {<a name="line.801"></a>
-<span class="sourceLineNo">802</span>    addDependencyJarsForClasses(conf,<a name="line.802"></a>
-<span class="sourceLineNo">803</span>      // explicitly pull a class from each module<a name="line.803"></a>
-<span class="sourceLineNo">804</span>      org.apache.hadoop.hbase.HConstants.class,                      // hbase-common<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.class, // hbase-protocol-shaded<a name="line.805"></a>
-<span class="sourceLineNo">806</span>      org.apache.hadoop.hbase.client.Put.class,                      // hbase-client<a name="line.806"></a>
-<span class="sourceLineNo">807</span>      org.apache.hadoop.hbase.ipc.RpcServer.class,                   // hbase-server<a name="line.807"></a>
-<span class="sourceLineNo">808</span>      org.apache.hadoop.hbase.CompatibilityFactory.class,            // hbase-hadoop-compat<a name="line.808"></a>
-<span class="sourceLineNo">809</span>      org.apache.hadoop.hbase.mapreduce.JobUtil.class,               // hbase-hadoop2-compat<a name="line.809"></a>
-<span class="sourceLineNo">810</span>      org.apache.hadoop.hbase.mapreduce.TableMapper.class,           // hbase-mapreduce<a name="line.810"></a>
-<span class="sourceLineNo">811</span>      org.apache.hadoop.hbase.metrics.impl.FastLongHistogram.class,  // hbase-metrics<a name="line.811"></a>
-<span class="sourceLineNo">812</span>      org.apache.hadoop.hbase.metrics.Snapshot.class,                // hbase-metrics-api<a name="line.812"></a>
-<span class="sourceLineNo">813</span>      org.apache.hadoop.hbase.replication.ReplicationUtils.class,    // hbase-replication<a name="line.813"></a>
-<span class="sourceLineNo">814</span>      org.apache.hadoop.hbase.http.HttpServer.class,                 // hbase-http<a name="line.814"></a>
-<span class="sourceLineNo">815</span>      org.apache.hadoop.hbase.procedure2.Procedure.class,            // hbase-procedure<a name="line.815"></a>
-<span class="sourceLineNo">816</span>      org.apache.hadoop.hbase.zookeeper.ZKWatcher.class,             // hbase-zookeeper<a name="line.816"></a>
-<span class="sourceLineNo">817</span>      org.apache.hbase.thirdparty.com.google.common.collect.Lists.class, // hb-shaded-miscellaneous<a name="line.817"></a>
-<span class="sourceLineNo">818</span>      org.apache.hbase.thirdparty.com.google.gson.GsonBuilder.class, // hbase-shaded-gson<a name="line.818"></a>
-<span class="sourceLineNo">819</span>      org.apache.hbase.thirdparty.com.google.protobuf.UnsafeByteOperations.class, // hb-sh-protobuf<a name="line.819"></a>
-<span class="sourceLineNo">820</span>      org.apache.hbase.thirdparty.io.netty.channel.Channel.class,    // hbase-shaded-netty<a name="line.820"></a>
-<span class="sourceLineNo">821</span>      org.apache.zookeeper.ZooKeeper.class,                          // zookeeper<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      org.apache.htrace.core.Tracer.class,                           // htrace<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      com.codahale.metrics.MetricRegistry.class,                     // metrics-core<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      org.apache.commons.lang3.ArrayUtils.class);                    // commons-lang<a name="line.824"></a>
-<span class="sourceLineNo">825</span>  }<a name="line.825"></a>
-<span class="sourceLineNo">826</span><a name="line.826"></a>
-<span class="sourceLineNo">827</span>  /**<a name="line.827"></a>
-<span class="sourceLineNo">828</span>   * Returns a classpath string built from the content of the "tmpjars" value in {@code conf}.<a name="line.828"></a>
-<span class="sourceLineNo">829</span>   * Also exposed to shell scripts via `bin/hbase mapredcp`.<a name="line.829"></a>
-<span class="sourceLineNo">830</span>   */<a name="line.830"></a>
-<span class="sourceLineNo">831</span>  public static String buildDependencyClasspath(Configuration conf) {<a name="line.831"></a>
-<span class="sourceLineNo">832</span>    if (conf == null) {<a name="line.832"></a>
-<span class="sourceLineNo">833</span>      throw new IllegalArgumentException("Must provide a configuration object.");<a name="line.833"></a>
-<span class="sourceLineNo">834</span>    }<a name="line.834"></a>
-<span class="sourceLineNo">835</span>    Set&lt;String&gt; paths = new HashSet&lt;&gt;(conf.getStringCollection("tmpjars"));<a name="line.835"></a>
-<span class="sourceLineNo">836</span>    if (paths.isEmpty()) {<a name="line.836"></a>
-<span class="sourceLineNo">837</span>      throw new IllegalArgumentException("Configuration contains no tmpjars.");<a name="line.837"></a>
-<span class="sourceLineNo">838</span>    }<a name="line.838"></a>
-<span class="sourceLineNo">839</span>    StringBuilder sb = new StringBuilder();<a name="line.839"></a>
-<span class="sourceLineNo">840</span>    for (String s : paths) {<a name="line.840"></a>
-<span class="sourceLineNo">841</span>      // entries can take the form 'file:/path/to/file.jar'.<a name="line.841"></a>
-<span class="sourceLineNo">842</span>      int idx = s.indexOf(":");<a name="line.842"></a>
-<span class="sourceLineNo">843</span>      if (idx != -1) s = s.substring(idx + 1);<a name="line.843"></a>
-<span class="sourceLineNo">844</span>      if (sb.length() &gt; 0) sb.append(File.pathSeparator);<a name="line.844"></a>
-<span class="sourceLineNo">845</span>      sb.append(s);<a name="line.845"></a>
-<span class="sourceLineNo">846</span>    }<a name="line.846"></a>
-<span class="sourceLineNo">847</span>    return sb.toString();<a name="line.847"></a>
-<span class="sourceLineNo">848</span>  }<a name="line.848"></a>
-<span class="sourceLineNo">849</span><a name="line.849"></a>
-<span class="sourceLineNo">850</span>  /**<a name="line.850"></a>
-<span class="sourceLineNo">851</span>   * Add the HBase dependency jars as well as jars for any of the configured<a name="line.851"></a>
-<span class="sourceLineNo">852</span>   * job classes to the job configuration, so that JobClient will ship them<a name="line.852"></a>
-<span class="sourceLineNo">853</span>   * to the cluster and add them to the DistributedCache.<a name="line.853"></a>
-<span class="sourceLineNo">854</span>   */<a name="line.854"></a>
-<span class="sourceLineNo">855</span>  public static void addDependencyJars(Job job) throws IOException {<a name="line.855"></a>
-<span class="sourceLineNo">856</span>    addHBaseDependencyJars(job.getConfiguration());<a name="line.856"></a>
-<span class="sourceLineNo">857</span>    try {<a name="line.857"></a>
-<span class="sourceLineNo">858</span>      addDependencyJarsForClasses(job.getConfiguration(),<a name="line.858"></a>
-<span class="sourceLineNo">859</span>          // when making changes here, consider also mapred.TableMapReduceUtil<a name="line.859"></a>
-<span class="sourceLineNo">860</span>          // pull job classes<a name="line.860"></a>
-<span class="sourceLineNo">861</span>          job.getMapOutputKeyClass(),<a name="line.861"></a>
-<span class="sourceLineNo">862</span>          job.getMapOutputValueClass(),<a name="line.862"></a>
-<span class="sourceLineNo">863</span>          job.getInputFormatClass(),<a name="line.863"></a>
-<span class="sourceLineNo">864</span>          job.getOutputKeyClass(),<a name="line.864"></a>
-<span class="sourceLineNo">865</span>          job.getOutputValueClass(),<a name="line.865"></a>
-<span class="sourceLineNo">866</span>          job.getOutputFormatClass(),<a name="line.866"></a>
-<span class="sourceLineNo">867</span>          job.getPartitionerClass(),<a name="line.867"></a>
-<span class="sourceLineNo">868</span>          job.getCombinerClass());<a name="line.868"></a>
-<span class="sourceLineNo">869</span>    } catch (ClassNotFoundException e) {<a name="line.869"></a>
-<span class="sourceLineNo">870</span>      throw new IOException(e);<a name="line.870"></a>
-<span class="sourceLineNo">871</span>    }<a name="line.871"></a>
-<span class="sourceLineNo">872</span>  }<a name="line.872"></a>
-<span class="sourceLineNo">873</span><a name="line.873"></a>
-<span class="sourceLineNo">874</span>  /**<a name="line.874"></a>
-<span class="sourceLineNo">875</span>   * Add the jars containing the given classes to the job's configuration<a name="line.875"></a>
-<span class="sourceLineNo">876</span>   * such that JobClient will ship them to the cluster and add them to<a name="line.876"></a>
-<span class="sourceLineNo">877</span>   * the DistributedCache.<a name="line.877"></a>
-<span class="sourceLineNo">878</span>   * @deprecated since 1.3.0 and will be removed in 3.0.0. Use {@link #addDependencyJars(Job)}<a name="line.878"></a>
-<span class="sourceLineNo">879</span>   *   instead.<a name="line.879"></a>
-<span class="sourceLineNo">880</span>   * @see #addDependencyJars(Job)<a name="line.880"></a>
-<span class="sourceLineNo">881</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-8386"&gt;HBASE-8386&lt;/a&gt;<a name="line.881"></a>
-<span class="sourceLineNo">882</span>   */<a name="line.882"></a>
-<span class="sourceLineNo">883</span>  @Deprecated<a name="line.883"></a>
-<span class="sourceLineNo">884</span>  public static void addDependencyJars(Configuration conf,<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      Class&lt;?&gt;... classes) throws IOException {<a name="line.885"></a>
-<span class="sourceLineNo">886</span>    LOG.warn("The addDependencyJars(Configuration, Class&lt;?&gt;...) method has been deprecated since it"<a name="line.886"></a>
-<span class="sourceLineNo">887</span>             + " is easy to use incorrectly. Most users should rely on addDependencyJars(Job) " +<a name="line.887"></a>
-<span class="sourceLineNo">888</span>             "instead. See HBASE-8386 for more details.");<a name="line.888"></a>
-<span class="sourceLineNo">889</span>    addDependencyJarsForClasses(conf, classes);<a name="line.889"></a>
-<span class="sourceLineNo">890</span>  }<a name="line.890"></a>
-<span class="sourceLineNo">891</span><a name="line.891"></a>
-<span class="sourceLineNo">892</span>  /**<a name="line.892"></a>
-<span class="sourceLineNo">893</span>   * Add the jars containing the given classes to the job's configuration<a name="line.893"></a>
-<span class="sourceLineNo">894</span>   * such that JobClient will ship them to the cluster and add them to<a name="line.894"></a>
-<span class="sourceLineNo">895</span>   * the DistributedCache.<a name="line.895"></a>
-<span class="sourceLineNo">896</span>   *<a name="line.896"></a>
-<span class="sourceLineNo">897</span>   * N.B. that this method at most adds one jar per class given. If there is more than one<a name="line.897"></a>
-<span class="sourceLineNo">898</span>   * jar available containing a class with the same name as a given class, we don't define<a name="line.898"></a>
-<span class="sourceLineNo">899</span>   * which of those jars might be chosen.<a name="line.899"></a>
-<span class="sourceLineNo">900</span>   *<a name="line.900"></a>
-<span class="sourceLineNo">901</span>   * @param conf The Hadoop Configuration to modify<a name="line.901"></a>
-<span class="sourceLineNo">902</span>   * @param classes will add just those dependencies needed to find the given classes<a name="line.902"></a>
-<span class="sourceLineNo">903</span>   * @throws IOException if an underlying library call fails.<a name="line.903"></a>
-<span class="sourceLineNo">904</span>   */<a name="line.904"></a>
-<span class="sourceLineNo">905</span>  @InterfaceAudience.Private<a name="line.905"></a>
-<span class="sourceLineNo">906</span>  public static void addDependencyJarsForClasses(Configuration conf,<a name="line.906"></a>
-<span class="sourceLineNo">907</span>      Class&lt;?&gt;... classes) throws IOException {<a name="line.907"></a>
-<span class="sourceLineNo">908</span><a name="line.908"></a>
-<span class="sourceLineNo">909</span>    FileSystem localFs = FileSystem.getLocal(conf);<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    Set&lt;String&gt; jars = new HashSet&lt;&gt;();<a name="line.910"></a>
-<span class="sourceLineNo">911</span>    // Add jars that are already in the tmpjars variable<a name="line.911"></a>
-<span class="sourceLineNo">912</span>    jars.addAll(conf.getStringCollection("tmpjars"));<a name="line.912"></a>
-<span class="sourceLineNo">913</span><a name="line.913"></a>
-<span class="sourceLineNo">914</span>    // add jars as we find them to a map of contents jar name so that we can avoid<a name="line.914"></a>
-<span class="sourceLineNo">915</span>    // creating new jars for classes that have already been packaged.<a name="line.915"></a>
-<span class="sourceLineNo">916</span>    Map&lt;String, String&gt; packagedClasses = new HashMap&lt;&gt;();<a name="line.916"></a>
-<span class="sourceLineNo">917</span><a name="line.917"></a>
-<span class="sourceLineNo">918</span>    // Add jars containing the specified classes<a name="line.918"></a>
-<span class="sourceLineNo">919</span>    for (Class&lt;?&gt; clazz : classes) {<a name="line.919"></a>
-<span class="sourceLineNo">920</span>      if (clazz == null) continue;<a name="line.920"></a>
-<span class="sourceLineNo">921</span><a name="line.921"></a>
-<span class="sourceLineNo">922</span>      Path path = findOrCreateJar(clazz, localFs, packagedClasses);<a name="line.922"></a>
-<span class="sourceLineNo">923</span>      if (path == null) {<a name="line.923"></a>
-<span class="sourceLineNo">924</span>        LOG.warn("Could not find jar for class " + clazz +<a name="line.924"></a>
-<span class="sourceLineNo">925</span>                 " in order to ship it to the cluster.");<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        continue;<a name="line.926"></a>
-<span class="sourceLineNo">927</span>      }<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      if (!localFs.exists(path)) {<a name="line.928"></a>
-<span class="sourceLineNo">929</span>        LOG.warn("Could not validate jar file " + path + " for class "<a name="line.929"></a>
-<span class="sourceLineNo">930</span>                 + clazz);<a name="line.930"></a>
-<span class="sourceLineNo">931</span>        continue;<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      }<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      jars.add(path.toString());<a name="line.933"></a>
-<span class="sourceLineNo">934</span>    }<a name="line.934"></a>
-<span class="sourceLineNo">935</span>    if (jars.isEmpty()) return;<a name="line.935"></a>
-<span class="sourceLineNo">936</span><a name="line.936"></a>
-<span class="sourceLineNo">937</span>    conf.set("tmpjars", StringUtils.arrayToString(jars.toArray(new String[jars.size()])));<a name="line.937"></a>
-<span class="sourceLineNo">938</span>  }<a name="line.938"></a>
-<span class="sourceLineNo">939</span><a name="line.939"></a>
-<span class="sourceLineNo">940</span>  /**<a name="line.940"></a>
-<span class="sourceLineNo">941</span>   * Finds the Jar for a class or creates it if it doesn't exist. If the class is in<a name="line.941"></a>
-<span class="sourceLineNo">942</span>   * a directory in the classpath, it creates a Jar on the fly with the<a name="line.942"></a>
-<span class="sourceLineNo">943</span>   * contents of the directory and returns the path to that Jar. If a Jar is<a name="line.943"></a>
-<span class="sourceLineNo">944</span>   * created, it is created in the system temporary directory. Otherwise,<a name="line.944"></a>
-<span class="sourceLineNo">945</span>   * returns an existing jar that contains a class of the same name. Maintains<a name="line.945"></a>
-<span class="sourceLineNo">946</span>   * a mapping from jar contents to the tmp jar created.<a name="line.946"></a>
-<span class="sourceLineNo">947</span>   * @param my_class the class to find.<a name="line.947"></a>
-<span class="sourceLineNo">948</span>   * @param fs the FileSystem with which to qualify the returned path.<a name="line.948"></a>
-<span class="sourceLineNo">949</span>   * @param packagedClasses a map of class name to path.<a name="line.949"></a>
-<span class="sourceLineNo">950</span>   * @return a jar file that contains the class.<a name="line.950"></a>
-<span class="sourceLineNo">951</span>   * @throws IOException<a name="line.951"></a>
-<span class="sourceLineNo">952</span>   */<a name="line.952"></a>
-<span class="sourceLineNo">953</span>  private static Path findOrCreateJar(Class&lt;?&gt; my_class, FileSystem fs,<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      Map&lt;String, String&gt; packagedClasses)<a name="line.954"></a>
-<span class="sourceLineNo">955</span>  throws IOException {<a name="line.955"></a>
-<span class="sourceLineNo">956</span>    // attempt to locate an existing jar for the class.<a name="line.956"></a>
-<span class="sourceLineNo">957</span>    String jar = findContainingJar(my_class, packagedClasses);<a name="line.957"></a>
-<span class="sourceLineNo">958</span>    if (null == jar || jar.isEmpty()) {<a name="line.958"></a>
-<span class="sourceLineNo">959</span>      jar = getJar(my_class);<a name="line.959"></a>
-<span class="sourceLineNo">960</span>      updateMap(jar, packagedClasses);<a name="line.960"></a>
-<span class="sourceLineNo">961</span>    }<a name="line.961"></a>
-<span class="sourceLineNo">962</span><a name="line.962"></a>
-<span class="sourceLineNo">963</span>    if (null == jar || jar.isEmpty()) {<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      return null;<a name="line.964"></a>
-<span class="sourceLineNo">965</span>    }<a name="line.965"></a>
-<span class="sourceLineNo">966</span><a name="line.966"></a>
-<span class="sourceLineNo">967</span>    LOG.debug(String.format("For class %s, using jar %s", my_class.getName(), jar));<a name="line.967"></a>
-<span class="sourceLineNo">968</span>    return new Path(jar).makeQualified(fs.getUri(), fs.getWorkingDirectory());<a name="line.968"></a>
-<span class="sourceLineNo">969</span>  }<a name="line.969"></a>
-<span class="sourceLineNo">970</span><a name="line.970"></a>
-<span class="sourceLineNo">971</span>  /**<a name="line.971"></a>
-<span class="sourceLineNo">972</span>   * Add entries to &lt;code&gt;packagedClasses&lt;/code&gt; corresponding to class files<a name="line.972"></a>
-<span class="sourceLineNo">973</span>   * contained in &lt;code&gt;jar&lt;/code&gt;.<a name="line.973"></a>
-<span class="sourceLineNo">974</span>   * @param jar The jar who's content to list.<a name="line.974"></a>
-<span class="sourceLineNo">975</span>   * @param packagedClasses map[class -&gt; jar]<a name="line.975"></a>
-<span class="sourceLineNo">976</span>   */<a name="line.976"></a>
-<span class="sourceLineNo">977</span>  private static void updateMap(String jar, Map&lt;String, String&gt; packagedClasses) throws IOException {<a name="line.977"></a>
-<span class="sourceLineNo">978</span>    if (null == jar || jar.isEmpty()) {<a name="line.978"></a>
-<span class="sourceLineNo">979</span>      return;<a name="line.979"></a>
-<span class="sourceLineNo">980</span>    }<a name="line.980"></a>
-<span class="sourceLineNo">981</span>    ZipFile zip = null;<a name="line.981"></a>
-<span class="sourceLineNo">982</span>    try {<a name="line.982"></a>
-<span class="sourceLineNo">983</span>      zip = new ZipFile(jar);<a name="line.983"></a>
-<span class="sourceLineNo">984</span>      for (Enumeration&lt;? extends ZipEntry&gt; iter = zip.entries(); iter.hasMoreElements();) {<a name="line.984"></a>
-<span class="sourceLineNo">985</span>        ZipEntry entry = iter.nextElement();<a name="line.985"></a>
-<span class="sourceLineNo">986</span>        if (entry.getName().endsWith("class")) {<a name="line.986"></a>
-<span class="sourceLineNo">987</span>          packagedClasses.put(entry.getName(), jar);<a name="line.987"></a>
-<span class="sourceLineNo">988</span>        }<a name="line.988"></a>
-<span class="sourceLineNo">989</span>      }<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    } finally {<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      if (null != zip) zip.close();<a name="line.991"></a>
-<span class="sourceLineNo">992</span>    }<a name="line.992"></a>
-<span class="sourceLineNo">993</span>  }<a name="line.993"></a>
-<span class="sourceLineNo">994</span><a name="line.994"></a>
-<span class="sourceLineNo">995</span>  /**<a name="line.995"></a>
-<span class="sourceLineNo">996</span>   * Find a jar that contains a class of the same name, if any. It will return<a name="line.996"></a>
-<span class="sourceLineNo">997</span>   * a jar file, even if that is not the first thing on the class path that<a name="line.997"></a>
-<span class="sourceLineNo">998</span>   * has a class with the same name. Looks first on the classpath and then in<a name="line.998"></a>
-<span class="sourceLineNo">999</span>   * the &lt;code&gt;packagedClasses&lt;/code&gt; map.<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>   * @param my_class the class to find.<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>   * @return a jar file that contains the class, or null.<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>   * @throws IOException<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>   */<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>  private static String findContainingJar(Class&lt;?&gt; my_class, Map&lt;String, String&gt; packagedClasses)<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>      throws IOException {<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>    ClassLoader loader = my_class.getClassLoader();<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span><a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>    String class_file = my_class.getName().replaceAll("\\.", "/") + ".class";<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span><a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>    if (loader != null) {<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>      // first search the classpath<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>      for (Enumeration&lt;URL&gt; itr = loader.getResources(class_file); itr.hasMoreElements();) {<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>        URL url = itr.nextElement();<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>        if ("jar".equals(url.getProtocol())) {<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>          String toReturn = url.getPath();<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>          if (toReturn.startsWith("file:")) {<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>            toReturn = toReturn.substring("file:".length());<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>          }<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>          // URLDecoder is a misnamed class, since it actually decodes<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>          // x-www-form-urlencoded MIME type rather than actual<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>          // URL encoding (which the file path has). Therefore it would<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>          // decode +s to ' 's which is incorrect (spaces are actually<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>          // either unencoded or encoded as "%20"). Replace +s first, so<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>          // that they are kept sacred during the decoding process.<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>          toReturn = toReturn.replaceAll("\\+", "%2B");<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>          toReturn = URLDecoder.decode(toReturn, "UTF-8");<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>          return toReturn.replaceAll("!.*$", "");<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>        }<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>      }<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    }<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span><a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>    // now look in any jars we've packaged using JarFinder. Returns null when<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>    // no jar is found.<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    return packagedClasses.get(class_file);<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>  }<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span><a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>  /**<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>   * Invoke 'getJar' on a custom JarFinder implementation. Useful for some job<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>   * configuration contexts (HBASE-8140) and also for testing on MRv2.<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>   * check if we have HADOOP-9426.<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>   * @param my_class the class to find.<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>   * @return a jar file that contains the class, or null.<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>   */<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>  private static String getJar(Class&lt;?&gt; my_class) {<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>    String ret = null;<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>    try {<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>      ret = JarFinder.getJar(my_class);<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>    } catch (Exception e) {<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      // toss all other exceptions, related to reflection failure<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>      throw new RuntimeException("getJar invocation failed.", e);<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>    }<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span><a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>    return ret;<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>  }<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span><a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>  private static int getRegionCount(Configuration conf, TableName tableName) throws IOException {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>    try (Connection conn = ConnectionFactory.createConnection(conf);<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      RegionLocator locator = conn.getRegionLocator(tableName)) {<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      return locator.getAllRegionLocations().size();<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>    }<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>  }<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>}<a name="line.1062"></a>
+<span class="sourceLineNo">515</span>  public static void initCredentials(Job job) throws IOException {<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    UserProvider userProvider = UserProvider.instantiate(job.getConfiguration());<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    if (userProvider.isHadoopSecurityEnabled()) {<a name="line.517"></a>
+<span class="sourceLineNo">518</span>      // propagate delegation related props from launcher job to MR job<a name="line.518"></a>
+<span class="sourceLineNo">519</span>      if (System.getenv("HADOOP_TOKEN_FILE_LOCATION") != null) {<a name="line.519"></a>
+<span class="sourceLineNo">520</span>        job.getConfiguration().set("mapreduce.job.credentials.binary",<a name="line.520"></a>
+<span class="sourceLineNo">521</span>                                   System.getenv("HADOOP_TOKEN_FILE_LOCATION"));<a name="line.521"></a>
+<span class="sourceLineNo">522</span>      }<a name="line.522"></a>
+<span class="sourceLineNo">523</span>    }<a name="line.523"></a>
+<span class="sourceLineNo">524</span><a name="line.524"></a>
+<span class="sourceLineNo">525</span>    if (userProvider.isHBaseSecurityEnabled()) {<a name="line.525"></a>
+<span class="sourceLineNo">526</span>      try {<a name="line.526"></a>
+<span class="sourceLineNo">527</span>        // init credentials for remote cluster<a name="line.527"></a>
+<span class="sourceLineNo">528</span>        String quorumAddress = job.getConfiguration().get(TableOutputFormat.QUORUM_ADDRESS);<a name="line.528"></a>
+<span class="sourceLineNo">529</span>        User user = userProvider.getCurrent();<a name="line.529"></a>
+<span class="sourceLineNo">530</span>        if (quorumAddress != null) {<a name="line.530"></a>
+<span class="sourceLineNo">531</span>          Configuration peerConf = HBaseConfiguration.createClusterConf(job.getConfiguration(),<a name="line.531"></a>
+<span class="sourceLineNo">532</span>              quorumAddress, TableOutputFormat.OUTPUT_CONF_PREFIX);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>          Connection peerConn = ConnectionFactory.createConnection(peerConf);<a name="line.533"></a>
+<span class="sourceLineNo">534</span>          try {<a name="line.534"></a>
+<span class="sourceLineNo">535</span>            TokenUtil.addTokenForJob(peerConn, user, job);<a name="line.535"></a>
+<span class="sourceLineNo">536</span>          } finally {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>            peerConn.close();<a name="line.537"></a>
+<span class="sourceLineNo">538</span>          }<a name="line.538"></a>
+<span class="sourceLineNo">539</span>        }<a name="line.539"></a>
+<span class="sourceLineNo">540</span><a name="line.540"></a>
+<span class="sourceLineNo">541</span>        Connection conn = ConnectionFactory.createConnection(job.getConfiguration());<a name="line.541"></a>
+<span class="sourceLineNo">542</span>        try {<a name="line.542"></a>
+<span class="sourceLineNo">543</span>          TokenUtil.addTokenForJob(conn, user, job);<a name="line.543"></a>
+<span class="sourceLineNo">544</span>        } finally {<a name="line.544"></a>
+<span class="sourceLineNo">545</span>          conn.close();<a name="line.545"></a>
+<span class="sourceLineNo">546</span>        }<a name="line.546"></a>
+<span class="sourceLineNo">547</span>      } catch (InterruptedException ie) {<a name="line.547"></a>
+<span class="sourceLineNo">548</span>        LOG.info("Interrupted obtaining user authentication token");<a name="line.548"></a>
+<span class="sourceLineNo">549</span>        Thread.currentThread().interrupt();<a name="line.549"></a>
+<span class="sourceLineNo">550</span>      }<a name="line.550"></a>
+<span class="sourceLineNo">551</span>    }<a name="line.551"></a>
+<span class="sourceLineNo">552</span>  }<a name="line.552"></a>
+<span class="sourceLineNo">553</span><a name="line.553"></a>
+<span class="sourceLineNo">554</span>  /**<a name="line.554"></a>
+<span class="sourceLineNo">555</span>   * Obtain an authentication token, for the specified cluster, on behalf of the current user<a name="line.555"></a>
+<span class="sourceLineNo">556</span>   * and add it to the credentials for the given map reduce job.<a name="line.556"></a>
+<span class="sourceLineNo">557</span>   *<a name="line.557"></a>
+<span class="sourceLineNo">558</span>   * The quorumAddress is the key to the ZK ensemble, which contains:<a name="line.558"></a>
+<span class="sourceLineNo">559</span>   * hbase.zookeeper.quorum, hbase.zookeeper.client.port and<a name="line.559"></a>
+<span class="sourceLineNo">560</span>   * zookeeper.znode.parent<a name="line.560"></a>
+<span class="sourceLineNo">561</span>   *<a name="line.561"></a>
+<span class="sourceLineNo">562</span>   * @param job The job that requires the permission.<a name="line.562"></a>
+<span class="sourceLineNo">563</span>   * @param quorumAddress string that contains the 3 required configuratins<a name="line.563"></a>
+<span class="sourceLineNo">564</span>   * @throws IOException When the authentication token cannot be obtained.<a name="line.564"></a>
+<span class="sourceLineNo">565</span>   * @deprecated Since 1.2.0 and will be removed in 3.0.0. Use<a name="line.565"></a>
+<span class="sourceLineNo">566</span>   *   {@link #initCredentialsForCluster(Job, Configuration)} instead.<a name="line.566"></a>
+<span class="sourceLineNo">567</span>   * @see #initCredentialsForCluster(Job, Configuration)<a name="line.567"></a>
+<span class="sourceLineNo">568</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-14886"&gt;HBASE-14886&lt;/a&gt;<a name="line.568"></a>
+<span class="sourceLineNo">569</span>   */<a name="line.569"></a>
+<span class="sourceLineNo">570</span>  @Deprecated<a name="line.570"></a>
+<span class="sourceLineNo">571</span>  public static void initCredentialsForCluster(Job job, String quorumAddress)<a name="line.571"></a>
+<span class="sourceLineNo">572</span>      throws IOException {<a name="line.572"></a>
+<span class="sourceLineNo">573</span>    Configuration peerConf = HBaseConfiguration.createClusterConf(job.getConfiguration(),<a name="line.573"></a>
+<span class="sourceLineNo">574</span>        quorumAddress);<a name="line.574"></a>
+<span class="sourceLineNo">575</span>    initCredentialsForCluster(job, peerConf);<a name="line.575"></a>
+<span class="sourceLineNo">576</span>  }<a name="line.576"></a>
+<span class="sourceLineNo">577</span><a name="line.577"></a>
+<span class="sourceLineNo">578</span>  /**<a name="line.578"></a>
+<span class="sourceLineNo">579</span>   * Obtain an authentication token, for the specified cluster, on behalf of the current user<a name="line.579"></a>
+<span class="sourceLineNo">580</span>   * and add it to the credentials for the given map reduce job.<a name="line.580"></a>
+<span class="sourceLineNo">581</span>   *<a name="line.581"></a>
+<span class="sourceLineNo">582</span>   * @param job The job that requires the permission.<a name="line.582"></a>
+<span class="sourceLineNo">583</span>   * @param conf The configuration to use in connecting to the peer cluster<a name="line.583"></a>
+<span class="sourceLineNo">584</span>   * @throws IOException When the authentication token cannot be obtained.<a name="line.584"></a>
+<span class="sourceLineNo">585</span>   */<a name="line.585"></a>
+<span class="sourceLineNo">586</span>  public static void initCredentialsForCluster(Job job, Configuration conf)<a name="line.586"></a>
+<span class="sourceLineNo">587</span>      throws IOException {<a name="line.587"></a>
+<span class="sourceLineNo">588</span>    UserProvider userProvider = UserProvider.instantiate(job.getConfiguration());<a name="line.588"></a>
+<span class="sourceLineNo">589</span>    if (userProvider.isHBaseSecurityEnabled()) {<a name="line.589"></a>
+<span class="sourceLineNo">590</span>      try {<a name="line.590"></a>
+<span class="sourceLineNo">591</span>        Connection peerConn = ConnectionFactory.createConnection(conf);<a name="line.591"></a>
+<span class="sourceLineNo">592</span>        try {<a name="line.592"></a>
+<span class="sourceLineNo">593</span>          TokenUtil.addTokenForJob(peerConn, userProvider.getCurrent(), job);<a name="line.593"></a>
+<span class="sourceLineNo">594</span>        } finally {<a name="line.594"></a>
+<span class="sourceLineNo">595</span>          peerConn.close();<a name="line.595"></a>
+<span class="sourceLineNo">596</span>        }<a name="line.596"></a>
+<span class="sourceLineNo">597</span>      } catch (InterruptedException e) {<a name="line.597"></a>
+<span class="sourceLineNo">598</span>        LOG.info("Interrupted obtaining user authentication token");<a name="line.598"></a>
+<span class="sourceLineNo">599</span>        Thread.interrupted();<a name="line.599"></a>
+<span class="sourceLineNo">600</span>      }<a name="line.600"></a>
+<span class="sourceLineNo">601</span>    }<a name="line.601"></a>
+<span class="sourceLineNo">602</span>  }<a name="line.602"></a>
+<span class="sourceLineNo">603</span><a name="line.603"></a>
+<span class="sourceLineNo">604</span>  /**<a name="line.604"></a>
+<span class="sourceLineNo">605</span>   * Writes the given scan into a Base64 encoded string.<a name="line.605"></a>
+<span class="sourceLineNo">606</span>   *<a name="line.606"></a>
+<span class="sourceLineNo">607</span>   * @param scan  The scan to write out.<a name="line.607"></a>
+<span class="sourceLineNo">608</span>   * @return The scan saved in a Base64 encoded string.<a name="line.608"></a>
+<span class="sourceLineNo">609</span>   * @throws IOException When writing the scan fails.<a name="line.609"></a>
+<span class="sourceLineNo">610</span>   */<a name="line.610"></a>
+<span class="sourceLineNo">611</span>  public static String convertScanToString(Scan scan) throws IOException {<a name="line.611"></a>
+<span class="sourceLineNo">612</span>    ClientProtos.Scan proto = ProtobufUtil.toScan(scan);<a name="line.612"></a>
+<span class="sourceLineNo">613</span>    return Bytes.toString(Base64.getEncoder().encode(proto.toByteArray()));<a name="line.613"></a>
+<span class="sourceLineNo">614</span>  }<a name="line.614"></a>
+<span class="sourceLineNo">615</span><a name="line.615"></a>
+<span class="sourceLineNo">616</span>  /**<a name="line.616"></a>
+<span class="sourceLineNo">617</span>   * Converts the given Base64 string back into a Scan instance.<a name="line.617"></a>
+<span class="sourceLineNo">618</span>   *<a name="line.618"></a>
+<span class="sourceLineNo">619</span>   * @param base64  The scan details.<a name="line.619"></a>
+<span class="sourceLineNo">620</span>   * @return The newly created Scan instance.<a name="line.620"></a>
+<span class="sourceLineNo">621</span>   * @throws IOException When reading the scan instance fails.<a name="line.621"></a>
+<span class="sourceLineNo">622</span>   */<a name="line.622"></a>
+<span class="sourceLineNo">623</span>  public static Scan convertStringToScan(String base64) throws IOException {<a name="line.623"></a>
+<span class="sourceLineNo">624</span>    byte [] decoded = Base64.getDecoder().decode(base64);<a name="line.624"></a>
+<span class="sourceLineNo">625</span>    return ProtobufUtil.toScan(ClientProtos.Scan.parseFrom(decoded));<a name="line.625"></a>
+<span class="sourceLineNo">626</span>  }<a name="line.626"></a>
+<span class="sourceLineNo">627</span><a name="line.627"></a>
+<span class="sourceLineNo">628</span>  /**<a name="line.628"></a>
+<span class="sourceLineNo">629</span>   * Use this before submitting a TableReduce job. It will<a name="line.629"></a>
+<span class="sourceLineNo">630</span>   * appropriately set up the JobConf.<a name="line.630"></a>
+<span class="sourceLineNo">631</span>   *<a name="line.631"></a>
+<span class="sourceLineNo">632</span>   * @param table  The output table.<a name="line.632"></a>
+<span class="sourceLineNo">633</span>   * @param reducer  The reducer class to use.<a name="line.633"></a>
+<span class="sourceLineNo">634</span>   * @param job  The current job to adjust.<a name="line.634"></a>
+<span class="sourceLineNo">635</span>   * @throws IOException When determining the region count fails.<a name="line.635"></a>
+<span class="sourceLineNo">636</span>   */<a name="line.636"></a>
+<span class="sourceLineNo">637</span>  public static void initTableReducerJob(String table,<a name="line.637"></a>
+<span class="sourceLineNo">638</span>    Class&lt;? extends TableReducer&gt; reducer, Job job)<a name="line.638"></a>
+<span class="sourceLineNo">639</span>  throws IOException {<a name="line.639"></a>
+<span class="sourceLineNo">640</span>    initTableReducerJob(table, reducer, job, null);<a name="line.640"></a>
+<span class="sourceLineNo">641</span>  }<a name="line.641"></a>
+<span class="sourceLineNo">642</span><a name="line.642"></a>
+<span class="sourceLineNo">643</span>  /**<a name="line.643"></a>
+<span class="sourceLineNo">644</span>   * Use this before submitting a TableReduce job. It will<a name="line.644"></a>
+<span class="sourceLineNo">645</span>   * appropriately set up the JobConf.<a name="line.645"></a>
+<span class="sourceLineNo">646</span>   *<a name="line.646"></a>
+<span class="sourceLineNo">647</span>   * @param table  The output table.<a name="line.647"></a>
+<span class="sourceLineNo">648</span>   * @param reducer  The reducer class to use.<a name="line.648"></a>
+<span class="sourceLineNo">649</span>   * @param job  The current job to adjust.<a name="line.649"></a>
+<span class="sourceLineNo">650</span>   * @param partitioner  Partitioner to use. Pass &lt;code&gt;null&lt;/code&gt; to use<a name="line.650"></a>
+<span class="sourceLineNo">651</span>   * default partitioner.<a name="line.651"></a>
+<span class="sourceLineNo">652</span>   * @throws IOException When determining the region count fails.<a name="line.652"></a>
+<span class="sourceLineNo">653</span>   */<a name="line.653"></a>
+<span class="sourceLineNo">654</span>  public static void initTableReducerJob(String table,<a name="line.654"></a>
+<span class="sourceLineNo">655</span>    Class&lt;? extends TableReducer&gt; reducer, Job job,<a name="line.655"></a>
+<span class="sourceLineNo">656</span>    Class partitioner) throws IOException {<a name="line.656"></a>
+<span class="sourceLineNo">657</span>    initTableReducerJob(table, reducer, job, partitioner, null, null, null);<a name="line.657"></a>
+<span class="sourceLineNo">658</span>  }<a name="line.658"></a>
+<span class="sourceLineNo">659</span><a name="line.659"></a>
+<span class="sourceLineNo">660</span>  /**<a name="line.660"></a>
+<span class="sourceLineNo">661</span>   * Use this before submitting a TableReduce job. It will<a name="line.661"></a>
+<span class="sourceLineNo">662</span>   * appropriately set up the JobConf.<a name="line.662"></a>
+<span class="sourceLineNo">663</span>   *<a name="line.663"></a>
+<span class="sourceLineNo">664</span>   * @param table  The output table.<a name="line.664"></a>
+<span class="sourceLineNo">665</span>   * @param reducer  The reducer class to use.<a name="line.665"></a>
+<span class="sourceLineNo">666</span>   * @param job  The current job to adjust.  Make sure the passed job is<a name="line.666"></a>
+<span class="sourceLineNo">667</span>   * carrying all necessary HBase configuration.<a name="line.667"></a>
+<span class="sourceLineNo">668</span>   * @param partitioner  Partitioner to use. Pass &lt;code&gt;null&lt;/code&gt; to use<a name="line.668"></a>
+<span class="sourceLineNo">669</span>   * default partitioner.<a name="line.669"></a>
+<span class="sourceLineNo">670</span>   * @param quorumAddress Distant cluster to write to; default is null for<a name="line.670"></a>
+<span class="sourceLineNo">671</span>   * output to the cluster that is designated in &lt;code&gt;hbase-site.xml&lt;/code&gt;.<a name="line.671"></a>
+<span class="sourceLineNo">672</span>   * Set this String to the zookeeper ensemble of an alternate remote cluster<a name="line.672"></a>
+<span class="sourceLineNo">673</span>   * when you would have the reduce write a cluster that is other than the<a name="line.673"></a>
+<span class="sourceLineNo">674</span>   * default; e.g. copying tables between clusters, the source would be<a name="line.674"></a>
+<span class="sourceLineNo">675</span>   * designated by &lt;code&gt;hbase-site.xml&lt;/code&gt; and this param would have the<a name="line.675"></a>
+<span class="sourceLineNo">676</span>   * ensemble address of the remote cluster.  The format to pass is particular.<a name="line.676"></a>
+<span class="sourceLineNo">677</span>   * Pass &lt;code&gt; &amp;lt;hbase.zookeeper.quorum&amp;gt;:&amp;lt;<a name="line.677"></a>
+<span class="sourceLineNo">678</span>   *             hbase.zookeeper.client.port&amp;gt;:&amp;lt;zookeeper.znode.parent&amp;gt;<a name="line.678"></a>
+<span class="sourceLineNo">679</span>   * &lt;/code&gt; such as &lt;code&gt;server,server2,server3:2181:/hbase&lt;/code&gt;.<a name="line.679"></a>
+<span class="sourceLineNo">680</span>   * @param serverClass redefined hbase.regionserver.class<a name="line.680"></a>
+<span class="sourceLineNo">681</span>   * @param serverImpl redefined hbase.regionserver.impl<a name="line.681"></a>
+<span class="sourceLineNo">682</span>   * @throws IOException When determining the region count fails.<a name="line.682"></a>
+<span class="sourceLineNo">683</span>   */<a name="line.683"></a>
+<span class="sourceLineNo">684</span>  public static void initTableReducerJob(String table,<a name="line.684"></a>
+<span class="sourceLineNo">685</span>    Class&lt;? extends TableReducer&gt; reducer, Job job,<a name="line.685"></a>
+<span class="sourceLineNo">686</span>    Class partitioner, String quorumAddress, String serverClass,<a name="line.686"></a>
+<span class="sourceLineNo">687</span>    String serverImpl) throws IOException {<a name="line.687"></a>
+<span class="sourceLineNo">688</span>    initTableReducerJob(table, reducer, job, partitioner, quorumAddress,<a name="line.688"></a>
+<span class="sourceLineNo">689</span>        serverClass, serverImpl, true);<a name="line.689"></a>
+<span class="sourceLineNo">690</span>  }<a name="line.690"></a>
+<span class="sourceLineNo">691</span><a name="line.691"></a>
+<span class="sourceLineNo">692</span>  /**<a name="line.692"></a>
+<span class="sourceLineNo">693</span>   * Use this before submitting a TableReduce job. It will<a name="line.693"></a>
+<span class="sourceLineNo">694</span>   * appropriately set up the JobConf.<a name="line.694"></a>
+<span class="sourceLineNo">695</span>   *<a name="line.695"></a>
+<span class="sourceLineNo">696</span>   * @param table  The output table.<a name="line.696"></a>
+<span class="sourceLineNo">697</span>   * @param reducer  The reducer class to use.<a name="line.697"></a>
+<span class="sourceLineNo">698</span>   * @param job  The current job to adjust.  Make sure the passed job is<a name="line.698"></a>
+<span class="sourceLineNo">699</span>   * carrying all necessary HBase configuration.<a name="line.699"></a>
+<span class="sourceLineNo">700</span>   * @param partitioner  Partitioner to use. Pass &lt;code&gt;null&lt;/code&gt; to use<a name="line.700"></a>
+<span class="sourceLineNo">701</span>   * default partitioner.<a name="line.701"></a>
+<span class="sourceLineNo">702</span>   * @param quorumAddress Distant cluster to write to; default is null for<a name="line.702"></a>
+<span class="sourceLineNo">703</span>   * output to the cluster that is designated in &lt;code&gt;hbase-site.xml&lt;/code&gt;.<a name="line.703"></a>
+<span class="sourceLineNo">704</span>   * Set this String to the zookeeper ensemble of an alternate remote cluster<a name="line.704"></a>
+<span class="sourceLineNo">705</span>   * when you would have the reduce write a cluster that is other than the<a name="line.705"></a>
+<span class="sourceLineNo">706</span>   * default; e.g. copying tables between clusters, the source would be<a name="line.706"></a>
+<span class="sourceLineNo">707</span>   * designated by &lt;code&gt;hbase-site.xml&lt;/code&gt; and this param would have the<a name="line.707"></a>
+<span class="sourceLineNo">708</span>   * ensemble address of the remote cluster.  The format to pass is particular.<a name="line.708"></a>
+<span class="sourceLineNo">709</span>   * Pass &lt;code&gt; &amp;lt;hbase.zookeeper.quorum&amp;gt;:&amp;lt;<a name="line.709"></a>
+<span class="sourceLineNo">710</span>   *             hbase.zookeeper.client.port&amp;gt;:&amp;lt;zookeeper.znode.parent&amp;gt;<a name="line.710"></a>
+<span class="sourceLineNo">711</span>   * &lt;/code&gt; such as &lt;code&gt;server,server2,server3:2181:/hbase&lt;/code&gt;.<a name="line.711"></a>
+<span class="sourceLineNo">712</span>   * @param serverClass redefined hbase.regionserver.class<a name="line.712"></a>
+<span class="sourceLineNo">713</span>   * @param serverImpl redefined hbase.regionserver.impl<a name="line.713"></a>
+<span class="sourceLineNo">714</span>   * @param addDependencyJars upload HBase jars and jars for any of the configured<a name="line.714"></a>
+<span class="sourceLineNo">715</span>   *           job classes via the distributed cache (tmpjars).<a name="line.715"></a>
+<span class="sourceLineNo">716</span>   * @throws IOException When determining the region count fails.<a name="line.716"></a>
+<span class="sourceLineNo">717</span>   */<a name="line.717"></a>
+<span class="sourceLineNo">718</span>  public static void initTableReducerJob(String table,<a name="line.718"></a>
+<span class="sourceLineNo">719</span>    Class&lt;? extends TableReducer&gt; reducer, Job job,<a name="line.719"></a>
+<span class="sourceLineNo">720</span>    Class partitioner, String quorumAddress, String serverClass,<a name="line.720"></a>
+<span class="sourceLineNo">721</span>    String serverImpl, boolean addDependencyJars) throws IOException {<a name="line.721"></a>
+<span class="sourceLineNo">722</span><a name="line.722"></a>
+<span class="sourceLineNo">723</span>    Configuration conf = job.getConfiguration();<a name="line.723"></a>
+<span class="sourceLineNo">724</span>    HBaseConfiguration.merge(conf, HBaseConfiguration.create(conf));<a name="line.724"></a>
+<span class="sourceLineNo">725</span>    job.setOutputFormatClass(TableOutputFormat.class);<a name="line.725"></a>
+<span class="sourceLineNo">726</span>    if (reducer != null) job.setReducerClass(reducer);<a name="line.726"></a>
+<span class="sourceLineNo">727</span>    conf.set(TableOutputFormat.OUTPUT_TABLE, table);<a name="line.727"></a>
+<span class="sourceLineNo">728</span>    conf.setStrings("io.serializations", conf.get("io.serializations"),<a name="line.728"></a>
+<span class="sourceLineNo">729</span>        MutationSerialization.class.getName(), ResultSerialization.class.getName());<a name="line.729"></a>
+<span class="sourceLineNo">730</span>    // If passed a quorum/ensemble address, pass it on to TableOutputFormat.<a name="line.730"></a>
+<span class="sourceLineNo">731</span>    if (quorumAddress != null) {<a name="line.731"></a>
+<span class="sourceLineNo">732</span>      // Calling this will validate the format<a name="line.732"></a>
+<span class="sourceLineNo">733</span>      ZKConfig.validateClusterKey(quorumAddress);<a name="line.733"></a>
+<span class="sourceLineNo">734</span>      conf.set(TableOutputFormat.QUORUM_ADDRESS,quorumAddress);<a name="line.734"></a>
+<span class="sourceLineNo">735</span>    }<a name="line.735"></a>
+<span class="sourceLineNo">736</span>    if (serverClass != null &amp;&amp; serverImpl != null) {<a name="line.736"></a>
+<span class="sourceLineNo">737</span>      conf.set(TableOutputFormat.REGION_SERVER_CLASS, serverClass);<a name="line.737"></a>
+<span class="sourceLineNo">738</span>      conf.set(TableOutputFormat.REGION_SERVER_IMPL, serverImpl);<a name="line.738"></a>
+<span class="sourceLineNo">739</span>    }<a name="line.739"></a>
+<span class="sourceLineNo">740</span>    job.setOutputKeyClass(ImmutableBytesWritable.class);<a name="line.740"></a>
+<span class="sourceLineNo">741</span>    job.setOutputValueClass(Writable.class);<a name="line.741"></a>
+<span class="sourceLineNo">742</span>    if (partitioner == HRegionPartitioner.class) {<a name="line.742"></a>
+<span class="sourceLineNo">743</span>      job.setPartitionerClass(HRegionPartitioner.class);<a name="line.743"></a>
+<span class="sourceLineNo">744</span>      int regions = getRegionCount(conf, TableName.valueOf(table));<a name="line.744"></a>
+<span class="sourceLineNo">745</span>      if (job.getNumReduceTasks() &gt; regions) {<a name="line.745"></a>
+<span class="sourceLineNo">746</span>        job.setNumReduceTasks(regions);<a name="line.746"></a>
+<span class="sourceLineNo">747</span>      }<a name="line.747"></a>
+<span class="sourceLineNo">748</span>    } else if (partitioner != null) {<a name="line.748"></a>
+<span class="sourceLineNo">749</span>      job.setPartitionerClass(partitioner);<a name="line.749"></a>
+<span class="sourceLineNo">750</span>    }<a name="line.750"></a>
+<span class="sourceLineNo">751</span><a name="line.751"></a>
+<span class="sourceLineNo">752</span>    if (addDependencyJars) {<a name="line.752"></a>
+<span class="sourceLineNo">753</span>      addDependencyJars(job);<a name="line.753"></a>
+<span class="sourceLineNo">754</span>    }<a name="line.754"></a>
+<span class="sourceLineNo">755</span><a name="line.755"></a>
+<span class="sourceLineNo">756</span>    initCredentials(job);<a name="line.756"></a>
+<span class="sourceLineNo">757</span>  }<a name="line.757"></a>
+<span class="sourceLineNo">758</span><a name="line.758"></a>
+<span class="sourceLineNo">759</span>  /**<a name="line.759"></a>
+<span class="sourceLineNo">760</span>   * Ensures that the given number of reduce tasks for the given job<a name="line.760"></a>
+<span class="sourceLineNo">761</span>   * configuration does not exceed the number of regions for the given table.<a name="line.761"></a>
+<span class="sourceLineNo">762</span>   *<a name="line.762"></a>
+<span class="sourceLineNo">763</span>   * @param table  The table to get the region count for.<a name="line.763"></a>
+<span class="sourceLineNo">764</span>   * @param job  The current job to adjust.<a name="line.764"></a>
+<span class="sourceLineNo">765</span>   * @throws IOException When retrieving the table details fails.<a name="line.765"></a>
+<span class="sourceLineNo">766</span>   */<a name="line.766"></a>
+<span class="sourceLineNo">767</span>  public static void limitNumReduceTasks(String table, Job job) throws IOException {<a name="line.767"></a>
+<span class="sourceLineNo">768</span>    int regions = getRegionCount(job.getConfiguration(), TableName.valueOf(table));<a name="line.768"></a>
+<span class="sourceLineNo">769</span>    if (job.getNumReduceTasks() &gt; regions) {<a name="line.769"></a>
+<span class="sourceLineNo">770</span>      job.setNumReduceTasks(regions);<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    }<a name="line.771"></a>
+<span class="sourceLineNo">772</span>  }<a name="line.772"></a>
+<span class="sourceLineNo">773</span><a name="line.773"></a>
+<span class="sourceLineNo">774</span>  /**<a name="line.774"></a>
+<span class="sourceLineNo">775</span>   * Sets the number of reduce tasks for the given job configuration to the<a name="line.775"></a>
+<span class="sourceLineNo">776</span>   * number of regions the given table has.<a name="line.776"></a>
+<span class="sourceLineNo">777</span>   *<a name="line.777"></a>
+<span class="sourceLineNo">778</span>   * @param table  The table to get the region count for.<a name="line.778"></a>
+<span class="sourceLineNo">779</span>   * @param job  The current job to adjust.<a name="line.779"></a>
+<span class="sourceLineNo">780</span>   * @throws IOException When retrieving the table details fails.<a name="line.780"></a>
+<span class="sourceLineNo">781</span>   */<a name="line.781"></a>
+<span class="sourceLineNo">782</span>  public static void setNumReduceTasks(String table, Job job) throws IOException {<a name="line.782"></a>
+<span class="sourceLineNo">783</span>    job.setNumReduceTasks(getRegionCount(job.getConfiguration(), TableName.valueOf(table)));<a name="line.783"></a>
+<span class="sourceLineNo">784</span>  }<a name="line.784"></a>
+<span class="sourceLineNo">785</span><a name="line.785"></a>
+<span class="sourceLineNo">786</span>  /**<a name="line.786"></a>
+<span class="sourceLineNo">787</span>   * Sets the number of rows to return and cache with each scanner iteration.<a name="line.787"></a>
+<span class="sourceLineNo">788</span>   * Higher caching values will enable faster mapreduce jobs at the expense of<a name="line.788"></a>
+<span class="sourceLineNo">789</span>   * requiring more heap to contain the cached rows.<a name="line.789"></a>
+<span class="sourceLineNo">790</span>   *<a name="line.790"></a>
+<span class="sourceLineNo">791</span>   * @param job The current job to adjust.<a name="line.791"></a>
+<span class="sourceLineNo">792</span>   * @param batchSize The number of rows to return in batch with each scanner<a name="line.792"></a>
+<span class="sourceLineNo">793</span>   * iteration.<a name="line.793"></a>
+<span class="sourceLineNo">794</span>   */<a name="line.794"></a>
+<span class="sourceLineNo">795</span>  public static void setScannerCaching(Job job, int batchSize) {<a name="line.795"></a>
+<span class="sourceLineNo">796</span>    job.getConfiguration().setInt("hbase.client.scanner.caching", batchSize);<a name="line.796"></a>
+<span class="sourceLineNo">797</span>  }<a name="line.797"></a>
+<span class="sourceLineNo">798</span><a name="line.798"></a>
+<span class="sourceLineNo">799</span>  /**<a name="line.799"></a>
+<span class="sourceLineNo">800</span>   * Add HBase and its dependencies (only) to the job configuration.<a name="line.800"></a>
+<span class="sourceLineNo">801</span>   * &lt;p&gt;<a name="line.801"></a>
+<span class="sourceLineNo">802</span>   * This is intended as a low-level API, facilitating code reuse between this<a name="line.802"></a>
+<span class="sourceLineNo">803</span>   * class and its mapred counterpart. It also of use to external tools that<a name="line.803"></a>
+<span class="sourceLineNo">804</span>   * need to build a MapReduce job that interacts with HBase but want<a name="line.804"></a>
+<span class="sourceLineNo">805</span>   * fine-grained control over the jars shipped to the cluster.<a name="line.805"></a>
+<span class="sourceLineNo">806</span>   * &lt;/p&gt;<a name="line.806"></a>
+<span class="sourceLineNo">807</span>   * @param conf The Configuration object to extend with dependencies.<a name="line.807"></a>
+<span class="sourceLineNo">808</span>   * @see org.apache.hadoop.hbase.mapred.TableMapReduceUtil<a name="line.808"></a>
+<span class="sourceLineNo">809</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/PIG-3285"&gt;PIG-3285&lt;/a&gt;<a name="line.809"></a>
+<span class="sourceLineNo">810</span>   */<a name="line.810"></a>
+<span class="sourceLineNo">811</span>  public static void addHBaseDependencyJars(Configuration conf) throws IOException {<a name="line.811"></a>
+<span class="sourceLineNo">812</span>    addDependencyJarsForClasses(conf,<a name="line.812"></a>
+<span class="sourceLineNo">813</span>      // explicitly pull a class from each module<a name="line.813"></a>
+<span class="sourceLineNo">814</span>      org.apache.hadoop.hbase.HConstants.class,                      // hbase-common<a name="line.814"></a>
+<span class="sourceLineNo">815</span>      org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.class, // hbase-protocol-shaded<a name="line.815"></a>
+<span class="sourceLineNo">816</span>      org.apache.hadoop.hbase.client.Put.class,                      // hbase-client<a name="line.816"></a>
+<span class="sourceLineNo">817</span>      org.apache.hadoop.hbase.ipc.RpcServer.class,                   // hbase-server<a name="line.817"></a>
+<span class="sourceLineNo">818</span>      org.apache.hadoop.hbase.CompatibilityFactory.class,            // hbase-hadoop-compat<a name="line.818"></a>
+<span class="sourceLineNo">819</span>      org.apache.hadoop.hbase.mapreduce.JobUtil.class,               // hbase-hadoop2-compat<a name="line.819"></a>
+<span class="sourceLineNo">820</span>      org.apache.hadoop.hbase.mapreduce.TableMapper.class,           // hbase-mapreduce<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      org.apache.hadoop.hbase.metrics.impl.FastLongHistogram.class,  // hbase-metrics<a name="line.821"></a>
+<span class="sourceLineNo">822</span>      org.apache.hadoop.hbase.metrics.Snapshot.class,                // hbase-metrics-api<a name="line.822"></a>
+<span class="sourceLineNo">823</span>      org.apache.hadoop.hbase.replication.ReplicationUtils.class,    // hbase-replication<a name="line.823"></a>
+<span class="sourceLineNo">824</span>      org.apache.hadoop.hbase.http.HttpServer.class,                 // hbase-http<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      org.apache.hadoop.hbase.procedure2.Procedure.class,            // hbase-procedure<a name="line.825"></a>
+<span class="sourceLineNo">826</span>      org.apache.hadoop.hbase.zookeeper.ZKWatcher.class,             // hbase-zookeeper<a name="line.826"></a>
+<span class="sourceLineNo">827</span>      org.apache.hbase.thirdparty.com.google.common.collect.Lists.class, // hb-shaded-miscellaneous<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      org.apache.hbase.thirdparty.com.google.gson.GsonBuilder.class, // hbase-shaded-gson<a name="line.828"></a>
+<span class="sourceLineNo">829</span>      org.apache.hbase.thirdparty.com.google.protobuf.UnsafeByteOperations.class, // hb-sh-protobuf<a name="line.829"></a>
+<span class="sourceLineNo">830</span>      org.apache.hbase.thirdparty.io.netty.channel.Channel.class,    // hbase-shaded-netty<a name="line.830"></a>
+<span class="sourceLineNo">831</span>      org.apache.zookeeper.ZooKeeper.class,                          // zookeeper<a name="line.831"></a>
+<span class="sourceLineNo">832</span>      org.apache.htrace.core.Tracer.class,                           // htrace<a name="line.832"></a>
+<span class="sourceLineNo">833</span>      com.codahale.metrics.MetricRegistry.class,                     // metrics-core<a name="line.833"></a>
+<span class="sourceLineNo">834</span>      org.apache.commons.lang3.ArrayUtils.class);                    // commons-lang<a name="line.834"></a>
+<span class="sourceLineNo">835</span>  }<a name="line.835"></a>
+<span class="sourceLineNo">836</span><a name="line.836"></a>
+<span class="sourceLineNo">837</span>  /**<a name="line.837"></a>
+<span class="sourceLineNo">838</span>   * Returns a classpath string built from the content of the "tmpjars" value in {@code conf}.<a name="line.838"></a>
+<span class="sourceLineNo">839</span>   * Also exposed to shell scripts via `bin/hbase mapredcp`.<a name="line.839"></a>
+<span class="sourceLineNo">840</span>   */<a name="line.840"></a>
+<span class="sourceLineNo">841</span>  public static String buildDependencyClasspath(Configuration conf) {<a name="line.841"></a>
+<span class="sourceLineNo">842</span>    if (conf == null) {<a name="line.842"></a>
+<span class="sourceLineNo">843</span>      throw new IllegalArgumentException("Must provide a configuration object.");<a name="line.843"></a>
+<span class="sourceLineNo">844</span>    }<a name="line.844"></a>
+<span class="sourceLineNo">845</span>    Set&lt;String&gt; paths = new HashSet&lt;&gt;(conf.getStringCollection("tmpjars"));<a name="line.845"></a>
+<span class="sourceLineNo">846</span>    if (paths.isEmpty()) {<a name="line.846"></a>
+<span class="sourceLineNo">847</span>      throw new IllegalArgumentException("Configuration contains no tmpjars.");<a name="line.847"></a>
+<span class="sourceLineNo">848</span>    }<a name="line.848"></a>
+<span class="sourceLineNo">849</span>    StringBuilder sb = new StringBuilder();<a name="line.849"></a>
+<span class="sourceLineNo">850</span>    for (String s : paths) {<a name="line.850"></a>
+<span class="sourceLineNo">851</span>      // entries can take the form 'file:/path/to/file.jar'.<a name="line.851"></a>
+<span class="sourceLineNo">852</span>      int idx = s.indexOf(":");<a name="line.852"></a>
+<span class="sourceLineNo">853</span>      if (idx != -1) s = s.substring(idx + 1);<a name="line.853"></a>
+<span class="sourceLineNo">854</span>      if (sb.length() &gt; 0) sb.append(File.pathSeparator);<a name="line.854"></a>
+<span class="sourceLineNo">855</span>      sb.append(s);<a name="line.855"></a>
+<span class="sourceLineNo">856</span>    }<a name="line.856"></a>
+<span class="sourceLineNo">857</span>    return sb.toString();<a name="line.857"></a>
+<span class="sourceLineNo">858</span>  }<a name="line.858"></a>
+<span class="sourceLineNo">859</span><a name="line.859"></a>
+<span class="sourceLineNo">860</span>  /**<a name="line.860"></a>
+<span class="sourceLineNo">861</span>   * Add the HBase dependency jars as well as jars for any of the configured<a name="line.861"></a>
+<span class="sourceLineNo">862</span>   * job classes to the job configuration, so that JobClient will ship them<a name="line.862"></a>
+<span class="sourceLineNo">863</span>   * to the cluster and add them to the DistributedCache.<a name="line.863"></a>
+<span class="sourceLineNo">864</span>   */<a name="line.864"></a>
+<span class="sourceLineNo">865</span>  public static void addDependencyJars(Job job) throws IOException {<a name="line.865"></a>
+<span class="sourceLineNo">866</span>    addHBaseDependencyJars(job.getConfiguration());<a name="line.866"></a>
+<span class="sourceLineNo">867</span>    try {<a name="line.867"></a>
+<span class="sourceLineNo">868</span>      addDependencyJarsForClasses(job.getConfiguration(),<a name="line.868"></a>
+<span class="sourceLineNo">869</span>          // when making changes here, consider also mapred.TableMapReduceUtil<a name="line.869"></a>
+<span class="sourceLineNo">870</span>          // pull job classes<a name="line.870"></a>
+<span class="sourceLineNo">871</span>          job.getMapOutputKeyClass(),<a name="line.871"></a>
+<span class="sourceLineNo">872</span>          job.getMapOutputValueClass(),<a name="line.872"></a>
+<span class="sourceLineNo">873</span>          job.getInputFormatClass(),<a name="line.873"></a>
+<span class="sourceLineNo">874</span>          job.getOutputKeyClass(),<a name="line.874"></a>
+<span class="sourceLineNo">875</span>          job.getOutputValueClass(),<a name="line.875"></a>
+<span class="sourceLineNo">876</span>          job.getOutputFormatClass(),<a name="line.876"></a>
+<span class="sourceLineNo">877</span>          job.getPartitionerClass(),<a name="line.877"></a>
+<span class="sourceLineNo">878</span>          job.getCombinerClass());<a name="line.878"></a>
+<span class="sourceLineNo">879</span>    } catch (ClassNotFoundException e) {<a name="line.879"></a>
+<span class="sourceLineNo">880</span>      throw new IOException(e);<a name="line.880"></a>
+<span class="sourceLineNo">881</span>    }<a name="line.881"></a>
+<span class="sourceLineNo">882</span>  }<a name="line.882"></a>
+<span class="sourceLineNo">883</span><a name="line.883"></a>
+<span class="sourceLineNo">884</span>  /**<a name="line.884"></a>
+<span class="sourceLineNo">885</span>   * Add the jars containing the given classes to the job's configuration<a name="line.885"></a>
+<span class="sourceLineNo">886</span>   * such that JobClient will ship them to the cluster and add them to<a name="line.886"></a>
+<span class="sourceLineNo">887</span>   * the DistributedCache.<a name="line.887"></a>
+<span class="sourceLineNo">888</span>   * @deprecated since 1.3.0 and will be removed in 3.0.0. Use {@link #addDependencyJars(Job)}<a name="line.888"></a>
+<span class="sourceLineNo">889</span>   *   instead.<a name="line.889"></a>
+<span class="sourceLineNo">890</span>   * @see #addDependencyJars(Job)<a name="line.890"></a>
+<span class="sourceLineNo">891</span>   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-8386"&gt;HBASE-8386&lt;/a&gt;<a name="line.891"></a>
+<span class="sourceLineNo">892</span>   */<a name="line.892"></a>
+<span class="sourceLineNo">893</span>  @Deprecated<a name="line.893"></a>
+<span class="sourceLineNo">894</span>  public static void addDependencyJars(Configuration conf,<a name="line.894"></a>
+<span class="sourceLineNo">895</span>      Class&lt;?&gt;... classes) throws IOException {<a name="line.895"></a>
+<span class="sourceLineNo">896</span>    LOG.warn("The addDependencyJars(Configuration, Class&lt;?&gt;...) method has been deprecated since it"<a name="line.896"></a>
+<span class="sourceLineNo">897</span>             + " is easy to use incorrectly. Most users should rely on addDependencyJars(Job) " +<a name="line.897"></a>
+<span class="sourceLineNo">898</span>             "instead. See HBASE-8386 for more details.");<a name="line.898"></a>
+<span class="sourceLineNo">899</span>    addDependencyJarsForClasses(conf, classes);<a name="line.899"></a>
+<span class="sourceLineNo">900</span>  }<a name="line.900"></a>
+<span class="sourceLineNo">901</span><a name="line.901"></a>
+<span class="sourceLineNo">902</span>  /**<a name="line.902"></a>
+<span class="sourceLineNo">903</span>   * Add the jars containing the given classes to the job's configuration<a name="line.903"></a>
+<span class="sourceLineNo">904</span>   * such that JobClient will ship them to the cluster and add them to<a name="line.904"></a>
+<span class="sourceLineNo">905</span>   * the DistributedCache.<a name="line.905"></a>
+<span class="sourceLineNo">906</span>   *<a name="line.906"></a>
+<span class="sourceLineNo">907</span>   * N.B. that this method at most adds one jar per class given. If there is more than one<a name="line.907"></a>
+<span class="sourceLineNo">908</span>   * jar available containing a class with the same name as a given class, we don't define<a name="line.908"></a>
+<span class="sourceLineNo">909</span>   * which of those jars might be chosen.<a name="line.909"></a>
+<span class="sourceLineNo">910</span>   *<a name="line.910"></a>
+<span class="sourceLineNo">911</span>   * @param conf The Hadoop Configuration to modify<a name="line.911"></a>
+<span class="sourceLineNo">912</span>   * @param classes will add just those dependencies needed to find the given classes<a name="line.912"></a>
+<span class="sourceLineNo">913</span>   * @throws IOException if an underlying library call fails.<a name="line.913"></a>
+<span class="sourceLineNo">914</span>   */<a name="line.914"></a>
+<span class="sourceLineNo">915</span>  @InterfaceAudience.Private<a name="line.915"></a>
+<span class="sourceLineNo">916</span>  public static void addDependencyJarsForClasses(Configuration conf,<a name="line.916"></a>
+<span class="sourceLineNo">917</span>      Class&lt;?&gt;... classes) throws IOException {<a name="line.917"></a>
+<span class="sourceLineNo">918</span><a name="line.918"></a>
+<span class="sourceLineNo">919</span>    FileSystem localFs = FileSystem.getLocal(conf);<a name="line.919"></a>
+<span class="sourceLineNo">920</span>    Set&lt;String&gt; jars = new HashSet&lt;&gt;();<a name="line.920"></a>
+<span class="sourceLineNo">921</span>    // Add jars that are already in the tmpjars variable<a name="line.921"></a>
+<span class="sourceLineNo">922</span>    jars.addAll(conf.getStringCollection("tmpjars"));<a name="line.922"></a>
+<span class="sourceLineNo">923</span><a name="line.923"></a>
+<span class="sourceLineNo">924</span>    // add jars as we find them to a map of contents jar name so that we can avoid<a name="line.924"></a>
+<span class="sourceLineNo">925</span>    // creating new jars for classes that have already been packaged.<a name="line.925"></a>
+<span class="sourceLineNo">926</span>    Map&lt;String, String&gt; packagedClasses = new HashMap&lt;&gt;();<a name="line.926"></a>
+<span class="sourceLineNo">927</span><a name="line.927"></a>
+<span class="sourceLineNo">928</span>    // Add jars containing the specified classes<a name="line.928"></a>
+<span class="sourceLineNo">929</span>    for (Class&lt;?&gt; clazz : classes) {<a name="line.929"></a>
+<span class="sourceLineNo">930</span>      if (clazz == null) continue;<a name="line.930"></a>
+<span class="sourceLineNo">931</span><a name="line.931"></a>
+<span class="sourceLineNo">932</span>      Path path = findOrCreateJar(clazz, localFs, packagedClasses);<a name="line.932"></a>
+<span class="sourceLineNo">933</span>      if (path == null) {<a name="line.933"></a>
+<span class="sourceLineNo">934</span>        LOG.warn("Could not find jar for class " + clazz +<a name="line.934"></a>
+<span class="sourceLineNo">935</span>                 " in order to ship it to the cluster.");<a name="line.935"></a>
+<span class="sourceLineNo">936</span>        continue;<a name="line.936"></a>
+<span class="sourceLineNo">937</span>      }<a name="line.937"></a>
+<span class="sourceLineNo">938</span>      if (!localFs.exists(path)) {<a name="line.938"></a>
+<span class="sourceLineNo">939</span>        LOG.warn("Could not validate jar file " + path + " for class "<a name="line.939"></a>
+<span class="sourceLineNo">940</span>                 + clazz);<a name="line.940"></a>
+<span class="sourceLineNo">941</span>        continue;<a name="line.941"></a>
+<span class="sourceLineNo">942</span>      }<a name="line.942"></a>
+<span class="sourceLineNo">943</span>      jars.add(path.toString());<a name="line.943"></a>
+<span class="sourceLineNo">944</span>    }<a name="line.944"></a>
+<span class="sourceLineNo">945</span>    if (jars.isEmpty()) return;<a name="line.945"></a>
+<span class="sourceLineNo">946</span><a name="line.946"></a>
+<span class="sourceLineNo">947</span>    conf.set("tmpjars", StringUtils.arrayToString(jars.toArray(new String[jars.size()])));<a name="line.947"></a>
+<span class="sourceLineNo">948</span>  }<a name="line.948"></a>
+<span class="sourceLineNo">949</span><a name="line.949"></a>
+<span class="sourceLineNo">950</span>  /**<a name="line.950"></a>
+<span class="sourceLineNo">951</span>   * Finds the Jar for a class or creates it if it doesn't exist. If the class is in<a name="line.951"></a>
+<span class="sourceLineNo">952</span>   * a directory in the classpath, it creates a Jar on the fly with the<a name="line.952"></a>
+<span class="sourceLineNo">953</span>   * contents of the directory and returns the path to that Jar. If a Jar is<a name="line.953"></a>
+<span class="sourceLineNo">954</span>   * created, it is created in the system temporary directory. Otherwise,<a name="line.954"></a>
+<span class="sourceLineNo">955</span>   * returns an existing jar that contains a class of the same name. Maintains<a name="line.955"></a>
+<span class="sourceLineNo">956</span>   * a mapping from jar contents to the tmp jar created.<a name="line.956"></a>
+<span class="sourceLineNo">957</span>   * @param my_class the class to find.<a name="line.957"></a>
+<span class="sourceLineNo">958</span>   * @param fs the FileSystem with which to qualify the returned path.<a name="line.958"></a>
+<span class="sourceLineNo">959</span>   * @param packagedClasses a map of class name to path.<a name="line.959"></a>
+<span class="sourceLineNo">960</span>   * @return a jar file that contains the class.<a name="line.960"></a>
+<span class="sourceLineNo">961</span>   * @throws IOException<a name="line.961"></a>
+<span class="sourceLineNo">962</span>   */<a name="line.962"></a>
+<span class="sourceLineNo">963</span>  private static Path findOrCreateJar(Class&lt;?&gt; my_class, FileSystem fs,<a name="line.963"></a>
+<span class="sourceLineNo">964</span>      Map&lt;String, String&gt; packagedClasses)<a name="line.964"></a>
+<span class="sourceLineNo">965</span>  throws IOException {<a name="line.965"></a>
+<span class="sourceLineNo">966</span>    // attempt to locate an existing jar for the class.<a name="line.966"></a>
+<span class="sourceLineNo">967</span>    String jar = findContainingJar(my_class, packagedClasses);<a name="line.967"></a>
+<span class="sourceLineNo">968</span>    if (null == jar || jar.isEmpty()) {<a name="line.968"></a>
+<span class="sourceLineNo">969</span>      jar = getJar(my_class);<a name="line.969"></a>
+<span class="sourceLineNo">970</span>      updateMap(jar, packagedClasses);<a name="line.970"></a>
+<span class="sourceLineNo">971</span>    }<a name="line.971"></a>
+<span class="sourceLineNo">972</span><a name="line.972"></a>
+<span class="sourceLineNo">973</span>    if (null == jar || jar.isEmpty()) {<a name="line.973"></a>
+<span class="sourceLineNo">974</span>      return null;<a name="line.974"></a>
+<span class="sourceLineNo">975</span>    }<a name="line.975"></a>
+<span class="sourceLineNo">976</span><a name="line.976"></a>
+<span class="sourceLineNo">977</span>    LOG.debug(String.format("For class %s, using jar %s", my_class.getName(), jar));<a name="line.977"></a>
+<span class="sourceLineNo">978</span>    return new Path(jar).makeQualified(fs.getUri(), fs.getWorkingDirectory());<a name="line.978"></a>
+<span class="sourceLineNo">979</span>  }<a name="line.979"></a>
+<span class="sourceLineNo">980</span><a name="line.980"></a>
+<span class="sourceLineNo">981</span>  /**<a name="line.981"></a>
+<span class="sourceLineNo">982</span>   * Add entries to &lt;code&gt;packagedClasses&lt;/code&gt; corresponding to class files<a name="line.982"></a>
+<span class="sourceLineNo">983</span>   * contained in &lt;code&gt;jar&lt;/code&gt;.<a name="line.983"></a>
+<span class="sourceLineNo">984</span>   * @param jar The jar who's content to list.<a name="line.984"></a>
+<span class="sourceLineNo">985</span>   * @param packagedClasses map[class -&gt; jar]<a name="line.985"></a>
+<span class="sourceLineNo">986</span>   */<a name="line.986"></a>
+<span class="sourceLineNo">987</span>  private static void updateMap(String jar, Map&lt;String, String&gt; packagedClasses) throws IOException {<a name="line.987"></a>
+<span class="sourceLineNo">988</span>    if (null == jar || jar.isEmpty()) {<a name="line.988"></a>
+<span class="sourceLineNo">989</span>      return;<a name="line.989"></a>
+<span class="sourceLineNo">990</span>    }<a name="line.990"></a>
+<span class="sourceLineNo">991</span>    ZipFile zip = null;<a name="line.991"></a>
+<span class="sourceLineNo">992</span>    try {<a name="line.992"></a>
+<span class="sourceLineNo">993</span>      zip = new ZipFile(jar);<a name="line.993"></a>
+<span class="sourceLineNo">994</span>      for (Enumeration&lt;? extends ZipEntry&gt; iter = zip.entries(); iter.hasMoreElements();) {<a name="line.994"></a>
+<span class="sourceLineNo">995</span>        ZipEntry entry = iter.nextElement();<a name="line.995"></a>
+<span class="sourceLineNo">996</span>        if (entry.getName().endsWith("class")) {<a name="line.996"></a>
+<span class="sourceLineNo">997</span>          packagedClasses.put(entry.getName(), jar);<a name="line.997"></a>
+<span class="sourceLineNo">998</span>        }<a name="line.998"></a>
+<span class="sourceLineNo">999</span>      }<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>    } finally {<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>      if (null != zip) zip.close();<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>    }<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>  }<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span><a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>  /**<a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>   * Find a jar that contains a class of the same name, if any. It will return<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>   * a jar file, even if that is not the first thing on the class path that<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>   * has a class with the same name. Looks first on the classpath and then in<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>   * the &lt;code&gt;packagedClasses&lt;/code&gt; map.<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>   * @param my_class the class to find.<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>   * @return a jar file that contains the class, or null.<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>   * @throws IOException<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>   */<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>  private static String findContainingJar(Class&lt;?&gt; my_class, Map&lt;String, String&gt; packagedClasses)<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>      throws IOException {<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>    ClassLoader loader = my_class.getClassLoader();<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span><a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>    String class_file = my_class.getName().replaceAll("\\.", "/") + ".class";<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span><a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>    if (loader != null) {<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>      // first search the classpath<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>      for (Enumeration&lt;URL&gt; itr = loader.getResources(class_file); itr.hasMoreElements();) {<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>        URL url = itr.nextElement();<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>        if ("jar".equals(url.getProtocol())) {<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>          String toReturn = url.getPath();<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>          if (toReturn.startsWith("file:")) {<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>            toReturn = toReturn.substring("file:".length());<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>          }<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>          // URLDecoder is a misnamed class, since it actually decodes<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>          // x-www-form-urlencoded MIME type rather than actual<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>          // URL encoding (which the file path has). Therefore it would<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>          // decode +s to ' 's which is incorrect (spaces are actually<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>          // either unencoded or encoded as "%20"). Replace +s first, so<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>          // that they are kept sacred during the decoding process.<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>          toReturn = toReturn.replaceAll("\\+", "%2B");<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>          toReturn = URLDecoder.decode(toReturn, "UTF-8");<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>          return toReturn.replaceAll("!.*$", "");<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>        }<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>      }<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>    }<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span><a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>    // now look in any jars we've packaged using JarFinder. Returns null when<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>    // no jar is found.<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>    return packagedClasses.get(class_file);<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>  }<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span><a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>  /**<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>   * Invoke 'getJar' on a custom JarFinder implementation. Useful for some job<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>   * configuration contexts (HBASE-8140) and also for testing on MRv2.<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>   * check if we have HADOOP-9426.<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>   * @param my_class the class to find.<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>   * @return a jar file that contains the class, or null.<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>   */<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>  private static String getJar(Class&lt;?&gt; my_class) {<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>    String ret = null;<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    try {<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>      ret = JarFinder.getJar(my_class);<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    } catch (Exception e) {<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>      // toss all other exceptions, related to reflection failure<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>      throw new RuntimeException("getJar invocation failed.", e);<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>    }<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span><a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>    return ret;<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>  }<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span><a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>  private static int getRegionCount(Configuration conf, TableName tableName) throws IOException {<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>    try (Connection conn = ConnectionFactory.createConnection(conf);<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>      RegionLocator locator = conn.getRegionLocator(tableName)) {<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>      return locator.getAllRegionLocations().size();<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>    }<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>  }<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>}<a name="line.1072"></a>
 
 
 
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/TableSplit.html b/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/TableSplit.html
index 0a21dfc..35747cb 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/TableSplit.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/TableSplit.html
@@ -360,8 +360,8 @@
 <span class="sourceLineNo">352</span>  @Override<a name="line.352"></a>
 <span class="sourceLineNo">353</span>  public String toString() {<a name="line.353"></a>
 <span class="sourceLineNo">354</span>    StringBuilder sb = new StringBuilder();<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    sb.append("HBase table split(");<a name="line.355"></a>
-<span class="sourceLineNo">356</span>    sb.append("table name: ").append(tableName);<a name="line.356"></a>
+<span class="sourceLineNo">355</span>    sb.append("Split(");<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    sb.append("tablename=").append(tableName);<a name="line.356"></a>
 <span class="sourceLineNo">357</span>    // null scan input is represented by ""<a name="line.357"></a>
 <span class="sourceLineNo">358</span>    String printScan = "";<a name="line.358"></a>
 <span class="sourceLineNo">359</span>    if (!scan.equals("")) {<a name="line.359"></a>
@@ -372,12 +372,12 @@
 <span class="sourceLineNo">364</span>      catch (IOException e) {<a name="line.364"></a>
 <span class="sourceLineNo">365</span>        printScan = "";<a name="line.365"></a>
 <span class="sourceLineNo">366</span>      }<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    }<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    sb.append(", scan: ").append(printScan);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    sb.append(", start row: ").append(Bytes.toStringBinary(startRow));<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    sb.append(", end row: ").append(Bytes.toStringBinary(endRow));<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    sb.append(", region location: ").append(regionLocation);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    sb.append(", encoded region name: ").append(encodedRegionName);<a name="line.372"></a>
+<span class="sourceLineNo">367</span>      sb.append(", scan=").append(printScan);<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    }<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    sb.append(", startrow=").append(Bytes.toStringBinary(startRow));<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    sb.append(", endrow=").append(Bytes.toStringBinary(endRow));<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    sb.append(", regionLocation=").append(regionLocation);<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    sb.append(", regionname=").append(encodedRegionName);<a name="line.372"></a>
 <span class="sourceLineNo">373</span>    sb.append(")");<a name="line.373"></a>
 <span class="sourceLineNo">374</span>    return sb.toString();<a name="line.374"></a>
 <span class="sourceLineNo">375</span>  }<a name="line.375"></a>
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/rest/client/Client.html b/apidocs/src-html/org/apache/hadoop/hbase/rest/client/Client.html
index b6d6858..4cd9c1e 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/rest/client/Client.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/rest/client/Client.html
@@ -27,782 +27,786 @@
 <span class="sourceLineNo">019</span><a name="line.19"></a>
 <span class="sourceLineNo">020</span>package org.apache.hadoop.hbase.rest.client;<a name="line.20"></a>
 <span class="sourceLineNo">021</span><a name="line.21"></a>
-<span class="sourceLineNo">022</span>import java.io.ByteArrayInputStream;<a name="line.22"></a>
-<span class="sourceLineNo">023</span>import java.io.ByteArrayOutputStream;<a name="line.23"></a>
-<span class="sourceLineNo">024</span>import java.io.File;<a name="line.24"></a>
-<span class="sourceLineNo">025</span>import java.io.FileInputStream;<a name="line.25"></a>
-<span class="sourceLineNo">026</span>import java.io.IOException;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import java.io.InputStream;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import java.net.URI;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import java.net.URISyntaxException;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import java.net.URL;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import java.security.KeyManagementException;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import java.security.KeyStore;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import java.security.KeyStoreException;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import java.security.NoSuchAlgorithmException;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import java.security.cert.CertificateException;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import java.util.Collections;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import java.util.Map;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import java.util.Optional;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import java.util.concurrent.ConcurrentHashMap;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import javax.net.ssl.SSLContext;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.security.authentication.client.AuthenticatedURL;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.security.authentication.client.AuthenticationException;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.security.authentication.client.KerberosAuthenticator;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.http.Header;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.http.HttpResponse;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.http.HttpStatus;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.http.client.HttpClient;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.http.client.config.RequestConfig;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.http.client.methods.HttpDelete;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.http.client.methods.HttpGet;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.http.client.methods.HttpHead;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.http.client.methods.HttpPost;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.http.client.methods.HttpPut;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.http.client.methods.HttpUriRequest;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.http.entity.InputStreamEntity;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.http.impl.client.HttpClientBuilder;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.http.impl.client.HttpClients;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.http.message.BasicHeader;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.http.ssl.SSLContexts;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.http.util.EntityUtils;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.slf4j.Logger;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.slf4j.LoggerFactory;<a name="line.63"></a>
-<span class="sourceLineNo">064</span><a name="line.64"></a>
-<span class="sourceLineNo">065</span>/**<a name="line.65"></a>
-<span class="sourceLineNo">066</span> * A wrapper around HttpClient which provides some useful function and<a name="line.66"></a>
-<span class="sourceLineNo">067</span> * semantics for interacting with the REST gateway.<a name="line.67"></a>
-<span class="sourceLineNo">068</span> */<a name="line.68"></a>
-<span class="sourceLineNo">069</span>@InterfaceAudience.Public<a name="line.69"></a>
-<span class="sourceLineNo">070</span>public class Client {<a name="line.70"></a>
-<span class="sourceLineNo">071</span>  public static final Header[] EMPTY_HEADER_ARRAY = new Header[0];<a name="line.71"></a>
-<span class="sourceLineNo">072</span><a name="line.72"></a>
-<span class="sourceLineNo">073</span>  private static final Logger LOG = LoggerFactory.getLogger(Client.class);<a name="line.73"></a>
+<span class="sourceLineNo">022</span>import java.io.BufferedInputStream;<a name="line.22"></a>
+<span class="sourceLineNo">023</span>import java.io.ByteArrayInputStream;<a name="line.23"></a>
+<span class="sourceLineNo">024</span>import java.io.ByteArrayOutputStream;<a name="line.24"></a>
+<span class="sourceLineNo">025</span>import java.io.File;<a name="line.25"></a>
+<span class="sourceLineNo">026</span>import java.io.FileInputStream;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import java.io.IOException;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import java.io.InputStream;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import java.net.URI;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import java.net.URISyntaxException;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import java.net.URL;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import java.nio.file.Files;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import java.security.KeyManagementException;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import java.security.KeyStore;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import java.security.KeyStoreException;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import java.security.NoSuchAlgorithmException;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import java.security.cert.CertificateException;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import java.util.Collections;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import java.util.Map;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import java.util.Optional;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import java.util.concurrent.ConcurrentHashMap;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import javax.net.ssl.SSLContext;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.security.authentication.client.AuthenticatedURL;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.security.authentication.client.AuthenticationException;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.security.authentication.client.KerberosAuthenticator;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.http.Header;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.http.HttpResponse;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.http.HttpStatus;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.http.client.HttpClient;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.http.client.config.RequestConfig;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.http.client.methods.HttpDelete;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.http.client.methods.HttpGet;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.http.client.methods.HttpHead;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.http.client.methods.HttpPost;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.http.client.methods.HttpPut;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.http.client.methods.HttpUriRequest;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.http.entity.InputStreamEntity;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.apache.http.impl.client.HttpClientBuilder;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.apache.http.impl.client.HttpClients;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.http.message.BasicHeader;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.http.ssl.SSLContexts;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.http.util.EntityUtils;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.slf4j.Logger;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.slf4j.LoggerFactory;<a name="line.65"></a>
+<span class="sourceLineNo">066</span><a name="line.66"></a>
+<span class="sourceLineNo">067</span>/**<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * A wrapper around HttpClient which provides some useful function and<a name="line.68"></a>
+<span class="sourceLineNo">069</span> * semantics for interacting with the REST gateway.<a name="line.69"></a>
+<span class="sourceLineNo">070</span> */<a name="line.70"></a>
+<span class="sourceLineNo">071</span>@InterfaceAudience.Public<a name="line.71"></a>
+<span class="sourceLineNo">072</span>public class Client {<a name="line.72"></a>
+<span class="sourceLineNo">073</span>  public static final Header[] EMPTY_HEADER_ARRAY = new Header[0];<a name="line.73"></a>
 <span class="sourceLineNo">074</span><a name="line.74"></a>
-<span class="sourceLineNo">075</span>  private HttpClient httpClient;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>  private Cluster cluster;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>  private boolean sslEnabled;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>  private HttpResponse resp;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>  private HttpGet httpGet = null;<a name="line.79"></a>
-<span class="sourceLineNo">080</span><a name="line.80"></a>
-<span class="sourceLineNo">081</span>  private Map&lt;String, String&gt; extraHeaders;<a name="line.81"></a>
+<span class="sourceLineNo">075</span>  private static final Logger LOG = LoggerFactory.getLogger(Client.class);<a name="line.75"></a>
+<span class="sourceLineNo">076</span><a name="line.76"></a>
+<span class="sourceLineNo">077</span>  private HttpClient httpClient;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>  private Cluster cluster;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>  private boolean sslEnabled;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>  private HttpResponse resp;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>  private HttpGet httpGet = null;<a name="line.81"></a>
 <span class="sourceLineNo">082</span><a name="line.82"></a>
-<span class="sourceLineNo">083</span>  private static final String AUTH_COOKIE = "hadoop.auth";<a name="line.83"></a>
-<span class="sourceLineNo">084</span>  private static final String AUTH_COOKIE_EQ = AUTH_COOKIE + "=";<a name="line.84"></a>
-<span class="sourceLineNo">085</span>  private static final String COOKIE = "Cookie";<a name="line.85"></a>
-<span class="sourceLineNo">086</span><a name="line.86"></a>
-<span class="sourceLineNo">087</span>  /**<a name="line.87"></a>
-<span class="sourceLineNo">088</span>   * Default Constructor<a name="line.88"></a>
-<span class="sourceLineNo">089</span>   */<a name="line.89"></a>
-<span class="sourceLineNo">090</span>  public Client() {<a name="line.90"></a>
-<span class="sourceLineNo">091</span>    this(null);<a name="line.91"></a>
-<span class="sourceLineNo">092</span>  }<a name="line.92"></a>
-<span class="sourceLineNo">093</span><a name="line.93"></a>
-<span class="sourceLineNo">094</span>  private void initialize(Cluster cluster, boolean sslEnabled, Optional&lt;KeyStore&gt; trustStore) {<a name="line.94"></a>
-<span class="sourceLineNo">095</span>    this.cluster = cluster;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    this.sslEnabled = sslEnabled;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    extraHeaders = new ConcurrentHashMap&lt;&gt;();<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    String clspath = System.getProperty("java.class.path");<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    LOG.debug("classpath " + clspath);<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    HttpClientBuilder httpClientBuilder = HttpClients.custom();<a name="line.100"></a>
-<span class="sourceLineNo">101</span><a name="line.101"></a>
-<span class="sourceLineNo">102</span>    RequestConfig requestConfig = RequestConfig.custom().<a name="line.102"></a>
-<span class="sourceLineNo">103</span>      setConnectTimeout(2000).build();<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    httpClientBuilder.setDefaultRequestConfig(requestConfig);<a name="line.104"></a>
-<span class="sourceLineNo">105</span><a name="line.105"></a>
-<span class="sourceLineNo">106</span>    // Since HBASE-25267 we don't use the deprecated DefaultHttpClient anymore.<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    // The new http client would decompress the gzip content automatically.<a name="line.107"></a>
-<span class="sourceLineNo">108</span>    // In order to keep the original behaviour of this public class, we disable<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    // automatic content compression.<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    httpClientBuilder.disableContentCompression();<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>    if(sslEnabled &amp;&amp; trustStore.isPresent()) {<a name="line.112"></a>
-<span class="sourceLineNo">113</span>      try {<a name="line.113"></a>
-<span class="sourceLineNo">114</span>        SSLContext sslcontext =<a name="line.114"></a>
-<span class="sourceLineNo">115</span>          SSLContexts.custom().loadTrustMaterial(trustStore.get(), null).build();<a name="line.115"></a>
-<span class="sourceLineNo">116</span>        httpClientBuilder.setSSLContext(sslcontext);<a name="line.116"></a>
-<span class="sourceLineNo">117</span>      } catch (NoSuchAlgorithmException | KeyStoreException | KeyManagementException e) {<a name="line.117"></a>
-<span class="sourceLineNo">118</span>        throw new ClientTrustStoreInitializationException("Error while processing truststore", e);<a name="line.118"></a>
-<span class="sourceLineNo">119</span>      }<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    }<a name="line.120"></a>
-<span class="sourceLineNo">121</span><a name="line.121"></a>
-<span class="sourceLineNo">122</span>    this.httpClient = httpClientBuilder.build();<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  }<a name="line.123"></a>
-<span class="sourceLineNo">124</span><a name="line.124"></a>
-<span class="sourceLineNo">125</span>  /**<a name="line.125"></a>
-<span class="sourceLineNo">126</span>   * Constructor<a name="line.126"></a>
-<span class="sourceLineNo">127</span>   * @param cluster the cluster definition<a name="line.127"></a>
-<span class="sourceLineNo">128</span>   */<a name="line.128"></a>
-<span class="sourceLineNo">129</span>  public Client(Cluster cluster) {<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    this(cluster, false);<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  }<a name="line.131"></a>
-<span class="sourceLineNo">132</span><a name="line.132"></a>
-<span class="sourceLineNo">133</span>  /**<a name="line.133"></a>
-<span class="sourceLineNo">134</span>   * Constructor<a name="line.134"></a>
-<span class="sourceLineNo">135</span>   * @param cluster the cluster definition<a name="line.135"></a>
-<span class="sourceLineNo">136</span>   * @param sslEnabled enable SSL or not<a name="line.136"></a>
-<span class="sourceLineNo">137</span>   */<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  public Client(Cluster cluster, boolean sslEnabled) {<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    initialize(cluster, sslEnabled, Optional.empty());<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  }<a name="line.140"></a>
-<span class="sourceLineNo">141</span><a name="line.141"></a>
-<span class="sourceLineNo">142</span>  /**<a name="line.142"></a>
-<span class="sourceLineNo">143</span>   * Constructor, allowing to define custom trust store (only for SSL connections)<a name="line.143"></a>
-<span class="sourceLineNo">144</span>   *<a name="line.144"></a>
-<span class="sourceLineNo">145</span>   * @param cluster the cluster definition<a name="line.145"></a>
-<span class="sourceLineNo">146</span>   * @param trustStorePath custom trust store to use for SSL connections<a name="line.146"></a>
-<span class="sourceLineNo">147</span>   * @param trustStorePassword password to use for custom trust store<a name="line.147"></a>
-<span class="sourceLineNo">148</span>   * @param trustStoreType type of custom trust store<a name="line.148"></a>
-<span class="sourceLineNo">149</span>   *<a name="line.149"></a>
-<span class="sourceLineNo">150</span>   * @throws ClientTrustStoreInitializationException if the trust store file can not be loaded<a name="line.150"></a>
-<span class="sourceLineNo">151</span>   */<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  public Client(Cluster cluster, String trustStorePath,<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    Optional&lt;String&gt; trustStorePassword, Optional&lt;String&gt; trustStoreType) {<a name="line.153"></a>
-<span class="sourceLineNo">154</span><a name="line.154"></a>
-<span class="sourceLineNo">155</span>    char[] password = trustStorePassword.map(String::toCharArray).orElse(null);<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    String type = trustStoreType.orElse(KeyStore.getDefaultType());<a name="line.156"></a>
-<span class="sourceLineNo">157</span><a name="line.157"></a>
-<span class="sourceLineNo">158</span>    KeyStore trustStore;<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    try(FileInputStream inputStream = new FileInputStream(new File(trustStorePath))) {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>      trustStore = KeyStore.getInstance(type);<a name="line.160"></a>
-<span class="sourceLineNo">161</span>      trustStore.load(inputStream, password);<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    } catch (KeyStoreException e) {<a name="line.162"></a>
-<span class="sourceLineNo">163</span>      throw new ClientTrustStoreInitializationException(<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        "Invalid trust store type: " + type, e);<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    } catch (CertificateException | NoSuchAlgorithmException | IOException e) {<a name="line.165"></a>
-<span class="sourceLineNo">166</span>      throw new ClientTrustStoreInitializationException(<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        "Trust store load error: " + trustStorePath, e);<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    }<a name="line.168"></a>
-<span class="sourceLineNo">169</span><a name="line.169"></a>
-<span class="sourceLineNo">170</span>    initialize(cluster, true, Optional.of(trustStore));<a name="line.170"></a>
-<span class="sourceLineNo">171</span>  }<a name="line.171"></a>
-<span class="sourceLineNo">172</span><a name="line.172"></a>
-<span class="sourceLineNo">173</span>  /**<a name="line.173"></a>
-<span class="sourceLineNo">174</span>   * Shut down the client. Close any open persistent connections.<a name="line.174"></a>
-<span class="sourceLineNo">175</span>   */<a name="line.175"></a>
-<span class="sourceLineNo">176</span>  public void shutdown() {<a name="line.176"></a>
-<span class="sourceLineNo">177</span>  }<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>  /**<a name="line.179"></a>
-<span class="sourceLineNo">180</span>   * @return the wrapped HttpClient<a name="line.180"></a>
-<span class="sourceLineNo">181</span>   */<a name="line.181"></a>
-<span class="sourceLineNo">182</span>  public HttpClient getHttpClient() {<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    return httpClient;<a name="line.183"></a>
-<span class="sourceLineNo">184</span>  }<a name="line.184"></a>
-<span class="sourceLineNo">185</span><a name="line.185"></a>
-<span class="sourceLineNo">186</span>  /**<a name="line.186"></a>
-<span class="sourceLineNo">187</span>   * Add extra headers.  These extra headers will be applied to all http<a name="line.187"></a>
-<span class="sourceLineNo">188</span>   * methods before they are removed. If any header is not used any more,<a name="line.188"></a>
-<span class="sourceLineNo">189</span>   * client needs to remove it explicitly.<a name="line.189"></a>
-<span class="sourceLineNo">190</span>   */<a name="line.190"></a>
-<span class="sourceLineNo">191</span>  public void addExtraHeader(final String name, final String value) {<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    extraHeaders.put(name, value);<a name="line.192"></a>
-<span class="sourceLineNo">193</span>  }<a name="line.193"></a>
-<span class="sourceLineNo">194</span><a name="line.194"></a>
-<span class="sourceLineNo">195</span>  /**<a name="line.195"></a>
-<span class="sourceLineNo">196</span>   * Get an extra header value.<a name="line.196"></a>
-<span class="sourceLineNo">197</span>   */<a name="line.197"></a>
-<span class="sourceLineNo">198</span>  public String getExtraHeader(final String name) {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    return extraHeaders.get(name);<a name="line.199"></a>
-<span class="sourceLineNo">200</span>  }<a name="line.200"></a>
-<span class="sourceLineNo">201</span><a name="line.201"></a>
-<span class="sourceLineNo">202</span>  /**<a name="line.202"></a>
-<span class="sourceLineNo">203</span>   * Get all extra headers (read-only).<a name="line.203"></a>
-<span class="sourceLineNo">204</span>   */<a name="line.204"></a>
-<span class="sourceLineNo">205</span>  public Map&lt;String, String&gt; getExtraHeaders() {<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    return Collections.unmodifiableMap(extraHeaders);<a name="line.206"></a>
-<span class="sourceLineNo">207</span>  }<a name="line.207"></a>
-<span class="sourceLineNo">208</span><a name="line.208"></a>
-<span class="sourceLineNo">209</span>  /**<a name="line.209"></a>
-<span class="sourceLineNo">210</span>   * Remove an extra header.<a name="line.210"></a>
-<span class="sourceLineNo">211</span>   */<a name="line.211"></a>
-<span class="sourceLineNo">212</span>  public void removeExtraHeader(final String name) {<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    extraHeaders.remove(name);<a name="line.213"></a>
-<span class="sourceLineNo">214</span>  }<a name="line.214"></a>
-<span class="sourceLineNo">215</span><a name="line.215"></a>
-<span class="sourceLineNo">216</span>  /**<a name="line.216"></a>
-<span class="sourceLineNo">217</span>   * Execute a transaction method given only the path. Will select at random<a name="line.217"></a>
-<span class="sourceLineNo">218</span>   * one of the members of the supplied cluster definition and iterate through<a name="line.218"></a>
-<span class="sourceLineNo">219</span>   * the list until a transaction can be successfully completed. The<a name="line.219"></a>
-<span class="sourceLineNo">220</span>   * definition of success here is a complete HTTP transaction, irrespective<a name="line.220"></a>
-<span class="sourceLineNo">221</span>   * of result code.<a name="line.221"></a>
-<span class="sourceLineNo">222</span>   * @param cluster the cluster definition<a name="line.222"></a>
-<span class="sourceLineNo">223</span>   * @param method the transaction method<a name="line.223"></a>
-<span class="sourceLineNo">224</span>   * @param headers HTTP header values to send<a name="line.224"></a>
-<span class="sourceLineNo">225</span>   * @param path the properly urlencoded path<a name="line.225"></a>
-<span class="sourceLineNo">226</span>   * @return the HTTP response code<a name="line.226"></a>
-<span class="sourceLineNo">227</span>   * @throws IOException<a name="line.227"></a>
-<span class="sourceLineNo">228</span>   */<a name="line.228"></a>
-<span class="sourceLineNo">229</span>  public HttpResponse executePathOnly(Cluster cluster, HttpUriRequest method,<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      Header[] headers, String path) throws IOException {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    IOException lastException;<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    if (cluster.nodes.size() &lt; 1) {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>      throw new IOException("Cluster is empty");<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    }<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    int start = (int)Math.round((cluster.nodes.size() - 1) * Math.random());<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    int i = start;<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    do {<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      cluster.lastHost = cluster.nodes.get(i);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      try {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>        StringBuilder sb = new StringBuilder();<a name="line.240"></a>
-<span class="sourceLineNo">241</span>        if (sslEnabled) {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>          sb.append("https://");<a name="line.242"></a>
-<span class="sourceLineNo">243</span>        } else {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>          sb.append("http://");<a name="line.244"></a>
-<span class="sourceLineNo">245</span>        }<a name="line.245"></a>
-<span class="sourceLineNo">246</span>        sb.append(cluster.lastHost);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>        sb.append(path);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>        URI uri = new URI(sb.toString());<a name="line.248"></a>
-<span class="sourceLineNo">249</span>        if (method instanceof HttpPut) {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>          HttpPut put = new HttpPut(uri);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>          put.setEntity(((HttpPut) method).getEntity());<a name="line.251"></a>
-<span class="sourceLineNo">252</span>          put.setHeaders(method.getAllHeaders());<a name="line.252"></a>
-<span class="sourceLineNo">253</span>          method = put;<a name="line.253"></a>
-<span class="sourceLineNo">254</span>        } else if (method instanceof HttpGet) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>          method = new HttpGet(uri);<a name="line.255"></a>
-<span class="sourceLineNo">256</span>        } else if (method instanceof HttpHead) {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>          method = new HttpHead(uri);<a name="line.257"></a>
-<span class="sourceLineNo">258</span>        } else if (method instanceof HttpDelete) {<a name="line.258"></a>
-<span class="sourceLineNo">259</span>          method = new HttpDelete(uri);<a name="line.259"></a>
-<span class="sourceLineNo">260</span>        } else if (method instanceof HttpPost) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>          HttpPost post = new HttpPost(uri);<a name="line.261"></a>
-<span class="sourceLineNo">262</span>          post.setEntity(((HttpPost) method).getEntity());<a name="line.262"></a>
-<span class="sourceLineNo">263</span>          post.setHeaders(method.getAllHeaders());<a name="line.263"></a>
-<span class="sourceLineNo">264</span>          method = post;<a name="line.264"></a>
-<span class="sourceLineNo">265</span>        }<a name="line.265"></a>
-<span class="sourceLineNo">266</span>        return executeURI(method, headers, uri.toString());<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      } catch (IOException e) {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>        lastException = e;<a name="line.268"></a>
-<span class="sourceLineNo">269</span>      } catch (URISyntaxException use) {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>        lastException = new IOException(use);<a name="line.270"></a>
-<span class="sourceLineNo">271</span>      }<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    } while (++i != start &amp;&amp; i &lt; cluster.nodes.size());<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    throw lastException;<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  }<a name="line.274"></a>
-<span class="sourceLineNo">275</span><a name="line.275"></a>
-<span class="sourceLineNo">276</span>  /**<a name="line.276"></a>
-<span class="sourceLineNo">277</span>   * Execute a transaction method given a complete URI.<a name="line.277"></a>
-<span class="sourceLineNo">278</span>   * @param method the transaction method<a name="line.278"></a>
-<span class="sourceLineNo">279</span>   * @param headers HTTP header values to send<a name="line.279"></a>
-<span class="sourceLineNo">280</span>   * @param uri a properly urlencoded URI<a name="line.280"></a>
-<span class="sourceLineNo">281</span>   * @return the HTTP response code<a name="line.281"></a>
-<span class="sourceLineNo">282</span>   * @throws IOException<a name="line.282"></a>
-<span class="sourceLineNo">283</span>   */<a name="line.283"></a>
-<span class="sourceLineNo">284</span>  public HttpResponse executeURI(HttpUriRequest method, Header[] headers, String uri)<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      throws IOException {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    // method.setURI(new URI(uri, true));<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    for (Map.Entry&lt;String, String&gt; e: extraHeaders.entrySet()) {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      method.addHeader(e.getKey(), e.getValue());<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    if (headers != null) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      for (Header header: headers) {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        method.addHeader(header);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      }<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    }<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    long startTime = System.currentTimeMillis();<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    if (resp != null) EntityUtils.consumeQuietly(resp.getEntity());<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    resp = httpClient.execute(method);<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    if (resp.getStatusLine().getStatusCode() == HttpStatus.SC_UNAUTHORIZED) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>      // Authentication error<a name="line.299"></a>
-<span class="sourceLineNo">300</span>      LOG.debug("Performing negotiation with the server.");<a name="line.300"></a>
-<span class="sourceLineNo">301</span>      negotiate(method, uri);<a name="line.301"></a>
-<span class="sourceLineNo">302</span>      resp = httpClient.execute(method);<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    }<a name="line.303"></a>
-<span class="sourceLineNo">304</span><a name="line.304"></a>
-<span class="sourceLineNo">305</span>    long endTime = System.currentTimeMillis();<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    if (LOG.isTraceEnabled()) {<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      LOG.trace(method.getMethod() + " " + uri + " " + resp.getStatusLine().getStatusCode() + " " +<a name="line.307"></a>
-<span class="sourceLineNo">308</span>          resp.getStatusLine().getReasonPhrase() + " in " + (endTime - startTime) + " ms");<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    }<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    return resp;<a name="line.310"></a>
-<span class="sourceLineNo">311</span>  }<a name="line.311"></a>
-<span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>  /**<a name="line.313"></a>
-<span class="sourceLineNo">314</span>   * Execute a transaction method. Will call either &lt;tt&gt;executePathOnly&lt;/tt&gt;<a name="line.314"></a>
-<span class="sourceLineNo">315</span>   * or &lt;tt&gt;executeURI&lt;/tt&gt; depending on whether a path only is supplied in<a name="line.315"></a>
-<span class="sourceLineNo">316</span>   * 'path', or if a complete URI is passed instead, respectively.<a name="line.316"></a>
-<span class="sourceLineNo">317</span>   * @param cluster the cluster definition<a name="line.317"></a>
-<span class="sourceLineNo">318</span>   * @param method the HTTP method<a name="line.318"></a>
-<span class="sourceLineNo">319</span>   * @param headers HTTP header values to send<a name="line.319"></a>
-<span class="sourceLineNo">320</span>   * @param path the properly urlencoded path or URI<a name="line.320"></a>
-<span class="sourceLineNo">321</span>   * @return the HTTP response code<a name="line.321"></a>
-<span class="sourceLineNo">322</span>   * @throws IOException<a name="line.322"></a>
-<span class="sourceLineNo">323</span>   */<a name="line.323"></a>
-<span class="sourceLineNo">324</span>  public HttpResponse execute(Cluster cluster, HttpUriRequest method, Header[] headers,<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      String path) throws IOException {<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    if (path.startsWith("/")) {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      return executePathOnly(cluster, method, headers, path);<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    }<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    return executeURI(method, headers, path);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>  }<a name="line.330"></a>
-<span class="sourceLineNo">331</span><a name="line.331"></a>
-<span class="sourceLineNo">332</span>  /**<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * Initiate client side Kerberos negotiation with the server.<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * @param method method to inject the authentication token into.<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   * @param uri the String to parse as a URL.<a name="line.335"></a>
-<span class="sourceLineNo">336</span>   * @throws IOException if unknown protocol is found.<a name="line.336"></a>
-<span class="sourceLineNo">337</span>   */<a name="line.337"></a>
-<span class="sourceLineNo">338</span>  private void negotiate(HttpUriRequest method, String uri) throws IOException {<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    try {<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      AuthenticatedURL.Token token = new AuthenticatedURL.Token();<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      KerberosAuthenticator authenticator = new KerberosAuthenticator();<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      authenticator.authenticate(new URL(uri), token);<a name="line.342"></a>
-<span class="sourceLineNo">343</span>      // Inject the obtained negotiated token in the method cookie<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      injectToken(method, token);<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    } catch (AuthenticationException e) {<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      LOG.error("Failed to negotiate with the server.", e);<a name="line.346"></a>
-<span class="sourceLineNo">347</span>      throw new IOException(e);<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    }<a name="line.348"></a>
-<span class="sourceLineNo">349</span>  }<a name="line.349"></a>
-<span class="sourceLineNo">350</span><a name="line.350"></a>
-<span class="sourceLineNo">351</span>  /**<a name="line.351"></a>
-<span class="sourceLineNo">352</span>   * Helper method that injects an authentication token to send with the method.<a name="line.352"></a>
-<span class="sourceLineNo">353</span>   * @param method method to inject the authentication token into.<a name="line.353"></a>
-<span class="sourceLineNo">354</span>   * @param token authentication token to inject.<a name="line.354"></a>
-<span class="sourceLineNo">355</span>   */<a name="line.355"></a>
-<span class="sourceLineNo">356</span>  private void injectToken(HttpUriRequest method, AuthenticatedURL.Token token) {<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    String t = token.toString();<a name="line.357"></a>
-<span class="sourceLineNo">358</span>    if (t != null) {<a name="line.358"></a>
-<span class="sourceLineNo">359</span>      if (!t.startsWith("\"")) {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        t = "\"" + t + "\"";<a name="line.360"></a>
-<span class="sourceLineNo">361</span>      }<a name="line.361"></a>
-<span class="sourceLineNo">362</span>      method.addHeader(COOKIE, AUTH_COOKIE_EQ + t);<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    }<a name="line.363"></a>
-<span class="sourceLineNo">364</span>  }<a name="line.364"></a>
-<span class="sourceLineNo">365</span><a name="line.365"></a>
-<span class="sourceLineNo">366</span>  /**<a name="line.366"></a>
-<span class="sourceLineNo">367</span>   * @return the cluster definition<a name="line.367"></a>
-<span class="sourceLineNo">368</span>   */<a name="line.368"></a>
-<span class="sourceLineNo">369</span>  public Cluster getCluster() {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    return cluster;<a name="line.370"></a>
-<span class="sourceLineNo">371</span>  }<a name="line.371"></a>
-<span class="sourceLineNo">372</span><a name="line.372"></a>
-<span class="sourceLineNo">373</span>  /**<a name="line.373"></a>
-<span class="sourceLineNo">374</span>   * @param cluster the cluster definition<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   */<a name="line.375"></a>
-<span class="sourceLineNo">376</span>  public void setCluster(Cluster cluster) {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    this.cluster = cluster;<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  }<a name="line.378"></a>
-<span class="sourceLineNo">379</span><a name="line.379"></a>
-<span class="sourceLineNo">380</span>  /**<a name="line.380"></a>
-<span class="sourceLineNo">381</span>   * Send a HEAD request<a name="line.381"></a>
-<span class="sourceLineNo">382</span>   * @param path the path or URI<a name="line.382"></a>
-<span class="sourceLineNo">383</span>   * @return a Response object with response detail<a name="line.383"></a>
-<span class="sourceLineNo">384</span>   * @throws IOException<a name="line.384"></a>
-<span class="sourceLineNo">385</span>   */<a name="line.385"></a>
-<span class="sourceLineNo">386</span>  public Response head(String path) throws IOException {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    return head(cluster, path, null);<a name="line.387"></a>
-<span class="sourceLineNo">388</span>  }<a name="line.388"></a>
-<span class="sourceLineNo">389</span><a name="line.389"></a>
-<span class="sourceLineNo">390</span>  /**<a name="line.390"></a>
-<span class="sourceLineNo">391</span>   * Send a HEAD request<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * @param cluster the cluster definition<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   * @param path the path or URI<a name="line.393"></a>
-<span class="sourceLineNo">394</span>   * @param headers the HTTP headers to include in the request<a name="line.394"></a>
-<span class="sourceLineNo">395</span>   * @return a Response object with response detail<a name="line.395"></a>
-<span class="sourceLineNo">396</span>   * @throws IOException<a name="line.396"></a>
-<span class="sourceLineNo">397</span>   */<a name="line.397"></a>
-<span class="sourceLineNo">398</span>  public Response head(Cluster cluster, String path, Header[] headers)<a name="line.398"></a>
-<span class="sourceLineNo">399</span>      throws IOException {<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    HttpHead method = new HttpHead(path);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    try {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      HttpResponse resp = execute(cluster, method, null, path);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      return new Response(resp.getStatusLine().getStatusCode(), resp.getAllHeaders(), null);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    } finally {<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      method.releaseConnection();<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    }<a name="line.406"></a>
-<span class="sourceLineNo">407</span>  }<a name="line.407"></a>
-<span class="sourceLineNo">408</span><a name="line.408"></a>
-<span class="sourceLineNo">409</span>  /**<a name="line.409"></a>
-<span class="sourceLineNo">410</span>   * Send a GET request<a name="line.410"></a>
-<span class="sourceLineNo">411</span>   * @param path the path or URI<a name="line.411"></a>
-<span class="sourceLineNo">412</span>   * @return a Response object with response detail<a name="line.412"></a>
-<span class="sourceLineNo">413</span>   * @throws IOException<a name="line.413"></a>
-<span class="sourceLineNo">414</span>   */<a name="line.414"></a>
-<span class="sourceLineNo">415</span>  public Response get(String path) throws IOException {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    return get(cluster, path);<a name="line.416"></a>
-<span class="sourceLineNo">417</span>  }<a name="line.417"></a>
-<span class="sourceLineNo">418</span><a name="line.418"></a>
-<span class="sourceLineNo">419</span>  /**<a name="line.419"></a>
-<span class="sourceLineNo">420</span>   * Send a GET request<a name="line.420"></a>
-<span class="sourceLineNo">421</span>   * @param cluster the cluster definition<a name="line.421"></a>
-<span class="sourceLineNo">422</span>   * @param path the path or URI<a name="line.422"></a>
-<span class="sourceLineNo">423</span>   * @return a Response object with response detail<a name="line.423"></a>
-<span class="sourceLineNo">424</span>   * @throws IOException<a name="line.424"></a>
-<span class="sourceLineNo">425</span>   */<a name="line.425"></a>
-<span class="sourceLineNo">426</span>  public Response get(Cluster cluster, String path) throws IOException {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    return get(cluster, path, EMPTY_HEADER_ARRAY);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>  }<a name="line.428"></a>
-<span class="sourceLineNo">429</span><a name="line.429"></a>
-<span class="sourceLineNo">430</span>  /**<a name="line.430"></a>
-<span class="sourceLineNo">431</span>   * Send a GET request<a name="line.431"></a>
-<span class="sourceLineNo">432</span>   * @param path the path or URI<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * @param accept Accept header value<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   * @return a Response object with response detail<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   * @throws IOException<a name="line.435"></a>
-<span class="sourceLineNo">436</span>   */<a name="line.436"></a>
-<span class="sourceLineNo">437</span>  public Response get(String path, String accept) throws IOException {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    return get(cluster, path, accept);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>  }<a name="line.439"></a>
-<span class="sourceLineNo">440</span><a name="line.440"></a>
-<span class="sourceLineNo">441</span>  /**<a name="line.441"></a>
-<span class="sourceLineNo">442</span>   * Send a GET request<a name="line.442"></a>
-<span class="sourceLineNo">443</span>   * @param cluster the cluster definition<a name="line.443"></a>
-<span class="sourceLineNo">444</span>   * @param path the path or URI<a name="line.444"></a>
-<span class="sourceLineNo">445</span>   * @param accept Accept header value<a name="line.445"></a>
-<span class="sourceLineNo">446</span>   * @return a Response object with response detail<a name="line.446"></a>
-<span class="sourceLineNo">447</span>   * @throws IOException<a name="line.447"></a>
-<span class="sourceLineNo">448</span>   */<a name="line.448"></a>
-<span class="sourceLineNo">449</span>  public Response get(Cluster cluster, String path, String accept)<a name="line.449"></a>
-<span class="sourceLineNo">450</span>      throws IOException {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>    Header[] headers = new Header[1];<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    headers[0] = new BasicHeader("Accept", accept);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    return get(cluster, path, headers);<a name="line.453"></a>
-<span class="sourceLineNo">454</span>  }<a name="line.454"></a>
-<span class="sourceLineNo">455</span><a name="line.455"></a>
-<span class="sourceLineNo">456</span>  /**<a name="line.456"></a>
-<span class="sourceLineNo">457</span>   * Send a GET request<a name="line.457"></a>
-<span class="sourceLineNo">458</span>   * @param path the path or URI<a name="line.458"></a>
-<span class="sourceLineNo">459</span>   * @param headers the HTTP headers to include in the request,<a name="line.459"></a>
-<span class="sourceLineNo">460</span>   * &lt;tt&gt;Accept&lt;/tt&gt; must be supplied<a name="line.460"></a>
-<span class="sourceLineNo">461</span>   * @return a Response object with response detail<a name="line.461"></a>
-<span class="sourceLineNo">462</span>   * @throws IOException<a name="line.462"></a>
-<span class="sourceLineNo">463</span>   */<a name="line.463"></a>
-<span class="sourceLineNo">464</span>  public Response get(String path, Header[] headers) throws IOException {<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    return get(cluster, path, headers);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>  }<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>  /**<a name="line.468"></a>
-<span class="sourceLineNo">469</span>   * Returns the response body of the HTTPResponse, if any, as an array of bytes.<a name="line.469"></a>
-<span class="sourceLineNo">470</span>   * If response body is not available or cannot be read, returns &lt;tt&gt;null&lt;/tt&gt;<a name="line.470"></a>
-<span class="sourceLineNo">471</span>   *<a name="line.471"></a>
-<span class="sourceLineNo">472</span>   * Note: This will cause the entire response body to be buffered in memory. A<a name="line.472"></a>
-<span class="sourceLineNo">473</span>   * malicious server may easily exhaust all the VM memory. It is strongly<a name="line.473"></a>
-<span class="sourceLineNo">474</span>   * recommended, to use getResponseAsStream if the content length of the response<a name="line.474"></a>
-<span class="sourceLineNo">475</span>   * is unknown or reasonably large.<a name="line.475"></a>
-<span class="sourceLineNo">476</span>   *<a name="line.476"></a>
-<span class="sourceLineNo">477</span>   * @param resp HttpResponse<a name="line.477"></a>
-<span class="sourceLineNo">478</span>   * @return The response body, null if body is empty<a name="line.478"></a>
-<span class="sourceLineNo">479</span>   * @throws IOException If an I/O (transport) problem occurs while obtaining the<a name="line.479"></a>
-<span class="sourceLineNo">480</span>   * response body.<a name="line.480"></a>
-<span class="sourceLineNo">481</span>   */<a name="line.481"></a>
-<span class="sourceLineNo">482</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value =<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      "NP_LOAD_OF_KNOWN_NULL_VALUE", justification = "null is possible return value")<a name="line.483"></a>
-<span class="sourceLineNo">484</span>  public static byte[] getResponseBody(HttpResponse resp) throws IOException {<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    if (resp.getEntity() == null) return null;<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    try (InputStream instream = resp.getEntity().getContent()) {<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      if (instream != null) {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>        long contentLength = resp.getEntity().getContentLength();<a name="line.488"></a>
-<span class="sourceLineNo">489</span>        if (contentLength &gt; Integer.MAX_VALUE) {<a name="line.489"></a>
-<span class="sourceLineNo">490</span>          //guard integer cast from overflow<a name="line.490"></a>
-<span class="sourceLineNo">491</span>          throw new IOException("Content too large to be buffered: " + contentLength +" bytes");<a name="line.491"></a>
-<span class="sourceLineNo">492</span>        }<a name="line.492"></a>
-<span class="sourceLineNo">493</span>        ByteArrayOutputStream outstream = new ByteArrayOutputStream(<a name="line.493"></a>
-<span class="sourceLineNo">494</span>            contentLength &gt; 0 ? (int) contentLength : 4*1024);<a name="line.494"></a>
-<span class="sourceLineNo">495</span>        byte[] buffer = new byte[4096];<a name="line.495"></a>
-<span class="sourceLineNo">496</span>        int len;<a name="line.496"></a>
-<span class="sourceLineNo">497</span>        while ((len = instream.read(buffer)) &gt; 0) {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>          outstream.write(buffer, 0, len);<a name="line.498"></a>
-<span class="sourceLineNo">499</span>        }<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        outstream.close();<a name="line.500"></a>
-<span class="sourceLineNo">501</span>        return outstream.toByteArray();<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      }<a name="line.502"></a>
-<span class="sourceLineNo">503</span>      return null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    }<a name="line.504"></a>
-<span class="sourceLineNo">505</span>  }<a name="line.505"></a>
-<span class="sourceLineNo">506</span><a name="line.506"></a>
-<span class="sourceLineNo">507</span>  /**<a name="line.507"></a>
-<span class="sourceLineNo">508</span>   * Send a GET request<a name="line.508"></a>
-<span class="sourceLineNo">509</span>   * @param c the cluster definition<a name="line.509"></a>
-<span class="sourceLineNo">510</span>   * @param path the path or URI<a name="line.510"></a>
-<span class="sourceLineNo">511</span>   * @param headers the HTTP headers to include in the request<a name="line.511"></a>
-<span class="sourceLineNo">512</span>   * @return a Response object with response detail<a name="line.512"></a>
-<span class="sourceLineNo">513</span>   * @throws IOException<a name="line.513"></a>
-<span class="sourceLineNo">514</span>   */<a name="line.514"></a>
-<span class="sourceLineNo">515</span>  public Response get(Cluster c, String path, Header[] headers)<a name="line.515"></a>
-<span class="sourceLineNo">516</span>      throws IOException {<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    if (httpGet != null) {<a name="line.517"></a>
-<span class="sourceLineNo">518</span>      httpGet.releaseConnection();<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    }<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    httpGet = new HttpGet(path);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    HttpResponse resp = execute(c, httpGet, headers, path);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    return new Response(resp.getStatusLine().getStatusCode(), resp.getAllHeaders(),<a name="line.522"></a>
-<span class="sourceLineNo">523</span>        resp, resp.getEntity() == null ? null : resp.getEntity().getContent());<a name="line.523"></a>
-<span class="sourceLineNo">524</span>  }<a name="line.524"></a>
-<span class="sourceLineNo">525</span><a name="line.525"></a>
-<span class="sourceLineNo">526</span>  /**<a name="line.526"></a>
-<span class="sourceLineNo">527</span>   * Send a PUT request<a name="line.527"></a>
-<span class="sourceLineNo">528</span>   * @param path the path or URI<a name="line.528"></a>
-<span class="sourceLineNo">529</span>   * @param contentType the content MIME type<a name="line.529"></a>
-<span class="sourceLineNo">530</span>   * @param content the content bytes<a name="line.530"></a>
-<span class="sourceLineNo">531</span>   * @return a Response object with response detail<a name="line.531"></a>
-<span class="sourceLineNo">532</span>   * @throws IOException<a name="line.532"></a>
-<span class="sourceLineNo">533</span>   */<a name="line.533"></a>
-<span class="sourceLineNo">534</span>  public Response put(String path, String contentType, byte[] content)<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      throws IOException {<a name="line.535"></a>
-<span class="sourceLineNo">536</span>    return put(cluster, path, contentType, content);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>  }<a name="line.537"></a>
-<span class="sourceLineNo">538</span><a name="line.538"></a>
-<span class="sourceLineNo">539</span>  /**<a name="line.539"></a>
-<span class="sourceLineNo">540</span>   * Send a PUT request<a name="line.540"></a>
-<span class="sourceLineNo">541</span>   * @param path the path or URI<a name="line.541"></a>
-<span class="sourceLineNo">542</span>   * @param contentType the content MIME type<a name="line.542"></a>
-<span class="sourceLineNo">543</span>   * @param content the content bytes<a name="line.543"></a>
-<span class="sourceLineNo">544</span>   * @param extraHdr extra Header to send<a name="line.544"></a>
-<span class="sourceLineNo">545</span>   * @return a Response object with response detail<a name="line.545"></a>
-<span class="sourceLineNo">546</span>   * @throws IOException<a name="line.546"></a>
-<span class="sourceLineNo">547</span>   */<a name="line.547"></a>
-<span class="sourceLineNo">548</span>  public Response put(String path, String contentType, byte[] content, Header extraHdr)<a name="line.548"></a>
-<span class="sourceLineNo">549</span>      throws IOException {<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    return put(cluster, path, contentType, content, extraHdr);<a name="line.550"></a>
-<span class="sourceLineNo">551</span>  }<a name="line.551"></a>
-<span class="sourceLineNo">552</span><a name="line.552"></a>
-<span class="sourceLineNo">553</span>  /**<a name="line.553"></a>
-<span class="sourceLineNo">554</span>   * Send a PUT request<a name="line.554"></a>
-<span class="sourceLineNo">555</span>   * @param cluster the cluster definition<a name="line.555"></a>
-<span class="sourceLineNo">556</span>   * @param path the path or URI<a name="line.556"></a>
-<span class="sourceLineNo">557</span>   * @param contentType the content MIME type<a name="line.557"></a>
-<span class="sourceLineNo">558</span>   * @param content the content bytes<a name="line.558"></a>
-<span class="sourceLineNo">559</span>   * @return a Response object with response detail<a name="line.559"></a>
-<span class="sourceLineNo">560</span>   * @throws IOException for error<a name="line.560"></a>
-<span class="sourceLineNo">561</span>   */<a name="line.561"></a>
-<span class="sourceLineNo">562</span>  public Response put(Cluster cluster, String path, String contentType,<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      byte[] content) throws IOException {<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    Header[] headers = new Header[1];<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    headers[0] = new BasicHeader("Content-Type", contentType);<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    return put(cluster, path, headers, content);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>  }<a name="line.567"></a>
-<span class="sourceLineNo">568</span><a name="line.568"></a>
-<span class="sourceLineNo">569</span>  /**<a name="line.569"></a>
-<span class="sourceLineNo">570</span>   * Send a PUT request<a name="line.570"></a>
-<span class="sourceLineNo">571</span>   * @param cluster the cluster definition<a name="line.571"></a>
-<span class="sourceLineNo">572</span>   * @param path the path or URI<a name="line.572"></a>
-<span class="sourceLineNo">573</span>   * @param contentType the content MIME type<a name="line.573"></a>
-<span class="sourceLineNo">574</span>   * @param content the content bytes<a name="line.574"></a>
-<span class="sourceLineNo">575</span>   * @param extraHdr additional Header to send<a name="line.575"></a>
-<span class="sourceLineNo">576</span>   * @return a Response object with response detail<a name="line.576"></a>
-<span class="sourceLineNo">577</span>   * @throws IOException for error<a name="line.577"></a>
-<span class="sourceLineNo">578</span>   */<a name="line.578"></a>
-<span class="sourceLineNo">579</span>  public Response put(Cluster cluster, String path, String contentType,<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      byte[] content, Header extraHdr) throws IOException {<a name="line.580"></a>
-<span class="sourceLineNo">581</span>    int cnt = extraHdr == null ? 1 : 2;<a name="line.581"></a>
-<span class="sourceLineNo">582</span>    Header[] headers = new Header[cnt];<a name="line.582"></a>
-<span class="sourceLineNo">583</span>    headers[0] = new BasicHeader("Content-Type", contentType);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    if (extraHdr != null) {<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      headers[1] = extraHdr;<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    }<a name="line.586"></a>
-<span class="sourceLineNo">587</span>    return put(cluster, path, headers, content);<a name="line.587"></a>
-<span class="sourceLineNo">588</span>  }<a name="line.588"></a>
-<span class="sourceLineNo">589</span><a name="line.589"></a>
-<span class="sourceLineNo">590</span>  /**<a name="line.590"></a>
-<span class="sourceLineNo">591</span>   * Send a PUT request<a name="line.591"></a>
-<span class="sourceLineNo">592</span>   * @param path the path or URI<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * @param headers the HTTP headers to include, &lt;tt&gt;Content-Type&lt;/tt&gt; must be<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   * supplied<a name="line.594"></a>
-<span class="sourceLineNo">595</span>   * @param content the content bytes<a name="line.595"></a>
-<span class="sourceLineNo">596</span>   * @return a Response object with response detail<a name="line.596"></a>
-<span class="sourceLineNo">597</span>   * @throws IOException<a name="line.597"></a>
-<span class="sourceLineNo">598</span>   */<a name="line.598"></a>
-<span class="sourceLineNo">599</span>  public Response put(String path, Header[] headers, byte[] content)<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      throws IOException {<a name="line.600"></a>
-<span class="sourceLineNo">601</span>    return put(cluster, path, headers, content);<a name="line.601"></a>
-<span class="sourceLineNo">602</span>  }<a name="line.602"></a>
-<span class="sourceLineNo">603</span><a name="line.603"></a>
-<span class="sourceLineNo">604</span>  /**<a name="line.604"></a>
-<span class="sourceLineNo">605</span>   * Send a PUT request<a name="line.605"></a>
-<span class="sourceLineNo">606</span>   * @param cluster the cluster definition<a name="line.606"></a>
-<span class="sourceLineNo">607</span>   * @param path the path or URI<a name="line.607"></a>
-<span class="sourceLineNo">608</span>   * @param headers the HTTP headers to include, &lt;tt&gt;Content-Type&lt;/tt&gt; must be<a name="line.608"></a>
-<span class="sourceLineNo">609</span>   * supplied<a name="line.609"></a>
-<span class="sourceLineNo">610</span>   * @param content the content bytes<a name="line.610"></a>
-<span class="sourceLineNo">611</span>   * @return a Response object with response detail<a name="line.611"></a>
-<span class="sourceLineNo">612</span>   * @throws IOException<a name="line.612"></a>
-<span class="sourceLineNo">613</span>   */<a name="line.613"></a>
-<span class="sourceLineNo">614</span>  public Response put(Cluster cluster, String path, Header[] headers,<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      byte[] content) throws IOException {<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    HttpPut method = new HttpPut(path);<a name="line.616"></a>
-<span class="sourceLineNo">617</span>    try {<a name="line.617"></a>
-<span class="sourceLineNo">618</span>      method.setEntity(new InputStreamEntity(new ByteArrayInputStream(content), content.length));<a name="line.618"></a>
-<span class="sourceLineNo">619</span>      HttpResponse resp = execute(cluster, method, headers, path);<a name="line.619"></a>
-<span class="sourceLineNo">620</span>      headers = resp.getAllHeaders();<a name="line.620"></a>
-<span class="sourceLineNo">621</span>      content = getResponseBody(resp);<a name="line.621"></a>
-<span class="sourceLineNo">622</span>      return new Response(resp.getStatusLine().getStatusCode(), headers, content);<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    } finally {<a name="line.623"></a>
-<span class="sourceLineNo">624</span>      method.releaseConnection();<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    }<a name="line.625"></a>
-<span class="sourceLineNo">626</span>  }<a name="line.626"></a>
-<span class="sourceLineNo">627</span><a name="line.627"></a>
-<span class="sourceLineNo">628</span>  /**<a name="line.628"></a>
-<span class="sourceLineNo">629</span>   * Send a POST request<a name="line.629"></a>
-<span class="sourceLineNo">630</span>   * @param path the path or URI<a name="line.630"></a>
-<span class="sourceLineNo">631</span>   * @param contentType the content MIME type<a name="line.631"></a>
-<span class="sourceLineNo">632</span>   * @param content the content bytes<a name="line.632"></a>
-<span class="sourceLineNo">633</span>   * @return a Response object with response detail<a name="line.633"></a>
-<span class="sourceLineNo">634</span>   * @throws IOException<a name="line.634"></a>
-<span class="sourceLineNo">635</span>   */<a name="line.635"></a>
-<span class="sourceLineNo">636</span>  public Response post(String path, String contentType, byte[] content)<a name="line.636"></a>
-<span class="sourceLineNo">637</span>      throws IOException {<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    return post(cluster, path, contentType, content);<a name="line.638"></a>
-<span class="sourceLineNo">639</span>  }<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>  /**<a name="line.641"></a>
-<span class="sourceLineNo">642</span>   * Send a POST request<a name="line.642"></a>
-<span class="sourceLineNo">643</span>   * @param path the path or URI<a name="line.643"></a>
-<span class="sourceLineNo">644</span>   * @param contentType the content MIME type<a name="line.644"></a>
-<span class="sourceLineNo">645</span>   * @param content the content bytes<a name="line.645"></a>
-<span class="sourceLineNo">646</span>   * @param extraHdr additional Header to send<a name="line.646"></a>
-<span class="sourceLineNo">647</span>   * @return a Response object with response detail<a name="line.647"></a>
-<span class="sourceLineNo">648</span>   * @throws IOException<a name="line.648"></a>
-<span class="sourceLineNo">649</span>   */<a name="line.649"></a>
-<span class="sourceLineNo">650</span>  public Response post(String path, String contentType, byte[] content, Header extraHdr)<a name="line.650"></a>
-<span class="sourceLineNo">651</span>      throws IOException {<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    return post(cluster, path, contentType, content, extraHdr);<a name="line.652"></a>
-<span class="sourceLineNo">653</span>  }<a name="line.653"></a>
-<span class="sourceLineNo">654</span><a name="line.654"></a>
-<span class="sourceLineNo">655</span>  /**<a name="line.655"></a>
-<span class="sourceLineNo">656</span>   * Send a POST request<a name="line.656"></a>
-<span class="sourceLineNo">657</span>   * @param cluster the cluster definition<a name="line.657"></a>
-<span class="sourceLineNo">658</span>   * @param path the path or URI<a name="line.658"></a>
-<span class="sourceLineNo">659</span>   * @param contentType the content MIME type<a name="line.659"></a>
-<span class="sourceLineNo">660</span>   * @param content the content bytes<a name="line.660"></a>
-<span class="sourceLineNo">661</span>   * @return a Response object with response detail<a name="line.661"></a>
-<span class="sourceLineNo">662</span>   * @throws IOException for error<a name="line.662"></a>
-<span class="sourceLineNo">663</span>   */<a name="line.663"></a>
-<span class="sourceLineNo">664</span>  public Response post(Cluster cluster, String path, String contentType,<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      byte[] content) throws IOException {<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    Header[] headers = new Header[1];<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    headers[0] = new BasicHeader("Content-Type", contentType);<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    return post(cluster, path, headers, content);<a name="line.668"></a>
-<span class="sourceLineNo">669</span>  }<a name="line.669"></a>
-<span class="sourceLineNo">670</span><a name="line.670"></a>
-<span class="sourceLineNo">671</span>  /**<a name="line.671"></a>
-<span class="sourceLineNo">672</span>   * Send a POST request<a name="line.672"></a>
-<span class="sourceLineNo">673</span>   * @param cluster the cluster definition<a name="line.673"></a>
-<span class="sourceLineNo">674</span>   * @param path the path or URI<a name="line.674"></a>
-<span class="sourceLineNo">675</span>   * @param contentType the content MIME type<a name="line.675"></a>
-<span class="sourceLineNo">676</span>   * @param content the content bytes<a name="line.676"></a>
-<span class="sourceLineNo">677</span>   * @param extraHdr additional Header to send<a name="line.677"></a>
-<span class="sourceLineNo">678</span>   * @return a Response object with response detail<a name="line.678"></a>
-<span class="sourceLineNo">679</span>   * @throws IOException for error<a name="line.679"></a>
-<span class="sourceLineNo">680</span>   */<a name="line.680"></a>
-<span class="sourceLineNo">681</span>  public Response post(Cluster cluster, String path, String contentType,<a name="line.681"></a>
-<span class="sourceLineNo">682</span>      byte[] content, Header extraHdr) throws IOException {<a name="line.682"></a>
-<span class="sourceLineNo">683</span>    int cnt = extraHdr == null ? 1 : 2;<a name="line.683"></a>
-<span class="sourceLineNo">684</span>    Header[] headers = new Header[cnt];<a name="line.684"></a>
-<span class="sourceLineNo">685</span>    headers[0] = new BasicHeader("Content-Type", contentType);<a name="line.685"></a>
-<span class="sourceLineNo">686</span>    if (extraHdr != null) {<a name="line.686"></a>
-<span class="sourceLineNo">687</span>      headers[1] = extraHdr;<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    }<a name="line.688"></a>
-<span class="sourceLineNo">689</span>    return post(cluster, path, headers, content);<a name="line.689"></a>
-<span class="sourceLineNo">690</span>  }<a name="line.690"></a>
-<span class="sourceLineNo">691</span><a name="line.691"></a>
-<span class="sourceLineNo">692</span>  /**<a name="line.692"></a>
-<span class="sourceLineNo">693</span>   * Send a POST request<a name="line.693"></a>
-<span class="sourceLineNo">694</span>   * @param path the path or URI<a name="line.694"></a>
-<span class="sourceLineNo">695</span>   * @param headers the HTTP headers to include, &lt;tt&gt;Content-Type&lt;/tt&gt; must be<a name="line.695"></a>
-<span class="sourceLineNo">696</span>   * supplied<a name="line.696"></a>
-<span class="sourceLineNo">697</span>   * @param content the content bytes<a name="line.697"></a>
-<span class="sourceLineNo">698</span>   * @return a Response object with response detail<a name="line.698"></a>
-<span class="sourceLineNo">699</span>   * @throws IOException<a name="line.699"></a>
-<span class="sourceLineNo">700</span>   */<a name="line.700"></a>
-<span class="sourceLineNo">701</span>  public Response post(String path, Header[] headers, byte[] content)<a name="line.701"></a>
-<span class="sourceLineNo">702</span>      throws IOException {<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    return post(cluster, path, headers, content);<a name="line.703"></a>
-<span class="sourceLineNo">704</span>  }<a name="line.704"></a>
-<span class="sourceLineNo">705</span><a name="line.705"></a>
-<span class="sourceLineNo">706</span>  /**<a name="line.706"></a>
-<span class="sourceLineNo">707</span>   * Send a POST request<a name="line.707"></a>
-<span class="sourceLineNo">708</span>   * @param cluster the cluster definition<a name="line.708"></a>
-<span class="sourceLineNo">709</span>   * @param path the path or URI<a name="line.709"></a>
-<span class="sourceLineNo">710</span>   * @param headers the HTTP headers to include, &lt;tt&gt;Content-Type&lt;/tt&gt; must be<a name="line.710"></a>
-<span class="sourceLineNo">711</span>   * supplied<a name="line.711"></a>
-<span class="sourceLineNo">712</span>   * @param content the content bytes<a name="line.712"></a>
-<span class="sourceLineNo">713</span>   * @return a Response object with response detail<a name="line.713"></a>
-<span class="sourceLineNo">714</span>   * @throws IOException<a name="line.714"></a>
-<span class="sourceLineNo">715</span>   */<a name="line.715"></a>
-<span class="sourceLineNo">716</span>  public Response post(Cluster cluster, String path, Header[] headers,<a name="line.716"></a>
-<span class="sourceLineNo">717</span>      byte[] content) throws IOException {<a name="line.717"></a>
-<span class="sourceLineNo">718</span>    HttpPost method = new HttpPost(path);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>    try {<a name="line.719"></a>
-<span class="sourceLineNo">720</span>      method.setEntity(new InputStreamEntity(new ByteArrayInputStream(content), content.length));<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      HttpResponse resp = execute(cluster, method, headers, path);<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      headers = resp.getAllHeaders();<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      content = getResponseBody(resp);<a name="line.723"></a>
-<span class="sourceLineNo">724</span>      return new Response(resp.getStatusLine().getStatusCode(), headers, content);<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    } finally {<a name="line.725"></a>
-<span class="sourceLineNo">726</span>      method.releaseConnection();<a name="line.726"></a>
-<span class="sourceLineNo">727</span>    }<a name="line.727"></a>
-<span class="sourceLineNo">728</span>  }<a name="line.728"></a>
-<span class="sourceLineNo">729</span><a name="line.729"></a>
-<span class="sourceLineNo">730</span>  /**<a name="line.730"></a>
-<span class="sourceLineNo">731</span>   * Send a DELETE request<a name="line.731"></a>
-<span class="sourceLineNo">732</span>   * @param path the path or URI<a name="line.732"></a>
-<span class="sourceLineNo">733</span>   * @return a Response object with response detail<a name="line.733"></a>
-<span class="sourceLineNo">734</span>   * @throws IOException<a name="line.734"></a>
-<span class="sourceLineNo">735</span>   */<a name="line.735"></a>
-<span class="sourceLineNo">736</span>  public Response delete(String path) throws IOException {<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    return delete(cluster, path);<a name="line.737"></a>
-<span class="sourceLineNo">738</span>  }<a name="line.738"></a>
-<span class="sourceLineNo">739</span><a name="line.739"></a>
-<span class="sourceLineNo">740</span>  /**<a name="line.740"></a>
-<span class="sourceLineNo">741</span>   * Send a DELETE request<a name="line.741"></a>
-<span class="sourceLineNo">742</span>   * @param path the path or URI<a name="line.742"></a>
-<span class="sourceLineNo">743</span>   * @param extraHdr additional Header to send<a name="line.743"></a>
-<span class="sourceLineNo">744</span>   * @return a Response object with response detail<a name="line.744"></a>
-<span class="sourceLineNo">745</span>   * @throws IOException<a name="line.745"></a>
-<span class="sourceLineNo">746</span>   */<a name="line.746"></a>
-<span class="sourceLineNo">747</span>  public Response delete(String path, Header extraHdr) throws IOException {<a name="line.747"></a>
-<span class="sourceLineNo">748</span>    return delete(cluster, path, extraHdr);<a name="line.748"></a>
-<span class="sourceLineNo">749</span>  }<a name="line.749"></a>
-<span class="sourceLineNo">750</span><a name="line.750"></a>
-<span class="sourceLineNo">751</span>  /**<a name="line.751"></a>
-<span class="sourceLineNo">752</span>   * Send a DELETE request<a name="line.752"></a>
-<span class="sourceLineNo">753</span>   * @param cluster the cluster definition<a name="line.753"></a>
-<span class="sourceLineNo">754</span>   * @param path the path or URI<a name="line.754"></a>
-<span class="sourceLineNo">755</span>   * @return a Response object with response detail<a name="line.755"></a>
-<span class="sourceLineNo">756</span>   * @throws IOException for error<a name="line.756"></a>
-<span class="sourceLineNo">757</span>   */<a name="line.757"></a>
-<span class="sourceLineNo">758</span>  public Response delete(Cluster cluster, String path) throws IOException {<a name="line.758"></a>
-<span class="sourceLineNo">759</span>    HttpDelete method = new HttpDelete(path);<a name="line.759"></a>
-<span class="sourceLineNo">760</span>    try {<a name="line.760"></a>
-<span class="sourceLineNo">761</span>      HttpResponse resp = execute(cluster, method, null, path);<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      Header[] headers = resp.getAllHeaders();<a name="line.762"></a>
-<span class="sourceLineNo">763</span>      byte[] content = getResponseBody(resp);<a name="line.763"></a>
-<span class="sourceLineNo">764</span>      return new Response(resp.getStatusLine().getStatusCode(), headers, content);<a name="line.764"></a>
-<span class="sourceLineNo">765</span>    } finally {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      method.releaseConnection();<a name="line.766"></a>
-<span class="sourceLineNo">767</span>    }<a name="line.767"></a>
-<span class="sourceLineNo">768</span>  }<a name="line.768"></a>
-<span class="sourceLineNo">769</span><a name="line.769"></a>
-<span class="sourceLineNo">770</span>  /**<a name="line.770"></a>
-<span class="sourceLineNo">771</span>   * Send a DELETE request<a name="line.771"></a>
-<span class="sourceLineNo">772</span>   * @param cluster the cluster definition<a name="line.772"></a>
-<span class="sourceLineNo">773</span>   * @param path the path or URI<a name="line.773"></a>
-<span class="sourceLineNo">774</span>   * @return a Response object with response detail<a name="line.774"></a>
-<span class="sourceLineNo">775</span>   * @throws IOException for error<a name="line.775"></a>
-<span class="sourceLineNo">776</span>   */<a name="line.776"></a>
-<span class="sourceLineNo">777</span>  public Response delete(Cluster cluster, String path, Header extraHdr) throws IOException {<a name="line.777"></a>
-<span class="sourceLineNo">778</span>    HttpDelete method = new HttpDelete(path);<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    try {<a name="line.779"></a>
-<span class="sourceLineNo">780</span>      Header[] headers = { extraHdr };<a name="line.780"></a>
-<span class="sourceLineNo">781</span>      HttpResponse resp = execute(cluster, method, headers, path);<a name="line.781"></a>
-<span class="sourceLineNo">782</span>      headers = resp.getAllHeaders();<a name="line.782"></a>
-<span class="sourceLineNo">783</span>      byte[] content = getResponseBody(resp);<a name="line.783"></a>
-<span class="sourceLineNo">784</span>      return new Response(resp.getStatusLine().getStatusCode(), headers, content);<a name="line.784"></a>
-<span class="sourceLineNo">785</span>    } finally {<a name="line.785"></a>
-<span class="sourceLineNo">786</span>      method.releaseConnection();<a name="line.786"></a>
-<span class="sourceLineNo">787</span>    }<a name="line.787"></a>
-<span class="sourceLineNo">788</span>  }<a name="line.788"></a>
-<span class="sourceLineNo">789</span><a name="line.789"></a>
-<span class="sourceLineNo">790</span><a name="line.790"></a>
-<span class="sourceLineNo">791</span>  public static class ClientTrustStoreInitializationException extends RuntimeException {<a name="line.791"></a>
-<span class="sourceLineNo">792</span><a name="line.792"></a>
-<span class="sourceLineNo">793</span>    public ClientTrustStoreInitializationException(String message, Throwable cause) {<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      super(message, cause);<a name="line.794"></a>
-<span class="sourceLineNo">795</span>    }<a name="line.795"></a>
-<span class="sourceLineNo">796</span>  }<a name="line.796"></a>
-<span class="sourceLineNo">797</span>}<a name="line.797"></a>
+<span class="sourceLineNo">083</span>  private Map&lt;String, String&gt; extraHeaders;<a name="line.83"></a>
+<span class="sourceLineNo">084</span><a name="line.84"></a>
+<span class="sourceLineNo">085</span>  private static final String AUTH_COOKIE = "hadoop.auth";<a name="line.85"></a>
+<span class="sourceLineNo">086</span>  private static final String AUTH_COOKIE_EQ = AUTH_COOKIE + "=";<a name="line.86"></a>
+<span class="sourceLineNo">087</span>  private static final String COOKIE = "Cookie";<a name="line.87"></a>
+<span class="sourceLineNo">088</span><a name="line.88"></a>
+<span class="sourceLineNo">089</span>  /**<a name="line.89"></a>
+<span class="sourceLineNo">090</span>   * Default Constructor<a name="line.90"></a>
+<span class="sourceLineNo">091</span>   */<a name="line.91"></a>
+<span class="sourceLineNo">092</span>  public Client() {<a name="line.92"></a>
+<span class="sourceLineNo">093</span>    this(null);<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  }<a name="line.94"></a>
+<span class="sourceLineNo">095</span><a name="line.95"></a>
+<span class="sourceLineNo">096</span>  private void initialize(Cluster cluster, boolean sslEnabled, Optional&lt;KeyStore&gt; trustStore) {<a name="line.96"></a>
+<span class="sourceLineNo">097</span>    this.cluster = cluster;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>    this.sslEnabled = sslEnabled;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    extraHeaders = new ConcurrentHashMap&lt;&gt;();<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    String clspath = System.getProperty("java.class.path");<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    LOG.debug("classpath " + clspath);<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    HttpClientBuilder httpClientBuilder = HttpClients.custom();<a name="line.102"></a>
+<span class="sourceLineNo">103</span><a name="line.103"></a>
+<span class="sourceLineNo">104</span>    RequestConfig requestConfig = RequestConfig.custom().<a name="line.104"></a>
+<span class="sourceLineNo">105</span>      setConnectTimeout(2000).build();<a name="line.105"></a>
+<span class="sourceLineNo">106</span>    httpClientBuilder.setDefaultRequestConfig(requestConfig);<a name="line.106"></a>
+<span class="sourceLineNo">107</span><a name="line.107"></a>
+<span class="sourceLineNo">108</span>    // Since HBASE-25267 we don't use the deprecated DefaultHttpClient anymore.<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    // The new http client would decompress the gzip content automatically.<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    // In order to keep the original behaviour of this public class, we disable<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    // automatic content compression.<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    httpClientBuilder.disableContentCompression();<a name="line.112"></a>
+<span class="sourceLineNo">113</span><a name="line.113"></a>
+<span class="sourceLineNo">114</span>    if(sslEnabled &amp;&amp; trustStore.isPresent()) {<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      try {<a name="line.115"></a>
+<span class="sourceLineNo">116</span>        SSLContext sslcontext =<a name="line.116"></a>
+<span class="sourceLineNo">117</span>          SSLContexts.custom().loadTrustMaterial(trustStore.get(), null).build();<a name="line.117"></a>
+<span class="sourceLineNo">118</span>        httpClientBuilder.setSSLContext(sslcontext);<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      } catch (NoSuchAlgorithmException | KeyStoreException | KeyManagementException e) {<a name="line.119"></a>
+<span class="sourceLineNo">120</span>        throw new ClientTrustStoreInitializationException("Error while processing truststore", e);<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      }<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    }<a name="line.122"></a>
+<span class="sourceLineNo">123</span><a name="line.123"></a>
+<span class="sourceLineNo">124</span>    this.httpClient = httpClientBuilder.build();<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  }<a name="line.125"></a>
+<span class="sourceLineNo">126</span><a name="line.126"></a>
+<span class="sourceLineNo">127</span>  /**<a name="line.127"></a>
+<span class="sourceLineNo">128</span>   * Constructor<a name="line.128"></a>
+<span class="sourceLineNo">129</span>   * @param cluster the cluster definition<a name="line.129"></a>
+<span class="sourceLineNo">130</span>   */<a name="line.130"></a>
+<span class="sourceLineNo">131</span>  public Client(Cluster cluster) {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    this(cluster, false);<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  }<a name="line.133"></a>
+<span class="sourceLineNo">134</span><a name="line.134"></a>
+<span class="sourceLineNo">135</span>  /**<a name="line.135"></a>
+<span class="sourceLineNo">136</span>   * Constructor<a name="line.136"></a>
+<span class="sourceLineNo">137</span>   * @param cluster the cluster definition<a name="line.137"></a>
+<span class="sourceLineNo">138</span>   * @param sslEnabled enable SSL or not<a name="line.138"></a>
+<span class="sourceLineNo">139</span>   */<a name="line.139"></a>
+<span class="sourceLineNo">140</span>  public Client(Cluster cluster, boolean sslEnabled) {<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    initialize(cluster, sslEnabled, Optional.empty());<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  }<a name="line.142"></a>
+<span class="sourceLineNo">143</span><a name="line.143"></a>
+<span class="sourceLineNo">144</span>  /**<a name="line.144"></a>
+<span class="sourceLineNo">145</span>   * Constructor, allowing to define custom trust store (only for SSL connections)<a name="line.145"></a>
+<span class="sourceLineNo">146</span>   *<a name="line.146"></a>
+<span class="sourceLineNo">147</span>   * @param cluster the cluster definition<a name="line.147"></a>
+<span class="sourceLineNo">148</span>   * @param trustStorePath custom trust store to use for SSL connections<a name="line.148"></a>
+<span class="sourceLineNo">149</span>   * @param trustStorePassword password to use for custom trust store<a name="line.149"></a>
+<span class="sourceLineNo">150</span>   * @param trustStoreType type of custom trust store<a name="line.150"></a>
+<span class="sourceLineNo">151</span>   *<a name="line.151"></a>
+<span class="sourceLineNo">152</span>   * @throws ClientTrustStoreInitializationException if the trust store file can not be loaded<a name="line.152"></a>
+<span class="sourceLineNo">153</span>   */<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  public Client(Cluster cluster, String trustStorePath,<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    Optional&lt;String&gt; trustStorePassword, Optional&lt;String&gt; trustStoreType) {<a name="line.155"></a>
+<span class="sourceLineNo">156</span><a name="line.156"></a>
+<span class="sourceLineNo">157</span>    char[] password = trustStorePassword.map(String::toCharArray).orElse(null);<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    String type = trustStoreType.orElse(KeyStore.getDefaultType());<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>    KeyStore trustStore;<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    try {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>      trustStore = KeyStore.getInstance(type);<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    } catch (KeyStoreException e) {<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      throw new ClientTrustStoreInitializationException("Invalid trust store type: " + type, e);<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    }<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    try (InputStream inputStream =<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      new BufferedInputStream(Files.newInputStream(new File(trustStorePath).toPath()))) {<a name="line.167"></a>
+<span class="sourceLineNo">168</span>      trustStore.load(inputStream, password);<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    } catch (CertificateException | NoSuchAlgorithmException | IOException e) {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>      throw new ClientTrustStoreInitializationException("Trust store load error: " + trustStorePath,<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        e);<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    }<a name="line.172"></a>
+<span class="sourceLineNo">173</span><a name="line.173"></a>
+<span class="sourceLineNo">174</span>    initialize(cluster, true, Optional.of(trustStore));<a name="line.174"></a>
+<span class="sourceLineNo">175</span>  }<a name="line.175"></a>
+<span class="sourceLineNo">176</span><a name="line.176"></a>
+<span class="sourceLineNo">177</span>  /**<a name="line.177"></a>
+<span class="sourceLineNo">178</span>   * Shut down the client. Close any open persistent connections.<a name="line.178"></a>
+<span class="sourceLineNo">179</span>   */<a name="line.179"></a>
+<span class="sourceLineNo">180</span>  public void shutdown() {<a name="line.180"></a>
+<span class="sourceLineNo">181</span>  }<a name="line.181"></a>
+<span class="sourceLineNo">182</span><a name="line.182"></a>
+<span class="sourceLineNo">183</span>  /**<a name="line.183"></a>
+<span class="sourceLineNo">184</span>   * @return the wrapped HttpClient<a name="line.184"></a>
+<span class="sourceLineNo">185</span>   */<a name="line.185"></a>
+<span class="sourceLineNo">186</span>  public HttpClient getHttpClient() {<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    return httpClient;<a name="line.187"></a>
+<span class="sourceLineNo">188</span>  }<a name="line.188"></a>
+<span class="sourceLineNo">189</span><a name="line.189"></a>
+<span class="sourceLineNo">190</span>  /**<a name="line.190"></a>
+<span class="sourceLineNo">191</span>   * Add extra headers.  These extra headers will be applied to all http<a name="line.191"></a>
+<span class="sourceLineNo">192</span>   * methods before they are removed. If any header is not used any more,<a name="line.192"></a>
+<span class="sourceLineNo">193</span>   * client needs to remove it explicitly.<a name="line.193"></a>
+<span class="sourceLineNo">194</span>   */<a name="line.194"></a>
+<span class="sourceLineNo">195</span>  public void addExtraHeader(final String name, final String value) {<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    extraHeaders.put(name, value);<a name="line.196"></a>
+<span class="sourceLineNo">197</span>  }<a name="line.197"></a>
+<span class="sourceLineNo">198</span><a name="line.198"></a>
+<span class="sourceLineNo">199</span>  /**<a name="line.199"></a>
+<span class="sourceLineNo">200</span>   * Get an extra header value.<a name="line.200"></a>
+<span class="sourceLineNo">201</span>   */<a name="line.201"></a>
+<span class="sourceLineNo">202</span>  public String getExtraHeader(final String name) {<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    return extraHeaders.get(name);<a name="line.203"></a>
+<span class="sourceLineNo">204</span>  }<a name="line.204"></a>
+<span class="sourceLineNo">205</span><a name="line.205"></a>
+<span class="sourceLineNo">206</span>  /**<a name="line.206"></a>
+<span class="sourceLineNo">207</span>   * Get all extra headers (read-only).<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   */<a name="line.208"></a>
+<span class="sourceLineNo">209</span>  public Map&lt;String, String&gt; getExtraHeaders() {<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    return Collections.unmodifiableMap(extraHeaders);<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  }<a name="line.211"></a>
+<span class="sourceLineNo">212</span><a name="line.212"></a>
+<span class="sourceLineNo">213</span>  /**<a name="line.213"></a>
+<span class="sourceLineNo">214</span>   * Remove an extra header.<a name="line.214"></a>
+<span class="sourceLineNo">215</span>   */<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  public void removeExtraHeader(final String name) {<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    extraHeaders.remove(name);<a name="line.217"></a>
+<span class="sourceLineNo">218</span>  }<a name="line.218"></a>
+<span class="sourceLineNo">219</span><a name="line.219"></a>
+<span class="sourceLineNo">220</span>  /**<a name="line.220"></a>
+<span class="sourceLineNo">221</span>   * Execute a transaction method given only the path. Will select at random<a name="line.221"></a>
+<span class="sourceLineNo">222</span>   * one of the members of the supplied cluster definition and iterate through<a name="line.222"></a>
+<span class="sourceLineNo">223</span>   * the list until a transaction can be successfully completed. The<a name="line.223"></a>
+<span class="sourceLineNo">224</span>   * definition of success here is a complete HTTP transaction, irrespective<a name="line.224"></a>
+<span class="sourceLineNo">225</span>   * of result code.<a name="line.225"></a>
+<span class="sourceLineNo">226</span>   * @param cluster the cluster definition<a name="line.226"></a>
+<span class="sourceLineNo">227</span>   * @param method the transaction method<a name="line.227"></a>
+<span class="sourceLineNo">228</span>   * @param headers HTTP header values to send<a name="line.228"></a>
+<span class="sourceLineNo">229</span>   * @param path the properly urlencoded path<a name="line.229"></a>
+<span class="sourceLineNo">230</span>   * @return the HTTP response code<a name="line.230"></a>
+<span class="sourceLineNo">231</span>   * @throws IOException<a name="line.231"></a>
+<span class="sourceLineNo">232</span>   */<a name="line.232"></a>
+<span class="sourceLineNo">233</span>  public HttpResponse executePathOnly(Cluster cluster, HttpUriRequest method,<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      Header[] headers, String path) throws IOException {<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    IOException lastException;<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    if (cluster.nodes.size() &lt; 1) {<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      throw new IOException("Cluster is empty");<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    }<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    int start = (int)Math.round((cluster.nodes.size() - 1) * Math.random());<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    int i = start;<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    do {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      cluster.lastHost = cluster.nodes.get(i);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      try {<a name="line.243"></a>
+<span class="sourceLineNo">244</span>        StringBuilder sb = new StringBuilder();<a name="line.244"></a>
+<span class="sourceLineNo">245</span>        if (sslEnabled) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>          sb.append("https://");<a name="line.246"></a>
+<span class="sourceLineNo">247</span>        } else {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>          sb.append("http://");<a name="line.248"></a>
+<span class="sourceLineNo">249</span>        }<a name="line.249"></a>
+<span class="sourceLineNo">250</span>        sb.append(cluster.lastHost);<a name="line.250"></a>
+<span class="sourceLineNo">251</span>        sb.append(path);<a name="line.251"></a>
+<span class="sourceLineNo">252</span>        URI uri = new URI(sb.toString());<a name="line.252"></a>
+<span class="sourceLineNo">253</span>        if (method instanceof HttpPut) {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>          HttpPut put = new HttpPut(uri);<a name="line.254"></a>
+<span class="sourceLineNo">255</span>          put.setEntity(((HttpPut) method).getEntity());<a name="line.255"></a>
+<span class="sourceLineNo">256</span>          put.setHeaders(method.getAllHeaders());<a name="line.256"></a>
+<span class="sourceLineNo">257</span>          method = put;<a name="line.257"></a>
+<span class="sourceLineNo">258</span>        } else if (method instanceof HttpGet) {<a name="line.258"></a>
+<span class="sourceLineNo">259</span>          method = new HttpGet(uri);<a name="line.259"></a>
+<span class="sourceLineNo">260</span>        } else if (method instanceof HttpHead) {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>          method = new HttpHead(uri);<a name="line.261"></a>
+<span class="sourceLineNo">262</span>        } else if (method instanceof HttpDelete) {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>          method = new HttpDelete(uri);<a name="line.263"></a>
+<span class="sourceLineNo">264</span>        } else if (method instanceof HttpPost) {<a name="line.264"></a>
+<span class="sourceLineNo">265</span>          HttpPost post = new HttpPost(uri);<a name="line.265"></a>
+<span class="sourceLineNo">266</span>          post.setEntity(((HttpPost) method).getEntity());<a name="line.266"></a>
+<span class="sourceLineNo">267</span>          post.setHeaders(method.getAllHeaders());<a name="line.267"></a>
+<span class="sourceLineNo">268</span>          method = post;<a name="line.268"></a>
+<span class="sourceLineNo">269</span>        }<a name="line.269"></a>
+<span class="sourceLineNo">270</span>        return executeURI(method, headers, uri.toString());<a name="line.270"></a>
+<span class="sourceLineNo">271</span>      } catch (IOException e) {<a name="line.271"></a>
+<span class="sourceLineNo">272</span>        lastException = e;<a name="line.272"></a>
+<span class="sourceLineNo">273</span>      } catch (URISyntaxException use) {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>        lastException = new IOException(use);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>      }<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    } while (++i != start &amp;&amp; i &lt; cluster.nodes.size());<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    throw lastException;<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  }<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>  /**<a name="line.280"></a>
+<span class="sourceLineNo">281</span>   * Execute a transaction method given a complete URI.<a name="line.281"></a>
+<span class="sourceLineNo">282</span>   * @param method the transaction method<a name="line.282"></a>
+<span class="sourceLineNo">283</span>   * @param headers HTTP header values to send<a name="line.283"></a>
+<span class="sourceLineNo">284</span>   * @param uri a properly urlencoded URI<a name="line.284"></a>
+<span class="sourceLineNo">285</span>   * @return the HTTP response code<a name="line.285"></a>
+<span class="sourceLineNo">286</span>   * @throws IOException<a name="line.286"></a>
+<span class="sourceLineNo">287</span>   */<a name="line.287"></a>
+<span class="sourceLineNo">288</span>  public HttpResponse executeURI(HttpUriRequest method, Header[] headers, String uri)<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      throws IOException {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    // method.setURI(new URI(uri, true));<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    for (Map.Entry&lt;String, String&gt; e: extraHeaders.entrySet()) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      method.addHeader(e.getKey(), e.getValue());<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    }<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    if (headers != null) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>      for (Header header: headers) {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>        method.addHeader(header);<a name="line.296"></a>
+<span class="sourceLineNo">297</span>      }<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    }<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    long startTime = System.currentTimeMillis();<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    if (resp != null) EntityUtils.consumeQuietly(resp.getEntity());<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    resp = httpClient.execute(method);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    if (resp.getStatusLine().getStatusCode() == HttpStatus.SC_UNAUTHORIZED) {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>      // Authentication error<a name="line.303"></a>
+<span class="sourceLineNo">304</span>      LOG.debug("Performing negotiation with the server.");<a name="line.304"></a>
+<span class="sourceLineNo">305</span>      negotiate(method, uri);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>      resp = httpClient.execute(method);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    }<a name="line.307"></a>
+<span class="sourceLineNo">308</span><a name="line.308"></a>
+<span class="sourceLineNo">309</span>    long endTime = System.currentTimeMillis();<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    if (LOG.isTraceEnabled()) {<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      LOG.trace(method.getMethod() + " " + uri + " " + resp.getStatusLine().getStatusCode() + " " +<a name="line.311"></a>
+<span class="sourceLineNo">312</span>          resp.getStatusLine().getReasonPhrase() + " in " + (endTime - startTime) + " ms");<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    }<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    return resp;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>  }<a name="line.315"></a>
+<span class="sourceLineNo">316</span><a name="line.316"></a>
+<span class="sourceLineNo">317</span>  /**<a name="line.317"></a>
+<span class="sourceLineNo">318</span>   * Execute a transaction method. Will call either &lt;tt&gt;executePathOnly&lt;/tt&gt;<a name="line.318"></a>
+<span class="sourceLineNo">319</span>   * or &lt;tt&gt;executeURI&lt;/tt&gt; depending on whether a path only is supplied in<a name="line.319"></a>
+<span class="sourceLineNo">320</span>   * 'path', or if a complete URI is passed instead, respectively.<a name="line.320"></a>
+<span class="sourceLineNo">321</span>   * @param cluster the cluster definition<a name="line.321"></a>
+<span class="sourceLineNo">322</span>   * @param method the HTTP method<a name="line.322"></a>
+<span class="sourceLineNo">323</span>   * @param headers HTTP header values to send<a name="line.323"></a>
+<span class="sourceLineNo">324</span>   * @param path the properly urlencoded path or URI<a name="line.324"></a>
+<span class="sourceLineNo">325</span>   * @return the HTTP response code<a name="line.325"></a>
+<span class="sourceLineNo">326</span>   * @throws IOException<a name="line.326"></a>
+<span class="sourceLineNo">327</span>   */<a name="line.327"></a>
+<span class="sourceLineNo">328</span>  public HttpResponse execute(Cluster cluster, HttpUriRequest method, Header[] headers,<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      String path) throws IOException {<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    if (path.startsWith("/")) {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      return executePathOnly(cluster, method, headers, path);<a name="line.331"></a>
+<span class="sourceLineNo">332</span>    }<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    return executeURI(method, headers, path);<a name="line.333"></a>
+<span class="sourceLineNo">334</span>  }<a name="line.334"></a>
+<span class="sourceLineNo">335</span><a name="line.335"></a>
+<span class="sourceLineNo">336</span>  /**<a name="line.336"></a>
+<span class="sourceLineNo">337</span>   * Initiate client side Kerberos negotiation with the server.<a name="line.337"></a>
+<span class="sourceLineNo">338</span>   * @param method method to inject the authentication token into.<a name="line.338"></a>
+<span class="sourceLineNo">339</span>   * @param uri the String to parse as a URL.<a name="line.339"></a>
+<span class="sourceLineNo">340</span>   * @throws IOException if unknown protocol is found.<a name="line.340"></a>
+<span class="sourceLineNo">341</span>   */<a name="line.341"></a>
+<span class="sourceLineNo">342</span>  private void negotiate(HttpUriRequest method, String uri) throws IOException {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    try {<a name="line.343"></a>
+<span class="sourceLineNo">344</span>      AuthenticatedURL.Token token = new AuthenticatedURL.Token();<a name="line.344"></a>
+<span class="sourceLineNo">345</span>      KerberosAuthenticator authenticator = new KerberosAuthenticator();<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      authenticator.authenticate(new URL(uri), token);<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      // Inject the obtained negotiated token in the method cookie<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      injectToken(method, token);<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    } catch (AuthenticationException e) {<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      LOG.error("Failed to negotiate with the server.", e);<a name="line.350"></a>
+<span class="sourceLineNo">351</span>      throw new IOException(e);<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    }<a name="line.352"></a>
+<span class="sourceLineNo">353</span>  }<a name="line.353"></a>
+<span class="sourceLineNo">354</span><a name="line.354"></a>
+<span class="sourceLineNo">355</span>  /**<a name="line.355"></a>
+<span class="sourceLineNo">356</span>   * Helper method that injects an authentication token to send with the method.<a name="line.356"></a>
+<span class="sourceLineNo">357</span>   * @param method method to inject the authentication token into.<a name="line.357"></a>
+<span class="sourceLineNo">358</span>   * @param token authentication token to inject.<a name="line.358"></a>
+<span class="sourceLineNo">359</span>   */<a name="line.359"></a>
+<span class="sourceLineNo">360</span>  private void injectToken(HttpUriRequest method, AuthenticatedURL.Token token) {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    String t = token.toString();<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    if (t != null) {<a name="line.362"></a>
+<span class="sourceLineNo">363</span>      if (!t.startsWith("\"")) {<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        t = "\"" + t + "\"";<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      }<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      method.addHeader(COOKIE, AUTH_COOKIE_EQ + t);<a name="line.366"></a>
+<span class="sourceLineNo">367</span>    }<a name="line.367"></a>
+<span class="sourceLineNo">368</span>  }<a name="line.368"></a>
+<span class="sourceLineNo">369</span><a name="line.369"></a>
+<span class="sourceLineNo">370</span>  /**<a name="line.370"></a>
+<span class="sourceLineNo">371</span>   * @return the cluster definition<a name="line.371"></a>
+<span class="sourceLineNo">372</span>   */<a name="line.372"></a>
+<span class="sourceLineNo">373</span>  public Cluster getCluster() {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>    return cluster;<a name="line.374"></a>
+<span class="sourceLineNo">375</span>  }<a name="line.375"></a>
+<span class="sourceLineNo">376</span><a name="line.376"></a>
+<span class="sourceLineNo">377</span>  /**<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   * @param cluster the cluster definition<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   */<a name="line.379"></a>
+<span class="sourceLineNo">380</span>  public void setCluster(Cluster cluster) {<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    this.cluster = cluster;<a name="line.381"></a>
+<span class="sourceLineNo">382</span>  }<a name="line.382"></a>
+<span class="sourceLineNo">383</span><a name="line.383"></a>
+<span class="sourceLineNo">384</span>  /**<a name="line.384"></a>
+<span class="sourceLineNo">385</span>   * Send a HEAD request<a name="line.385"></a>
+<span class="sourceLineNo">386</span>   * @param path the path or URI<a name="line.386"></a>
+<span class="sourceLineNo">387</span>   * @return a Response object with response detail<a name="line.387"></a>
+<span class="sourceLineNo">388</span>   * @throws IOException<a name="line.388"></a>
+<span class="sourceLineNo">389</span>   */<a name="line.389"></a>
+<span class="sourceLineNo">390</span>  public Response head(String path) throws IOException {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    return head(cluster, path, null);<a name="line.391"></a>
+<span class="sourceLineNo">392</span>  }<a name="line.392"></a>
+<span class="sourceLineNo">393</span><a name="line.393"></a>
+<span class="sourceLineNo">394</span>  /**<a name="line.394"></a>
+<span class="sourceLineNo">395</span>   * Send a HEAD request<a name="line.395"></a>
+<span class="sourceLineNo">396</span>   * @param cluster the cluster definition<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   * @param path the path or URI<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   * @param headers the HTTP headers to include in the request<a name="line.398"></a>
+<span class="sourceLineNo">399</span>   * @return a Response object with response detail<a name="line.399"></a>
+<span class="sourceLineNo">400</span>   * @throws IOException<a name="line.400"></a>
+<span class="sourceLineNo">401</span>   */<a name="line.401"></a>
+<span class="sourceLineNo">402</span>  public Response head(Cluster cluster, String path, Header[] headers)<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      throws IOException {<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    HttpHead method = new HttpHead(path);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    try {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      HttpResponse resp = execute(cluster, method, null, path);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      return new Response(resp.getStatusLine().getStatusCode(), resp.getAllHeaders(), null);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    } finally {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>      method.releaseConnection();<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    }<a name="line.410"></a>
+<span class="sourceLineNo">411</span>  }<a name="line.411"></a>
+<span class="sourceLineNo">412</span><a name="line.412"></a>
+<span class="sourceLineNo">413</span>  /**<a name="line.413"></a>
+<span class="sourceLineNo">414</span>   * Send a GET request<a name="line.414"></a>
+<span class="sourceLineNo">415</span>   * @param path the path or URI<a name="line.415"></a>
+<span class="sourceLineNo">416</span>   * @return a Response object with response detail<a name="line.416"></a>
+<span class="sourceLineNo">417</span>   * @throws IOException<a name="line.417"></a>
+<span class="sourceLineNo">418</span>   */<a name="line.418"></a>
+<span class="sourceLineNo">419</span>  public Response get(String path) throws IOException {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    return get(cluster, path);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>  }<a name="line.421"></a>
+<span class="sourceLineNo">422</span><a name="line.422"></a>
+<span class="sourceLineNo">423</span>  /**<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   * Send a GET request<a name="line.424"></a>
+<span class="sourceLineNo">425</span>   * @param cluster the cluster definition<a name="line.425"></a>
+<span class="sourceLineNo">426</span>   * @param path the path or URI<a name="line.426"></a>
+<span class="sourceLineNo">427</span>   * @return a Response object with response detail<a name="line.427"></a>
+<span class="sourceLineNo">428</span>   * @throws IOException<a name="line.428"></a>
+<span class="sourceLineNo">429</span>   */<a name="line.429"></a>
+<span class="sourceLineNo">430</span>  public Response get(Cluster cluster, String path) throws IOException {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    return get(cluster, path, EMPTY_HEADER_ARRAY);<a name="line.431"></a>
+<span class="sourceLineNo">432</span>  }<a name="line.432"></a>
+<span class="sourceLineNo">433</span><a name="line.433"></a>
+<span class="sourceLineNo">434</span>  /**<a name="line.434"></a>
+<span class="sourceLineNo">435</span>   * Send a GET request<a name="line.435"></a>
+<span class="sourceLineNo">436</span>   * @param path the path or URI<a name="line.436"></a>
+<span class="sourceLineNo">437</span>   * @param accept Accept header value<a name="line.437"></a>
+<span class="sourceLineNo">438</span>   * @return a Response object with response detail<a name="line.438"></a>
+<span class="sourceLineNo">439</span>   * @throws IOException<a name="line.439"></a>
+<span class="sourceLineNo">440</span>   */<a name="line.440"></a>
+<span class="sourceLineNo">441</span>  public Response get(String path, String accept) throws IOException {<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    return get(cluster, path, accept);<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  }<a name="line.443"></a>
+<span class="sourceLineNo">444</span><a name="line.444"></a>
+<span class="sourceLineNo">445</span>  /**<a name="line.445"></a>
+<span class="sourceLineNo">446</span>   * Send a GET request<a name="line.446"></a>
+<span class="sourceLineNo">447</span>   * @param cluster the cluster definition<a name="line.447"></a>
+<span class="sourceLineNo">448</span>   * @param path the path or URI<a name="line.448"></a>
+<span class="sourceLineNo">449</span>   * @param accept Accept header value<a name="line.449"></a>
+<span class="sourceLineNo">450</span>   * @return a Response object with response detail<a name="line.450"></a>
+<span class="sourceLineNo">451</span>   * @throws IOException<a name="line.451"></a>
+<span class="sourceLineNo">452</span>   */<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  public Response get(Cluster cluster, String path, String accept)<a name="line.453"></a>
+<span class="sourceLineNo">454</span>      throws IOException {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>    Header[] headers = new Header[1];<a name="line.455"></a>
+<span class="sourceLineNo">456</span>    headers[0] = new BasicHeader("Accept", accept);<a name="line.456"></a>
+<span class="sourceLineNo">457</span>    return get(cluster, path, headers);<a name="line.457"></a>
+<span class="sourceLineNo">458</span>  }<a name="line.458"></a>
+<span class="sourceLineNo">459</span><a name="line.459"></a>
+<span class="sourceLineNo">460</span>  /**<a name="line.460"></a>
+<span class="sourceLineNo">461</span>   * Send a GET request<a name="line.461"></a>
+<span class="sourceLineNo">462</span>   * @param path the path or URI<a name="line.462"></a>
+<span class="sourceLineNo">463</span>   * @param headers the HTTP headers to include in the request,<a name="line.463"></a>
+<span class="sourceLineNo">464</span>   * &lt;tt&gt;Accept&lt;/tt&gt; must be supplied<a name="line.464"></a>
+<span class="sourceLineNo">465</span>   * @return a Response object with response detail<a name="line.465"></a>
+<span class="sourceLineNo">466</span>   * @throws IOException<a name="line.466"></a>
+<span class="sourceLineNo">467</span>   */<a name="line.467"></a>
+<span class="sourceLineNo">468</span>  public Response get(String path, Header[] headers) throws IOException {<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    return get(cluster, path, headers);<a name="line.469"></a>
+<span class="sourceLineNo">470</span>  }<a name="line.470"></a>
+<span class="sourceLineNo">471</span><a name="line.471"></a>
+<span class="sourceLineNo">472</span>  /**<a name="line.472"></a>
+<span class="sourceLineNo">473</span>   * Returns the response body of the HTTPResponse, if any, as an array of bytes.<a name="line.473"></a>
+<span class="sourceLineNo">474</span>   * If response body is not available or cannot be read, returns &lt;tt&gt;null&lt;/tt&gt;<a name="line.474"></a>
+<span class="sourceLineNo">475</span>   *<a name="line.475"></a>
+<span class="sourceLineNo">476</span>   * Note: This will cause the entire response body to be buffered in memory. A<a name="line.476"></a>
+<span class="sourceLineNo">477</span>   * malicious server may easily exhaust all the VM memory. It is strongly<a name="line.477"></a>
+<span class="sourceLineNo">478</span>   * recommended, to use getResponseAsStream if the content length of the response<a name="line.478"></a>
+<span class="sourceLineNo">479</span>   * is unknown or reasonably large.<a name="line.479"></a>
+<span class="sourceLineNo">480</span>   *<a name="line.480"></a>
+<span class="sourceLineNo">481</span>   * @param resp HttpResponse<a name="line.481"></a>
+<span class="sourceLineNo">482</span>   * @return The response body, null if body is empty<a name="line.482"></a>
+<span class="sourceLineNo">483</span>   * @throws IOException If an I/O (transport) problem occurs while obtaining the<a name="line.483"></a>
+<span class="sourceLineNo">484</span>   * response body.<a name="line.484"></a>
+<span class="sourceLineNo">485</span>   */<a name="line.485"></a>
+<span class="sourceLineNo">486</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value =<a name="line.486"></a>
+<span class="sourceLineNo">487</span>      "NP_LOAD_OF_KNOWN_NULL_VALUE", justification = "null is possible return value")<a name="line.487"></a>
+<span class="sourceLineNo">488</span>  public static byte[] getResponseBody(HttpResponse resp) throws IOException {<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    if (resp.getEntity() == null) return null;<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    try (InputStream instream = resp.getEntity().getContent()) {<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      if (instream != null) {<a name="line.491"></a>
+<span class="sourceLineNo">492</span>        long contentLength = resp.getEntity().getContentLength();<a name="line.492"></a>
+<span class="sourceLineNo">493</span>        if (contentLength &gt; Integer.MAX_VALUE) {<a name="line.493"></a>
+<span class="sourceLineNo">494</span>          //guard integer cast from overflow<a name="line.494"></a>
+<span class="sourceLineNo">495</span>          throw new IOException("Content too large to be buffered: " + contentLength +" bytes");<a name="line.495"></a>
+<span class="sourceLineNo">496</span>        }<a name="line.496"></a>
+<span class="sourceLineNo">497</span>        ByteArrayOutputStream outstream = new ByteArrayOutputStream(<a name="line.497"></a>
+<span class="sourceLineNo">498</span>            contentLength &gt; 0 ? (int) contentLength : 4*1024);<a name="line.498"></a>
+<span class="sourceLineNo">499</span>        byte[] buffer = new byte[4096];<a name="line.499"></a>
+<span class="sourceLineNo">500</span>        int len;<a name="line.500"></a>
+<span class="sourceLineNo">501</span>        while ((len = instream.read(buffer)) &gt; 0) {<a name="line.501"></a>
+<span class="sourceLineNo">502</span>          outstream.write(buffer, 0, len);<a name="line.502"></a>
+<span class="sourceLineNo">503</span>        }<a name="line.503"></a>
+<span class="sourceLineNo">504</span>        outstream.close();<a name="line.504"></a>
+<span class="sourceLineNo">505</span>        return outstream.toByteArray();<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      }<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      return null;<a name="line.507"></a>
+<span class="sourceLineNo">508</span>    }<a name="line.508"></a>
+<span class="sourceLineNo">509</span>  }<a name="line.509"></a>
+<span class="sourceLineNo">510</span><a name="line.510"></a>
+<span class="sourceLineNo">511</span>  /**<a name="line.511"></a>
+<span class="sourceLineNo">512</span>   * Send a GET request<a name="line.512"></a>
+<span class="sourceLineNo">513</span>   * @param c the cluster definition<a name="line.513"></a>
+<span class="sourceLineNo">514</span>   * @param path the path or URI<a name="line.514"></a>
+<span class="sourceLineNo">515</span>   * @param headers the HTTP headers to include in the request<a name="line.515"></a>
+<span class="sourceLineNo">516</span>   * @return a Response object with response detail<a name="line.516"></a>
+<span class="sourceLineNo">517</span>   * @throws IOException<a name="line.517"></a>
+<span class="sourceLineNo">518</span>   */<a name="line.518"></a>
+<span class="sourceLineNo">519</span>  public Response get(Cluster c, String path, Header[] headers)<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      throws IOException {<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    if (httpGet != null) {<a name="line.521"></a>
+<span class="sourceLineNo">522</span>      httpGet.releaseConnection();<a name="line.522"></a>
+<span class="sourceLineNo">523</span>    }<a name="line.523"></a>
+<span class="sourceLineNo">524</span>    httpGet = new HttpGet(path);<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    HttpResponse resp = execute(c, httpGet, headers, path);<a name="line.525"></a>
+<span class="sourceLineNo">526</span>    return new Response(resp.getStatusLine().getStatusCode(), resp.getAllHeaders(),<a name="line.526"></a>
+<span class="sourceLineNo">527</span>        resp, resp.getEntity() == null ? null : resp.getEntity().getContent());<a name="line.527"></a>
+<span class="sourceLineNo">528</span>  }<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>  /**<a name="line.530"></a>
+<span class="sourceLineNo">531</span>   * Send a PUT request<a name="line.531"></a>
+<span class="sourceLineNo">532</span>   * @param path the path or URI<a name="line.532"></a>
+<span class="sourceLineNo">533</span>   * @param contentType the content MIME type<a name="line.533"></a>
+<span class="sourceLineNo">534</span>   * @param content the content bytes<a name="line.534"></a>
+<span class="sourceLineNo">535</span>   * @return a Response object with response detail<a name="line.535"></a>
+<span class="sourceLineNo">536</span>   * @throws IOException<a name="line.536"></a>
+<span class="sourceLineNo">537</span>   */<a name="line.537"></a>
+<span class="sourceLineNo">538</span>  public Response put(String path, String contentType, byte[] content)<a name="line.538"></a>
+<span class="sourceLineNo">539</span>      throws IOException {<a name="line.539"></a>
+<span class="sourceLineNo">540</span>    return put(cluster, path, contentType, content);<a name="line.540"></a>
+<span class="sourceLineNo">541</span>  }<a name="line.541"></a>
+<span class="sourceLineNo">542</span><a name="line.542"></a>
+<span class="sourceLineNo">543</span>  /**<a name="line.543"></a>
+<span class="sourceLineNo">544</span>   * Send a PUT request<a name="line.544"></a>
+<span class="sourceLineNo">545</span>   * @param path the path or URI<a name="line.545"></a>
+<span class="sourceLineNo">546</span>   * @param contentType the content MIME type<a name="line.546"></a>
+<span class="sourceLineNo">547</span>   * @param content the content bytes<a name="line.547"></a>
+<span class="sourceLineNo">548</span>   * @param extraHdr extra Header to send<a name="line.548"></a>
+<span class="sourceLineNo">549</span>   * @return a Response object with response detail<a name="line.549"></a>
+<span class="sourceLineNo">550</span>   * @throws IOException<a name="line.550"></a>
+<span class="sourceLineNo">551</span>   */<a name="line.551"></a>
+<span class="sourceLineNo">552</span>  public Response put(String path, String contentType, byte[] content, Header extraHdr)<a name="line.552"></a>
+<span class="sourceLineNo">553</span>      throws IOException {<a name="line.553"></a>
+<span class="sourceLineNo">554</span>    return put(cluster, path, contentType, content, extraHdr);<a name="line.554"></a>
+<span class="sourceLineNo">555</span>  }<a name="line.555"></a>
+<span class="sourceLineNo">556</span><a name="line.556"></a>
+<span class="sourceLineNo">557</span>  /**<a name="line.557"></a>
+<span class="sourceLineNo">558</span>   * Send a PUT request<a name="line.558"></a>
+<span class="sourceLineNo">559</span>   * @param cluster the cluster definition<a name="line.559"></a>
+<span class="sourceLineNo">560</span>   * @param path the path or URI<a name="line.560"></a>
+<span class="sourceLineNo">561</span>   * @param contentType the content MIME type<a name="line.561"></a>
+<span class="sourceLineNo">562</span>   * @param content the content bytes<a name="line.562"></a>
+<span class="sourceLineNo">563</span>   * @return a Response object with response detail<a name="line.563"></a>
+<span class="sourceLineNo">564</span>   * @throws IOException for error<a name="line.564"></a>
+<span class="sourceLineNo">565</span>   */<a name="line.565"></a>
+<span class="sourceLineNo">566</span>  public Response put(Cluster cluster, String path, String contentType,<a name="line.566"></a>
+<span class="sourceLineNo">567</span>      byte[] content) throws IOException {<a name="line.567"></a>
+<span class="sourceLineNo">568</span>    Header[] headers = new Header[1];<a name="line.568"></a>
+<span class="sourceLineNo">569</span>    headers[0] = new BasicHeader("Content-Type", contentType);<a name="line.569"></a>
+<span class="sourceLineNo">570</span>    return put(cluster, path, headers, content);<a name="line.570"></a>
+<span class="sourceLineNo">571</span>  }<a name="line.571"></a>
+<span class="sourceLineNo">572</span><a name="line.572"></a>
+<span class="sourceLineNo">573</span>  /**<a name="line.573"></a>
+<span class="sourceLineNo">574</span>   * Send a PUT request<a name="line.574"></a>
+<span class="sourceLineNo">575</span>   * @param cluster the cluster definition<a name="line.575"></a>
+<span class="sourceLineNo">576</span>   * @param path the path or URI<a name="line.576"></a>
+<span class="sourceLineNo">577</span>   * @param contentType the content MIME type<a name="line.577"></a>
+<span class="sourceLineNo">578</span>   * @param content the content bytes<a name="line.578"></a>
+<span class="sourceLineNo">579</span>   * @param extraHdr additional Header to send<a name="line.579"></a>
+<span class="sourceLineNo">580</span>   * @return a Response object with response detail<a name="line.580"></a>
+<span class="sourceLineNo">581</span>   * @throws IOException for error<a name="line.581"></a>
+<span class="sourceLineNo">582</span>   */<a name="line.582"></a>
+<span class="sourceLineNo">583</span>  public Response put(Cluster cluster, String path, String contentType,<a name="line.583"></a>
+<span class="sourceLineNo">584</span>      byte[] content, Header extraHdr) throws IOException {<a name="line.584"></a>
+<span class="sourceLineNo">585</span>    int cnt = extraHdr == null ? 1 : 2;<a name="line.585"></a>
+<span class="sourceLineNo">586</span>    Header[] headers = new Header[cnt];<a name="line.586"></a>
+<span class="sourceLineNo">587</span>    headers[0] = new BasicHeader("Content-Type", contentType);<a name="line.587"></a>
+<span class="sourceLineNo">588</span>    if (extraHdr != null) {<a name="line.588"></a>
+<span class="sourceLineNo">589</span>      headers[1] = extraHdr;<a name="line.589"></a>
+<span class="sourceLineNo">590</span>    }<a name="line.590"></a>
+<span class="sourceLineNo">591</span>    return put(cluster, path, headers, content);<a name="line.591"></a>
+<span class="sourceLineNo">592</span>  }<a name="line.592"></a>
+<span class="sourceLineNo">593</span><a name="line.593"></a>
+<span class="sourceLineNo">594</span>  /**<a name="line.594"></a>
+<span class="sourceLineNo">595</span>   * Send a PUT request<a name="line.595"></a>
+<span class="sourceLineNo">596</span>   * @param path the path or URI<a name="line.596"></a>
+<span class="sourceLineNo">597</span>   * @param headers the HTTP headers to include, &lt;tt&gt;Content-Type&lt;/tt&gt; must be<a name="line.597"></a>
+<span class="sourceLineNo">598</span>   * supplied<a name="line.598"></a>
+<span class="sourceLineNo">599</span>   * @param content the content bytes<a name="line.599"></a>
+<span class="sourceLineNo">600</span>   * @return a Response object with response detail<a name="line.600"></a>
+<span class="sourceLineNo">601</span>   * @throws IOException<a name="line.601"></a>
+<span class="sourceLineNo">602</span>   */<a name="line.602"></a>
+<span class="sourceLineNo">603</span>  public Response put(String path, Header[] headers, byte[] content)<a name="line.603"></a>
+<span class="sourceLineNo">604</span>      throws IOException {<a name="line.604"></a>
+<span class="sourceLineNo">605</span>    return put(cluster, path, headers, content);<a name="line.605"></a>
+<span class="sourceLineNo">606</span>  }<a name="line.606"></a>
+<span class="sourceLineNo">607</span><a name="line.607"></a>
+<span class="sourceLineNo">608</span>  /**<a name="line.608"></a>
+<span class="sourceLineNo">609</span>   * Send a PUT request<a name="line.609"></a>
+<span class="sourceLineNo">610</span>   * @param cluster the cluster definition<a name="line.610"></a>
+<span class="sourceLineNo">611</span>   * @param path the path or URI<a name="line.611"></a>
+<span class="sourceLineNo">612</span>   * @param headers the HTTP headers to include, &lt;tt&gt;Content-Type&lt;/tt&gt; must be<a name="line.612"></a>
+<span class="sourceLineNo">613</span>   * supplied<a name="line.613"></a>
+<span class="sourceLineNo">614</span>   * @param content the content bytes<a name="line.614"></a>
+<span class="sourceLineNo">615</span>   * @return a Response object with response detail<a name="line.615"></a>
+<span class="sourceLineNo">616</span>   * @throws IOException<a name="line.616"></a>
+<span class="sourceLineNo">617</span>   */<a name="line.617"></a>
+<span class="sourceLineNo">618</span>  public Response put(Cluster cluster, String path, Header[] headers,<a name="line.618"></a>
+<span class="sourceLineNo">619</span>      byte[] content) throws IOException {<a name="line.619"></a>
+<span class="sourceLineNo">620</span>    HttpPut method = new HttpPut(path);<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    try {<a name="line.621"></a>
+<span class="sourceLineNo">622</span>      method.setEntity(new InputStreamEntity(new ByteArrayInputStream(content), content.length));<a name="line.622"></a>
+<span class="sourceLineNo">623</span>      HttpResponse resp = execute(cluster, method, headers, path);<a name="line.623"></a>
+<span class="sourceLineNo">624</span>      headers = resp.getAllHeaders();<a name="line.624"></a>
+<span class="sourceLineNo">625</span>      content = getResponseBody(resp);<a name="line.625"></a>
+<span class="sourceLineNo">626</span>      return new Response(resp.getStatusLine().getStatusCode(), headers, content);<a name="line.626"></a>
+<span class="sourceLineNo">627</span>    } finally {<a name="line.627"></a>
+<span class="sourceLineNo">628</span>      method.releaseConnection();<a name="line.628"></a>
+<span class="sourceLineNo">629</span>    }<a name="line.629"></a>
+<span class="sourceLineNo">630</span>  }<a name="line.630"></a>
+<span class="sourceLineNo">631</span><a name="line.631"></a>
+<span class="sourceLineNo">632</span>  /**<a name="line.632"></a>
+<span class="sourceLineNo">633</span>   * Send a POST request<a name="line.633"></a>
+<span class="sourceLineNo">634</span>   * @param path the path or URI<a name="line.634"></a>
+<span class="sourceLineNo">635</span>   * @param contentType the content MIME type<a name="line.635"></a>
+<span class="sourceLineNo">636</span>   * @param content the content bytes<a name="line.636"></a>
+<span class="sourceLineNo">637</span>   * @return a Response object with response detail<a name="line.637"></a>
+<span class="sourceLineNo">638</span>   * @throws IOException<a name="line.638"></a>
+<span class="sourceLineNo">639</span>   */<a name="line.639"></a>
+<span class="sourceLineNo">640</span>  public Response post(String path, String contentType, byte[] content)<a name="line.640"></a>
+<span class="sourceLineNo">641</span>      throws IOException {<a name="line.641"></a>
+<span class="sourceLineNo">642</span>    return post(cluster, path, contentType, content);<a name="line.642"></a>
+<span class="sourceLineNo">643</span>  }<a name="line.643"></a>
+<span class="sourceLineNo">644</span><a name="line.644"></a>
+<span class="sourceLineNo">645</span>  /**<a name="line.645"></a>
+<span class="sourceLineNo">646</span>   * Send a POST request<a name="line.646"></a>
+<span class="sourceLineNo">647</span>   * @param path the path or URI<a name="line.647"></a>
+<span class="sourceLineNo">648</span>   * @param contentType the content MIME type<a name="line.648"></a>
+<span class="sourceLineNo">649</span>   * @param content the content bytes<a name="line.649"></a>
+<span class="sourceLineNo">650</span>   * @param extraHdr additional Header to send<a name="line.650"></a>
+<span class="sourceLineNo">651</span>   * @return a Response object with response detail<a name="line.651"></a>
+<span class="sourceLineNo">652</span>   * @throws IOException<a name="line.652"></a>
+<span class="sourceLineNo">653</span>   */<a name="line.653"></a>
+<span class="sourceLineNo">654</span>  public Response post(String path, String contentType, byte[] content, Header extraHdr)<a name="line.654"></a>
+<span class="sourceLineNo">655</span>      throws IOException {<a name="line.655"></a>
+<span class="sourceLineNo">656</span>    return post(cluster, path, contentType, content, extraHdr);<a name="line.656"></a>
+<span class="sourceLineNo">657</span>  }<a name="line.657"></a>
+<span class="sourceLineNo">658</span><a name="line.658"></a>
+<span class="sourceLineNo">659</span>  /**<a name="line.659"></a>
+<span class="sourceLineNo">660</span>   * Send a POST request<a name="line.660"></a>
+<span class="sourceLineNo">661</span>   * @param cluster the cluster definition<a name="line.661"></a>
+<span class="sourceLineNo">662</span>   * @param path the path or URI<a name="line.662"></a>
+<span class="sourceLineNo">663</span>   * @param contentType the content MIME type<a name="line.663"></a>
+<span class="sourceLineNo">664</span>   * @param content the content bytes<a name="line.664"></a>
+<span class="sourceLineNo">665</span>   * @return a Response object with response detail<a name="line.665"></a>
+<span class="sourceLineNo">666</span>   * @throws IOException for error<a name="line.666"></a>
+<span class="sourceLineNo">667</span>   */<a name="line.667"></a>
+<span class="sourceLineNo">668</span>  public Response post(Cluster cluster, String path, String contentType,<a name="line.668"></a>
+<span class="sourceLineNo">669</span>      byte[] content) throws IOException {<a name="line.669"></a>
+<span class="sourceLineNo">670</span>    Header[] headers = new Header[1];<a name="line.670"></a>
+<span class="sourceLineNo">671</span>    headers[0] = new BasicHeader("Content-Type", contentType);<a name="line.671"></a>
+<span class="sourceLineNo">672</span>    return post(cluster, path, headers, content);<a name="line.672"></a>
+<span class="sourceLineNo">673</span>  }<a name="line.673"></a>
+<span class="sourceLineNo">674</span><a name="line.674"></a>
+<span class="sourceLineNo">675</span>  /**<a name="line.675"></a>
+<span class="sourceLineNo">676</span>   * Send a POST request<a name="line.676"></a>
+<span class="sourceLineNo">677</span>   * @param cluster the cluster definition<a name="line.677"></a>
+<span class="sourceLineNo">678</span>   * @param path the path or URI<a name="line.678"></a>
+<span class="sourceLineNo">679</span>   * @param contentType the content MIME type<a name="line.679"></a>
+<span class="sourceLineNo">680</span>   * @param content the content bytes<a name="line.680"></a>
+<span class="sourceLineNo">681</span>   * @param extraHdr additional Header to send<a name="line.681"></a>
+<span class="sourceLineNo">682</span>   * @return a Response object with response detail<a name="line.682"></a>
+<span class="sourceLineNo">683</span>   * @throws IOException for error<a name="line.683"></a>
+<span class="sourceLineNo">684</span>   */<a name="line.684"></a>
+<span class="sourceLineNo">685</span>  public Response post(Cluster cluster, String path, String contentType,<a name="line.685"></a>
+<span class="sourceLineNo">686</span>      byte[] content, Header extraHdr) throws IOException {<a name="line.686"></a>
+<span class="sourceLineNo">687</span>    int cnt = extraHdr == null ? 1 : 2;<a name="line.687"></a>
+<span class="sourceLineNo">688</span>    Header[] headers = new Header[cnt];<a name="line.688"></a>
+<span class="sourceLineNo">689</span>    headers[0] = new BasicHeader("Content-Type", contentType);<a name="line.689"></a>
+<span class="sourceLineNo">690</span>    if (extraHdr != null) {<a name="line.690"></a>
+<span class="sourceLineNo">691</span>      headers[1] = extraHdr;<a name="line.691"></a>
+<span class="sourceLineNo">692</span>    }<a name="line.692"></a>
+<span class="sourceLineNo">693</span>    return post(cluster, path, headers, content);<a name="line.693"></a>
+<span class="sourceLineNo">694</span>  }<a name="line.694"></a>
+<span class="sourceLineNo">695</span><a name="line.695"></a>
+<span class="sourceLineNo">696</span>  /**<a name="line.696"></a>
+<span class="sourceLineNo">697</span>   * Send a POST request<a name="line.697"></a>
+<span class="sourceLineNo">698</span>   * @param path the path or URI<a name="line.698"></a>
+<span class="sourceLineNo">699</span>   * @param headers the HTTP headers to include, &lt;tt&gt;Content-Type&lt;/tt&gt; must be<a name="line.699"></a>
+<span class="sourceLineNo">700</span>   * supplied<a name="line.700"></a>
+<span class="sourceLineNo">701</span>   * @param content the content bytes<a name="line.701"></a>
+<span class="sourceLineNo">702</span>   * @return a Response object with response detail<a name="line.702"></a>
+<span class="sourceLineNo">703</span>   * @throws IOException<a name="line.703"></a>
+<span class="sourceLineNo">704</span>   */<a name="line.704"></a>
+<span class="sourceLineNo">705</span>  public Response post(String path, Header[] headers, byte[] content)<a name="line.705"></a>
+<span class="sourceLineNo">706</span>      throws IOException {<a name="line.706"></a>
+<span class="sourceLineNo">707</span>    return post(cluster, path, headers, content);<a name="line.707"></a>
+<span class="sourceLineNo">708</span>  }<a name="line.708"></a>
+<span class="sourceLineNo">709</span><a name="line.709"></a>
+<span class="sourceLineNo">710</span>  /**<a name="line.710"></a>
+<span class="sourceLineNo">711</span>   * Send a POST request<a name="line.711"></a>
+<span class="sourceLineNo">712</span>   * @param cluster the cluster definition<a name="line.712"></a>
+<span class="sourceLineNo">713</span>   * @param path the path or URI<a name="line.713"></a>
+<span class="sourceLineNo">714</span>   * @param headers the HTTP headers to include, &lt;tt&gt;Content-Type&lt;/tt&gt; must be<a name="line.714"></a>
+<span class="sourceLineNo">715</span>   * supplied<a name="line.715"></a>
+<span class="sourceLineNo">716</span>   * @param content the content bytes<a name="line.716"></a>
+<span class="sourceLineNo">717</span>   * @return a Response object with response detail<a name="line.717"></a>
+<span class="sourceLineNo">718</span>   * @throws IOException<a name="line.718"></a>
+<span class="sourceLineNo">719</span>   */<a name="line.719"></a>
+<span class="sourceLineNo">720</span>  public Response post(Cluster cluster, String path, Header[] headers,<a name="line.720"></a>
+<span class="sourceLineNo">721</span>      byte[] content) throws IOException {<a name="line.721"></a>
+<span class="sourceLineNo">722</span>    HttpPost method = new HttpPost(path);<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    try {<a name="line.723"></a>
+<span class="sourceLineNo">724</span>      method.setEntity(new InputStreamEntity(new ByteArrayInputStream(content), content.length));<a name="line.724"></a>
+<span class="sourceLineNo">725</span>      HttpResponse resp = execute(cluster, method, headers, path);<a name="line.725"></a>
+<span class="sourceLineNo">726</span>      headers = resp.getAllHeaders();<a name="line.726"></a>
+<span class="sourceLineNo">727</span>      content = getResponseBody(resp);<a name="line.727"></a>
+<span class="sourceLineNo">728</span>      return new Response(resp.getStatusLine().getStatusCode(), headers, content);<a name="line.728"></a>
+<span class="sourceLineNo">729</span>    } finally {<a name="line.729"></a>
+<span class="sourceLineNo">730</span>      method.releaseConnection();<a name="line.730"></a>
+<span class="sourceLineNo">731</span>    }<a name="line.731"></a>
+<span class="sourceLineNo">732</span>  }<a name="line.732"></a>
+<span class="sourceLineNo">733</span><a name="line.733"></a>
+<span class="sourceLineNo">734</span>  /**<a name="line.734"></a>
+<span class="sourceLineNo">735</span>   * Send a DELETE request<a name="line.735"></a>
+<span class="sourceLineNo">736</span>   * @param path the path or URI<a name="line.736"></a>
+<span class="sourceLineNo">737</span>   * @return a Response object with response detail<a name="line.737"></a>
+<span class="sourceLineNo">738</span>   * @throws IOException<a name="line.738"></a>
+<span class="sourceLineNo">739</span>   */<a name="line.739"></a>
+<span class="sourceLineNo">740</span>  public Response delete(String path) throws IOException {<a name="line.740"></a>
+<span class="sourceLineNo">741</span>    return delete(cluster, path);<a name="line.741"></a>
+<span class="sourceLineNo">742</span>  }<a name="line.742"></a>
+<span class="sourceLineNo">743</span><a name="line.743"></a>
+<span class="sourceLineNo">744</span>  /**<a name="line.744"></a>
+<span class="sourceLineNo">745</span>   * Send a DELETE request<a name="line.745"></a>
+<span class="sourceLineNo">746</span>   * @param path the path or URI<a name="line.746"></a>
+<span class="sourceLineNo">747</span>   * @param extraHdr additional Header to send<a name="line.747"></a>
+<span class="sourceLineNo">748</span>   * @return a Response object with response detail<a name="line.748"></a>
+<span class="sourceLineNo">749</span>   * @throws IOException<a name="line.749"></a>
+<span class="sourceLineNo">750</span>   */<a name="line.750"></a>
+<span class="sourceLineNo">751</span>  public Response delete(String path, Header extraHdr) throws IOException {<a name="line.751"></a>
+<span class="sourceLineNo">752</span>    return delete(cluster, path, extraHdr);<a name="line.752"></a>
+<span class="sourceLineNo">753</span>  }<a name="line.753"></a>
+<span class="sourceLineNo">754</span><a name="line.754"></a>
+<span class="sourceLineNo">755</span>  /**<a name="line.755"></a>
+<span class="sourceLineNo">756</span>   * Send a DELETE request<a name="line.756"></a>
+<span class="sourceLineNo">757</span>   * @param cluster the cluster definition<a name="line.757"></a>
+<span class="sourceLineNo">758</span>   * @param path the path or URI<a name="line.758"></a>
+<span class="sourceLineNo">759</span>   * @return a Response object with response detail<a name="line.759"></a>
+<span class="sourceLineNo">760</span>   * @throws IOException for error<a name="line.760"></a>
+<span class="sourceLineNo">761</span>   */<a name="line.761"></a>
+<span class="sourceLineNo">762</span>  public Response delete(Cluster cluster, String path) throws IOException {<a name="line.762"></a>
+<span class="sourceLineNo">763</span>    HttpDelete method = new HttpDelete(path);<a name="line.763"></a>
+<span class="sourceLineNo">764</span>    try {<a name="line.764"></a>
+<span class="sourceLineNo">765</span>      HttpResponse resp = execute(cluster, method, null, path);<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      Header[] headers = resp.getAllHeaders();<a name="line.766"></a>
+<span class="sourceLineNo">767</span>      byte[] content = getResponseBody(resp);<a name="line.767"></a>
+<span class="sourceLineNo">768</span>      return new Response(resp.getStatusLine().getStatusCode(), headers, content);<a name="line.768"></a>
+<span class="sourceLineNo">769</span>    } finally {<a name="line.769"></a>
+<span class="sourceLineNo">770</span>      method.releaseConnection();<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    }<a name="line.771"></a>
+<span class="sourceLineNo">772</span>  }<a name="line.772"></a>
+<span class="sourceLineNo">773</span><a name="line.773"></a>
+<span class="sourceLineNo">774</span>  /**<a name="line.774"></a>
+<span class="sourceLineNo">775</span>   * Send a DELETE request<a name="line.775"></a>
+<span class="sourceLineNo">776</span>   * @param cluster the cluster definition<a name="line.776"></a>
+<span class="sourceLineNo">777</span>   * @param path the path or URI<a name="line.777"></a>
+<span class="sourceLineNo">778</span>   * @return a Response object with response detail<a name="line.778"></a>
+<span class="sourceLineNo">779</span>   * @throws IOException for error<a name="line.779"></a>
+<span class="sourceLineNo">780</span>   */<a name="line.780"></a>
+<span class="sourceLineNo">781</span>  public Response delete(Cluster cluster, String path, Header extraHdr) throws IOException {<a name="line.781"></a>
+<span class="sourceLineNo">782</span>    HttpDelete method = new HttpDelete(path);<a name="line.782"></a>
+<span class="sourceLineNo">783</span>    try {<a name="line.783"></a>
+<span class="sourceLineNo">784</span>      Header[] headers = { extraHdr };<a name="line.784"></a>
+<span class="sourceLineNo">785</span>      HttpResponse resp = execute(cluster, method, headers, path);<a name="line.785"></a>
+<span class="sourceLineNo">786</span>      headers = resp.getAllHeaders();<a name="line.786"></a>
+<span class="sourceLineNo">787</span>      byte[] content = getResponseBody(resp);<a name="line.787"></a>
+<span class="sourceLineNo">788</span>      return new Response(resp.getStatusLine().getStatusCode(), headers, content);<a name="line.788"></a>
+<span class="sourceLineNo">789</span>    } finally {<a name="line.789"></a>
+<span class="sourceLineNo">790</span>      method.releaseConnection();<a name="line.790"></a>
+<span class="sourceLineNo">791</span>    }<a name="line.791"></a>
+<span class="sourceLineNo">792</span>  }<a name="line.792"></a>
+<span class="sourceLineNo">793</span><a name="line.793"></a>
+<span class="sourceLineNo">794</span><a name="line.794"></a>
+<span class="sourceLineNo">795</span>  public static class ClientTrustStoreInitializationException extends RuntimeException {<a name="line.795"></a>
+<span class="sourceLineNo">796</span><a name="line.796"></a>
+<span class="sourceLineNo">797</span>    public ClientTrustStoreInitializationException(String message, Throwable cause) {<a name="line.797"></a>
+<span class="sourceLineNo">798</span>      super(message, cause);<a name="line.798"></a>
+<span class="sourceLineNo">799</span>    }<a name="line.799"></a>
+<span class="sourceLineNo">800</span>  }<a name="line.800"></a>
+<span class="sourceLineNo">801</span>}<a name="line.801"></a>
 
 
 
diff --git a/book.html b/book.html
index a96cb44..c988322 100644
--- a/book.html
+++ b/book.html
@@ -46106,7 +46106,7 @@ org/apache/hadoop/hbase/security/access/AccessControlClient.revoke:(Lorg/apache/
 <div id="footer">
 <div id="footer-text">
 Version 3.0.0-SNAPSHOT<br>
-Last updated 2021-03-11 20:05:07 UTC
+Last updated 2021-03-12 20:04:56 UTC
 </div>
 </div>
 <link rel="stylesheet" href="./coderay-asciidoctor.css">
diff --git a/bulk-loads.html b/bulk-loads.html
index a3acf8c..7ccc674 100644
--- a/bulk-loads.html
+++ b/bulk-loads.html
@@ -172,7 +172,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2021
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-03-11</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2021-03-12</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/checkstyle-aggregate.html b/checkstyle-aggregate.html
index 2364b04f..45f452a 100644
--- a/checkstyle-aggregate.html
+++ b/checkstyle-aggregate.html
@@ -166,10 +166,10 @@
 <th><img src="images/icon_warning_sml.gif" alt="" />&#160;Warnings</th>
 <th><img src="images/icon_error_sml.gif" alt="" />&#160;Errors</th></tr>
 <tr class="b">
-<td>4360</td>
+<td>4362</td>
 <td>0</td>
 <td>0</td>
-<td>9176</td></tr></table></div>
+<td>9181</td></tr></table></div>
 <div class="section">
 <h2><a name="Files"></a>Files</h2>
 <table border="0" class="table table-striped">
@@ -2994,135 +2994,145 @@
 <td>0</td>
 <td>3</td></tr>
 <tr class="a">
+<td><a href="#org.apache.hadoop.hbase.mapreduce.RoundRobinTableInputFormat.java">org/apache/hadoop/hbase/mapreduce/RoundRobinTableInputFormat.java</a></td>
+<td>0</td>
+<td>0</td>
+<td>2</td></tr>
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.RowCounter.java">org/apache/hadoop/hbase/mapreduce/RowCounter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.SimpleTotalOrderPartitioner.java">org/apache/hadoop/hbase/mapreduce/SimpleTotalOrderPartitioner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.SyncTable.java">org/apache/hadoop/hbase/mapreduce/SyncTable.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TableInputFormat.java">org/apache/hadoop/hbase/mapreduce/TableInputFormat.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TableInputFormatBase.java">org/apache/hadoop/hbase/mapreduce/TableInputFormatBase.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>15</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil.java">org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>63</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TableMapper.java">org/apache/hadoop/hbase/mapreduce/TableMapper.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TableOutputCommitter.java">org/apache/hadoop/hbase/mapreduce/TableOutputCommitter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TableOutputFormat.java">org/apache/hadoop/hbase/mapreduce/TableOutputFormat.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TableRecordReader.java">org/apache/hadoop/hbase/mapreduce/TableRecordReader.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TableRecordReaderImpl.java">org/apache/hadoop/hbase/mapreduce/TableRecordReaderImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>18</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TableReducer.java">org/apache/hadoop/hbase/mapreduce/TableReducer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TableSnapshotInputFormat.java">org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormat.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TableSnapshotInputFormatImpl.java">org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormatImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestGroupingTableMapper.java">org/apache/hadoop/hbase/mapreduce/TestGroupingTableMapper.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestHBaseMRTestingUtility.java">org/apache/hadoop/hbase/mapreduce/TestHBaseMRTestingUtility.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestHFileOutputFormat2.java">org/apache/hadoop/hbase/mapreduce/TestHFileOutputFormat2.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>39</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestHRegionPartitioner.java">org/apache/hadoop/hbase/mapreduce/TestHRegionPartitioner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestImportExport.java">org/apache/hadoop/hbase/mapreduce/TestImportExport.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>39</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestImportTSVWithOperationAttributes.java">org/apache/hadoop/hbase/mapreduce/TestImportTSVWithOperationAttributes.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestImportTSVWithTTLs.java">org/apache/hadoop/hbase/mapreduce/TestImportTSVWithTTLs.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestImportTSVWithVisibilityLabels.java">org/apache/hadoop/hbase/mapreduce/TestImportTSVWithVisibilityLabels.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>27</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestImportTsv.java">org/apache/hadoop/hbase/mapreduce/TestImportTsv.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>20</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestMultiTableInputFormat.java">org/apache/hadoop/hbase/mapreduce/TestMultiTableInputFormat.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestMultiTableInputFormatBase.java">org/apache/hadoop/hbase/mapreduce/TestMultiTableInputFormatBase.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestMultithreadedTableMapper.java">org/apache/hadoop/hbase/mapreduce/TestMultithreadedTableMapper.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>12</td></tr>
+<tr class="b">
+<td><a href="#org.apache.hadoop.hbase.mapreduce.TestRoundRobinTableInputFormat.java">org/apache/hadoop/hbase/mapreduce/TestRoundRobinTableInputFormat.java</a></td>
+<td>0</td>
+<td>0</td>
+<td>1</td></tr>
 <tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestRowCounter.java">org/apache/hadoop/hbase/mapreduce/TestRowCounter.java</a></td>
 <td>0</td>
@@ -3562,7 +3572,7 @@
 <td><a href="#org.apache.hadoop.hbase.master.cleaner.CleanerChore.java">org/apache/hadoop/hbase/master/cleaner/CleanerChore.java</a></td>
 <td>0</td>
 <td>0</td>
-<td>3</td></tr>
+<td>4</td></tr>
 <tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.cleaner.DirScanPool.java">org/apache/hadoop/hbase/master/cleaner/DirScanPool.java</a></td>
 <td>0</td>
@@ -5902,7 +5912,7 @@
 <td><a href="#org.apache.hadoop.hbase.rest.client.Client.java">org/apache/hadoop/hbase/rest/client/Client.java</a></td>
 <td>0</td>
 <td>0</td>
-<td>28</td></tr>
+<td>29</td></tr>
 <tr class="a">
 <td><a href="#org.apache.hadoop.hbase.rest.client.RemoteAdmin.java">org/apache/hadoop/hbase/rest/client/RemoteAdmin.java</a></td>
 <td>0</td>
@@ -7468,7 +7478,7 @@
 <li>sortStaticImportsAlphabetically: <tt>&quot;true&quot;</tt></li>
 <li>groups: <tt>&quot;*,org.apache.hbase.thirdparty,org.apache.hadoop.hbase.shaded&quot;</tt></li>
 <li>option: <tt>&quot;top&quot;</tt></li></ul></td>
-<td>694</td>
+<td>695</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="b">
 <td></td>
@@ -7480,7 +7490,7 @@
 <td><a class="externalLink" href="http://checkstyle.sourceforge.net/config_imports.html#UnusedImports">UnusedImports</a>
 <ul>
 <li>processJavadoc: <tt>&quot;true&quot;</tt></li></ul></td>
-<td>69</td>
+<td>70</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="b">
 <td>indentation</td>
@@ -7498,7 +7508,7 @@
 <td><a class="externalLink" href="http://checkstyle.sourceforge.net/config_javadoc.html#JavadocTagContinuationIndentation">JavadocTagContinuationIndentation</a>
 <ul>
 <li>offset: <tt>&quot;2&quot;</tt></li></ul></td>
-<td>529</td>
+<td>530</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="b">
 <td></td>
@@ -7521,7 +7531,7 @@
 <ul>
 <li>max: <tt>&quot;100&quot;</tt></li>
 <li>ignorePattern: <tt>&quot;^package.*|^import.*|a href|href|http://|https://|ftp://|org.apache.thrift.|com.google.protobuf.|hbase.protobuf.generated&quot;</tt></li></ul></td>
-<td>874</td>
+<td>876</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="b">
 <td></td>
@@ -7808,61 +7818,61 @@
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>595</td></tr>
+<td>599</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>596</td></tr>
+<td>600</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>608</td></tr>
+<td>612</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>637</td></tr>
+<td>641</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>699</td></tr>
+<td>703</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>700</td></tr>
+<td>704</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>711</td></tr>
+<td>715</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>734</td></tr>
+<td>738</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>735</td></tr>
+<td>739</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>845</td></tr></table></div>
+<td>849</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ChaosZKClient.java">org/apache/hadoop/hbase/ChaosZKClient.java</h3>
 <table border="0" class="table table-striped">
@@ -11612,337 +11622,337 @@
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>862</td></tr>
+<td>887</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>863</td></tr>
+<td>888</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>864</td></tr>
+<td>889</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>882</td></tr>
+<td>907</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>883</td></tr>
+<td>908</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>884</td></tr>
+<td>909</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>1030</td></tr>
+<td>1055</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>1031</td></tr>
+<td>1056</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>1032</td></tr>
+<td>1057</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>1033</td></tr>
+<td>1058</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>1034</td></tr>
+<td>1059</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>1056</td></tr>
+<td>1081</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>1249</td></tr>
+<td>1274</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>1250</td></tr>
+<td>1275</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2186</td></tr>
+<td>2211</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2187</td></tr>
+<td>2212</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2188</td></tr>
+<td>2213</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2221</td></tr>
+<td>2246</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2236</td></tr>
+<td>2261</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2312</td></tr>
+<td>2337</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2313</td></tr>
+<td>2338</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2327</td></tr>
+<td>2352</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2328</td></tr>
+<td>2353</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2342</td></tr>
+<td>2367</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2358</td></tr>
+<td>2383</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2359</td></tr>
+<td>2384</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2374</td></tr>
+<td>2399</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2392</td></tr>
+<td>2417</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2408</td></tr>
+<td>2433</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2424</td></tr>
+<td>2449</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2441</td></tr>
+<td>2466</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2461</td></tr>
+<td>2486</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2477</td></tr>
+<td>2502</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>2494</td></tr>
+<td>2519</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>2498</td></tr>
+<td>2523</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>2501</td></tr>
+<td>2526</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>2505</td></tr>
+<td>2530</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'else' construct must use '{}'s.</td>
-<td>2506</td></tr>
+<td>2531</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2511</td></tr>
+<td>2536</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2524</td></tr>
+<td>2549</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2537</td></tr>
+<td>2562</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2550</td></tr>
+<td>2575</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2563</td></tr>
+<td>2588</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>2641</td></tr>
+<td>2666</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2786</td></tr>
+<td>2811</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>2800</td></tr>
+<td>2825</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2809</td></tr>
+<td>2834</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>2814</td></tr>
+<td>2839</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2822</td></tr>
+<td>2847</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2888</td></tr>
+<td>2913</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2889</td></tr>
+<td>2914</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2890</td></tr>
+<td>2915</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2891</td></tr>
+<td>2916</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2913</td></tr>
+<td>2938</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2932</td></tr>
+<td>2957</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2951</td></tr></table></div>
+<td>2976</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.QosTestHelper.java">org/apache/hadoop/hbase/QosTestHelper.java</h3>
 <table border="0" class="table table-striped">
@@ -15884,31 +15894,31 @@
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>853</td></tr>
+<td>854</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>870</td></tr>
+<td>871</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>871</td></tr>
+<td>872</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>889</td></tr>
+<td>890</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>898</td></tr></table></div>
+<td>899</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.ResultScanner.java">org/apache/hadoop/hbase/client/ResultScanner.java</h3>
 <table border="0" class="table table-striped">
@@ -17777,19 +17787,19 @@
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>72</td></tr>
+<td>77</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>277</td></tr>
+<td>418</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>341</td></tr></table></div>
+<td>482</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestScannerTimeout.java">org/apache/hadoop/hbase/client/TestScannerTimeout.java</h3>
 <table border="0" class="table table-striped">
@@ -35197,7 +35207,7 @@
 <td>'for' construct must use '{}'s.</td>
 <td>115</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.mapreduce.RowCounter.java">org/apache/hadoop/hbase/mapreduce/RowCounter.java</h3>
+<h3 id="org.apache.hadoop.hbase.mapreduce.RoundRobinTableInputFormat.java">org/apache/hadoop/hbase/mapreduce/RoundRobinTableInputFormat.java</h3>
 <table border="0" class="table table-striped">
 <tr class="a">
 <th>Severity</th>
@@ -35209,39 +35219,60 @@
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
+<td>Wrong order for 'java.util.HashMap' import.</td>
+<td>25</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Javadoc comment at column 14 has parse error. Details: mismatched input ':' expecting &lt;EOF&gt; while parsing JAVADOC</td>
+<td>46</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.mapreduce.RowCounter.java">org/apache/hadoop/hbase/mapreduce/RowCounter.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
 <td>Wrong order for 'java.util.ArrayList' import.</td>
 <td>23</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.yetus.audience.InterfaceAudience' import.</td>
 <td>35</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
 <td>38</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'extends' has incorrect indentation level 2, expected level should be 4.</td>
 <td>81</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 4, expected level should be 6.</td>
 <td>98</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>261</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -35250,31 +35281,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.SimpleTotalOrderPartitioner.java">org/apache/hadoop/hbase/mapreduce/SimpleTotalOrderPartitioner.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configurable' import.</td>
 <td>26</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>43</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'implements' has incorrect indentation level 0, expected level should be 2.</td>
 <td>49</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -35283,31 +35314,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.SyncTable.java">org/apache/hadoop/hbase/mapreduce/SyncTable.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>244</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>245</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>247</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -35316,37 +35347,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TableInputFormat.java">org/apache/hadoop/hbase/mapreduce/TableInputFormat.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Connection' import.</td>
 <td>33</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.Pair' import.</td>
 <td>40</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'implements' has incorrect indentation level 0, expected level should be 2.</td>
 <td>49</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'catch' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>130</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -35355,97 +35386,97 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TableInputFormatBase.java">org/apache/hadoop/hbase/mapreduce/TableInputFormatBase.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>100</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>103</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 113).</td>
 <td>121</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>125</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>439</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
 <td>461</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>475</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 116).</td>
 <td>534</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 127).</td>
 <td>536</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 135).</td>
 <td>537</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 150).</td>
 <td>542</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>589</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>614</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>659</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
@@ -35454,406 +35485,406 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil.java">org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Connection' import.</td>
 <td>46</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.security.User' import.</td>
 <td>54</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'com.codahale.metrics.MetricRegistry' import.</td>
 <td>65</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>70</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>85</td></tr>
-<tr class="a">
+<td>86</td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>92</td></tr>
-<tr class="b">
+<td>93</td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>108</td></tr>
-<tr class="a">
+<td>109</td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>136</td></tr>
-<tr class="b">
+<td>137</td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 3, expected level should be 2.</td>
-<td>139</td></tr>
-<tr class="a">
+<td>140</td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 5.</td>
-<td>143</td></tr>
-<tr class="b">
+<td>144</td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
-<td>144</td></tr>
-<tr class="a">
+<td>145</td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>158</td></tr>
-<tr class="b">
+<td>159</td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 3, expected level should be 2.</td>
-<td>163</td></tr>
-<tr class="a">
+<td>164</td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 3, expected level should be 5.</td>
-<td>168</td></tr>
-<tr class="b">
+<td>169</td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
-<td>169</td></tr>
-<tr class="a">
+<td>170</td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 3, expected level should be 2.</td>
-<td>171</td></tr>
-<tr class="b">
+<td>172</td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>184</td></tr>
-<tr class="a">
+<td>185</td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>197</td></tr>
-<tr class="b">
+<td>198</td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>199</td></tr>
-<tr class="a">
+<td>200</td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>200</td></tr>
-<tr class="b">
+<td>201</td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>230</td></tr>
-<tr class="a">
+<td>231</td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>241</td></tr>
-<tr class="b">
+<td>242</td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
-<td>242</td></tr>
-<tr class="a">
+<td>243</td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>256</td></tr>
-<tr class="b">
+<td>257</td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>266</td></tr>
-<tr class="a">
+<td>267</td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
-<td>267</td></tr>
-<tr class="b">
+<td>268</td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>281</td></tr>
-<tr class="a">
+<td>291</td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>291</td></tr>
-<tr class="b">
+<td>301</td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
-<td>292</td></tr>
-<tr class="a">
+<td>302</td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>387</td></tr>
-<tr class="b">
+<td>397</td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>392</td></tr>
-<tr class="a">
+<td>402</td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>393</td></tr>
-<tr class="b">
+<td>403</td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>629</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>641</td></tr>
+<td>639</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>657</td></tr>
+<td>651</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>659</td></tr>
+<td>667</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>661</td></tr>
+<td>669</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>662</td></tr>
+<td>671</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>663</td></tr>
+<td>672</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>664</td></tr>
+<td>673</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>665</td></tr>
+<td>674</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>666</td></tr>
+<td>675</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>667</td></tr>
+<td>676</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>689</td></tr>
+<td>677</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>691</td></tr>
+<td>699</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>693</td></tr>
+<td>701</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>694</td></tr>
+<td>703</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>695</td></tr>
+<td>704</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>696</td></tr>
+<td>705</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>697</td></tr>
+<td>706</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>698</td></tr>
+<td>707</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>699</td></tr>
+<td>708</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>716</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>783</td></tr>
-<tr class="b">
+<td>709</td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>843</td></tr>
+<td>726</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>793</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>844</td></tr>
+<td>853</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>920</td></tr>
+<td>854</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>935</td></tr>
+<td>930</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>945</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>951</td></tr>
-<tr class="a">
+<td>961</td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>955</td></tr>
-<tr class="b">
+<td>965</td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
-<td>977</td></tr>
-<tr class="a">
+<td>987</td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>991</td></tr>
-<tr class="b">
+<td>1001</td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>1002</td></tr></table></div>
+<td>1012</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TableMapper.java">org/apache/hadoop/hbase/mapreduce/TableMapper.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Result' import.</td>
 <td>22</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -35862,25 +35893,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TableOutputCommitter.java">org/apache/hadoop/hbase/mapreduce/TableOutputCommitter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.mapreduce.JobContext' import.</td>
 <td>24</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>64</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
@@ -35889,37 +35920,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TableOutputFormat.java">org/apache/hadoop/hbase/mapreduce/TableOutputFormat.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'implements' has incorrect indentation level 0, expected level should be 2.</td>
 <td>52</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 127).</td>
 <td>73</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'extends' has incorrect indentation level 2, expected level should be 4.</td>
 <td>94</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 4, expected level should be 6.</td>
 <td>139</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -35928,25 +35959,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TableRecordReader.java">org/apache/hadoop/hbase/mapreduce/TableRecordReader.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Result' import.</td>
 <td>24</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'extends' has incorrect indentation level 0, expected level should be 2.</td>
 <td>38</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -35955,115 +35986,115 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TableRecordReaderImpl.java">org/apache/hadoop/hbase/mapreduce/TableRecordReaderImpl.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for' has incorrect indentation level 6, expected level should be 4.</td>
 <td>309</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>310</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 8, expected level should be 6.</td>
 <td>311</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>312</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 8, expected level should be 6.</td>
 <td>313</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for rcurly' has incorrect indentation level 6, expected level should be 4.</td>
 <td>314</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 6, expected level should be 4.</td>
 <td>315</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>316</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 8, expected level should be 6.</td>
 <td>317</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>318</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 8, expected level should be 6.</td>
 <td>319</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 6, expected level should be 4.</td>
 <td>320</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 6, expected level should be 4.</td>
 <td>321</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>322</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 8, expected level should be 6.</td>
 <td>323</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>324</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 8, expected level should be 6.</td>
 <td>325</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -36072,19 +36103,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TableReducer.java">org/apache/hadoop/hbase/mapreduce/TableReducer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Mutation' import.</td>
 <td>22</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -36093,61 +36124,61 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TableSnapshotInputFormat.java">org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormat.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 111).</td>
 <td>54</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>202</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>203</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>216</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>217</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 3, expected level should be 2.</td>
 <td>222</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 116).</td>
 <td>223</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
 <td>224</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -36156,13 +36187,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TableSnapshotInputFormatImpl.java">org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormatImpl.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
@@ -36171,13 +36202,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TestGroupingTableMapper.java">org/apache/hadoop/hbase/mapreduce/TestGroupingTableMapper.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>AvoidStarImport</td>
@@ -36186,31 +36217,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TestHBaseMRTestingUtility.java">org/apache/hadoop/hbase/mapreduce/TestHBaseMRTestingUtility.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.io.IOException' import.</td>
 <td>28</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.junit.Assert.assertFalse' import.</td>
 <td>32</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 110).</td>
 <td>60</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -36219,241 +36250,241 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TestHFileOutputFormat2.java">org/apache/hadoop/hbase/mapreduce/TestHFileOutputFormat2.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 5 should be on the previous line.</td>
 <td>188</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>190</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>191</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>259</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>260</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>UpperEll</td>
 <td>Should use uppercase 'L'.</td>
 <td>282</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>311</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>344</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>350</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>418</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>532</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>610</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' should be on the previous line.</td>
 <td>619</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 170 lines (max allowed is 150).</td>
 <td>622</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>783</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
 <td>785</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 114).</td>
 <td>794</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>830</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' should be on the previous line.</td>
 <td>842</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>883</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>907</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'getMockColumnFamiliesForBloomType' has incorrect indentation level 2, expected level should be 4.</td>
 <td>959</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>959</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>980</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' should be on the previous line.</td>
 <td>993</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for rparen' has incorrect indentation level 10, expected level should be 6.</td>
 <td>1005</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'getMockColumnFamiliesForBlockSize' has incorrect indentation level 2, expected level should be 4.</td>
 <td>1034</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>1034</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1059</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' should be on the previous line.</td>
 <td>1073</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>1113</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1135</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1215</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>1235</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>1237</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>1437</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>1441</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>1490</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -36462,13 +36493,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TestHRegionPartitioner.java">org/apache/hadoop/hbase/mapreduce/TestHRegionPartitioner.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -36477,241 +36508,241 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TestImportExport.java">org/apache/hadoop/hbase/mapreduce/TestImportExport.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>176</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>178</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>179</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>180</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>194</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>196</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>197</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>198</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>208</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>266</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>277</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 14, expected level should be 8.</td>
 <td>296</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 14, expected level should be 8.</td>
 <td>297</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' child has incorrect indentation level 5, expected level should be 6.</td>
 <td>308</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 3, expected level should be 2.</td>
 <td>315</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>334</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>334</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>336</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>372</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>374</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>375</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>390</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 10, expected level should be 8.</td>
 <td>391</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>446</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>447</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>448</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>464</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>465</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 26.</td>
 <td>533</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 26.</td>
 <td>534</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 26.</td>
 <td>535</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 26.</td>
 <td>549</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 26.</td>
 <td>550</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>562</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 113).</td>
 <td>626</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 123).</td>
 <td>644</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>711</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>713</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -36720,61 +36751,61 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TestImportTSVWithOperationAttributes.java">org/apache/hadoop/hbase/mapreduce/TestImportTSVWithOperationAttributes.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>129</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>131</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>132</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>145</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>147</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>148</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>163</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>203</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -36783,25 +36814,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TestImportTSVWithTTLs.java">org/apache/hadoop/hbase/mapreduce/TestImportTSVWithTTLs.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>117</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>119</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -36810,169 +36841,169 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.mapreduce.TestImportTSVWithVisibilityLabels.java">org/apache/hadoop/hbase/mapreduce/TestImportTSVWithVisibilityLabels.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>168</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>170</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>171</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>184</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>185</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>186</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>236</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>237</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>239</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be 10.</td>
 <td>254</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be 10.</td>
 <td>256</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be 10.</td>
 <td>258</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be 10.</td>
 <td>259</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization rcurly' has incorrect indentation level 12, expected level should be one of the following: 8, 10.</td>
 <td>261</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>273</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>275</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>276</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>277</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be one of the following: 10, 23.</td>
 <td>291</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be one of the following: 10, 23.</td>
 <td>292</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be 10.</td>
 <td>309</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be 10.</td>
 <td>311</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be 10.</td>
 <td>312</td></tr>
-<tr class="a">
... 115670 lines suppressed ...