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 2018/05/07 14:47:41 UTC

[01/44] hbase-site git commit: Published site at 8e6ff689e806138e602a46730886d8c5f524fdcd.

Repository: hbase-site
Updated Branches:
  refs/heads/asf-site af92c4d4e -> 131f2a897


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/src-html/org/apache/hadoop/hbase/TestPerformanceEvaluation.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/TestPerformanceEvaluation.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/TestPerformanceEvaluation.html
index 6e0103c..469dca7 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/TestPerformanceEvaluation.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/TestPerformanceEvaluation.html
@@ -187,47 +187,57 @@
 <span class="sourceLineNo">179</span>  }<a name="line.179"></a>
 <span class="sourceLineNo">180</span><a name="line.180"></a>
 <span class="sourceLineNo">181</span>  @Test<a name="line.181"></a>
-<span class="sourceLineNo">182</span>  public void testParseOptsWithThreads() {<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    Queue&lt;String&gt; opts = new LinkedList&lt;&gt;();<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    String cmdName = "sequentialWrite";<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    int threads = 1;<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    opts.offer(cmdName);<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    opts.offer(String.valueOf(threads));<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    PerformanceEvaluation.TestOptions options = PerformanceEvaluation.parseOpts(opts);<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    assertNotNull(options);<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    assertNotNull(options.getCmdName());<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    assertEquals(cmdName, options.getCmdName());<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    assertEquals(threads, options.getNumClientThreads());<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>  @Test<a name="line.195"></a>
-<span class="sourceLineNo">196</span>  public void testParseOptsWrongThreads() {<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    Queue&lt;String&gt; opts = new LinkedList&lt;&gt;();<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    String cmdName = "sequentialWrite";<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    opts.offer(cmdName);<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    opts.offer("qq");<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    try {<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      PerformanceEvaluation.parseOpts(opts);<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    } catch (IllegalArgumentException e) {<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      System.out.println(e.getMessage());<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      assertEquals("Command " + cmdName + " does not have threads number", e.getMessage());<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      assertTrue(e.getCause() instanceof NumberFormatException);<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>  @Test<a name="line.210"></a>
-<span class="sourceLineNo">211</span>  public void testParseOptsNoThreads() {<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    Queue&lt;String&gt; opts = new LinkedList&lt;&gt;();<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    String cmdName = "sequentialWrite";<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    try {<a name="line.214"></a>
-<span class="sourceLineNo">215</span>      PerformanceEvaluation.parseOpts(opts);<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    } catch (IllegalArgumentException e) {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      System.out.println(e.getMessage());<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      assertEquals("Command " + cmdName + " does not have threads number", e.getMessage());<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      assertTrue(e.getCause() instanceof NoSuchElementException);<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>}<a name="line.222"></a>
+<span class="sourceLineNo">182</span>  public void testSetBufferSizeOption() {<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    TestOptions opts = new PerformanceEvaluation.TestOptions();<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    long bufferSize = opts.getBufferSize();<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    assertEquals(bufferSize, 2l * 1024l * 1024l);<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    opts.setBufferSize(64l * 1024l);<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    bufferSize = opts.getBufferSize();<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    assertEquals(bufferSize, 64l * 1024l);<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>  @Test<a name="line.191"></a>
+<span class="sourceLineNo">192</span>  public void testParseOptsWithThreads() {<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    Queue&lt;String&gt; opts = new LinkedList&lt;&gt;();<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    String cmdName = "sequentialWrite";<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    int threads = 1;<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    opts.offer(cmdName);<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    opts.offer(String.valueOf(threads));<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    PerformanceEvaluation.TestOptions options = PerformanceEvaluation.parseOpts(opts);<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    assertNotNull(options);<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    assertNotNull(options.getCmdName());<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    assertEquals(cmdName, options.getCmdName());<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    assertEquals(threads, options.getNumClientThreads());<a name="line.202"></a>
+<span class="sourceLineNo">203</span>  }<a name="line.203"></a>
+<span class="sourceLineNo">204</span><a name="line.204"></a>
+<span class="sourceLineNo">205</span>  @Test<a name="line.205"></a>
+<span class="sourceLineNo">206</span>  public void testParseOptsWrongThreads() {<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    Queue&lt;String&gt; opts = new LinkedList&lt;&gt;();<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    String cmdName = "sequentialWrite";<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    opts.offer(cmdName);<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    opts.offer("qq");<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    try {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      PerformanceEvaluation.parseOpts(opts);<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    } catch (IllegalArgumentException e) {<a name="line.213"></a>
+<span class="sourceLineNo">214</span>      System.out.println(e.getMessage());<a name="line.214"></a>
+<span class="sourceLineNo">215</span>      assertEquals("Command " + cmdName + " does not have threads number", e.getMessage());<a name="line.215"></a>
+<span class="sourceLineNo">216</span>      assertTrue(e.getCause() instanceof NumberFormatException);<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>  @Test<a name="line.220"></a>
+<span class="sourceLineNo">221</span>  public void testParseOptsNoThreads() {<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    Queue&lt;String&gt; opts = new LinkedList&lt;&gt;();<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    String cmdName = "sequentialWrite";<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    try {<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      PerformanceEvaluation.parseOpts(opts);<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    } catch (IllegalArgumentException e) {<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      System.out.println(e.getMessage());<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      assertEquals("Command " + cmdName + " does not have threads number", e.getMessage());<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      assertTrue(e.getCause() instanceof NoSuchElementException);<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    }<a name="line.230"></a>
+<span class="sourceLineNo">231</span>  }<a name="line.231"></a>
+<span class="sourceLineNo">232</span>}<a name="line.232"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupWithBulkLoad.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupWithBulkLoad.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupWithBulkLoad.html
index 71db4e8..6276e06 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupWithBulkLoad.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupWithBulkLoad.html
@@ -27,148 +27,132 @@
 <span class="sourceLineNo">019</span><a name="line.19"></a>
 <span class="sourceLineNo">020</span>import static org.junit.Assert.assertTrue;<a name="line.20"></a>
 <span class="sourceLineNo">021</span><a name="line.21"></a>
-<span class="sourceLineNo">022</span>import java.util.ArrayList;<a name="line.22"></a>
-<span class="sourceLineNo">023</span>import java.util.Collection;<a name="line.23"></a>
-<span class="sourceLineNo">024</span>import java.util.List;<a name="line.24"></a>
-<span class="sourceLineNo">025</span>import java.util.Map;<a name="line.25"></a>
-<span class="sourceLineNo">026</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import org.apache.hadoop.hbase.TableName;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.backup.impl.BackupAdminImpl;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.backup.impl.BackupSystemTable;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.backup.util.BackupUtils;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.client.HBaseAdmin;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.client.HTable;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.client.Put;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.tool.TestLoadIncrementalHFiles;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.junit.Assert;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.junit.ClassRule;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.junit.Test;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.junit.experimental.categories.Category;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.junit.runner.RunWith;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.junit.runners.Parameterized;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.slf4j.Logger;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.slf4j.LoggerFactory;<a name="line.47"></a>
-<span class="sourceLineNo">048</span><a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.49"></a>
-<span class="sourceLineNo">050</span><a name="line.50"></a>
-<span class="sourceLineNo">051</span>/**<a name="line.51"></a>
-<span class="sourceLineNo">052</span> * 1. Create table t1<a name="line.52"></a>
-<span class="sourceLineNo">053</span> * 2. Load data to t1<a name="line.53"></a>
-<span class="sourceLineNo">054</span> * 3 Full backup t1<a name="line.54"></a>
-<span class="sourceLineNo">055</span> * 4 Load data to t1<a name="line.55"></a>
-<span class="sourceLineNo">056</span> * 5 bulk load into t1<a name="line.56"></a>
-<span class="sourceLineNo">057</span> * 6 Incremental backup t1<a name="line.57"></a>
-<span class="sourceLineNo">058</span> */<a name="line.58"></a>
-<span class="sourceLineNo">059</span>@Category(LargeTests.class)<a name="line.59"></a>
-<span class="sourceLineNo">060</span>@RunWith(Parameterized.class)<a name="line.60"></a>
-<span class="sourceLineNo">061</span>public class TestIncrementalBackupWithBulkLoad extends TestBackupBase {<a name="line.61"></a>
-<span class="sourceLineNo">062</span><a name="line.62"></a>
-<span class="sourceLineNo">063</span>  @ClassRule<a name="line.63"></a>
-<span class="sourceLineNo">064</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.64"></a>
-<span class="sourceLineNo">065</span>      HBaseClassTestRule.forClass(TestIncrementalBackupWithBulkLoad.class);<a name="line.65"></a>
-<span class="sourceLineNo">066</span><a name="line.66"></a>
-<span class="sourceLineNo">067</span>  private static final Logger LOG = LoggerFactory.getLogger(TestIncrementalBackupDeleteTable.class);<a name="line.67"></a>
-<span class="sourceLineNo">068</span><a name="line.68"></a>
-<span class="sourceLineNo">069</span>  @Parameterized.Parameters<a name="line.69"></a>
-<span class="sourceLineNo">070</span>  public static Collection&lt;Object[]&gt; data() {<a name="line.70"></a>
-<span class="sourceLineNo">071</span>    secure = true;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>    List&lt;Object[]&gt; params = new ArrayList&lt;&gt;();<a name="line.72"></a>
-<span class="sourceLineNo">073</span>    params.add(new Object[] {Boolean.TRUE});<a name="line.73"></a>
-<span class="sourceLineNo">074</span>    return params;<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>  public TestIncrementalBackupWithBulkLoad(Boolean b) {<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>  // implement all test cases in 1 test since incremental backup/restore has dependencies<a name="line.80"></a>
-<span class="sourceLineNo">081</span>  @Test<a name="line.81"></a>
-<span class="sourceLineNo">082</span>  public void TestIncBackupDeleteTable() throws Exception {<a name="line.82"></a>
-<span class="sourceLineNo">083</span>    String testName = "TestIncBackupDeleteTable";<a name="line.83"></a>
-<span class="sourceLineNo">084</span>    // #1 - create full backup for all tables<a name="line.84"></a>
-<span class="sourceLineNo">085</span>    LOG.info("create full backup image for all tables");<a name="line.85"></a>
-<span class="sourceLineNo">086</span><a name="line.86"></a>
-<span class="sourceLineNo">087</span>    List&lt;TableName&gt; tables = Lists.newArrayList(table1);<a name="line.87"></a>
-<span class="sourceLineNo">088</span>    Connection conn = ConnectionFactory.createConnection(conf1);<a name="line.88"></a>
-<span class="sourceLineNo">089</span>    HBaseAdmin admin = (HBaseAdmin) conn.getAdmin();<a name="line.89"></a>
-<span class="sourceLineNo">090</span>    BackupAdminImpl client = new BackupAdminImpl(conn);<a name="line.90"></a>
-<span class="sourceLineNo">091</span><a name="line.91"></a>
-<span class="sourceLineNo">092</span>    BackupRequest request = createBackupRequest(BackupType.FULL, tables, BACKUP_ROOT_DIR);<a name="line.92"></a>
-<span class="sourceLineNo">093</span>    String backupIdFull = client.backupTables(request);<a name="line.93"></a>
-<span class="sourceLineNo">094</span><a name="line.94"></a>
-<span class="sourceLineNo">095</span>    assertTrue(checkSucceeded(backupIdFull));<a name="line.95"></a>
-<span class="sourceLineNo">096</span><a name="line.96"></a>
-<span class="sourceLineNo">097</span>    // #2 - insert some data to table table1<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    HTable t1 = (HTable) conn.getTable(table1);<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    Put p1;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    for (int i = 0; i &lt; NB_ROWS_IN_BATCH; i++) {<a name="line.100"></a>
-<span class="sourceLineNo">101</span>      p1 = new Put(Bytes.toBytes("row-t1" + i));<a name="line.101"></a>
-<span class="sourceLineNo">102</span>      p1.addColumn(famName, qualName, Bytes.toBytes("val" + i));<a name="line.102"></a>
-<span class="sourceLineNo">103</span>      t1.put(p1);<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    }<a name="line.104"></a>
-<span class="sourceLineNo">105</span><a name="line.105"></a>
-<span class="sourceLineNo">106</span>    Assert.assertEquals(TEST_UTIL.countRows(t1), NB_ROWS_IN_BATCH * 2);<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    t1.close();<a name="line.107"></a>
-<span class="sourceLineNo">108</span><a name="line.108"></a>
-<span class="sourceLineNo">109</span>    int NB_ROWS2 = 20;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    LOG.debug("bulk loading into " + testName);<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    int actual = TestLoadIncrementalHFiles.loadHFiles(testName, table1Desc, TEST_UTIL, famName,<a name="line.111"></a>
-<span class="sourceLineNo">112</span>        qualName, false, null, new byte[][][] {<a name="line.112"></a>
-<span class="sourceLineNo">113</span>          new byte[][]{ Bytes.toBytes("aaaa"), Bytes.toBytes("cccc") },<a name="line.113"></a>
-<span class="sourceLineNo">114</span>          new byte[][]{ Bytes.toBytes("ddd"), Bytes.toBytes("ooo") },<a name="line.114"></a>
-<span class="sourceLineNo">115</span>        }, true, false, true, NB_ROWS_IN_BATCH*2, NB_ROWS2);<a name="line.115"></a>
-<span class="sourceLineNo">116</span><a name="line.116"></a>
-<span class="sourceLineNo">117</span>    // #3 - incremental backup for table1<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    tables = Lists.newArrayList(table1);<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    request = createBackupRequest(BackupType.INCREMENTAL, tables, BACKUP_ROOT_DIR);<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    String backupIdIncMultiple = client.backupTables(request);<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    assertTrue(checkSucceeded(backupIdIncMultiple));<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    // #4 bulk load again<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    LOG.debug("bulk loading into " + testName);<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    int actual1 = TestLoadIncrementalHFiles.loadHFiles(testName, table1Desc, TEST_UTIL, famName,<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      qualName, false, null,<a name="line.125"></a>
-<span class="sourceLineNo">126</span>      new byte[][][] { new byte[][] { Bytes.toBytes("ppp"), Bytes.toBytes("qqq") },<a name="line.126"></a>
-<span class="sourceLineNo">127</span>        new byte[][] { Bytes.toBytes("rrr"), Bytes.toBytes("sss") }, },<a name="line.127"></a>
-<span class="sourceLineNo">128</span>      true, false, true, NB_ROWS_IN_BATCH * 2 + actual, NB_ROWS2);<a name="line.128"></a>
+<span class="sourceLineNo">022</span>import java.util.List;<a name="line.22"></a>
+<span class="sourceLineNo">023</span>import java.util.Map;<a name="line.23"></a>
+<span class="sourceLineNo">024</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.24"></a>
+<span class="sourceLineNo">025</span>import org.apache.hadoop.hbase.TableName;<a name="line.25"></a>
+<span class="sourceLineNo">026</span>import org.apache.hadoop.hbase.backup.impl.BackupAdminImpl;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import org.apache.hadoop.hbase.backup.impl.BackupSystemTable;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.backup.util.BackupUtils;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.client.HBaseAdmin;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.client.HTable;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.client.Put;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.tool.TestLoadIncrementalHFiles;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.junit.Assert;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.junit.ClassRule;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.junit.Test;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.junit.experimental.categories.Category;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.slf4j.Logger;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.slf4j.LoggerFactory;<a name="line.43"></a>
+<span class="sourceLineNo">044</span><a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.45"></a>
+<span class="sourceLineNo">046</span><a name="line.46"></a>
+<span class="sourceLineNo">047</span>/**<a name="line.47"></a>
+<span class="sourceLineNo">048</span> * 1. Create table t1<a name="line.48"></a>
+<span class="sourceLineNo">049</span> * 2. Load data to t1<a name="line.49"></a>
+<span class="sourceLineNo">050</span> * 3 Full backup t1<a name="line.50"></a>
+<span class="sourceLineNo">051</span> * 4 Load data to t1<a name="line.51"></a>
+<span class="sourceLineNo">052</span> * 5 bulk load into t1<a name="line.52"></a>
+<span class="sourceLineNo">053</span> * 6 Incremental backup t1<a name="line.53"></a>
+<span class="sourceLineNo">054</span> */<a name="line.54"></a>
+<span class="sourceLineNo">055</span>@Category(LargeTests.class)<a name="line.55"></a>
+<span class="sourceLineNo">056</span>public class TestIncrementalBackupWithBulkLoad extends TestBackupBase {<a name="line.56"></a>
+<span class="sourceLineNo">057</span><a name="line.57"></a>
+<span class="sourceLineNo">058</span>  @ClassRule<a name="line.58"></a>
+<span class="sourceLineNo">059</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.59"></a>
+<span class="sourceLineNo">060</span>      HBaseClassTestRule.forClass(TestIncrementalBackupWithBulkLoad.class);<a name="line.60"></a>
+<span class="sourceLineNo">061</span><a name="line.61"></a>
+<span class="sourceLineNo">062</span>  private static final Logger LOG = LoggerFactory.getLogger(TestIncrementalBackupDeleteTable.class);<a name="line.62"></a>
+<span class="sourceLineNo">063</span><a name="line.63"></a>
+<span class="sourceLineNo">064</span>  // implement all test cases in 1 test since incremental backup/restore has dependencies<a name="line.64"></a>
+<span class="sourceLineNo">065</span>  @Test<a name="line.65"></a>
+<span class="sourceLineNo">066</span>  public void TestIncBackupDeleteTable() throws Exception {<a name="line.66"></a>
+<span class="sourceLineNo">067</span>    String testName = "TestIncBackupDeleteTable";<a name="line.67"></a>
+<span class="sourceLineNo">068</span>    // #1 - create full backup for all tables<a name="line.68"></a>
+<span class="sourceLineNo">069</span>    LOG.info("create full backup image for all tables");<a name="line.69"></a>
+<span class="sourceLineNo">070</span><a name="line.70"></a>
+<span class="sourceLineNo">071</span>    List&lt;TableName&gt; tables = Lists.newArrayList(table1);<a name="line.71"></a>
+<span class="sourceLineNo">072</span>    Connection conn = ConnectionFactory.createConnection(conf1);<a name="line.72"></a>
+<span class="sourceLineNo">073</span>    HBaseAdmin admin = (HBaseAdmin) conn.getAdmin();<a name="line.73"></a>
+<span class="sourceLineNo">074</span>    BackupAdminImpl client = new BackupAdminImpl(conn);<a name="line.74"></a>
+<span class="sourceLineNo">075</span><a name="line.75"></a>
+<span class="sourceLineNo">076</span>    BackupRequest request = createBackupRequest(BackupType.FULL, tables, BACKUP_ROOT_DIR);<a name="line.76"></a>
+<span class="sourceLineNo">077</span>    String backupIdFull = client.backupTables(request);<a name="line.77"></a>
+<span class="sourceLineNo">078</span><a name="line.78"></a>
+<span class="sourceLineNo">079</span>    assertTrue(checkSucceeded(backupIdFull));<a name="line.79"></a>
+<span class="sourceLineNo">080</span><a name="line.80"></a>
+<span class="sourceLineNo">081</span>    // #2 - insert some data to table table1<a name="line.81"></a>
+<span class="sourceLineNo">082</span>    HTable t1 = (HTable) conn.getTable(table1);<a name="line.82"></a>
+<span class="sourceLineNo">083</span>    Put p1;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>    for (int i = 0; i &lt; NB_ROWS_IN_BATCH; i++) {<a name="line.84"></a>
+<span class="sourceLineNo">085</span>      p1 = new Put(Bytes.toBytes("row-t1" + i));<a name="line.85"></a>
+<span class="sourceLineNo">086</span>      p1.addColumn(famName, qualName, Bytes.toBytes("val" + i));<a name="line.86"></a>
+<span class="sourceLineNo">087</span>      t1.put(p1);<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>    Assert.assertEquals(TEST_UTIL.countRows(t1), NB_ROWS_IN_BATCH * 2);<a name="line.90"></a>
+<span class="sourceLineNo">091</span>    t1.close();<a name="line.91"></a>
+<span class="sourceLineNo">092</span><a name="line.92"></a>
+<span class="sourceLineNo">093</span>    int NB_ROWS2 = 20;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>    LOG.debug("bulk loading into " + testName);<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    int actual = TestLoadIncrementalHFiles.loadHFiles(testName, table1Desc, TEST_UTIL, famName,<a name="line.95"></a>
+<span class="sourceLineNo">096</span>        qualName, false, null, new byte[][][] {<a name="line.96"></a>
+<span class="sourceLineNo">097</span>          new byte[][]{ Bytes.toBytes("aaaa"), Bytes.toBytes("cccc") },<a name="line.97"></a>
+<span class="sourceLineNo">098</span>          new byte[][]{ Bytes.toBytes("ddd"), Bytes.toBytes("ooo") },<a name="line.98"></a>
+<span class="sourceLineNo">099</span>        }, true, false, true, NB_ROWS_IN_BATCH*2, NB_ROWS2);<a name="line.99"></a>
+<span class="sourceLineNo">100</span><a name="line.100"></a>
+<span class="sourceLineNo">101</span>    // #3 - incremental backup for table1<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    tables = Lists.newArrayList(table1);<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    request = createBackupRequest(BackupType.INCREMENTAL, tables, BACKUP_ROOT_DIR);<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    String backupIdIncMultiple = client.backupTables(request);<a name="line.104"></a>
+<span class="sourceLineNo">105</span>    assertTrue(checkSucceeded(backupIdIncMultiple));<a name="line.105"></a>
+<span class="sourceLineNo">106</span>    // #4 bulk load again<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    LOG.debug("bulk loading into " + testName);<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    int actual1 = TestLoadIncrementalHFiles.loadHFiles(testName, table1Desc, TEST_UTIL, famName,<a name="line.108"></a>
+<span class="sourceLineNo">109</span>      qualName, false, null,<a name="line.109"></a>
+<span class="sourceLineNo">110</span>      new byte[][][] { new byte[][] { Bytes.toBytes("ppp"), Bytes.toBytes("qqq") },<a name="line.110"></a>
+<span class="sourceLineNo">111</span>        new byte[][] { Bytes.toBytes("rrr"), Bytes.toBytes("sss") }, },<a name="line.111"></a>
+<span class="sourceLineNo">112</span>      true, false, true, NB_ROWS_IN_BATCH * 2 + actual, NB_ROWS2);<a name="line.112"></a>
+<span class="sourceLineNo">113</span><a name="line.113"></a>
+<span class="sourceLineNo">114</span>    // #5 - incremental backup for table1<a name="line.114"></a>
+<span class="sourceLineNo">115</span>    tables = Lists.newArrayList(table1);<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    request = createBackupRequest(BackupType.INCREMENTAL, tables, BACKUP_ROOT_DIR);<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    String backupIdIncMultiple1 = client.backupTables(request);<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    assertTrue(checkSucceeded(backupIdIncMultiple1));<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    // Delete all data in table1<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    TEST_UTIL.deleteTableData(table1);<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    // #5.1 - check tables for full restore */<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    HBaseAdmin hAdmin = TEST_UTIL.getHBaseAdmin();<a name="line.122"></a>
+<span class="sourceLineNo">123</span><a name="line.123"></a>
+<span class="sourceLineNo">124</span>    // #6 - restore incremental backup for table1<a name="line.124"></a>
+<span class="sourceLineNo">125</span>    TableName[] tablesRestoreIncMultiple = new TableName[] { table1 };<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    //TableName[] tablesMapIncMultiple = new TableName[] { table1_restore };<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    client.restore(BackupUtils.createRestoreRequest(BACKUP_ROOT_DIR, backupIdIncMultiple1,<a name="line.127"></a>
+<span class="sourceLineNo">128</span>      false, tablesRestoreIncMultiple, tablesRestoreIncMultiple, true));<a name="line.128"></a>
 <span class="sourceLineNo">129</span><a name="line.129"></a>
-<span class="sourceLineNo">130</span>    // #5 - incremental backup for table1<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    tables = Lists.newArrayList(table1);<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    request = createBackupRequest(BackupType.INCREMENTAL, tables, BACKUP_ROOT_DIR);<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    String backupIdIncMultiple1 = client.backupTables(request);<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    assertTrue(checkSucceeded(backupIdIncMultiple1));<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    // Delete all data in table1<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    TEST_UTIL.deleteTableData(table1);<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    // #5.1 - check tables for full restore */<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    HBaseAdmin hAdmin = TEST_UTIL.getHBaseAdmin();<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>    // #6 - restore incremental backup for table1<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    TableName[] tablesRestoreIncMultiple = new TableName[] { table1 };<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    //TableName[] tablesMapIncMultiple = new TableName[] { table1_restore };<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    client.restore(BackupUtils.createRestoreRequest(BACKUP_ROOT_DIR, backupIdIncMultiple1,<a name="line.143"></a>
-<span class="sourceLineNo">144</span>      false, tablesRestoreIncMultiple, tablesRestoreIncMultiple, true));<a name="line.144"></a>
-<span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>    HTable hTable = (HTable) conn.getTable(table1);<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    Assert.assertEquals(TEST_UTIL.countRows(hTable), NB_ROWS_IN_BATCH * 2 + actual + actual1);<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    request = createBackupRequest(BackupType.FULL, tables, BACKUP_ROOT_DIR);<a name="line.148"></a>
-<span class="sourceLineNo">149</span><a name="line.149"></a>
-<span class="sourceLineNo">150</span>    backupIdFull = client.backupTables(request);<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    try (final BackupSystemTable table = new BackupSystemTable(conn)) {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      Pair&lt;Map&lt;TableName, Map&lt;String, Map&lt;String, List&lt;Pair&lt;String, Boolean&gt;&gt;&gt;&gt;&gt;, List&lt;byte[]&gt;&gt; pair<a name="line.152"></a>
-<span class="sourceLineNo">153</span>        = table.readBulkloadRows(tables);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>      assertTrue("map still has " + pair.getSecond().size() + " entries",<a name="line.154"></a>
-<span class="sourceLineNo">155</span>          pair.getSecond().isEmpty());<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    }<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    assertTrue(checkSucceeded(backupIdFull));<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>    hTable.close();<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    admin.close();<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    conn.close();<a name="line.161"></a>
-<span class="sourceLineNo">162</span>  }<a name="line.162"></a>
-<span class="sourceLineNo">163</span>}<a name="line.163"></a>
+<span class="sourceLineNo">130</span>    HTable hTable = (HTable) conn.getTable(table1);<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    Assert.assertEquals(TEST_UTIL.countRows(hTable), NB_ROWS_IN_BATCH * 2 + actual + actual1);<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    request = createBackupRequest(BackupType.FULL, tables, BACKUP_ROOT_DIR);<a name="line.132"></a>
+<span class="sourceLineNo">133</span><a name="line.133"></a>
+<span class="sourceLineNo">134</span>    backupIdFull = client.backupTables(request);<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    try (final BackupSystemTable table = new BackupSystemTable(conn)) {<a name="line.135"></a>
+<span class="sourceLineNo">136</span>      Pair&lt;Map&lt;TableName, Map&lt;String, Map&lt;String, List&lt;Pair&lt;String, Boolean&gt;&gt;&gt;&gt;&gt;, List&lt;byte[]&gt;&gt; pair<a name="line.136"></a>
+<span class="sourceLineNo">137</span>        = table.readBulkloadRows(tables);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>      assertTrue("map still has " + pair.getSecond().size() + " entries",<a name="line.138"></a>
+<span class="sourceLineNo">139</span>          pair.getSecond().isEmpty());<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    }<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    assertTrue(checkSucceeded(backupIdFull));<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>    hTable.close();<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    admin.close();<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    conn.close();<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>
 
 
 


[14/44] hbase-site git commit: Published site at 8e6ff689e806138e602a46730886d8c5f524fdcd.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html
index 418c60c..7cf23c4 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html
@@ -64,2689 +64,2710 @@
 <span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.AsyncConnection;<a name="line.56"></a>
 <span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.AsyncTable;<a name="line.57"></a>
 <span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.BufferedMutator;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Get;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Put;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Result;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.111"></a>
-<span class="sourceLineNo">112</span><a name="line.112"></a>
-<span class="sourceLineNo">113</span>/**<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
-<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
-<span class="sourceLineNo">119</span> *<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
-<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
-<span class="sourceLineNo">124</span> *<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
-<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
-<span class="sourceLineNo">129</span> */<a name="line.129"></a>
-<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
-<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
-<span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // TODO : should we make this configurable<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private static final int TAG_LENGTH = 256;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  static {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        "Run async random read test");<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        "Run async random write test");<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.164"></a>
-<span class="sourceLineNo">165</span>        "Run async sequential read test");<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        "Run async sequential write test");<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        "Run async scan test (read every row)");<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      "Run random read test");<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      "Run random seek and scan 100 test");<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      "Run random write test");<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      "Run sequential read test");<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      "Run sequential write test");<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      "Run scan test (read every row)");<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "(make sure to use --rows=20)");<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  }<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * inner-class so we can find associated properties.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   */<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  protected static enum Counter {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    /** elapsed time */<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    ELAPSED_TIME,<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    /** number of rows */<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    public RunResult(long duration, Histogram hist) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      this.duration = duration;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.hist = hist;<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>    public final long duration;<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final Histogram hist;<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>    @Override<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    public String toString() {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      return Long.toString(duration);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>    @Override public int compareTo(RunResult o) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      return Long.compare(this.duration, o.duration);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
-<span class="sourceLineNo">234</span><a name="line.234"></a>
-<span class="sourceLineNo">235</span>  /**<a name="line.235"></a>
-<span class="sourceLineNo">236</span>   * Constructor<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * @param conf Configuration object<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   */<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    super(conf);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      String name, String description) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  /**<a name="line.249"></a>
-<span class="sourceLineNo">250</span>   * Implementations can have their status set.<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   */<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  interface Status {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    /**<a name="line.253"></a>
-<span class="sourceLineNo">254</span>     * Sets status<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * @param msg status message<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @throws IOException<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     */<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    void setStatus(final String msg) throws IOException;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  }<a name="line.259"></a>
-<span class="sourceLineNo">260</span><a name="line.260"></a>
-<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   */<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  public static class EvaluationMapTask<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>    /** configuration parameter name that contains the command */<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the PE impl */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>    @Override<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>      // this is required so that extensions of PE are instantiated within the<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // map reduce task...<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      try {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      } catch (Exception e) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      try {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        return Class.forName(className).asSubclass(type);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      } catch (ClassNotFoundException e) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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>    @Override<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.298"></a>
-<span class="sourceLineNo">299</span>           throws IOException, InterruptedException {<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>      Status status = new Status() {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        @Override<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        public void setStatus(String msg) {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>           context.setStatus(msg);<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><a name="line.307"></a>
-<span class="sourceLineNo">308</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      AsyncConnection asyncCon = null;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      try {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      } catch (ExecutionException e) {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>        throw new IOException(e);<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>      // Evaluation task<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      // Collect how much time the thing took. Report as map output and<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // to the ELAPSED_TIME counter.<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.progress();<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    }<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>  /*<a name="line.330"></a>
-<span class="sourceLineNo">331</span>   * If table does not already exist, create. Also create a table when<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   */<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      throw new IllegalStateException(<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    HTableDescriptor desc =<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    byte[][] splits = getSplits(opts);<a name="line.346"></a>
-<span class="sourceLineNo">347</span><a name="line.347"></a>
-<span class="sourceLineNo">348</span>    // recreate the table when user has requested presplit or when existing<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      needsDelete = true;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      // wait, why did it delete my table?!?<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        .add("needsDelete", needsDelete)<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("isReadCmd", isReadCmd)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("exists", exists)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("desc", desc)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("presplit", opts.presplitRegions)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("replicas", opts.replicas)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .toString());<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>    // remove an existing table<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    if (needsDelete) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      if (admin.isTableEnabled(tableName)) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        admin.disableTable(tableName);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      admin.deleteTable(tableName);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>    // table creation is necessary<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    if (!exists || needsDelete) {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      desc = getTableDescriptor(opts);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      if (splits != null) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        if (LOG.isDebugEnabled()) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<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>      admin.createTable(desc, splits);<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      LOG.info("Table " + desc + " created");<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    return admin.tableExists(tableName);<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>  /**<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setCompressionType(opts.compression);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setBloomFilterType(opts.bloomType);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBlocksize(opts.blockSize);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    if (opts.inMemoryCF) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      family.setInMemory(true);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    desc.addFamily(family);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      desc.setRegionReplication(opts.replicas);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    return desc;<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>  /**<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   * generates splits based on total number of rows and specified split regions<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   */<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      int rowkey = jump * (1 + i);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      splits[i] = format(rowkey);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return splits;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  }<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  /*<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * Run all clients in this vm each to its own thread.<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   */<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    assert cmd != null;<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    @SuppressWarnings("unchecked")<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      final int index = i;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        @Override<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        public RunResult call() throws Exception {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>            @Override<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            public void setStatus(final String msg) throws IOException {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>              LOG.info(msg);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>          });<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.459"></a>
-<span class="sourceLineNo">460</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          return run;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      });<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    }<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    pool.shutdown();<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      try {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        results[i] = threads[i].get();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      } catch (ExecutionException e) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>        throw new IOException(e.getCause());<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    final String test = cmd.getSimpleName();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.475"></a>
-<span class="sourceLineNo">476</span>             + Arrays.toString(results));<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    Arrays.sort(results);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    long total = 0;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    for (RunResult result : results) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      total += result.duration;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    LOG.info("[" + test + "]"<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      + "\tMin: " + results[0] + "ms"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.485"></a>
-<span class="sourceLineNo">486</span><a name="line.486"></a>
-<span class="sourceLineNo">487</span>    con.close();<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    asyncCon.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    return results;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  /*<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Before we start up the job, write out an input file with instruction<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * per client regards which row they are to start on.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * @param cmd Command to run.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @throws IOException<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   */<a name="line.499"></a>
-<span class="sourceLineNo">500</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    assert cmd != null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    Job job = Job.getInstance(conf);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.509"></a>
-<span class="sourceLineNo">510</span><a name="line.510"></a>
-<span class="sourceLineNo">511</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    // this is default, but be explicit about it just in case.<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.514"></a>
-<span class="sourceLineNo">515</span><a name="line.515"></a>
-<span class="sourceLineNo">516</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputValueClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setReducerClass(LongSumReducer.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>    job.setNumReduceTasks(1);<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      Histogram.class,     // yammer metrics<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      );<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>    TableMapReduceUtil.initCredentials(job);<a name="line.534"></a>
-<span class="sourceLineNo">535</span><a name="line.535"></a>
-<span class="sourceLineNo">536</span>    job.waitForCompletion(true);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    return job;<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>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<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>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>  /*<a name="line.546"></a>
-<span class="sourceLineNo">547</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * @param c Configuration<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<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>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    return writeInputFile(c, opts, new Path("."));<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.556"></a>
-<span class="sourceLineNo">557</span>  throws IOException {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>    FileSystem fs = FileSystem.get(c);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    fs.mkdirs(inputDir);<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    // Make input random.<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Hash h = MurmurHash.getInstance();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    try {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>        TestOptions next = new TestOptions(opts);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        next.startRow = j * perClientRows;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.perClientRunRows = perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        String s = MAPPER.writeValueAsString(next);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        byte[] b = Bytes.toBytes(s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        m.put(hash, s);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>        out.println(e.getValue());<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    } finally {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      out.close();<a name="line.586"></a>
-<span class="sourceLineNo">587</span>    }<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    return inputDir;<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>   * Describes a command.<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   */<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  static class CmdDescriptor {<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private String name;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String description;<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      this.cmdClass = cmdClass;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.name = name;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.description = description;<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>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>      return cmdClass;<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>    public String getName() {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>      return name;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    public String getDescription() {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>      return description;<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><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * This makes tracking all these arguments a little easier.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>  static class TestOptions {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    String cmdName = null;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    boolean nomapred = false;<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    boolean filterAll = false;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    int startRow = 0;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    float size = 1.0f;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    int perClientRunRows = DEFAULT_ROWS_PER_GB;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    int numClientThreads = 1;<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    int totalRows = DEFAULT_ROWS_PER_GB;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    int measureAfter = 0;<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    float sampleRate = 1.0f;<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    double traceRate = 0.0;<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    String tableName = TABLE_NAME;<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    boolean flushCommits = true;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    boolean writeToWAL = true;<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    boolean autoFlush = false;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    boolean oneCon = false;<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    boolean useTags = false;<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    int noOfTags = 1;<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    boolean reportLatency = false;<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    int multiGet = 0;<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    int randomSleep = 0;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    boolean inMemoryCF = false;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    int presplitRegions = 0;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    int replicas = HTableDescriptor.DEFAULT_REGION_REPLICATION;<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    String splitPolicy = null;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    Compression.Algorithm compression = Compression.Algorithm.NONE;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    BloomType bloomType = BloomType.ROW;<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    int blockSize = HConstants.DEFAULT_BLOCKSIZE;<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    DataBlockEncoding blockEncoding = DataBlockEncoding.NONE;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    boolean valueRandom = false;<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    boolean valueZipf = false;<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    int valueSize = DEFAULT_VALUE_LENGTH;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    int period = (this.perClientRunRows / 10) == 0? perClientRunRows: perClientRunRows / 10;<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    int cycles = 1;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    int columns = 1;<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    int caching = 30;<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    boolean addColumns = true;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    MemoryCompactionPolicy inMemoryCompaction =<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        MemoryCompactionPolicy.valueOf(<a name="line.664"></a>
-<span class="sourceLineNo">665</span>            CompactingMemStore.COMPACTING_MEMSTORE_TYPE_DEFAULT);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    boolean asyncPrefetch = false;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    boolean cacheBlocks = true;<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    Scan.ReadType scanReadType = Scan.ReadType.DEFAULT;<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>    public TestOptions() {}<a name="line.670"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.BufferedMutatorParams;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Get;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Put;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.Result;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.Table;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.LongWritable;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.io.Text;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Job;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.Tool;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.hadoop.util.ToolRunner;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.Sampler;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.htrace.core.TraceScope;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.Logger;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.slf4j.LoggerFactory;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * command-line which test to run and how many clients are participating in<a name="line.118"></a>
+<span class="sourceLineNo">119</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.119"></a>
+<span class="sourceLineNo">120</span> *<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.123"></a>
+<span class="sourceLineNo">124</span> * paper, pages 8-10.<a name="line.124"></a>
+<span class="sourceLineNo">125</span> *<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.128"></a>
+<span class="sourceLineNo">129</span> * specified otherwise.<a name="line.129"></a>
+<span class="sourceLineNo">130</span> */<a name="line.130"></a>
+<span class="sourceLineNo">131</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.131"></a>
+<span class="sourceLineNo">132</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  static final String RANDOM_READ = "randomRead";<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  static {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  }<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
+<span class="sourceLineNo">156</span><a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
+<span class="sourceLineNo">243</span><a name="line.243"></a>
+<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
+<span class="sourceLineNo">249</span><a name="line.249"></a>
+<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
+<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
+<span class="sourceLineNo">261</span><a name="line.261"></a>
+<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
+<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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><a name="line.297"></a>
+<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
+<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        }<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>      ObjectMapp

<TRUNCATED>

[20/44] hbase-site git commit: Published site at 8e6ff689e806138e602a46730886d8c5f524fdcd.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.IncrementTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.IncrementTest.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.IncrementTest.html
index 418c60c..7cf23c4 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.IncrementTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.IncrementTest.html
@@ -64,2689 +64,2710 @@
 <span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.AsyncConnection;<a name="line.56"></a>
 <span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.AsyncTable;<a name="line.57"></a>
 <span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.BufferedMutator;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Get;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Put;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Result;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.111"></a>
-<span class="sourceLineNo">112</span><a name="line.112"></a>
-<span class="sourceLineNo">113</span>/**<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
-<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
-<span class="sourceLineNo">119</span> *<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
-<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
-<span class="sourceLineNo">124</span> *<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
-<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
-<span class="sourceLineNo">129</span> */<a name="line.129"></a>
-<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
-<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
-<span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // TODO : should we make this configurable<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private static final int TAG_LENGTH = 256;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  static {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        "Run async random read test");<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        "Run async random write test");<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.164"></a>
-<span class="sourceLineNo">165</span>        "Run async sequential read test");<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        "Run async sequential write test");<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        "Run async scan test (read every row)");<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      "Run random read test");<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      "Run random seek and scan 100 test");<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      "Run random write test");<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      "Run sequential read test");<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      "Run sequential write test");<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      "Run scan test (read every row)");<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "(make sure to use --rows=20)");<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  }<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * inner-class so we can find associated properties.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   */<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  protected static enum Counter {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    /** elapsed time */<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    ELAPSED_TIME,<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    /** number of rows */<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    public RunResult(long duration, Histogram hist) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      this.duration = duration;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.hist = hist;<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>    public final long duration;<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final Histogram hist;<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>    @Override<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    public String toString() {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      return Long.toString(duration);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>    @Override public int compareTo(RunResult o) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      return Long.compare(this.duration, o.duration);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
-<span class="sourceLineNo">234</span><a name="line.234"></a>
-<span class="sourceLineNo">235</span>  /**<a name="line.235"></a>
-<span class="sourceLineNo">236</span>   * Constructor<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * @param conf Configuration object<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   */<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    super(conf);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      String name, String description) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  /**<a name="line.249"></a>
-<span class="sourceLineNo">250</span>   * Implementations can have their status set.<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   */<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  interface Status {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    /**<a name="line.253"></a>
-<span class="sourceLineNo">254</span>     * Sets status<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * @param msg status message<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @throws IOException<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     */<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    void setStatus(final String msg) throws IOException;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  }<a name="line.259"></a>
-<span class="sourceLineNo">260</span><a name="line.260"></a>
-<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   */<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  public static class EvaluationMapTask<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>    /** configuration parameter name that contains the command */<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the PE impl */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>    @Override<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>      // this is required so that extensions of PE are instantiated within the<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // map reduce task...<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      try {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      } catch (Exception e) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      try {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        return Class.forName(className).asSubclass(type);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      } catch (ClassNotFoundException e) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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>    @Override<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.298"></a>
-<span class="sourceLineNo">299</span>           throws IOException, InterruptedException {<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>      Status status = new Status() {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        @Override<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        public void setStatus(String msg) {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>           context.setStatus(msg);<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><a name="line.307"></a>
-<span class="sourceLineNo">308</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      AsyncConnection asyncCon = null;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      try {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      } catch (ExecutionException e) {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>        throw new IOException(e);<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>      // Evaluation task<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      // Collect how much time the thing took. Report as map output and<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // to the ELAPSED_TIME counter.<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.progress();<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    }<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>  /*<a name="line.330"></a>
-<span class="sourceLineNo">331</span>   * If table does not already exist, create. Also create a table when<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   */<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      throw new IllegalStateException(<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    HTableDescriptor desc =<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    byte[][] splits = getSplits(opts);<a name="line.346"></a>
-<span class="sourceLineNo">347</span><a name="line.347"></a>
-<span class="sourceLineNo">348</span>    // recreate the table when user has requested presplit or when existing<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      needsDelete = true;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      // wait, why did it delete my table?!?<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        .add("needsDelete", needsDelete)<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("isReadCmd", isReadCmd)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("exists", exists)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("desc", desc)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("presplit", opts.presplitRegions)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("replicas", opts.replicas)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .toString());<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>    // remove an existing table<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    if (needsDelete) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      if (admin.isTableEnabled(tableName)) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        admin.disableTable(tableName);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      admin.deleteTable(tableName);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>    // table creation is necessary<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    if (!exists || needsDelete) {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      desc = getTableDescriptor(opts);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      if (splits != null) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        if (LOG.isDebugEnabled()) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<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>      admin.createTable(desc, splits);<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      LOG.info("Table " + desc + " created");<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    return admin.tableExists(tableName);<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>  /**<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setCompressionType(opts.compression);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setBloomFilterType(opts.bloomType);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBlocksize(opts.blockSize);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    if (opts.inMemoryCF) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      family.setInMemory(true);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    desc.addFamily(family);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      desc.setRegionReplication(opts.replicas);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    return desc;<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>  /**<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   * generates splits based on total number of rows and specified split regions<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   */<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      int rowkey = jump * (1 + i);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      splits[i] = format(rowkey);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return splits;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  }<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  /*<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * Run all clients in this vm each to its own thread.<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   */<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    assert cmd != null;<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    @SuppressWarnings("unchecked")<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      final int index = i;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        @Override<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        public RunResult call() throws Exception {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>            @Override<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            public void setStatus(final String msg) throws IOException {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>              LOG.info(msg);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>          });<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.459"></a>
-<span class="sourceLineNo">460</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          return run;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      });<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    }<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    pool.shutdown();<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      try {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        results[i] = threads[i].get();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      } catch (ExecutionException e) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>        throw new IOException(e.getCause());<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    final String test = cmd.getSimpleName();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.475"></a>
-<span class="sourceLineNo">476</span>             + Arrays.toString(results));<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    Arrays.sort(results);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    long total = 0;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    for (RunResult result : results) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      total += result.duration;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    LOG.info("[" + test + "]"<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      + "\tMin: " + results[0] + "ms"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.485"></a>
-<span class="sourceLineNo">486</span><a name="line.486"></a>
-<span class="sourceLineNo">487</span>    con.close();<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    asyncCon.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    return results;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  /*<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Before we start up the job, write out an input file with instruction<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * per client regards which row they are to start on.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * @param cmd Command to run.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @throws IOException<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   */<a name="line.499"></a>
-<span class="sourceLineNo">500</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    assert cmd != null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    Job job = Job.getInstance(conf);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.509"></a>
-<span class="sourceLineNo">510</span><a name="line.510"></a>
-<span class="sourceLineNo">511</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    // this is default, but be explicit about it just in case.<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.514"></a>
-<span class="sourceLineNo">515</span><a name="line.515"></a>
-<span class="sourceLineNo">516</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputValueClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setReducerClass(LongSumReducer.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>    job.setNumReduceTasks(1);<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      Histogram.class,     // yammer metrics<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      );<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>    TableMapReduceUtil.initCredentials(job);<a name="line.534"></a>
-<span class="sourceLineNo">535</span><a name="line.535"></a>
-<span class="sourceLineNo">536</span>    job.waitForCompletion(true);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    return job;<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>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<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>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>  /*<a name="line.546"></a>
-<span class="sourceLineNo">547</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * @param c Configuration<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<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>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    return writeInputFile(c, opts, new Path("."));<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.556"></a>
-<span class="sourceLineNo">557</span>  throws IOException {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>    FileSystem fs = FileSystem.get(c);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    fs.mkdirs(inputDir);<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    // Make input random.<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Hash h = MurmurHash.getInstance();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    try {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>        TestOptions next = new TestOptions(opts);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        next.startRow = j * perClientRows;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.perClientRunRows = perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        String s = MAPPER.writeValueAsString(next);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        byte[] b = Bytes.toBytes(s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        m.put(hash, s);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>        out.println(e.getValue());<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    } finally {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      out.close();<a name="line.586"></a>
-<span class="sourceLineNo">587</span>    }<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    return inputDir;<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>   * Describes a command.<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   */<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  static class CmdDescriptor {<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private String name;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String description;<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      this.cmdClass = cmdClass;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.name = name;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.description = description;<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>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>      return cmdClass;<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>    public String getName() {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>      return name;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    public String getDescription() {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>      return description;<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><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * This makes tracking all these arguments a little easier.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>  static class TestOptions {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    String cmdName = null;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    boolean nomapred = false;<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    boolean filterAll = false;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    int startRow = 0;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    float size = 1.0f;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    int perClientRunRows = DEFAULT_ROWS_PER_GB;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    int numClientThreads = 1;<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    int totalRows = DEFAULT_ROWS_PER_GB;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    int measureAfter = 0;<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    float sampleRate = 1.0f;<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    double traceRate = 0.0;<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    String tableName = TABLE_NAME;<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    boolean flushCommits = true;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    boolean writeToWAL = true;<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    boolean autoFlush = false;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    boolean oneCon = false;<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    boolean useTags = false;<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    int noOfTags = 1;<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    boolean reportLatency = false;<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    int multiGet = 0;<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    int randomSleep = 0;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    boolean inMemoryCF = false;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    int presplitRegions = 0;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    int replicas = HTableDescriptor.DEFAULT_REGION_REPLICATION;<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    String splitPolicy = null;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    Compression.Algorithm compression = Compression.Algorithm.NONE;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    BloomType bloomType = BloomType.ROW;<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    int blockSize = HConstants.DEFAULT_BLOCKSIZE;<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    DataBlockEncoding blockEncoding = DataBlockEncoding.NONE;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    boolean valueRandom = false;<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    boolean valueZipf = false;<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    int valueSize = DEFAULT_VALUE_LENGTH;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    int period = (this.perClientRunRows / 10) == 0? perClientRunRows: perClientRunRows / 10;<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    int cycles = 1;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    int columns = 1;<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    int caching = 30;<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    boolean addColumns = true;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    MemoryCompactionPolicy inMemoryCompaction =<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        MemoryCompactionPolicy.valueOf(<a name="line.664"></a>
-<span class="sourceLineNo">665</span>            CompactingMemStore.COMPACTING_MEMSTORE_TYPE_DEFAULT);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    boolean asyncPrefetch = false;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    boolean cacheBlocks = true;<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    Scan.ReadType scanReadType = Scan.ReadType.DEFAULT;<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>    public TestOptions() {}<a name="line.670"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.BufferedMutatorParams;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Get;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Put;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.Result;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.Table;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.LongWritable;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.io.Text;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Job;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.Tool;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.hadoop.util.ToolRunner;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.Sampler;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.htrace.core.TraceScope;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.Logger;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.slf4j.LoggerFactory;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * command-line which test to run and how many clients are participating in<a name="line.118"></a>
+<span class="sourceLineNo">119</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.119"></a>
+<span class="sourceLineNo">120</span> *<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.123"></a>
+<span class="sourceLineNo">124</span> * paper, pages 8-10.<a name="line.124"></a>
+<span class="sourceLineNo">125</span> *<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.128"></a>
+<span class="sourceLineNo">129</span> * specified otherwise.<a name="line.129"></a>
+<span class="sourceLineNo">130</span> */<a name="line.130"></a>
+<span class="sourceLineNo">131</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.131"></a>
+<span class="sourceLineNo">132</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  static final String RANDOM_READ = "randomRead";<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  static {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  }<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
+<span class="sourceLineNo">156</span><a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
+<span class="sourceLineNo">243</span><a name="line.243"></a>
+<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
+<span class="sourceLineNo">249</span><a name="line.249"></a>
+<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
+<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
+<span class="sourceLineNo">261</span><a name="line.261"></a>
+<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
+<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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><a name="line.297"></a>
+<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
+<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        }<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>      ObjectMapper mapper = new ObjectMapper();<a name="line.309">

<TRUNCATED>

[03/44] hbase-site git commit: Published site at 8e6ff689e806138e602a46730886d8c5f524fdcd.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html
index 418c60c..7cf23c4 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html
@@ -64,2689 +64,2710 @@
 <span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.AsyncConnection;<a name="line.56"></a>
 <span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.AsyncTable;<a name="line.57"></a>
 <span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.BufferedMutator;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Get;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Put;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Result;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.111"></a>
-<span class="sourceLineNo">112</span><a name="line.112"></a>
-<span class="sourceLineNo">113</span>/**<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
-<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
-<span class="sourceLineNo">119</span> *<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
-<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
-<span class="sourceLineNo">124</span> *<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
-<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
-<span class="sourceLineNo">129</span> */<a name="line.129"></a>
-<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
-<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
-<span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // TODO : should we make this configurable<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private static final int TAG_LENGTH = 256;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  static {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        "Run async random read test");<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        "Run async random write test");<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.164"></a>
-<span class="sourceLineNo">165</span>        "Run async sequential read test");<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        "Run async sequential write test");<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        "Run async scan test (read every row)");<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      "Run random read test");<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      "Run random seek and scan 100 test");<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      "Run random write test");<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      "Run sequential read test");<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      "Run sequential write test");<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      "Run scan test (read every row)");<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "(make sure to use --rows=20)");<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  }<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * inner-class so we can find associated properties.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   */<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  protected static enum Counter {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    /** elapsed time */<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    ELAPSED_TIME,<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    /** number of rows */<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    public RunResult(long duration, Histogram hist) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      this.duration = duration;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.hist = hist;<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>    public final long duration;<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final Histogram hist;<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>    @Override<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    public String toString() {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      return Long.toString(duration);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>    @Override public int compareTo(RunResult o) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      return Long.compare(this.duration, o.duration);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
-<span class="sourceLineNo">234</span><a name="line.234"></a>
-<span class="sourceLineNo">235</span>  /**<a name="line.235"></a>
-<span class="sourceLineNo">236</span>   * Constructor<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * @param conf Configuration object<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   */<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    super(conf);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      String name, String description) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  /**<a name="line.249"></a>
-<span class="sourceLineNo">250</span>   * Implementations can have their status set.<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   */<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  interface Status {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    /**<a name="line.253"></a>
-<span class="sourceLineNo">254</span>     * Sets status<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * @param msg status message<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @throws IOException<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     */<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    void setStatus(final String msg) throws IOException;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  }<a name="line.259"></a>
-<span class="sourceLineNo">260</span><a name="line.260"></a>
-<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   */<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  public static class EvaluationMapTask<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>    /** configuration parameter name that contains the command */<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the PE impl */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>    @Override<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>      // this is required so that extensions of PE are instantiated within the<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // map reduce task...<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      try {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      } catch (Exception e) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      try {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        return Class.forName(className).asSubclass(type);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      } catch (ClassNotFoundException e) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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>    @Override<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.298"></a>
-<span class="sourceLineNo">299</span>           throws IOException, InterruptedException {<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>      Status status = new Status() {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        @Override<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        public void setStatus(String msg) {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>           context.setStatus(msg);<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><a name="line.307"></a>
-<span class="sourceLineNo">308</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      AsyncConnection asyncCon = null;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      try {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      } catch (ExecutionException e) {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>        throw new IOException(e);<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>      // Evaluation task<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      // Collect how much time the thing took. Report as map output and<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // to the ELAPSED_TIME counter.<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.progress();<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    }<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>  /*<a name="line.330"></a>
-<span class="sourceLineNo">331</span>   * If table does not already exist, create. Also create a table when<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   */<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      throw new IllegalStateException(<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    HTableDescriptor desc =<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    byte[][] splits = getSplits(opts);<a name="line.346"></a>
-<span class="sourceLineNo">347</span><a name="line.347"></a>
-<span class="sourceLineNo">348</span>    // recreate the table when user has requested presplit or when existing<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      needsDelete = true;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      // wait, why did it delete my table?!?<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        .add("needsDelete", needsDelete)<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("isReadCmd", isReadCmd)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("exists", exists)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("desc", desc)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("presplit", opts.presplitRegions)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("replicas", opts.replicas)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .toString());<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>    // remove an existing table<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    if (needsDelete) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      if (admin.isTableEnabled(tableName)) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        admin.disableTable(tableName);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      admin.deleteTable(tableName);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>    // table creation is necessary<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    if (!exists || needsDelete) {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      desc = getTableDescriptor(opts);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      if (splits != null) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        if (LOG.isDebugEnabled()) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<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>      admin.createTable(desc, splits);<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      LOG.info("Table " + desc + " created");<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    return admin.tableExists(tableName);<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>  /**<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setCompressionType(opts.compression);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setBloomFilterType(opts.bloomType);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBlocksize(opts.blockSize);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    if (opts.inMemoryCF) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      family.setInMemory(true);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    desc.addFamily(family);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      desc.setRegionReplication(opts.replicas);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    return desc;<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>  /**<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   * generates splits based on total number of rows and specified split regions<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   */<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      int rowkey = jump * (1 + i);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      splits[i] = format(rowkey);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return splits;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  }<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  /*<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * Run all clients in this vm each to its own thread.<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   */<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    assert cmd != null;<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    @SuppressWarnings("unchecked")<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      final int index = i;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        @Override<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        public RunResult call() throws Exception {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>            @Override<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            public void setStatus(final String msg) throws IOException {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>              LOG.info(msg);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>          });<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.459"></a>
-<span class="sourceLineNo">460</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          return run;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      });<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    }<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    pool.shutdown();<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      try {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        results[i] = threads[i].get();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      } catch (ExecutionException e) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>        throw new IOException(e.getCause());<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    final String test = cmd.getSimpleName();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.475"></a>
-<span class="sourceLineNo">476</span>             + Arrays.toString(results));<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    Arrays.sort(results);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    long total = 0;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    for (RunResult result : results) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      total += result.duration;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    LOG.info("[" + test + "]"<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      + "\tMin: " + results[0] + "ms"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.485"></a>
-<span class="sourceLineNo">486</span><a name="line.486"></a>
-<span class="sourceLineNo">487</span>    con.close();<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    asyncCon.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    return results;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  /*<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Before we start up the job, write out an input file with instruction<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * per client regards which row they are to start on.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * @param cmd Command to run.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @throws IOException<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   */<a name="line.499"></a>
-<span class="sourceLineNo">500</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    assert cmd != null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    Job job = Job.getInstance(conf);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.509"></a>
-<span class="sourceLineNo">510</span><a name="line.510"></a>
-<span class="sourceLineNo">511</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    // this is default, but be explicit about it just in case.<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.514"></a>
-<span class="sourceLineNo">515</span><a name="line.515"></a>
-<span class="sourceLineNo">516</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputValueClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setReducerClass(LongSumReducer.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>    job.setNumReduceTasks(1);<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      Histogram.class,     // yammer metrics<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      );<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>    TableMapReduceUtil.initCredentials(job);<a name="line.534"></a>
-<span class="sourceLineNo">535</span><a name="line.535"></a>
-<span class="sourceLineNo">536</span>    job.waitForCompletion(true);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    return job;<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>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<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>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>  /*<a name="line.546"></a>
-<span class="sourceLineNo">547</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * @param c Configuration<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<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>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    return writeInputFile(c, opts, new Path("."));<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.556"></a>
-<span class="sourceLineNo">557</span>  throws IOException {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>    FileSystem fs = FileSystem.get(c);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    fs.mkdirs(inputDir);<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    // Make input random.<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Hash h = MurmurHash.getInstance();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    try {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>        TestOptions next = new TestOptions(opts);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        next.startRow = j * perClientRows;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.perClientRunRows = perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        String s = MAPPER.writeValueAsString(next);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        byte[] b = Bytes.toBytes(s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        m.put(hash, s);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>        out.println(e.getValue());<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    } finally {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      out.close();<a name="line.586"></a>
-<span class="sourceLineNo">587</span>    }<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    return inputDir;<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>   * Describes a command.<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   */<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  static class CmdDescriptor {<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private String name;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String description;<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      this.cmdClass = cmdClass;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.name = name;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.description = description;<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>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>      return cmdClass;<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>    public String getName() {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>      return name;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    public String getDescription() {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>      return description;<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><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * This makes tracking all these arguments a little easier.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>  static class TestOptions {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    String cmdName = null;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    boolean nomapred = false;<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    boolean filterAll = false;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    int startRow = 0;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    float size = 1.0f;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    int perClientRunRows = DEFAULT_ROWS_PER_GB;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    int numClientThreads = 1;<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    int totalRows = DEFAULT_ROWS_PER_GB;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    int measureAfter = 0;<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    float sampleRate = 1.0f;<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    double traceRate = 0.0;<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    String tableName = TABLE_NAME;<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    boolean flushCommits = true;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    boolean writeToWAL = true;<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    boolean autoFlush = false;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    boolean oneCon = false;<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    boolean useTags = false;<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    int noOfTags = 1;<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    boolean reportLatency = false;<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    int multiGet = 0;<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    int randomSleep = 0;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    boolean inMemoryCF = false;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    int presplitRegions = 0;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    int replicas = HTableDescriptor.DEFAULT_REGION_REPLICATION;<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    String splitPolicy = null;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    Compression.Algorithm compression = Compression.Algorithm.NONE;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    BloomType bloomType = BloomType.ROW;<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    int blockSize = HConstants.DEFAULT_BLOCKSIZE;<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    DataBlockEncoding blockEncoding = DataBlockEncoding.NONE;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    boolean valueRandom = false;<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    boolean valueZipf = false;<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    int valueSize = DEFAULT_VALUE_LENGTH;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    int period = (this.perClientRunRows / 10) == 0? perClientRunRows: perClientRunRows / 10;<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    int cycles = 1;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    int columns = 1;<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    int caching = 30;<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    boolean addColumns = true;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    MemoryCompactionPolicy inMemoryCompaction =<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        MemoryCompactionPolicy.valueOf(<a name="line.664"></a>
-<span class="sourceLineNo">665</span>            CompactingMemStore.COMPACTING_MEMSTORE_TYPE_DEFAULT);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    boolean asyncPrefetch = false;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    boolean cacheBlocks = true;<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    Scan.ReadType scanReadType = Scan.ReadType.DEFAULT;<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>    public TestOptions() {}<a name="line.670"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.BufferedMutatorParams;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Get;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Put;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.Result;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.Table;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.LongWritable;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.io.Text;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Job;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.Tool;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.hadoop.util.ToolRunner;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.Sampler;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.htrace.core.TraceScope;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.Logger;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.slf4j.LoggerFactory;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * command-line which test to run and how many clients are participating in<a name="line.118"></a>
+<span class="sourceLineNo">119</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.119"></a>
+<span class="sourceLineNo">120</span> *<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.123"></a>
+<span class="sourceLineNo">124</span> * paper, pages 8-10.<a name="line.124"></a>
+<span class="sourceLineNo">125</span> *<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.128"></a>
+<span class="sourceLineNo">129</span> * specified otherwise.<a name="line.129"></a>
+<span class="sourceLineNo">130</span> */<a name="line.130"></a>
+<span class="sourceLineNo">131</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.131"></a>
+<span class="sourceLineNo">132</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  static final String RANDOM_READ = "randomRead";<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  static {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  }<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
+<span class="sourceLineNo">156</span><a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
+<span class="sourceLineNo">243</span><a name="line.243"></a>
+<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
+<span class="sourceLineNo">249</span><a name="line.249"></a>
+<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
+<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
+<span class="sourceLineNo">261</span><a name="line.261"></a>
+<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
+<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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><a name="line.297"></a>
+<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
+<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        }<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>      ObjectMapper mapper = new ObjectMapper();<a name="line.309"></a>
+<spa

<TRUNCATED>

[34/44] hbase-site git commit: Published site at 8e6ff689e806138e602a46730886d8c5f524fdcd.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html
index 418c60c..7cf23c4 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html
@@ -64,2689 +64,2710 @@
 <span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.AsyncConnection;<a name="line.56"></a>
 <span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.AsyncTable;<a name="line.57"></a>
 <span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.BufferedMutator;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Get;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Put;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Result;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.111"></a>
-<span class="sourceLineNo">112</span><a name="line.112"></a>
-<span class="sourceLineNo">113</span>/**<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
-<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
-<span class="sourceLineNo">119</span> *<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
-<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
-<span class="sourceLineNo">124</span> *<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
-<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
-<span class="sourceLineNo">129</span> */<a name="line.129"></a>
-<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
-<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
-<span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // TODO : should we make this configurable<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private static final int TAG_LENGTH = 256;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  static {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        "Run async random read test");<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        "Run async random write test");<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.164"></a>
-<span class="sourceLineNo">165</span>        "Run async sequential read test");<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        "Run async sequential write test");<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        "Run async scan test (read every row)");<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      "Run random read test");<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      "Run random seek and scan 100 test");<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      "Run random write test");<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      "Run sequential read test");<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      "Run sequential write test");<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      "Run scan test (read every row)");<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "(make sure to use --rows=20)");<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  }<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * inner-class so we can find associated properties.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   */<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  protected static enum Counter {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    /** elapsed time */<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    ELAPSED_TIME,<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    /** number of rows */<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    public RunResult(long duration, Histogram hist) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      this.duration = duration;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.hist = hist;<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>    public final long duration;<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final Histogram hist;<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>    @Override<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    public String toString() {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      return Long.toString(duration);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>    @Override public int compareTo(RunResult o) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      return Long.compare(this.duration, o.duration);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
-<span class="sourceLineNo">234</span><a name="line.234"></a>
-<span class="sourceLineNo">235</span>  /**<a name="line.235"></a>
-<span class="sourceLineNo">236</span>   * Constructor<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * @param conf Configuration object<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   */<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    super(conf);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      String name, String description) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  /**<a name="line.249"></a>
-<span class="sourceLineNo">250</span>   * Implementations can have their status set.<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   */<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  interface Status {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    /**<a name="line.253"></a>
-<span class="sourceLineNo">254</span>     * Sets status<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * @param msg status message<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @throws IOException<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     */<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    void setStatus(final String msg) throws IOException;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  }<a name="line.259"></a>
-<span class="sourceLineNo">260</span><a name="line.260"></a>
-<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   */<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  public static class EvaluationMapTask<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>    /** configuration parameter name that contains the command */<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the PE impl */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>    @Override<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>      // this is required so that extensions of PE are instantiated within the<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // map reduce task...<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      try {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      } catch (Exception e) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      try {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        return Class.forName(className).asSubclass(type);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      } catch (ClassNotFoundException e) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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>    @Override<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.298"></a>
-<span class="sourceLineNo">299</span>           throws IOException, InterruptedException {<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>      Status status = new Status() {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        @Override<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        public void setStatus(String msg) {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>           context.setStatus(msg);<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><a name="line.307"></a>
-<span class="sourceLineNo">308</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      AsyncConnection asyncCon = null;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      try {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      } catch (ExecutionException e) {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>        throw new IOException(e);<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>      // Evaluation task<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      // Collect how much time the thing took. Report as map output and<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // to the ELAPSED_TIME counter.<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.progress();<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    }<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>  /*<a name="line.330"></a>
-<span class="sourceLineNo">331</span>   * If table does not already exist, create. Also create a table when<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   */<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      throw new IllegalStateException(<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    HTableDescriptor desc =<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    byte[][] splits = getSplits(opts);<a name="line.346"></a>
-<span class="sourceLineNo">347</span><a name="line.347"></a>
-<span class="sourceLineNo">348</span>    // recreate the table when user has requested presplit or when existing<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      needsDelete = true;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      // wait, why did it delete my table?!?<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        .add("needsDelete", needsDelete)<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("isReadCmd", isReadCmd)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("exists", exists)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("desc", desc)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("presplit", opts.presplitRegions)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("replicas", opts.replicas)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .toString());<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>    // remove an existing table<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    if (needsDelete) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      if (admin.isTableEnabled(tableName)) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        admin.disableTable(tableName);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      admin.deleteTable(tableName);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>    // table creation is necessary<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    if (!exists || needsDelete) {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      desc = getTableDescriptor(opts);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      if (splits != null) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        if (LOG.isDebugEnabled()) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<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>      admin.createTable(desc, splits);<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      LOG.info("Table " + desc + " created");<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    return admin.tableExists(tableName);<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>  /**<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setCompressionType(opts.compression);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setBloomFilterType(opts.bloomType);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBlocksize(opts.blockSize);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    if (opts.inMemoryCF) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      family.setInMemory(true);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    desc.addFamily(family);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      desc.setRegionReplication(opts.replicas);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    return desc;<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>  /**<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   * generates splits based on total number of rows and specified split regions<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   */<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      int rowkey = jump * (1 + i);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      splits[i] = format(rowkey);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return splits;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  }<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  /*<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * Run all clients in this vm each to its own thread.<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   */<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    assert cmd != null;<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    @SuppressWarnings("unchecked")<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      final int index = i;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        @Override<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        public RunResult call() throws Exception {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>            @Override<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            public void setStatus(final String msg) throws IOException {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>              LOG.info(msg);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>          });<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.459"></a>
-<span class="sourceLineNo">460</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          return run;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      });<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    }<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    pool.shutdown();<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      try {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        results[i] = threads[i].get();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      } catch (ExecutionException e) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>        throw new IOException(e.getCause());<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    final String test = cmd.getSimpleName();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.475"></a>
-<span class="sourceLineNo">476</span>             + Arrays.toString(results));<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    Arrays.sort(results);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    long total = 0;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    for (RunResult result : results) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      total += result.duration;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    LOG.info("[" + test + "]"<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      + "\tMin: " + results[0] + "ms"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.485"></a>
-<span class="sourceLineNo">486</span><a name="line.486"></a>
-<span class="sourceLineNo">487</span>    con.close();<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    asyncCon.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    return results;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  /*<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Before we start up the job, write out an input file with instruction<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * per client regards which row they are to start on.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * @param cmd Command to run.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @throws IOException<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   */<a name="line.499"></a>
-<span class="sourceLineNo">500</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    assert cmd != null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    Job job = Job.getInstance(conf);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.509"></a>
-<span class="sourceLineNo">510</span><a name="line.510"></a>
-<span class="sourceLineNo">511</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    // this is default, but be explicit about it just in case.<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.514"></a>
-<span class="sourceLineNo">515</span><a name="line.515"></a>
-<span class="sourceLineNo">516</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputValueClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setReducerClass(LongSumReducer.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>    job.setNumReduceTasks(1);<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      Histogram.class,     // yammer metrics<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      );<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>    TableMapReduceUtil.initCredentials(job);<a name="line.534"></a>
-<span class="sourceLineNo">535</span><a name="line.535"></a>
-<span class="sourceLineNo">536</span>    job.waitForCompletion(true);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    return job;<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>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<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>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>  /*<a name="line.546"></a>
-<span class="sourceLineNo">547</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * @param c Configuration<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<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>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    return writeInputFile(c, opts, new Path("."));<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.556"></a>
-<span class="sourceLineNo">557</span>  throws IOException {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>    FileSystem fs = FileSystem.get(c);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    fs.mkdirs(inputDir);<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    // Make input random.<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Hash h = MurmurHash.getInstance();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    try {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>        TestOptions next = new TestOptions(opts);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        next.startRow = j * perClientRows;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.perClientRunRows = perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        String s = MAPPER.writeValueAsString(next);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        byte[] b = Bytes.toBytes(s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        m.put(hash, s);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>        out.println(e.getValue());<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    } finally {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      out.close();<a name="line.586"></a>
-<span class="sourceLineNo">587</span>    }<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    return inputDir;<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>   * Describes a command.<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   */<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  static class CmdDescriptor {<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private String name;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String description;<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      this.cmdClass = cmdClass;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.name = name;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.description = description;<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>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>      return cmdClass;<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>    public String getName() {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>      return name;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    public String getDescription() {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>      return description;<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><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * This makes tracking all these arguments a little easier.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>  static class TestOptions {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    String cmdName = null;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    boolean nomapred = false;<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    boolean filterAll = false;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    int startRow = 0;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    float size = 1.0f;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    int perClientRunRows = DEFAULT_ROWS_PER_GB;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    int numClientThreads = 1;<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    int totalRows = DEFAULT_ROWS_PER_GB;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    int measureAfter = 0;<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    float sampleRate = 1.0f;<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    double traceRate = 0.0;<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    String tableName = TABLE_NAME;<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    boolean flushCommits = true;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    boolean writeToWAL = true;<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    boolean autoFlush = false;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    boolean oneCon = false;<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    boolean useTags = false;<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    int noOfTags = 1;<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    boolean reportLatency = false;<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    int multiGet = 0;<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    int randomSleep = 0;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    boolean inMemoryCF = false;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    int presplitRegions = 0;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    int replicas = HTableDescriptor.DEFAULT_REGION_REPLICATION;<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    String splitPolicy = null;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    Compression.Algorithm compression = Compression.Algorithm.NONE;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    BloomType bloomType = BloomType.ROW;<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    int blockSize = HConstants.DEFAULT_BLOCKSIZE;<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    DataBlockEncoding blockEncoding = DataBlockEncoding.NONE;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    boolean valueRandom = false;<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    boolean valueZipf = false;<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    int valueSize = DEFAULT_VALUE_LENGTH;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    int period = (this.perClientRunRows / 10) == 0? perClientRunRows: perClientRunRows / 10;<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    int cycles = 1;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    int columns = 1;<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    int caching = 30;<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    boolean addColumns = true;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    MemoryCompactionPolicy inMemoryCompaction =<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        MemoryCompactionPolicy.valueOf(<a name="line.664"></a>
-<span class="sourceLineNo">665</span>            CompactingMemStore.COMPACTING_MEMSTORE_TYPE_DEFAULT);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    boolean asyncPrefetch = false;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    boolean cacheBlocks = true;<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    Scan.ReadType scanReadType = Scan.ReadType.DEFAULT;<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>    public TestOptions() {}<a name="line.670"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.BufferedMutatorParams;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Get;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Put;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.Result;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.Table;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.LongWritable;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.io.Text;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Job;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.Tool;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.hadoop.util.ToolRunner;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.Sampler;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.htrace.core.TraceScope;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.Logger;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.slf4j.LoggerFactory;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * command-line which test to run and how many clients are participating in<a name="line.118"></a>
+<span class="sourceLineNo">119</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.119"></a>
+<span class="sourceLineNo">120</span> *<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.123"></a>
+<span class="sourceLineNo">124</span> * paper, pages 8-10.<a name="line.124"></a>
+<span class="sourceLineNo">125</span> *<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.128"></a>
+<span class="sourceLineNo">129</span> * specified otherwise.<a name="line.129"></a>
+<span class="sourceLineNo">130</span> */<a name="line.130"></a>
+<span class="sourceLineNo">131</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.131"></a>
+<span class="sourceLineNo">132</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  static final String RANDOM_READ = "randomRead";<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  static {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  }<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
+<span class="sourceLineNo">156</span><a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
+<span class="sourceLineNo">243</span><a name="line.243"></a>
+<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
+<span class="sourceLineNo">249</span><a name="line.249"></a>
+<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
+<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
+<span class="sourceLineNo">261</span><a name="line.261"></a>
+<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
+<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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><a name="line.297"></a>
+<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
+<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        }<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>      ObjectMapper mapper = new ObjectMapper();<a name="line.309">

<TRUNCATED>

[27/44] hbase-site git commit: Published site at 8e6ff689e806138e602a46730886d8c5f524fdcd.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndDeleteTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndDeleteTest.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndDeleteTest.html
index 418c60c..7cf23c4 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndDeleteTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndDeleteTest.html
@@ -64,2689 +64,2710 @@
 <span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.AsyncConnection;<a name="line.56"></a>
 <span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.AsyncTable;<a name="line.57"></a>
 <span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.BufferedMutator;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Get;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Put;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Result;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.111"></a>
-<span class="sourceLineNo">112</span><a name="line.112"></a>
-<span class="sourceLineNo">113</span>/**<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
-<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
-<span class="sourceLineNo">119</span> *<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
-<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
-<span class="sourceLineNo">124</span> *<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
-<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
-<span class="sourceLineNo">129</span> */<a name="line.129"></a>
-<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
-<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
-<span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // TODO : should we make this configurable<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private static final int TAG_LENGTH = 256;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  static {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        "Run async random read test");<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        "Run async random write test");<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.164"></a>
-<span class="sourceLineNo">165</span>        "Run async sequential read test");<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        "Run async sequential write test");<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        "Run async scan test (read every row)");<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      "Run random read test");<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      "Run random seek and scan 100 test");<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      "Run random write test");<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      "Run sequential read test");<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      "Run sequential write test");<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      "Run scan test (read every row)");<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "(make sure to use --rows=20)");<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  }<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * inner-class so we can find associated properties.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   */<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  protected static enum Counter {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    /** elapsed time */<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    ELAPSED_TIME,<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    /** number of rows */<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    public RunResult(long duration, Histogram hist) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      this.duration = duration;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.hist = hist;<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>    public final long duration;<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final Histogram hist;<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>    @Override<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    public String toString() {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      return Long.toString(duration);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>    @Override public int compareTo(RunResult o) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      return Long.compare(this.duration, o.duration);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
-<span class="sourceLineNo">234</span><a name="line.234"></a>
-<span class="sourceLineNo">235</span>  /**<a name="line.235"></a>
-<span class="sourceLineNo">236</span>   * Constructor<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * @param conf Configuration object<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   */<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    super(conf);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      String name, String description) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  /**<a name="line.249"></a>
-<span class="sourceLineNo">250</span>   * Implementations can have their status set.<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   */<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  interface Status {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    /**<a name="line.253"></a>
-<span class="sourceLineNo">254</span>     * Sets status<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * @param msg status message<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @throws IOException<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     */<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    void setStatus(final String msg) throws IOException;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  }<a name="line.259"></a>
-<span class="sourceLineNo">260</span><a name="line.260"></a>
-<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   */<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  public static class EvaluationMapTask<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>    /** configuration parameter name that contains the command */<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the PE impl */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>    @Override<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>      // this is required so that extensions of PE are instantiated within the<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // map reduce task...<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      try {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      } catch (Exception e) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      try {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        return Class.forName(className).asSubclass(type);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      } catch (ClassNotFoundException e) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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>    @Override<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.298"></a>
-<span class="sourceLineNo">299</span>           throws IOException, InterruptedException {<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>      Status status = new Status() {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        @Override<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        public void setStatus(String msg) {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>           context.setStatus(msg);<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><a name="line.307"></a>
-<span class="sourceLineNo">308</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      AsyncConnection asyncCon = null;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      try {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      } catch (ExecutionException e) {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>        throw new IOException(e);<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>      // Evaluation task<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      // Collect how much time the thing took. Report as map output and<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // to the ELAPSED_TIME counter.<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.progress();<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    }<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>  /*<a name="line.330"></a>
-<span class="sourceLineNo">331</span>   * If table does not already exist, create. Also create a table when<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   */<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      throw new IllegalStateException(<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    HTableDescriptor desc =<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    byte[][] splits = getSplits(opts);<a name="line.346"></a>
-<span class="sourceLineNo">347</span><a name="line.347"></a>
-<span class="sourceLineNo">348</span>    // recreate the table when user has requested presplit or when existing<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      needsDelete = true;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      // wait, why did it delete my table?!?<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        .add("needsDelete", needsDelete)<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("isReadCmd", isReadCmd)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("exists", exists)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("desc", desc)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("presplit", opts.presplitRegions)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("replicas", opts.replicas)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .toString());<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>    // remove an existing table<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    if (needsDelete) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      if (admin.isTableEnabled(tableName)) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        admin.disableTable(tableName);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      admin.deleteTable(tableName);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>    // table creation is necessary<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    if (!exists || needsDelete) {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      desc = getTableDescriptor(opts);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      if (splits != null) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        if (LOG.isDebugEnabled()) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<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>      admin.createTable(desc, splits);<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      LOG.info("Table " + desc + " created");<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    return admin.tableExists(tableName);<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>  /**<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setCompressionType(opts.compression);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setBloomFilterType(opts.bloomType);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBlocksize(opts.blockSize);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    if (opts.inMemoryCF) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      family.setInMemory(true);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    desc.addFamily(family);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      desc.setRegionReplication(opts.replicas);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    return desc;<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>  /**<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   * generates splits based on total number of rows and specified split regions<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   */<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      int rowkey = jump * (1 + i);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      splits[i] = format(rowkey);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return splits;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  }<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  /*<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * Run all clients in this vm each to its own thread.<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   */<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    assert cmd != null;<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    @SuppressWarnings("unchecked")<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      final int index = i;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        @Override<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        public RunResult call() throws Exception {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>            @Override<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            public void setStatus(final String msg) throws IOException {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>              LOG.info(msg);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>          });<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.459"></a>
-<span class="sourceLineNo">460</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          return run;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      });<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    }<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    pool.shutdown();<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      try {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        results[i] = threads[i].get();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      } catch (ExecutionException e) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>        throw new IOException(e.getCause());<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    final String test = cmd.getSimpleName();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.475"></a>
-<span class="sourceLineNo">476</span>             + Arrays.toString(results));<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    Arrays.sort(results);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    long total = 0;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    for (RunResult result : results) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      total += result.duration;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    LOG.info("[" + test + "]"<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      + "\tMin: " + results[0] + "ms"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.485"></a>
-<span class="sourceLineNo">486</span><a name="line.486"></a>
-<span class="sourceLineNo">487</span>    con.close();<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    asyncCon.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    return results;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  /*<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Before we start up the job, write out an input file with instruction<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * per client regards which row they are to start on.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * @param cmd Command to run.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @throws IOException<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   */<a name="line.499"></a>
-<span class="sourceLineNo">500</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    assert cmd != null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    Job job = Job.getInstance(conf);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.509"></a>
-<span class="sourceLineNo">510</span><a name="line.510"></a>
-<span class="sourceLineNo">511</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    // this is default, but be explicit about it just in case.<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.514"></a>
-<span class="sourceLineNo">515</span><a name="line.515"></a>
-<span class="sourceLineNo">516</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputValueClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setReducerClass(LongSumReducer.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>    job.setNumReduceTasks(1);<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      Histogram.class,     // yammer metrics<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      );<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>    TableMapReduceUtil.initCredentials(job);<a name="line.534"></a>
-<span class="sourceLineNo">535</span><a name="line.535"></a>
-<span class="sourceLineNo">536</span>    job.waitForCompletion(true);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    return job;<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>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<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>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>  /*<a name="line.546"></a>
-<span class="sourceLineNo">547</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * @param c Configuration<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<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>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    return writeInputFile(c, opts, new Path("."));<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.556"></a>
-<span class="sourceLineNo">557</span>  throws IOException {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>    FileSystem fs = FileSystem.get(c);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    fs.mkdirs(inputDir);<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    // Make input random.<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Hash h = MurmurHash.getInstance();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    try {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>        TestOptions next = new TestOptions(opts);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        next.startRow = j * perClientRows;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.perClientRunRows = perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        String s = MAPPER.writeValueAsString(next);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        byte[] b = Bytes.toBytes(s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        m.put(hash, s);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>        out.println(e.getValue());<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    } finally {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      out.close();<a name="line.586"></a>
-<span class="sourceLineNo">587</span>    }<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    return inputDir;<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>   * Describes a command.<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   */<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  static class CmdDescriptor {<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private String name;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String description;<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      this.cmdClass = cmdClass;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.name = name;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.description = description;<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>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>      return cmdClass;<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>    public String getName() {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>      return name;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    public String getDescription() {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>      return description;<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><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * This makes tracking all these arguments a little easier.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>  static class TestOptions {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    String cmdName = null;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    boolean nomapred = false;<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    boolean filterAll = false;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    int startRow = 0;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    float size = 1.0f;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    int perClientRunRows = DEFAULT_ROWS_PER_GB;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    int numClientThreads = 1;<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    int totalRows = DEFAULT_ROWS_PER_GB;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    int measureAfter = 0;<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    float sampleRate = 1.0f;<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    double traceRate = 0.0;<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    String tableName = TABLE_NAME;<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    boolean flushCommits = true;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    boolean writeToWAL = true;<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    boolean autoFlush = false;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    boolean oneCon = false;<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    boolean useTags = false;<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    int noOfTags = 1;<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    boolean reportLatency = false;<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    int multiGet = 0;<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    int randomSleep = 0;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    boolean inMemoryCF = false;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    int presplitRegions = 0;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    int replicas = HTableDescriptor.DEFAULT_REGION_REPLICATION;<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    String splitPolicy = null;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    Compression.Algorithm compression = Compression.Algorithm.NONE;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    BloomType bloomType = BloomType.ROW;<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    int blockSize = HConstants.DEFAULT_BLOCKSIZE;<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    DataBlockEncoding blockEncoding = DataBlockEncoding.NONE;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    boolean valueRandom = false;<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    boolean valueZipf = false;<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    int valueSize = DEFAULT_VALUE_LENGTH;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    int period = (this.perClientRunRows / 10) == 0? perClientRunRows: perClientRunRows / 10;<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    int cycles = 1;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    int columns = 1;<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    int caching = 30;<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    boolean addColumns = true;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    MemoryCompactionPolicy inMemoryCompaction =<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        MemoryCompactionPolicy.valueOf(<a name="line.664"></a>
-<span class="sourceLineNo">665</span>            CompactingMemStore.COMPACTING_MEMSTORE_TYPE_DEFAULT);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    boolean asyncPrefetch = false;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    boolean cacheBlocks = true;<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    Scan.ReadType scanReadType = Scan.ReadType.DEFAULT;<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>    public TestOptions() {}<a name="line.670"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.BufferedMutatorParams;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Get;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Put;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.Result;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.Table;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.LongWritable;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.io.Text;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Job;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.Tool;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.hadoop.util.ToolRunner;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.Sampler;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.htrace.core.TraceScope;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.Logger;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.slf4j.LoggerFactory;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * command-line which test to run and how many clients are participating in<a name="line.118"></a>
+<span class="sourceLineNo">119</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.119"></a>
+<span class="sourceLineNo">120</span> *<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.123"></a>
+<span class="sourceLineNo">124</span> * paper, pages 8-10.<a name="line.124"></a>
+<span class="sourceLineNo">125</span> *<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.128"></a>
+<span class="sourceLineNo">129</span> * specified otherwise.<a name="line.129"></a>
+<span class="sourceLineNo">130</span> */<a name="line.130"></a>
+<span class="sourceLineNo">131</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.131"></a>
+<span class="sourceLineNo">132</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  static final String RANDOM_READ = "randomRead";<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  static {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  }<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
+<span class="sourceLineNo">156</span><a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
+<span class="sourceLineNo">243</span><a name="line.243"></a>
+<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
+<span class="sourceLineNo">249</span><a name="line.249"></a>
+<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
+<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
+<span class="sourceLineNo">261</span><a name="line.261"></a>
+<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
+<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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><a name="line.297"></a>
+<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
+<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        }<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>      ObjectMapper mapper = new ObjectMap

<TRUNCATED>

[11/44] hbase-site git commit: Published site at 8e6ff689e806138e602a46730886d8c5f524fdcd.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html
index 418c60c..7cf23c4 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html
@@ -64,2689 +64,2710 @@
 <span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.AsyncConnection;<a name="line.56"></a>
 <span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.AsyncTable;<a name="line.57"></a>
 <span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.BufferedMutator;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Get;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Put;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Result;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.111"></a>
-<span class="sourceLineNo">112</span><a name="line.112"></a>
-<span class="sourceLineNo">113</span>/**<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
-<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
-<span class="sourceLineNo">119</span> *<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
-<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
-<span class="sourceLineNo">124</span> *<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
-<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
-<span class="sourceLineNo">129</span> */<a name="line.129"></a>
-<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
-<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
-<span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // TODO : should we make this configurable<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private static final int TAG_LENGTH = 256;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  static {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        "Run async random read test");<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        "Run async random write test");<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.164"></a>
-<span class="sourceLineNo">165</span>        "Run async sequential read test");<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        "Run async sequential write test");<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        "Run async scan test (read every row)");<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      "Run random read test");<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      "Run random seek and scan 100 test");<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      "Run random write test");<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      "Run sequential read test");<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      "Run sequential write test");<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      "Run scan test (read every row)");<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "(make sure to use --rows=20)");<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  }<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * inner-class so we can find associated properties.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   */<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  protected static enum Counter {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    /** elapsed time */<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    ELAPSED_TIME,<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    /** number of rows */<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    public RunResult(long duration, Histogram hist) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      this.duration = duration;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.hist = hist;<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>    public final long duration;<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final Histogram hist;<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>    @Override<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    public String toString() {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      return Long.toString(duration);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>    @Override public int compareTo(RunResult o) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      return Long.compare(this.duration, o.duration);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
-<span class="sourceLineNo">234</span><a name="line.234"></a>
-<span class="sourceLineNo">235</span>  /**<a name="line.235"></a>
-<span class="sourceLineNo">236</span>   * Constructor<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * @param conf Configuration object<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   */<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    super(conf);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      String name, String description) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  /**<a name="line.249"></a>
-<span class="sourceLineNo">250</span>   * Implementations can have their status set.<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   */<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  interface Status {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    /**<a name="line.253"></a>
-<span class="sourceLineNo">254</span>     * Sets status<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * @param msg status message<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @throws IOException<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     */<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    void setStatus(final String msg) throws IOException;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  }<a name="line.259"></a>
-<span class="sourceLineNo">260</span><a name="line.260"></a>
-<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   */<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  public static class EvaluationMapTask<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>    /** configuration parameter name that contains the command */<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the PE impl */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>    @Override<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>      // this is required so that extensions of PE are instantiated within the<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // map reduce task...<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      try {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      } catch (Exception e) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      try {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        return Class.forName(className).asSubclass(type);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      } catch (ClassNotFoundException e) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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>    @Override<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.298"></a>
-<span class="sourceLineNo">299</span>           throws IOException, InterruptedException {<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>      Status status = new Status() {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        @Override<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        public void setStatus(String msg) {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>           context.setStatus(msg);<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><a name="line.307"></a>
-<span class="sourceLineNo">308</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      AsyncConnection asyncCon = null;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      try {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      } catch (ExecutionException e) {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>        throw new IOException(e);<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>      // Evaluation task<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      // Collect how much time the thing took. Report as map output and<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // to the ELAPSED_TIME counter.<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.progress();<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    }<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>  /*<a name="line.330"></a>
-<span class="sourceLineNo">331</span>   * If table does not already exist, create. Also create a table when<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   */<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      throw new IllegalStateException(<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    HTableDescriptor desc =<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    byte[][] splits = getSplits(opts);<a name="line.346"></a>
-<span class="sourceLineNo">347</span><a name="line.347"></a>
-<span class="sourceLineNo">348</span>    // recreate the table when user has requested presplit or when existing<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      needsDelete = true;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      // wait, why did it delete my table?!?<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        .add("needsDelete", needsDelete)<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("isReadCmd", isReadCmd)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("exists", exists)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("desc", desc)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("presplit", opts.presplitRegions)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("replicas", opts.replicas)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .toString());<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>    // remove an existing table<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    if (needsDelete) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      if (admin.isTableEnabled(tableName)) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        admin.disableTable(tableName);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      admin.deleteTable(tableName);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>    // table creation is necessary<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    if (!exists || needsDelete) {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      desc = getTableDescriptor(opts);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      if (splits != null) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        if (LOG.isDebugEnabled()) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<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>      admin.createTable(desc, splits);<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      LOG.info("Table " + desc + " created");<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    return admin.tableExists(tableName);<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>  /**<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setCompressionType(opts.compression);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setBloomFilterType(opts.bloomType);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBlocksize(opts.blockSize);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    if (opts.inMemoryCF) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      family.setInMemory(true);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    desc.addFamily(family);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      desc.setRegionReplication(opts.replicas);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    return desc;<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>  /**<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   * generates splits based on total number of rows and specified split regions<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   */<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      int rowkey = jump * (1 + i);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      splits[i] = format(rowkey);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return splits;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  }<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  /*<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * Run all clients in this vm each to its own thread.<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   */<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    assert cmd != null;<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    @SuppressWarnings("unchecked")<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      final int index = i;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        @Override<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        public RunResult call() throws Exception {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>            @Override<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            public void setStatus(final String msg) throws IOException {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>              LOG.info(msg);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>          });<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.459"></a>
-<span class="sourceLineNo">460</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          return run;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      });<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    }<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    pool.shutdown();<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      try {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        results[i] = threads[i].get();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      } catch (ExecutionException e) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>        throw new IOException(e.getCause());<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    final String test = cmd.getSimpleName();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.475"></a>
-<span class="sourceLineNo">476</span>             + Arrays.toString(results));<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    Arrays.sort(results);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    long total = 0;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    for (RunResult result : results) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      total += result.duration;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    LOG.info("[" + test + "]"<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      + "\tMin: " + results[0] + "ms"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.485"></a>
-<span class="sourceLineNo">486</span><a name="line.486"></a>
-<span class="sourceLineNo">487</span>    con.close();<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    asyncCon.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    return results;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  /*<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Before we start up the job, write out an input file with instruction<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * per client regards which row they are to start on.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * @param cmd Command to run.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @throws IOException<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   */<a name="line.499"></a>
-<span class="sourceLineNo">500</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    assert cmd != null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    Job job = Job.getInstance(conf);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.509"></a>
-<span class="sourceLineNo">510</span><a name="line.510"></a>
-<span class="sourceLineNo">511</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    // this is default, but be explicit about it just in case.<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.514"></a>
-<span class="sourceLineNo">515</span><a name="line.515"></a>
-<span class="sourceLineNo">516</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputValueClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setReducerClass(LongSumReducer.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>    job.setNumReduceTasks(1);<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      Histogram.class,     // yammer metrics<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      );<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>    TableMapReduceUtil.initCredentials(job);<a name="line.534"></a>
-<span class="sourceLineNo">535</span><a name="line.535"></a>
-<span class="sourceLineNo">536</span>    job.waitForCompletion(true);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    return job;<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>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<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>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>  /*<a name="line.546"></a>
-<span class="sourceLineNo">547</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * @param c Configuration<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<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>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    return writeInputFile(c, opts, new Path("."));<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.556"></a>
-<span class="sourceLineNo">557</span>  throws IOException {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>    FileSystem fs = FileSystem.get(c);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    fs.mkdirs(inputDir);<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    // Make input random.<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Hash h = MurmurHash.getInstance();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    try {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>        TestOptions next = new TestOptions(opts);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        next.startRow = j * perClientRows;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.perClientRunRows = perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        String s = MAPPER.writeValueAsString(next);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        byte[] b = Bytes.toBytes(s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        m.put(hash, s);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>        out.println(e.getValue());<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    } finally {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      out.close();<a name="line.586"></a>
-<span class="sourceLineNo">587</span>    }<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    return inputDir;<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>   * Describes a command.<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   */<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  static class CmdDescriptor {<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private String name;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String description;<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      this.cmdClass = cmdClass;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.name = name;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.description = description;<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>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>      return cmdClass;<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>    public String getName() {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>      return name;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    public String getDescription() {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>      return description;<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><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * This makes tracking all these arguments a little easier.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>  static class TestOptions {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    String cmdName = null;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    boolean nomapred = false;<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    boolean filterAll = false;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    int startRow = 0;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    float size = 1.0f;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    int perClientRunRows = DEFAULT_ROWS_PER_GB;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    int numClientThreads = 1;<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    int totalRows = DEFAULT_ROWS_PER_GB;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    int measureAfter = 0;<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    float sampleRate = 1.0f;<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    double traceRate = 0.0;<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    String tableName = TABLE_NAME;<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    boolean flushCommits = true;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    boolean writeToWAL = true;<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    boolean autoFlush = false;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    boolean oneCon = false;<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    boolean useTags = false;<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    int noOfTags = 1;<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    boolean reportLatency = false;<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    int multiGet = 0;<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    int randomSleep = 0;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    boolean inMemoryCF = false;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    int presplitRegions = 0;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    int replicas = HTableDescriptor.DEFAULT_REGION_REPLICATION;<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    String splitPolicy = null;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    Compression.Algorithm compression = Compression.Algorithm.NONE;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    BloomType bloomType = BloomType.ROW;<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    int blockSize = HConstants.DEFAULT_BLOCKSIZE;<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    DataBlockEncoding blockEncoding = DataBlockEncoding.NONE;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    boolean valueRandom = false;<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    boolean valueZipf = false;<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    int valueSize = DEFAULT_VALUE_LENGTH;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    int period = (this.perClientRunRows / 10) == 0? perClientRunRows: perClientRunRows / 10;<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    int cycles = 1;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    int columns = 1;<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    int caching = 30;<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    boolean addColumns = true;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    MemoryCompactionPolicy inMemoryCompaction =<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        MemoryCompactionPolicy.valueOf(<a name="line.664"></a>
-<span class="sourceLineNo">665</span>            CompactingMemStore.COMPACTING_MEMSTORE_TYPE_DEFAULT);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    boolean asyncPrefetch = false;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    boolean cacheBlocks = true;<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    Scan.ReadType scanReadType = Scan.ReadType.DEFAULT;<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>    public TestOptions() {}<a name="line.670"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.BufferedMutatorParams;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Get;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Put;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.Result;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.Table;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.LongWritable;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.io.Text;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Job;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.Tool;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.hadoop.util.ToolRunner;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.Sampler;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.htrace.core.TraceScope;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.Logger;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.slf4j.LoggerFactory;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * command-line which test to run and how many clients are participating in<a name="line.118"></a>
+<span class="sourceLineNo">119</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.119"></a>
+<span class="sourceLineNo">120</span> *<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.123"></a>
+<span class="sourceLineNo">124</span> * paper, pages 8-10.<a name="line.124"></a>
+<span class="sourceLineNo">125</span> *<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.128"></a>
+<span class="sourceLineNo">129</span> * specified otherwise.<a name="line.129"></a>
+<span class="sourceLineNo">130</span> */<a name="line.130"></a>
+<span class="sourceLineNo">131</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.131"></a>
+<span class="sourceLineNo">132</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  static final String RANDOM_READ = "randomRead";<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  static {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  }<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
+<span class="sourceLineNo">156</span><a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
+<span class="sourceLineNo">243</span><a name="line.243"></a>
+<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
+<span class="sourceLineNo">249</span><a name="line.249"></a>
+<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
+<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
+<span class="sourceLineNo">261</span><a name="line.261"></a>
+<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
+<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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><a name="line.297"></a>
+<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
+<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        }<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>      ObjectMapper mapper = new ObjectMapper();<a name="line.309"></a>
+<span class="s

<TRUNCATED>

[02/44] hbase-site git commit: Published site at 8e6ff689e806138e602a46730886d8c5f524fdcd.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html
index 418c60c..7cf23c4 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html
@@ -64,2689 +64,2710 @@
 <span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.AsyncConnection;<a name="line.56"></a>
 <span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.AsyncTable;<a name="line.57"></a>
 <span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.BufferedMutator;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Get;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Put;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Result;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.111"></a>
-<span class="sourceLineNo">112</span><a name="line.112"></a>
-<span class="sourceLineNo">113</span>/**<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
-<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
-<span class="sourceLineNo">119</span> *<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
-<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
-<span class="sourceLineNo">124</span> *<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
-<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
-<span class="sourceLineNo">129</span> */<a name="line.129"></a>
-<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
-<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
-<span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // TODO : should we make this configurable<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private static final int TAG_LENGTH = 256;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  static {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        "Run async random read test");<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        "Run async random write test");<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.164"></a>
-<span class="sourceLineNo">165</span>        "Run async sequential read test");<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        "Run async sequential write test");<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        "Run async scan test (read every row)");<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      "Run random read test");<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      "Run random seek and scan 100 test");<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      "Run random write test");<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      "Run sequential read test");<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      "Run sequential write test");<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      "Run scan test (read every row)");<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "(make sure to use --rows=20)");<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  }<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * inner-class so we can find associated properties.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   */<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  protected static enum Counter {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    /** elapsed time */<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    ELAPSED_TIME,<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    /** number of rows */<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    public RunResult(long duration, Histogram hist) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      this.duration = duration;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.hist = hist;<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>    public final long duration;<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final Histogram hist;<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>    @Override<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    public String toString() {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      return Long.toString(duration);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>    @Override public int compareTo(RunResult o) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      return Long.compare(this.duration, o.duration);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
-<span class="sourceLineNo">234</span><a name="line.234"></a>
-<span class="sourceLineNo">235</span>  /**<a name="line.235"></a>
-<span class="sourceLineNo">236</span>   * Constructor<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * @param conf Configuration object<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   */<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    super(conf);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      String name, String description) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  /**<a name="line.249"></a>
-<span class="sourceLineNo">250</span>   * Implementations can have their status set.<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   */<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  interface Status {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    /**<a name="line.253"></a>
-<span class="sourceLineNo">254</span>     * Sets status<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * @param msg status message<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @throws IOException<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     */<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    void setStatus(final String msg) throws IOException;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  }<a name="line.259"></a>
-<span class="sourceLineNo">260</span><a name="line.260"></a>
-<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   */<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  public static class EvaluationMapTask<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>    /** configuration parameter name that contains the command */<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the PE impl */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>    @Override<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>      // this is required so that extensions of PE are instantiated within the<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // map reduce task...<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      try {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      } catch (Exception e) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      try {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        return Class.forName(className).asSubclass(type);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      } catch (ClassNotFoundException e) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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>    @Override<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.298"></a>
-<span class="sourceLineNo">299</span>           throws IOException, InterruptedException {<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>      Status status = new Status() {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        @Override<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        public void setStatus(String msg) {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>           context.setStatus(msg);<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><a name="line.307"></a>
-<span class="sourceLineNo">308</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      AsyncConnection asyncCon = null;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      try {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      } catch (ExecutionException e) {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>        throw new IOException(e);<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>      // Evaluation task<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      // Collect how much time the thing took. Report as map output and<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // to the ELAPSED_TIME counter.<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.progress();<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    }<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>  /*<a name="line.330"></a>
-<span class="sourceLineNo">331</span>   * If table does not already exist, create. Also create a table when<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   */<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      throw new IllegalStateException(<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    HTableDescriptor desc =<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    byte[][] splits = getSplits(opts);<a name="line.346"></a>
-<span class="sourceLineNo">347</span><a name="line.347"></a>
-<span class="sourceLineNo">348</span>    // recreate the table when user has requested presplit or when existing<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      needsDelete = true;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      // wait, why did it delete my table?!?<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        .add("needsDelete", needsDelete)<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("isReadCmd", isReadCmd)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("exists", exists)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("desc", desc)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("presplit", opts.presplitRegions)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("replicas", opts.replicas)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .toString());<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>    // remove an existing table<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    if (needsDelete) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      if (admin.isTableEnabled(tableName)) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        admin.disableTable(tableName);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      admin.deleteTable(tableName);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>    // table creation is necessary<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    if (!exists || needsDelete) {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      desc = getTableDescriptor(opts);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      if (splits != null) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        if (LOG.isDebugEnabled()) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<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>      admin.createTable(desc, splits);<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      LOG.info("Table " + desc + " created");<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    return admin.tableExists(tableName);<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>  /**<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setCompressionType(opts.compression);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setBloomFilterType(opts.bloomType);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBlocksize(opts.blockSize);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    if (opts.inMemoryCF) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      family.setInMemory(true);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    desc.addFamily(family);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      desc.setRegionReplication(opts.replicas);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    return desc;<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>  /**<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   * generates splits based on total number of rows and specified split regions<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   */<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      int rowkey = jump * (1 + i);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      splits[i] = format(rowkey);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return splits;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  }<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  /*<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * Run all clients in this vm each to its own thread.<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   */<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    assert cmd != null;<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    @SuppressWarnings("unchecked")<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      final int index = i;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        @Override<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        public RunResult call() throws Exception {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>            @Override<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            public void setStatus(final String msg) throws IOException {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>              LOG.info(msg);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>          });<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.459"></a>
-<span class="sourceLineNo">460</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          return run;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      });<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    }<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    pool.shutdown();<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      try {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        results[i] = threads[i].get();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      } catch (ExecutionException e) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>        throw new IOException(e.getCause());<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    final String test = cmd.getSimpleName();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.475"></a>
-<span class="sourceLineNo">476</span>             + Arrays.toString(results));<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    Arrays.sort(results);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    long total = 0;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    for (RunResult result : results) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      total += result.duration;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    LOG.info("[" + test + "]"<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      + "\tMin: " + results[0] + "ms"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.485"></a>
-<span class="sourceLineNo">486</span><a name="line.486"></a>
-<span class="sourceLineNo">487</span>    con.close();<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    asyncCon.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    return results;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  /*<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Before we start up the job, write out an input file with instruction<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * per client regards which row they are to start on.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * @param cmd Command to run.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @throws IOException<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   */<a name="line.499"></a>
-<span class="sourceLineNo">500</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    assert cmd != null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    Job job = Job.getInstance(conf);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.509"></a>
-<span class="sourceLineNo">510</span><a name="line.510"></a>
-<span class="sourceLineNo">511</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    // this is default, but be explicit about it just in case.<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.514"></a>
-<span class="sourceLineNo">515</span><a name="line.515"></a>
-<span class="sourceLineNo">516</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputValueClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setReducerClass(LongSumReducer.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>    job.setNumReduceTasks(1);<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      Histogram.class,     // yammer metrics<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      );<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>    TableMapReduceUtil.initCredentials(job);<a name="line.534"></a>
-<span class="sourceLineNo">535</span><a name="line.535"></a>
-<span class="sourceLineNo">536</span>    job.waitForCompletion(true);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    return job;<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>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<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>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>  /*<a name="line.546"></a>
-<span class="sourceLineNo">547</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * @param c Configuration<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<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>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    return writeInputFile(c, opts, new Path("."));<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.556"></a>
-<span class="sourceLineNo">557</span>  throws IOException {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>    FileSystem fs = FileSystem.get(c);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    fs.mkdirs(inputDir);<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    // Make input random.<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Hash h = MurmurHash.getInstance();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    try {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>        TestOptions next = new TestOptions(opts);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        next.startRow = j * perClientRows;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.perClientRunRows = perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        String s = MAPPER.writeValueAsString(next);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        byte[] b = Bytes.toBytes(s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        m.put(hash, s);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>        out.println(e.getValue());<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    } finally {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      out.close();<a name="line.586"></a>
-<span class="sourceLineNo">587</span>    }<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    return inputDir;<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>   * Describes a command.<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   */<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  static class CmdDescriptor {<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private String name;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String description;<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      this.cmdClass = cmdClass;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.name = name;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.description = description;<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>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>      return cmdClass;<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>    public String getName() {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>      return name;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    public String getDescription() {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>      return description;<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><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * This makes tracking all these arguments a little easier.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>  static class TestOptions {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    String cmdName = null;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    boolean nomapred = false;<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    boolean filterAll = false;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    int startRow = 0;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    float size = 1.0f;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    int perClientRunRows = DEFAULT_ROWS_PER_GB;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    int numClientThreads = 1;<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    int totalRows = DEFAULT_ROWS_PER_GB;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    int measureAfter = 0;<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    float sampleRate = 1.0f;<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    double traceRate = 0.0;<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    String tableName = TABLE_NAME;<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    boolean flushCommits = true;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    boolean writeToWAL = true;<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    boolean autoFlush = false;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    boolean oneCon = false;<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    boolean useTags = false;<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    int noOfTags = 1;<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    boolean reportLatency = false;<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    int multiGet = 0;<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    int randomSleep = 0;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    boolean inMemoryCF = false;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    int presplitRegions = 0;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    int replicas = HTableDescriptor.DEFAULT_REGION_REPLICATION;<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    String splitPolicy = null;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    Compression.Algorithm compression = Compression.Algorithm.NONE;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    BloomType bloomType = BloomType.ROW;<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    int blockSize = HConstants.DEFAULT_BLOCKSIZE;<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    DataBlockEncoding blockEncoding = DataBlockEncoding.NONE;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    boolean valueRandom = false;<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    boolean valueZipf = false;<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    int valueSize = DEFAULT_VALUE_LENGTH;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    int period = (this.perClientRunRows / 10) == 0? perClientRunRows: perClientRunRows / 10;<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    int cycles = 1;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    int columns = 1;<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    int caching = 30;<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    boolean addColumns = true;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    MemoryCompactionPolicy inMemoryCompaction =<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        MemoryCompactionPolicy.valueOf(<a name="line.664"></a>
-<span class="sourceLineNo">665</span>            CompactingMemStore.COMPACTING_MEMSTORE_TYPE_DEFAULT);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    boolean asyncPrefetch = false;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    boolean cacheBlocks = true;<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    Scan.ReadType scanReadType = Scan.ReadType.DEFAULT;<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>    public TestOptions() {}<a name="line.670"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.BufferedMutatorParams;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Get;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Put;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.Result;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.Table;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.LongWritable;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.io.Text;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Job;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.Tool;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.hadoop.util.ToolRunner;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.Sampler;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.htrace.core.TraceScope;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.Logger;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.slf4j.LoggerFactory;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * command-line which test to run and how many clients are participating in<a name="line.118"></a>
+<span class="sourceLineNo">119</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.119"></a>
+<span class="sourceLineNo">120</span> *<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.123"></a>
+<span class="sourceLineNo">124</span> * paper, pages 8-10.<a name="line.124"></a>
+<span class="sourceLineNo">125</span> *<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.128"></a>
+<span class="sourceLineNo">129</span> * specified otherwise.<a name="line.129"></a>
+<span class="sourceLineNo">130</span> */<a name="line.130"></a>
+<span class="sourceLineNo">131</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.131"></a>
+<span class="sourceLineNo">132</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  static final String RANDOM_READ = "randomRead";<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  static {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  }<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
+<span class="sourceLineNo">156</span><a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
+<span class="sourceLineNo">243</span><a name="line.243"></a>
+<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
+<span class="sourceLineNo">249</span><a name="line.249"></a>
+<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
+<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
+<span class="sourceLineNo">261</span><a name="line.261"></a>
+<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
+<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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><a name="line.297"></a>
+<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
+<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        }<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>      ObjectMapper mapper = new ObjectMapper();<a name="line.309"></a>
+<span class="sourceLineNo">310</span>      TestOptions opts = ma

<TRUNCATED>

[21/44] hbase-site git commit: Published site at 8e6ff689e806138e602a46730886d8c5f524fdcd.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.FilteredScanTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.FilteredScanTest.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.FilteredScanTest.html
index 418c60c..7cf23c4 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.FilteredScanTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.FilteredScanTest.html
@@ -64,2689 +64,2710 @@
 <span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.AsyncConnection;<a name="line.56"></a>
 <span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.AsyncTable;<a name="line.57"></a>
 <span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.BufferedMutator;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Get;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Put;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Result;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.111"></a>
-<span class="sourceLineNo">112</span><a name="line.112"></a>
-<span class="sourceLineNo">113</span>/**<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
-<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
-<span class="sourceLineNo">119</span> *<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
-<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
-<span class="sourceLineNo">124</span> *<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
-<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
-<span class="sourceLineNo">129</span> */<a name="line.129"></a>
-<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
-<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
-<span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // TODO : should we make this configurable<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private static final int TAG_LENGTH = 256;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  static {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        "Run async random read test");<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        "Run async random write test");<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.164"></a>
-<span class="sourceLineNo">165</span>        "Run async sequential read test");<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        "Run async sequential write test");<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        "Run async scan test (read every row)");<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      "Run random read test");<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      "Run random seek and scan 100 test");<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      "Run random write test");<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      "Run sequential read test");<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      "Run sequential write test");<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      "Run scan test (read every row)");<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "(make sure to use --rows=20)");<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  }<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * inner-class so we can find associated properties.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   */<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  protected static enum Counter {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    /** elapsed time */<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    ELAPSED_TIME,<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    /** number of rows */<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    public RunResult(long duration, Histogram hist) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      this.duration = duration;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.hist = hist;<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>    public final long duration;<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final Histogram hist;<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>    @Override<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    public String toString() {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      return Long.toString(duration);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>    @Override public int compareTo(RunResult o) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      return Long.compare(this.duration, o.duration);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
-<span class="sourceLineNo">234</span><a name="line.234"></a>
-<span class="sourceLineNo">235</span>  /**<a name="line.235"></a>
-<span class="sourceLineNo">236</span>   * Constructor<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * @param conf Configuration object<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   */<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    super(conf);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      String name, String description) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  /**<a name="line.249"></a>
-<span class="sourceLineNo">250</span>   * Implementations can have their status set.<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   */<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  interface Status {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    /**<a name="line.253"></a>
-<span class="sourceLineNo">254</span>     * Sets status<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * @param msg status message<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @throws IOException<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     */<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    void setStatus(final String msg) throws IOException;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  }<a name="line.259"></a>
-<span class="sourceLineNo">260</span><a name="line.260"></a>
-<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   */<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  public static class EvaluationMapTask<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>    /** configuration parameter name that contains the command */<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the PE impl */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>    @Override<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>      // this is required so that extensions of PE are instantiated within the<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // map reduce task...<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      try {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      } catch (Exception e) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      try {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        return Class.forName(className).asSubclass(type);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      } catch (ClassNotFoundException e) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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>    @Override<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.298"></a>
-<span class="sourceLineNo">299</span>           throws IOException, InterruptedException {<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>      Status status = new Status() {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        @Override<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        public void setStatus(String msg) {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>           context.setStatus(msg);<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><a name="line.307"></a>
-<span class="sourceLineNo">308</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      AsyncConnection asyncCon = null;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      try {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      } catch (ExecutionException e) {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>        throw new IOException(e);<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>      // Evaluation task<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      // Collect how much time the thing took. Report as map output and<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // to the ELAPSED_TIME counter.<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.progress();<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    }<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>  /*<a name="line.330"></a>
-<span class="sourceLineNo">331</span>   * If table does not already exist, create. Also create a table when<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   */<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      throw new IllegalStateException(<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    HTableDescriptor desc =<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    byte[][] splits = getSplits(opts);<a name="line.346"></a>
-<span class="sourceLineNo">347</span><a name="line.347"></a>
-<span class="sourceLineNo">348</span>    // recreate the table when user has requested presplit or when existing<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      needsDelete = true;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      // wait, why did it delete my table?!?<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        .add("needsDelete", needsDelete)<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("isReadCmd", isReadCmd)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("exists", exists)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("desc", desc)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("presplit", opts.presplitRegions)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("replicas", opts.replicas)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .toString());<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>    // remove an existing table<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    if (needsDelete) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      if (admin.isTableEnabled(tableName)) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        admin.disableTable(tableName);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      admin.deleteTable(tableName);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>    // table creation is necessary<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    if (!exists || needsDelete) {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      desc = getTableDescriptor(opts);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      if (splits != null) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        if (LOG.isDebugEnabled()) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<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>      admin.createTable(desc, splits);<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      LOG.info("Table " + desc + " created");<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    return admin.tableExists(tableName);<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>  /**<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setCompressionType(opts.compression);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setBloomFilterType(opts.bloomType);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBlocksize(opts.blockSize);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    if (opts.inMemoryCF) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      family.setInMemory(true);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    desc.addFamily(family);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      desc.setRegionReplication(opts.replicas);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    return desc;<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>  /**<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   * generates splits based on total number of rows and specified split regions<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   */<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      int rowkey = jump * (1 + i);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      splits[i] = format(rowkey);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return splits;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  }<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  /*<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * Run all clients in this vm each to its own thread.<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   */<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    assert cmd != null;<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    @SuppressWarnings("unchecked")<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      final int index = i;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        @Override<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        public RunResult call() throws Exception {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>            @Override<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            public void setStatus(final String msg) throws IOException {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>              LOG.info(msg);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>          });<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.459"></a>
-<span class="sourceLineNo">460</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          return run;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      });<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    }<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    pool.shutdown();<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      try {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        results[i] = threads[i].get();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      } catch (ExecutionException e) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>        throw new IOException(e.getCause());<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    final String test = cmd.getSimpleName();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.475"></a>
-<span class="sourceLineNo">476</span>             + Arrays.toString(results));<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    Arrays.sort(results);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    long total = 0;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    for (RunResult result : results) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      total += result.duration;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    LOG.info("[" + test + "]"<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      + "\tMin: " + results[0] + "ms"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.485"></a>
-<span class="sourceLineNo">486</span><a name="line.486"></a>
-<span class="sourceLineNo">487</span>    con.close();<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    asyncCon.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    return results;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  /*<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Before we start up the job, write out an input file with instruction<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * per client regards which row they are to start on.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * @param cmd Command to run.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @throws IOException<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   */<a name="line.499"></a>
-<span class="sourceLineNo">500</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    assert cmd != null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    Job job = Job.getInstance(conf);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.509"></a>
-<span class="sourceLineNo">510</span><a name="line.510"></a>
-<span class="sourceLineNo">511</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    // this is default, but be explicit about it just in case.<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.514"></a>
-<span class="sourceLineNo">515</span><a name="line.515"></a>
-<span class="sourceLineNo">516</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputValueClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setReducerClass(LongSumReducer.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>    job.setNumReduceTasks(1);<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      Histogram.class,     // yammer metrics<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      );<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>    TableMapReduceUtil.initCredentials(job);<a name="line.534"></a>
-<span class="sourceLineNo">535</span><a name="line.535"></a>
-<span class="sourceLineNo">536</span>    job.waitForCompletion(true);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    return job;<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>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<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>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>  /*<a name="line.546"></a>
-<span class="sourceLineNo">547</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * @param c Configuration<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<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>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    return writeInputFile(c, opts, new Path("."));<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.556"></a>
-<span class="sourceLineNo">557</span>  throws IOException {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>    FileSystem fs = FileSystem.get(c);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    fs.mkdirs(inputDir);<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    // Make input random.<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Hash h = MurmurHash.getInstance();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    try {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>        TestOptions next = new TestOptions(opts);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        next.startRow = j * perClientRows;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.perClientRunRows = perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        String s = MAPPER.writeValueAsString(next);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        byte[] b = Bytes.toBytes(s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        m.put(hash, s);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>        out.println(e.getValue());<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    } finally {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      out.close();<a name="line.586"></a>
-<span class="sourceLineNo">587</span>    }<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    return inputDir;<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>   * Describes a command.<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   */<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  static class CmdDescriptor {<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private String name;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String description;<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      this.cmdClass = cmdClass;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.name = name;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.description = description;<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>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>      return cmdClass;<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>    public String getName() {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>      return name;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    public String getDescription() {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>      return description;<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><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * This makes tracking all these arguments a little easier.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>  static class TestOptions {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    String cmdName = null;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    boolean nomapred = false;<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    boolean filterAll = false;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    int startRow = 0;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    float size = 1.0f;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    int perClientRunRows = DEFAULT_ROWS_PER_GB;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    int numClientThreads = 1;<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    int totalRows = DEFAULT_ROWS_PER_GB;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    int measureAfter = 0;<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    float sampleRate = 1.0f;<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    double traceRate = 0.0;<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    String tableName = TABLE_NAME;<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    boolean flushCommits = true;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    boolean writeToWAL = true;<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    boolean autoFlush = false;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    boolean oneCon = false;<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    boolean useTags = false;<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    int noOfTags = 1;<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    boolean reportLatency = false;<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    int multiGet = 0;<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    int randomSleep = 0;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    boolean inMemoryCF = false;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    int presplitRegions = 0;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    int replicas = HTableDescriptor.DEFAULT_REGION_REPLICATION;<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    String splitPolicy = null;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    Compression.Algorithm compression = Compression.Algorithm.NONE;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    BloomType bloomType = BloomType.ROW;<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    int blockSize = HConstants.DEFAULT_BLOCKSIZE;<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    DataBlockEncoding blockEncoding = DataBlockEncoding.NONE;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    boolean valueRandom = false;<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    boolean valueZipf = false;<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    int valueSize = DEFAULT_VALUE_LENGTH;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    int period = (this.perClientRunRows / 10) == 0? perClientRunRows: perClientRunRows / 10;<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    int cycles = 1;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    int columns = 1;<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    int caching = 30;<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    boolean addColumns = true;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    MemoryCompactionPolicy inMemoryCompaction =<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        MemoryCompactionPolicy.valueOf(<a name="line.664"></a>
-<span class="sourceLineNo">665</span>            CompactingMemStore.COMPACTING_MEMSTORE_TYPE_DEFAULT);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    boolean asyncPrefetch = false;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    boolean cacheBlocks = true;<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    Scan.ReadType scanReadType = Scan.ReadType.DEFAULT;<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>    public TestOptions() {}<a name="line.670"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.BufferedMutatorParams;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Get;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Put;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.Result;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.Table;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.LongWritable;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.io.Text;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Job;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.Tool;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.hadoop.util.ToolRunner;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.Sampler;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.htrace.core.TraceScope;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.Logger;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.slf4j.LoggerFactory;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * command-line which test to run and how many clients are participating in<a name="line.118"></a>
+<span class="sourceLineNo">119</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.119"></a>
+<span class="sourceLineNo">120</span> *<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.123"></a>
+<span class="sourceLineNo">124</span> * paper, pages 8-10.<a name="line.124"></a>
+<span class="sourceLineNo">125</span> *<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.128"></a>
+<span class="sourceLineNo">129</span> * specified otherwise.<a name="line.129"></a>
+<span class="sourceLineNo">130</span> */<a name="line.130"></a>
+<span class="sourceLineNo">131</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.131"></a>
+<span class="sourceLineNo">132</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  static final String RANDOM_READ = "randomRead";<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  static {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  }<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
+<span class="sourceLineNo">156</span><a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
+<span class="sourceLineNo">243</span><a name="line.243"></a>
+<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
+<span class="sourceLineNo">249</span><a name="line.249"></a>
+<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
+<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
+<span class="sourceLineNo">261</span><a name="line.261"></a>
+<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
+<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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><a name="line.297"></a>
+<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
+<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        }<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>      ObjectMapper mapper = new ObjectMapper();<a n

<TRUNCATED>

[15/44] hbase-site git commit: Published site at 8e6ff689e806138e602a46730886d8c5f524fdcd.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10Test.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10Test.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10Test.html
index 418c60c..7cf23c4 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10Test.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10Test.html
@@ -64,2689 +64,2710 @@
 <span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.AsyncConnection;<a name="line.56"></a>
 <span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.AsyncTable;<a name="line.57"></a>
 <span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.BufferedMutator;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Get;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Put;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Result;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.111"></a>
-<span class="sourceLineNo">112</span><a name="line.112"></a>
-<span class="sourceLineNo">113</span>/**<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
-<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
-<span class="sourceLineNo">119</span> *<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
-<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
-<span class="sourceLineNo">124</span> *<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
-<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
-<span class="sourceLineNo">129</span> */<a name="line.129"></a>
-<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
-<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
-<span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // TODO : should we make this configurable<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private static final int TAG_LENGTH = 256;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  static {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        "Run async random read test");<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        "Run async random write test");<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.164"></a>
-<span class="sourceLineNo">165</span>        "Run async sequential read test");<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        "Run async sequential write test");<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        "Run async scan test (read every row)");<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      "Run random read test");<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      "Run random seek and scan 100 test");<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      "Run random write test");<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      "Run sequential read test");<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      "Run sequential write test");<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      "Run scan test (read every row)");<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "(make sure to use --rows=20)");<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  }<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * inner-class so we can find associated properties.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   */<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  protected static enum Counter {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    /** elapsed time */<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    ELAPSED_TIME,<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    /** number of rows */<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    public RunResult(long duration, Histogram hist) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      this.duration = duration;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.hist = hist;<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>    public final long duration;<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final Histogram hist;<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>    @Override<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    public String toString() {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      return Long.toString(duration);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>    @Override public int compareTo(RunResult o) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      return Long.compare(this.duration, o.duration);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
-<span class="sourceLineNo">234</span><a name="line.234"></a>
-<span class="sourceLineNo">235</span>  /**<a name="line.235"></a>
-<span class="sourceLineNo">236</span>   * Constructor<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * @param conf Configuration object<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   */<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    super(conf);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      String name, String description) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  /**<a name="line.249"></a>
-<span class="sourceLineNo">250</span>   * Implementations can have their status set.<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   */<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  interface Status {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    /**<a name="line.253"></a>
-<span class="sourceLineNo">254</span>     * Sets status<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * @param msg status message<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @throws IOException<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     */<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    void setStatus(final String msg) throws IOException;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  }<a name="line.259"></a>
-<span class="sourceLineNo">260</span><a name="line.260"></a>
-<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   */<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  public static class EvaluationMapTask<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>    /** configuration parameter name that contains the command */<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the PE impl */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>    @Override<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>      // this is required so that extensions of PE are instantiated within the<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // map reduce task...<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      try {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      } catch (Exception e) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      try {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        return Class.forName(className).asSubclass(type);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      } catch (ClassNotFoundException e) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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>    @Override<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.298"></a>
-<span class="sourceLineNo">299</span>           throws IOException, InterruptedException {<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>      Status status = new Status() {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        @Override<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        public void setStatus(String msg) {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>           context.setStatus(msg);<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><a name="line.307"></a>
-<span class="sourceLineNo">308</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      AsyncConnection asyncCon = null;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      try {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      } catch (ExecutionException e) {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>        throw new IOException(e);<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>      // Evaluation task<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      // Collect how much time the thing took. Report as map output and<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // to the ELAPSED_TIME counter.<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.progress();<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    }<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>  /*<a name="line.330"></a>
-<span class="sourceLineNo">331</span>   * If table does not already exist, create. Also create a table when<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   */<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      throw new IllegalStateException(<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    HTableDescriptor desc =<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    byte[][] splits = getSplits(opts);<a name="line.346"></a>
-<span class="sourceLineNo">347</span><a name="line.347"></a>
-<span class="sourceLineNo">348</span>    // recreate the table when user has requested presplit or when existing<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      needsDelete = true;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      // wait, why did it delete my table?!?<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        .add("needsDelete", needsDelete)<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("isReadCmd", isReadCmd)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("exists", exists)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("desc", desc)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("presplit", opts.presplitRegions)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("replicas", opts.replicas)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .toString());<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>    // remove an existing table<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    if (needsDelete) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      if (admin.isTableEnabled(tableName)) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        admin.disableTable(tableName);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      admin.deleteTable(tableName);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>    // table creation is necessary<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    if (!exists || needsDelete) {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      desc = getTableDescriptor(opts);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      if (splits != null) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        if (LOG.isDebugEnabled()) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<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>      admin.createTable(desc, splits);<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      LOG.info("Table " + desc + " created");<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    return admin.tableExists(tableName);<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>  /**<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setCompressionType(opts.compression);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setBloomFilterType(opts.bloomType);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBlocksize(opts.blockSize);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    if (opts.inMemoryCF) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      family.setInMemory(true);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    desc.addFamily(family);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      desc.setRegionReplication(opts.replicas);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    return desc;<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>  /**<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   * generates splits based on total number of rows and specified split regions<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   */<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      int rowkey = jump * (1 + i);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      splits[i] = format(rowkey);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return splits;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  }<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  /*<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * Run all clients in this vm each to its own thread.<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   */<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    assert cmd != null;<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    @SuppressWarnings("unchecked")<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      final int index = i;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        @Override<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        public RunResult call() throws Exception {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>            @Override<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            public void setStatus(final String msg) throws IOException {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>              LOG.info(msg);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>          });<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.459"></a>
-<span class="sourceLineNo">460</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          return run;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      });<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    }<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    pool.shutdown();<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      try {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        results[i] = threads[i].get();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      } catch (ExecutionException e) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>        throw new IOException(e.getCause());<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    final String test = cmd.getSimpleName();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.475"></a>
-<span class="sourceLineNo">476</span>             + Arrays.toString(results));<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    Arrays.sort(results);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    long total = 0;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    for (RunResult result : results) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      total += result.duration;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    LOG.info("[" + test + "]"<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      + "\tMin: " + results[0] + "ms"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.485"></a>
-<span class="sourceLineNo">486</span><a name="line.486"></a>
-<span class="sourceLineNo">487</span>    con.close();<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    asyncCon.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    return results;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  /*<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Before we start up the job, write out an input file with instruction<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * per client regards which row they are to start on.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * @param cmd Command to run.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @throws IOException<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   */<a name="line.499"></a>
-<span class="sourceLineNo">500</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    assert cmd != null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    Job job = Job.getInstance(conf);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.509"></a>
-<span class="sourceLineNo">510</span><a name="line.510"></a>
-<span class="sourceLineNo">511</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    // this is default, but be explicit about it just in case.<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.514"></a>
-<span class="sourceLineNo">515</span><a name="line.515"></a>
-<span class="sourceLineNo">516</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputValueClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setReducerClass(LongSumReducer.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>    job.setNumReduceTasks(1);<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      Histogram.class,     // yammer metrics<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      );<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>    TableMapReduceUtil.initCredentials(job);<a name="line.534"></a>
-<span class="sourceLineNo">535</span><a name="line.535"></a>
-<span class="sourceLineNo">536</span>    job.waitForCompletion(true);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    return job;<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>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<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>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>  /*<a name="line.546"></a>
-<span class="sourceLineNo">547</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * @param c Configuration<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<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>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    return writeInputFile(c, opts, new Path("."));<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.556"></a>
-<span class="sourceLineNo">557</span>  throws IOException {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>    FileSystem fs = FileSystem.get(c);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    fs.mkdirs(inputDir);<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    // Make input random.<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Hash h = MurmurHash.getInstance();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    try {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>        TestOptions next = new TestOptions(opts);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        next.startRow = j * perClientRows;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.perClientRunRows = perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        String s = MAPPER.writeValueAsString(next);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        byte[] b = Bytes.toBytes(s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        m.put(hash, s);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>        out.println(e.getValue());<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    } finally {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      out.close();<a name="line.586"></a>
-<span class="sourceLineNo">587</span>    }<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    return inputDir;<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>   * Describes a command.<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   */<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  static class CmdDescriptor {<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private String name;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String description;<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      this.cmdClass = cmdClass;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.name = name;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.description = description;<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>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>      return cmdClass;<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>    public String getName() {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>      return name;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    public String getDescription() {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>      return description;<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><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * This makes tracking all these arguments a little easier.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>  static class TestOptions {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    String cmdName = null;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    boolean nomapred = false;<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    boolean filterAll = false;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    int startRow = 0;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    float size = 1.0f;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    int perClientRunRows = DEFAULT_ROWS_PER_GB;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    int numClientThreads = 1;<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    int totalRows = DEFAULT_ROWS_PER_GB;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    int measureAfter = 0;<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    float sampleRate = 1.0f;<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    double traceRate = 0.0;<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    String tableName = TABLE_NAME;<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    boolean flushCommits = true;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    boolean writeToWAL = true;<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    boolean autoFlush = false;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    boolean oneCon = false;<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    boolean useTags = false;<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    int noOfTags = 1;<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    boolean reportLatency = false;<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    int multiGet = 0;<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    int randomSleep = 0;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    boolean inMemoryCF = false;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    int presplitRegions = 0;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    int replicas = HTableDescriptor.DEFAULT_REGION_REPLICATION;<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    String splitPolicy = null;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    Compression.Algorithm compression = Compression.Algorithm.NONE;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    BloomType bloomType = BloomType.ROW;<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    int blockSize = HConstants.DEFAULT_BLOCKSIZE;<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    DataBlockEncoding blockEncoding = DataBlockEncoding.NONE;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    boolean valueRandom = false;<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    boolean valueZipf = false;<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    int valueSize = DEFAULT_VALUE_LENGTH;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    int period = (this.perClientRunRows / 10) == 0? perClientRunRows: perClientRunRows / 10;<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    int cycles = 1;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    int columns = 1;<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    int caching = 30;<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    boolean addColumns = true;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    MemoryCompactionPolicy inMemoryCompaction =<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        MemoryCompactionPolicy.valueOf(<a name="line.664"></a>
-<span class="sourceLineNo">665</span>            CompactingMemStore.COMPACTING_MEMSTORE_TYPE_DEFAULT);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    boolean asyncPrefetch = false;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    boolean cacheBlocks = true;<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    Scan.ReadType scanReadType = Scan.ReadType.DEFAULT;<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>    public TestOptions() {}<a name="line.670"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.BufferedMutatorParams;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Get;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Put;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.Result;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.Table;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.LongWritable;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.io.Text;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Job;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.Tool;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.hadoop.util.ToolRunner;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.Sampler;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.htrace.core.TraceScope;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.Logger;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.slf4j.LoggerFactory;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * command-line which test to run and how many clients are participating in<a name="line.118"></a>
+<span class="sourceLineNo">119</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.119"></a>
+<span class="sourceLineNo">120</span> *<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.123"></a>
+<span class="sourceLineNo">124</span> * paper, pages 8-10.<a name="line.124"></a>
+<span class="sourceLineNo">125</span> *<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.128"></a>
+<span class="sourceLineNo">129</span> * specified otherwise.<a name="line.129"></a>
+<span class="sourceLineNo">130</span> */<a name="line.130"></a>
+<span class="sourceLineNo">131</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.131"></a>
+<span class="sourceLineNo">132</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  static final String RANDOM_READ = "randomRead";<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  static {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  }<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
+<span class="sourceLineNo">156</span><a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
+<span class="sourceLineNo">243</span><a name="line.243"></a>
+<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
+<span class="sourceLineNo">249</span><a name="line.249"></a>
+<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
+<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
+<span class="sourceLineNo">261</span><a name="line.261"></a>
+<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
+<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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><a name="line.297"></a>
+<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
+<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        }<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>      

<TRUNCATED>

[24/44] hbase-site git commit: Published site at 8e6ff689e806138e602a46730886d8c5f524fdcd.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CmdDescriptor.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CmdDescriptor.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CmdDescriptor.html
index 418c60c..7cf23c4 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CmdDescriptor.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CmdDescriptor.html
@@ -64,2689 +64,2710 @@
 <span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.AsyncConnection;<a name="line.56"></a>
 <span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.AsyncTable;<a name="line.57"></a>
 <span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.BufferedMutator;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Get;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Put;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Result;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.111"></a>
-<span class="sourceLineNo">112</span><a name="line.112"></a>
-<span class="sourceLineNo">113</span>/**<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
-<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
-<span class="sourceLineNo">119</span> *<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
-<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
-<span class="sourceLineNo">124</span> *<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
-<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
-<span class="sourceLineNo">129</span> */<a name="line.129"></a>
-<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
-<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
-<span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // TODO : should we make this configurable<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private static final int TAG_LENGTH = 256;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  static {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        "Run async random read test");<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        "Run async random write test");<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.164"></a>
-<span class="sourceLineNo">165</span>        "Run async sequential read test");<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        "Run async sequential write test");<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        "Run async scan test (read every row)");<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      "Run random read test");<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      "Run random seek and scan 100 test");<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      "Run random write test");<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      "Run sequential read test");<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      "Run sequential write test");<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      "Run scan test (read every row)");<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "(make sure to use --rows=20)");<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  }<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * inner-class so we can find associated properties.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   */<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  protected static enum Counter {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    /** elapsed time */<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    ELAPSED_TIME,<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    /** number of rows */<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    public RunResult(long duration, Histogram hist) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      this.duration = duration;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.hist = hist;<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>    public final long duration;<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final Histogram hist;<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>    @Override<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    public String toString() {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      return Long.toString(duration);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>    @Override public int compareTo(RunResult o) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      return Long.compare(this.duration, o.duration);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
-<span class="sourceLineNo">234</span><a name="line.234"></a>
-<span class="sourceLineNo">235</span>  /**<a name="line.235"></a>
-<span class="sourceLineNo">236</span>   * Constructor<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * @param conf Configuration object<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   */<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    super(conf);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      String name, String description) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  /**<a name="line.249"></a>
-<span class="sourceLineNo">250</span>   * Implementations can have their status set.<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   */<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  interface Status {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    /**<a name="line.253"></a>
-<span class="sourceLineNo">254</span>     * Sets status<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * @param msg status message<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @throws IOException<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     */<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    void setStatus(final String msg) throws IOException;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  }<a name="line.259"></a>
-<span class="sourceLineNo">260</span><a name="line.260"></a>
-<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   */<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  public static class EvaluationMapTask<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>    /** configuration parameter name that contains the command */<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the PE impl */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>    @Override<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>      // this is required so that extensions of PE are instantiated within the<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // map reduce task...<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      try {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      } catch (Exception e) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      try {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        return Class.forName(className).asSubclass(type);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      } catch (ClassNotFoundException e) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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>    @Override<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.298"></a>
-<span class="sourceLineNo">299</span>           throws IOException, InterruptedException {<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>      Status status = new Status() {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        @Override<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        public void setStatus(String msg) {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>           context.setStatus(msg);<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><a name="line.307"></a>
-<span class="sourceLineNo">308</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      AsyncConnection asyncCon = null;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      try {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      } catch (ExecutionException e) {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>        throw new IOException(e);<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>      // Evaluation task<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      // Collect how much time the thing took. Report as map output and<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // to the ELAPSED_TIME counter.<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.progress();<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    }<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>  /*<a name="line.330"></a>
-<span class="sourceLineNo">331</span>   * If table does not already exist, create. Also create a table when<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   */<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      throw new IllegalStateException(<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    HTableDescriptor desc =<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    byte[][] splits = getSplits(opts);<a name="line.346"></a>
-<span class="sourceLineNo">347</span><a name="line.347"></a>
-<span class="sourceLineNo">348</span>    // recreate the table when user has requested presplit or when existing<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      needsDelete = true;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      // wait, why did it delete my table?!?<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        .add("needsDelete", needsDelete)<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("isReadCmd", isReadCmd)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("exists", exists)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("desc", desc)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("presplit", opts.presplitRegions)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("replicas", opts.replicas)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .toString());<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>    // remove an existing table<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    if (needsDelete) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      if (admin.isTableEnabled(tableName)) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        admin.disableTable(tableName);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      admin.deleteTable(tableName);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>    // table creation is necessary<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    if (!exists || needsDelete) {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      desc = getTableDescriptor(opts);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      if (splits != null) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        if (LOG.isDebugEnabled()) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<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>      admin.createTable(desc, splits);<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      LOG.info("Table " + desc + " created");<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    return admin.tableExists(tableName);<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>  /**<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setCompressionType(opts.compression);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setBloomFilterType(opts.bloomType);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBlocksize(opts.blockSize);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    if (opts.inMemoryCF) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      family.setInMemory(true);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    desc.addFamily(family);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      desc.setRegionReplication(opts.replicas);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    return desc;<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>  /**<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   * generates splits based on total number of rows and specified split regions<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   */<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      int rowkey = jump * (1 + i);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      splits[i] = format(rowkey);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return splits;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  }<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  /*<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * Run all clients in this vm each to its own thread.<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   */<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    assert cmd != null;<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    @SuppressWarnings("unchecked")<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      final int index = i;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        @Override<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        public RunResult call() throws Exception {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>            @Override<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            public void setStatus(final String msg) throws IOException {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>              LOG.info(msg);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>          });<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.459"></a>
-<span class="sourceLineNo">460</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          return run;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      });<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    }<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    pool.shutdown();<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      try {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        results[i] = threads[i].get();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      } catch (ExecutionException e) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>        throw new IOException(e.getCause());<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    final String test = cmd.getSimpleName();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.475"></a>
-<span class="sourceLineNo">476</span>             + Arrays.toString(results));<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    Arrays.sort(results);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    long total = 0;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    for (RunResult result : results) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      total += result.duration;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    LOG.info("[" + test + "]"<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      + "\tMin: " + results[0] + "ms"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.485"></a>
-<span class="sourceLineNo">486</span><a name="line.486"></a>
-<span class="sourceLineNo">487</span>    con.close();<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    asyncCon.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    return results;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  /*<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Before we start up the job, write out an input file with instruction<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * per client regards which row they are to start on.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * @param cmd Command to run.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @throws IOException<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   */<a name="line.499"></a>
-<span class="sourceLineNo">500</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    assert cmd != null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    Job job = Job.getInstance(conf);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.509"></a>
-<span class="sourceLineNo">510</span><a name="line.510"></a>
-<span class="sourceLineNo">511</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    // this is default, but be explicit about it just in case.<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.514"></a>
-<span class="sourceLineNo">515</span><a name="line.515"></a>
-<span class="sourceLineNo">516</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputValueClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setReducerClass(LongSumReducer.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>    job.setNumReduceTasks(1);<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      Histogram.class,     // yammer metrics<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      );<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>    TableMapReduceUtil.initCredentials(job);<a name="line.534"></a>
-<span class="sourceLineNo">535</span><a name="line.535"></a>
-<span class="sourceLineNo">536</span>    job.waitForCompletion(true);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    return job;<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>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<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>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>  /*<a name="line.546"></a>
-<span class="sourceLineNo">547</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * @param c Configuration<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<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>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    return writeInputFile(c, opts, new Path("."));<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.556"></a>
-<span class="sourceLineNo">557</span>  throws IOException {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>    FileSystem fs = FileSystem.get(c);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    fs.mkdirs(inputDir);<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    // Make input random.<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Hash h = MurmurHash.getInstance();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    try {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>        TestOptions next = new TestOptions(opts);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        next.startRow = j * perClientRows;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.perClientRunRows = perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        String s = MAPPER.writeValueAsString(next);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        byte[] b = Bytes.toBytes(s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        m.put(hash, s);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>        out.println(e.getValue());<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    } finally {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      out.close();<a name="line.586"></a>
-<span class="sourceLineNo">587</span>    }<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    return inputDir;<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>   * Describes a command.<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   */<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  static class CmdDescriptor {<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private String name;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String description;<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      this.cmdClass = cmdClass;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.name = name;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.description = description;<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>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>      return cmdClass;<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>    public String getName() {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>      return name;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    public String getDescription() {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>      return description;<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><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * This makes tracking all these arguments a little easier.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>  static class TestOptions {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    String cmdName = null;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    boolean nomapred = false;<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    boolean filterAll = false;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    int startRow = 0;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    float size = 1.0f;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    int perClientRunRows = DEFAULT_ROWS_PER_GB;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    int numClientThreads = 1;<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    int totalRows = DEFAULT_ROWS_PER_GB;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    int measureAfter = 0;<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    float sampleRate = 1.0f;<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    double traceRate = 0.0;<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    String tableName = TABLE_NAME;<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    boolean flushCommits = true;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    boolean writeToWAL = true;<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    boolean autoFlush = false;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    boolean oneCon = false;<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    boolean useTags = false;<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    int noOfTags = 1;<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    boolean reportLatency = false;<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    int multiGet = 0;<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    int randomSleep = 0;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    boolean inMemoryCF = false;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    int presplitRegions = 0;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    int replicas = HTableDescriptor.DEFAULT_REGION_REPLICATION;<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    String splitPolicy = null;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    Compression.Algorithm compression = Compression.Algorithm.NONE;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    BloomType bloomType = BloomType.ROW;<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    int blockSize = HConstants.DEFAULT_BLOCKSIZE;<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    DataBlockEncoding blockEncoding = DataBlockEncoding.NONE;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    boolean valueRandom = false;<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    boolean valueZipf = false;<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    int valueSize = DEFAULT_VALUE_LENGTH;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    int period = (this.perClientRunRows / 10) == 0? perClientRunRows: perClientRunRows / 10;<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    int cycles = 1;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    int columns = 1;<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    int caching = 30;<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    boolean addColumns = true;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    MemoryCompactionPolicy inMemoryCompaction =<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        MemoryCompactionPolicy.valueOf(<a name="line.664"></a>
-<span class="sourceLineNo">665</span>            CompactingMemStore.COMPACTING_MEMSTORE_TYPE_DEFAULT);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    boolean asyncPrefetch = false;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    boolean cacheBlocks = true;<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    Scan.ReadType scanReadType = Scan.ReadType.DEFAULT;<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>    public TestOptions() {}<a name="line.670"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.BufferedMutatorParams;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Get;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Put;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.Result;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.Table;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.LongWritable;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.io.Text;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Job;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.Tool;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.hadoop.util.ToolRunner;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.Sampler;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.htrace.core.TraceScope;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.Logger;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.slf4j.LoggerFactory;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * command-line which test to run and how many clients are participating in<a name="line.118"></a>
+<span class="sourceLineNo">119</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.119"></a>
+<span class="sourceLineNo">120</span> *<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.123"></a>
+<span class="sourceLineNo">124</span> * paper, pages 8-10.<a name="line.124"></a>
+<span class="sourceLineNo">125</span> *<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.128"></a>
+<span class="sourceLineNo">129</span> * specified otherwise.<a name="line.129"></a>
+<span class="sourceLineNo">130</span> */<a name="line.130"></a>
+<span class="sourceLineNo">131</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.131"></a>
+<span class="sourceLineNo">132</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  static final String RANDOM_READ = "randomRead";<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  static {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  }<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
+<span class="sourceLineNo">156</span><a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
+<span class="sourceLineNo">243</span><a name="line.243"></a>
+<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
+<span class="sourceLineNo">249</span><a name="line.249"></a>
+<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
+<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
+<span class="sourceLineNo">261</span><a name="line.261"></a>
+<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
+<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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><a name="line.297"></a>
+<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
+<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        }<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>      ObjectMapper mapper = new ObjectMapper();<a name="line.309">

<TRUNCATED>

[09/44] hbase-site git commit: Published site at 8e6ff689e806138e602a46730886d8c5f524fdcd.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialReadTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialReadTest.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialReadTest.html
index 418c60c..7cf23c4 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialReadTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialReadTest.html
@@ -64,2689 +64,2710 @@
 <span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.AsyncConnection;<a name="line.56"></a>
 <span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.AsyncTable;<a name="line.57"></a>
 <span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.BufferedMutator;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Get;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Put;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Result;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.111"></a>
-<span class="sourceLineNo">112</span><a name="line.112"></a>
-<span class="sourceLineNo">113</span>/**<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
-<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
-<span class="sourceLineNo">119</span> *<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
-<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
-<span class="sourceLineNo">124</span> *<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
-<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
-<span class="sourceLineNo">129</span> */<a name="line.129"></a>
-<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
-<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
-<span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // TODO : should we make this configurable<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private static final int TAG_LENGTH = 256;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  static {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        "Run async random read test");<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        "Run async random write test");<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.164"></a>
-<span class="sourceLineNo">165</span>        "Run async sequential read test");<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        "Run async sequential write test");<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        "Run async scan test (read every row)");<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      "Run random read test");<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      "Run random seek and scan 100 test");<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      "Run random write test");<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      "Run sequential read test");<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      "Run sequential write test");<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      "Run scan test (read every row)");<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "(make sure to use --rows=20)");<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  }<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * inner-class so we can find associated properties.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   */<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  protected static enum Counter {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    /** elapsed time */<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    ELAPSED_TIME,<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    /** number of rows */<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    public RunResult(long duration, Histogram hist) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      this.duration = duration;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.hist = hist;<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>    public final long duration;<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final Histogram hist;<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>    @Override<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    public String toString() {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      return Long.toString(duration);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>    @Override public int compareTo(RunResult o) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      return Long.compare(this.duration, o.duration);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
-<span class="sourceLineNo">234</span><a name="line.234"></a>
-<span class="sourceLineNo">235</span>  /**<a name="line.235"></a>
-<span class="sourceLineNo">236</span>   * Constructor<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * @param conf Configuration object<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   */<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    super(conf);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      String name, String description) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  /**<a name="line.249"></a>
-<span class="sourceLineNo">250</span>   * Implementations can have their status set.<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   */<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  interface Status {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    /**<a name="line.253"></a>
-<span class="sourceLineNo">254</span>     * Sets status<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * @param msg status message<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @throws IOException<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     */<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    void setStatus(final String msg) throws IOException;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  }<a name="line.259"></a>
-<span class="sourceLineNo">260</span><a name="line.260"></a>
-<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   */<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  public static class EvaluationMapTask<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>    /** configuration parameter name that contains the command */<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the PE impl */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>    @Override<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>      // this is required so that extensions of PE are instantiated within the<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // map reduce task...<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      try {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      } catch (Exception e) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      try {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        return Class.forName(className).asSubclass(type);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      } catch (ClassNotFoundException e) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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>    @Override<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.298"></a>
-<span class="sourceLineNo">299</span>           throws IOException, InterruptedException {<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>      Status status = new Status() {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        @Override<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        public void setStatus(String msg) {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>           context.setStatus(msg);<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><a name="line.307"></a>
-<span class="sourceLineNo">308</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      AsyncConnection asyncCon = null;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      try {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      } catch (ExecutionException e) {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>        throw new IOException(e);<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>      // Evaluation task<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      // Collect how much time the thing took. Report as map output and<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // to the ELAPSED_TIME counter.<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.progress();<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    }<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>  /*<a name="line.330"></a>
-<span class="sourceLineNo">331</span>   * If table does not already exist, create. Also create a table when<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   */<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      throw new IllegalStateException(<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    HTableDescriptor desc =<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    byte[][] splits = getSplits(opts);<a name="line.346"></a>
-<span class="sourceLineNo">347</span><a name="line.347"></a>
-<span class="sourceLineNo">348</span>    // recreate the table when user has requested presplit or when existing<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      needsDelete = true;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      // wait, why did it delete my table?!?<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        .add("needsDelete", needsDelete)<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("isReadCmd", isReadCmd)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("exists", exists)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("desc", desc)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("presplit", opts.presplitRegions)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("replicas", opts.replicas)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .toString());<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>    // remove an existing table<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    if (needsDelete) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      if (admin.isTableEnabled(tableName)) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        admin.disableTable(tableName);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      admin.deleteTable(tableName);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>    // table creation is necessary<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    if (!exists || needsDelete) {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      desc = getTableDescriptor(opts);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      if (splits != null) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        if (LOG.isDebugEnabled()) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<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>      admin.createTable(desc, splits);<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      LOG.info("Table " + desc + " created");<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    return admin.tableExists(tableName);<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>  /**<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setCompressionType(opts.compression);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setBloomFilterType(opts.bloomType);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBlocksize(opts.blockSize);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    if (opts.inMemoryCF) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      family.setInMemory(true);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    desc.addFamily(family);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      desc.setRegionReplication(opts.replicas);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    return desc;<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>  /**<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   * generates splits based on total number of rows and specified split regions<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   */<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      int rowkey = jump * (1 + i);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      splits[i] = format(rowkey);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return splits;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  }<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  /*<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * Run all clients in this vm each to its own thread.<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   */<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    assert cmd != null;<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    @SuppressWarnings("unchecked")<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      final int index = i;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        @Override<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        public RunResult call() throws Exception {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>            @Override<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            public void setStatus(final String msg) throws IOException {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>              LOG.info(msg);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>          });<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.459"></a>
-<span class="sourceLineNo">460</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          return run;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      });<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    }<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    pool.shutdown();<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      try {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        results[i] = threads[i].get();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      } catch (ExecutionException e) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>        throw new IOException(e.getCause());<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    final String test = cmd.getSimpleName();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.475"></a>
-<span class="sourceLineNo">476</span>             + Arrays.toString(results));<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    Arrays.sort(results);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    long total = 0;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    for (RunResult result : results) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      total += result.duration;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    LOG.info("[" + test + "]"<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      + "\tMin: " + results[0] + "ms"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.485"></a>
-<span class="sourceLineNo">486</span><a name="line.486"></a>
-<span class="sourceLineNo">487</span>    con.close();<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    asyncCon.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    return results;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  /*<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Before we start up the job, write out an input file with instruction<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * per client regards which row they are to start on.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * @param cmd Command to run.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @throws IOException<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   */<a name="line.499"></a>
-<span class="sourceLineNo">500</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    assert cmd != null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    Job job = Job.getInstance(conf);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.509"></a>
-<span class="sourceLineNo">510</span><a name="line.510"></a>
-<span class="sourceLineNo">511</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    // this is default, but be explicit about it just in case.<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.514"></a>
-<span class="sourceLineNo">515</span><a name="line.515"></a>
-<span class="sourceLineNo">516</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputValueClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setReducerClass(LongSumReducer.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>    job.setNumReduceTasks(1);<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      Histogram.class,     // yammer metrics<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      );<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>    TableMapReduceUtil.initCredentials(job);<a name="line.534"></a>
-<span class="sourceLineNo">535</span><a name="line.535"></a>
-<span class="sourceLineNo">536</span>    job.waitForCompletion(true);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    return job;<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>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<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>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>  /*<a name="line.546"></a>
-<span class="sourceLineNo">547</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * @param c Configuration<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<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>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    return writeInputFile(c, opts, new Path("."));<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.556"></a>
-<span class="sourceLineNo">557</span>  throws IOException {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>    FileSystem fs = FileSystem.get(c);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    fs.mkdirs(inputDir);<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    // Make input random.<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Hash h = MurmurHash.getInstance();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    try {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>        TestOptions next = new TestOptions(opts);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        next.startRow = j * perClientRows;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.perClientRunRows = perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        String s = MAPPER.writeValueAsString(next);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        byte[] b = Bytes.toBytes(s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        m.put(hash, s);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>        out.println(e.getValue());<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    } finally {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      out.close();<a name="line.586"></a>
-<span class="sourceLineNo">587</span>    }<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    return inputDir;<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>   * Describes a command.<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   */<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  static class CmdDescriptor {<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private String name;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String description;<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      this.cmdClass = cmdClass;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.name = name;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.description = description;<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>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>      return cmdClass;<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>    public String getName() {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>      return name;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    public String getDescription() {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>      return description;<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><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * This makes tracking all these arguments a little easier.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>  static class TestOptions {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    String cmdName = null;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    boolean nomapred = false;<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    boolean filterAll = false;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    int startRow = 0;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    float size = 1.0f;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    int perClientRunRows = DEFAULT_ROWS_PER_GB;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    int numClientThreads = 1;<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    int totalRows = DEFAULT_ROWS_PER_GB;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    int measureAfter = 0;<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    float sampleRate = 1.0f;<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    double traceRate = 0.0;<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    String tableName = TABLE_NAME;<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    boolean flushCommits = true;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    boolean writeToWAL = true;<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    boolean autoFlush = false;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    boolean oneCon = false;<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    boolean useTags = false;<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    int noOfTags = 1;<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    boolean reportLatency = false;<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    int multiGet = 0;<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    int randomSleep = 0;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    boolean inMemoryCF = false;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    int presplitRegions = 0;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    int replicas = HTableDescriptor.DEFAULT_REGION_REPLICATION;<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    String splitPolicy = null;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    Compression.Algorithm compression = Compression.Algorithm.NONE;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    BloomType bloomType = BloomType.ROW;<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    int blockSize = HConstants.DEFAULT_BLOCKSIZE;<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    DataBlockEncoding blockEncoding = DataBlockEncoding.NONE;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    boolean valueRandom = false;<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    boolean valueZipf = false;<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    int valueSize = DEFAULT_VALUE_LENGTH;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    int period = (this.perClientRunRows / 10) == 0? perClientRunRows: perClientRunRows / 10;<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    int cycles = 1;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    int columns = 1;<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    int caching = 30;<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    boolean addColumns = true;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    MemoryCompactionPolicy inMemoryCompaction =<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        MemoryCompactionPolicy.valueOf(<a name="line.664"></a>
-<span class="sourceLineNo">665</span>            CompactingMemStore.COMPACTING_MEMSTORE_TYPE_DEFAULT);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    boolean asyncPrefetch = false;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    boolean cacheBlocks = true;<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    Scan.ReadType scanReadType = Scan.ReadType.DEFAULT;<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>    public TestOptions() {}<a name="line.670"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.BufferedMutatorParams;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Get;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Put;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.Result;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.Table;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.LongWritable;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.io.Text;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Job;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.Tool;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.hadoop.util.ToolRunner;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.Sampler;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.htrace.core.TraceScope;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.Logger;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.slf4j.LoggerFactory;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * command-line which test to run and how many clients are participating in<a name="line.118"></a>
+<span class="sourceLineNo">119</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.119"></a>
+<span class="sourceLineNo">120</span> *<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.123"></a>
+<span class="sourceLineNo">124</span> * paper, pages 8-10.<a name="line.124"></a>
+<span class="sourceLineNo">125</span> *<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.128"></a>
+<span class="sourceLineNo">129</span> * specified otherwise.<a name="line.129"></a>
+<span class="sourceLineNo">130</span> */<a name="line.130"></a>
+<span class="sourceLineNo">131</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.131"></a>
+<span class="sourceLineNo">132</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  static final String RANDOM_READ = "randomRead";<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  static {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  }<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
+<span class="sourceLineNo">156</span><a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
+<span class="sourceLineNo">243</span><a name="line.243"></a>
+<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
+<span class="sourceLineNo">249</span><a name="line.249"></a>
+<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
+<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
+<span class="sourceLineNo">261</span><a name="line.261"></a>
+<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
+<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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><a name="line.297"></a>
+<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
+<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        }<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>      ObjectMapper mapper = new ObjectMap

<TRUNCATED>

[08/44] hbase-site git commit: Published site at 8e6ff689e806138e602a46730886d8c5f524fdcd.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialWriteTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialWriteTest.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialWriteTest.html
index 418c60c..7cf23c4 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialWriteTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialWriteTest.html
@@ -64,2689 +64,2710 @@
 <span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.AsyncConnection;<a name="line.56"></a>
 <span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.AsyncTable;<a name="line.57"></a>
 <span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.BufferedMutator;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Get;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Put;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Result;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.111"></a>
-<span class="sourceLineNo">112</span><a name="line.112"></a>
-<span class="sourceLineNo">113</span>/**<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
-<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
-<span class="sourceLineNo">119</span> *<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
-<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
-<span class="sourceLineNo">124</span> *<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
-<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
-<span class="sourceLineNo">129</span> */<a name="line.129"></a>
-<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
-<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
-<span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // TODO : should we make this configurable<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private static final int TAG_LENGTH = 256;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  static {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        "Run async random read test");<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        "Run async random write test");<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.164"></a>
-<span class="sourceLineNo">165</span>        "Run async sequential read test");<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        "Run async sequential write test");<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        "Run async scan test (read every row)");<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      "Run random read test");<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      "Run random seek and scan 100 test");<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      "Run random write test");<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      "Run sequential read test");<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      "Run sequential write test");<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      "Run scan test (read every row)");<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "(make sure to use --rows=20)");<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  }<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * inner-class so we can find associated properties.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   */<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  protected static enum Counter {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    /** elapsed time */<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    ELAPSED_TIME,<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    /** number of rows */<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    public RunResult(long duration, Histogram hist) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      this.duration = duration;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.hist = hist;<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>    public final long duration;<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final Histogram hist;<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>    @Override<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    public String toString() {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      return Long.toString(duration);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>    @Override public int compareTo(RunResult o) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      return Long.compare(this.duration, o.duration);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
-<span class="sourceLineNo">234</span><a name="line.234"></a>
-<span class="sourceLineNo">235</span>  /**<a name="line.235"></a>
-<span class="sourceLineNo">236</span>   * Constructor<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * @param conf Configuration object<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   */<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    super(conf);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      String name, String description) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  /**<a name="line.249"></a>
-<span class="sourceLineNo">250</span>   * Implementations can have their status set.<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   */<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  interface Status {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    /**<a name="line.253"></a>
-<span class="sourceLineNo">254</span>     * Sets status<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * @param msg status message<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @throws IOException<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     */<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    void setStatus(final String msg) throws IOException;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  }<a name="line.259"></a>
-<span class="sourceLineNo">260</span><a name="line.260"></a>
-<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   */<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  public static class EvaluationMapTask<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>    /** configuration parameter name that contains the command */<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the PE impl */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>    @Override<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>      // this is required so that extensions of PE are instantiated within the<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // map reduce task...<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      try {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      } catch (Exception e) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      try {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        return Class.forName(className).asSubclass(type);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      } catch (ClassNotFoundException e) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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>    @Override<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.298"></a>
-<span class="sourceLineNo">299</span>           throws IOException, InterruptedException {<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>      Status status = new Status() {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        @Override<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        public void setStatus(String msg) {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>           context.setStatus(msg);<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><a name="line.307"></a>
-<span class="sourceLineNo">308</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      AsyncConnection asyncCon = null;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      try {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      } catch (ExecutionException e) {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>        throw new IOException(e);<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>      // Evaluation task<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      // Collect how much time the thing took. Report as map output and<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // to the ELAPSED_TIME counter.<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.progress();<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    }<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>  /*<a name="line.330"></a>
-<span class="sourceLineNo">331</span>   * If table does not already exist, create. Also create a table when<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   */<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      throw new IllegalStateException(<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    HTableDescriptor desc =<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    byte[][] splits = getSplits(opts);<a name="line.346"></a>
-<span class="sourceLineNo">347</span><a name="line.347"></a>
-<span class="sourceLineNo">348</span>    // recreate the table when user has requested presplit or when existing<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      needsDelete = true;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      // wait, why did it delete my table?!?<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        .add("needsDelete", needsDelete)<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("isReadCmd", isReadCmd)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("exists", exists)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("desc", desc)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("presplit", opts.presplitRegions)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("replicas", opts.replicas)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .toString());<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>    // remove an existing table<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    if (needsDelete) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      if (admin.isTableEnabled(tableName)) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        admin.disableTable(tableName);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      admin.deleteTable(tableName);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>    // table creation is necessary<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    if (!exists || needsDelete) {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      desc = getTableDescriptor(opts);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      if (splits != null) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        if (LOG.isDebugEnabled()) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<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>      admin.createTable(desc, splits);<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      LOG.info("Table " + desc + " created");<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    return admin.tableExists(tableName);<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>  /**<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setCompressionType(opts.compression);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setBloomFilterType(opts.bloomType);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBlocksize(opts.blockSize);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    if (opts.inMemoryCF) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      family.setInMemory(true);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    desc.addFamily(family);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      desc.setRegionReplication(opts.replicas);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    return desc;<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>  /**<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   * generates splits based on total number of rows and specified split regions<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   */<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      int rowkey = jump * (1 + i);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      splits[i] = format(rowkey);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return splits;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  }<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  /*<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * Run all clients in this vm each to its own thread.<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   */<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    assert cmd != null;<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    @SuppressWarnings("unchecked")<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      final int index = i;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        @Override<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        public RunResult call() throws Exception {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>            @Override<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            public void setStatus(final String msg) throws IOException {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>              LOG.info(msg);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>          });<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.459"></a>
-<span class="sourceLineNo">460</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          return run;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      });<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    }<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    pool.shutdown();<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      try {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        results[i] = threads[i].get();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      } catch (ExecutionException e) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>        throw new IOException(e.getCause());<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    final String test = cmd.getSimpleName();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.475"></a>
-<span class="sourceLineNo">476</span>             + Arrays.toString(results));<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    Arrays.sort(results);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    long total = 0;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    for (RunResult result : results) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      total += result.duration;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    LOG.info("[" + test + "]"<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      + "\tMin: " + results[0] + "ms"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.485"></a>
-<span class="sourceLineNo">486</span><a name="line.486"></a>
-<span class="sourceLineNo">487</span>    con.close();<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    asyncCon.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    return results;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  /*<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Before we start up the job, write out an input file with instruction<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * per client regards which row they are to start on.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * @param cmd Command to run.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @throws IOException<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   */<a name="line.499"></a>
-<span class="sourceLineNo">500</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    assert cmd != null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    Job job = Job.getInstance(conf);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.509"></a>
-<span class="sourceLineNo">510</span><a name="line.510"></a>
-<span class="sourceLineNo">511</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    // this is default, but be explicit about it just in case.<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.514"></a>
-<span class="sourceLineNo">515</span><a name="line.515"></a>
-<span class="sourceLineNo">516</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputValueClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setReducerClass(LongSumReducer.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>    job.setNumReduceTasks(1);<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      Histogram.class,     // yammer metrics<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      );<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>    TableMapReduceUtil.initCredentials(job);<a name="line.534"></a>
-<span class="sourceLineNo">535</span><a name="line.535"></a>
-<span class="sourceLineNo">536</span>    job.waitForCompletion(true);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    return job;<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>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<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>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>  /*<a name="line.546"></a>
-<span class="sourceLineNo">547</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * @param c Configuration<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<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>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    return writeInputFile(c, opts, new Path("."));<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.556"></a>
-<span class="sourceLineNo">557</span>  throws IOException {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>    FileSystem fs = FileSystem.get(c);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    fs.mkdirs(inputDir);<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    // Make input random.<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Hash h = MurmurHash.getInstance();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    try {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>        TestOptions next = new TestOptions(opts);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        next.startRow = j * perClientRows;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.perClientRunRows = perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        String s = MAPPER.writeValueAsString(next);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        byte[] b = Bytes.toBytes(s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        m.put(hash, s);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>        out.println(e.getValue());<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    } finally {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      out.close();<a name="line.586"></a>
-<span class="sourceLineNo">587</span>    }<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    return inputDir;<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>   * Describes a command.<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   */<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  static class CmdDescriptor {<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private String name;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String description;<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      this.cmdClass = cmdClass;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.name = name;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.description = description;<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>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>      return cmdClass;<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>    public String getName() {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>      return name;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    public String getDescription() {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>      return description;<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><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * This makes tracking all these arguments a little easier.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>  static class TestOptions {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    String cmdName = null;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    boolean nomapred = false;<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    boolean filterAll = false;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    int startRow = 0;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    float size = 1.0f;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    int perClientRunRows = DEFAULT_ROWS_PER_GB;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    int numClientThreads = 1;<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    int totalRows = DEFAULT_ROWS_PER_GB;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    int measureAfter = 0;<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    float sampleRate = 1.0f;<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    double traceRate = 0.0;<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    String tableName = TABLE_NAME;<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    boolean flushCommits = true;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    boolean writeToWAL = true;<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    boolean autoFlush = false;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    boolean oneCon = false;<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    boolean useTags = false;<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    int noOfTags = 1;<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    boolean reportLatency = false;<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    int multiGet = 0;<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    int randomSleep = 0;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    boolean inMemoryCF = false;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    int presplitRegions = 0;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    int replicas = HTableDescriptor.DEFAULT_REGION_REPLICATION;<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    String splitPolicy = null;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    Compression.Algorithm compression = Compression.Algorithm.NONE;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    BloomType bloomType = BloomType.ROW;<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    int blockSize = HConstants.DEFAULT_BLOCKSIZE;<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    DataBlockEncoding blockEncoding = DataBlockEncoding.NONE;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    boolean valueRandom = false;<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    boolean valueZipf = false;<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    int valueSize = DEFAULT_VALUE_LENGTH;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    int period = (this.perClientRunRows / 10) == 0? perClientRunRows: perClientRunRows / 10;<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    int cycles = 1;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    int columns = 1;<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    int caching = 30;<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    boolean addColumns = true;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    MemoryCompactionPolicy inMemoryCompaction =<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        MemoryCompactionPolicy.valueOf(<a name="line.664"></a>
-<span class="sourceLineNo">665</span>            CompactingMemStore.COMPACTING_MEMSTORE_TYPE_DEFAULT);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    boolean asyncPrefetch = false;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    boolean cacheBlocks = true;<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    Scan.ReadType scanReadType = Scan.ReadType.DEFAULT;<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>    public TestOptions() {}<a name="line.670"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.BufferedMutatorParams;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Get;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Put;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.Result;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.Table;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.LongWritable;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.io.Text;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Job;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.Tool;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.hadoop.util.ToolRunner;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.Sampler;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.htrace.core.TraceScope;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.Logger;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.slf4j.LoggerFactory;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * command-line which test to run and how many clients are participating in<a name="line.118"></a>
+<span class="sourceLineNo">119</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.119"></a>
+<span class="sourceLineNo">120</span> *<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.123"></a>
+<span class="sourceLineNo">124</span> * paper, pages 8-10.<a name="line.124"></a>
+<span class="sourceLineNo">125</span> *<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.128"></a>
+<span class="sourceLineNo">129</span> * specified otherwise.<a name="line.129"></a>
+<span class="sourceLineNo">130</span> */<a name="line.130"></a>
+<span class="sourceLineNo">131</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.131"></a>
+<span class="sourceLineNo">132</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  static final String RANDOM_READ = "randomRead";<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  static {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  }<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
+<span class="sourceLineNo">156</span><a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
+<span class="sourceLineNo">243</span><a name="line.243"></a>
+<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
+<span class="sourceLineNo">249</span><a name="line.249"></a>
+<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
+<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
+<span class="sourceLineNo">261</span><a name="line.261"></a>
+<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
+<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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><a name="line.297"></a>
+<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
+<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        }<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>      ObjectMapper mapper = new Obje

<TRUNCATED>

[30/44] hbase-site git commit: Published site at 8e6ff689e806138e602a46730886d8c5f524fdcd.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTest.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTest.html
index 418c60c..7cf23c4 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTest.html
@@ -64,2689 +64,2710 @@
 <span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.AsyncConnection;<a name="line.56"></a>
 <span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.AsyncTable;<a name="line.57"></a>
 <span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.BufferedMutator;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Get;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Put;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Result;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.111"></a>
-<span class="sourceLineNo">112</span><a name="line.112"></a>
-<span class="sourceLineNo">113</span>/**<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
-<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
-<span class="sourceLineNo">119</span> *<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
-<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
-<span class="sourceLineNo">124</span> *<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
-<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
-<span class="sourceLineNo">129</span> */<a name="line.129"></a>
-<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
-<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
-<span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // TODO : should we make this configurable<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private static final int TAG_LENGTH = 256;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  static {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        "Run async random read test");<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        "Run async random write test");<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.164"></a>
-<span class="sourceLineNo">165</span>        "Run async sequential read test");<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        "Run async sequential write test");<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        "Run async scan test (read every row)");<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      "Run random read test");<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      "Run random seek and scan 100 test");<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      "Run random write test");<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      "Run sequential read test");<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      "Run sequential write test");<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      "Run scan test (read every row)");<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "(make sure to use --rows=20)");<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  }<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * inner-class so we can find associated properties.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   */<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  protected static enum Counter {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    /** elapsed time */<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    ELAPSED_TIME,<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    /** number of rows */<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    public RunResult(long duration, Histogram hist) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      this.duration = duration;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.hist = hist;<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>    public final long duration;<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final Histogram hist;<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>    @Override<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    public String toString() {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      return Long.toString(duration);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>    @Override public int compareTo(RunResult o) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      return Long.compare(this.duration, o.duration);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
-<span class="sourceLineNo">234</span><a name="line.234"></a>
-<span class="sourceLineNo">235</span>  /**<a name="line.235"></a>
-<span class="sourceLineNo">236</span>   * Constructor<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * @param conf Configuration object<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   */<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    super(conf);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      String name, String description) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  /**<a name="line.249"></a>
-<span class="sourceLineNo">250</span>   * Implementations can have their status set.<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   */<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  interface Status {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    /**<a name="line.253"></a>
-<span class="sourceLineNo">254</span>     * Sets status<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * @param msg status message<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @throws IOException<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     */<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    void setStatus(final String msg) throws IOException;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  }<a name="line.259"></a>
-<span class="sourceLineNo">260</span><a name="line.260"></a>
-<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   */<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  public static class EvaluationMapTask<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>    /** configuration parameter name that contains the command */<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the PE impl */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>    @Override<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>      // this is required so that extensions of PE are instantiated within the<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // map reduce task...<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      try {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      } catch (Exception e) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      try {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        return Class.forName(className).asSubclass(type);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      } catch (ClassNotFoundException e) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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>    @Override<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.298"></a>
-<span class="sourceLineNo">299</span>           throws IOException, InterruptedException {<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>      Status status = new Status() {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        @Override<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        public void setStatus(String msg) {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>           context.setStatus(msg);<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><a name="line.307"></a>
-<span class="sourceLineNo">308</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      AsyncConnection asyncCon = null;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      try {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      } catch (ExecutionException e) {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>        throw new IOException(e);<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>      // Evaluation task<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      // Collect how much time the thing took. Report as map output and<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // to the ELAPSED_TIME counter.<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.progress();<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    }<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>  /*<a name="line.330"></a>
-<span class="sourceLineNo">331</span>   * If table does not already exist, create. Also create a table when<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   */<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      throw new IllegalStateException(<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    HTableDescriptor desc =<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    byte[][] splits = getSplits(opts);<a name="line.346"></a>
-<span class="sourceLineNo">347</span><a name="line.347"></a>
-<span class="sourceLineNo">348</span>    // recreate the table when user has requested presplit or when existing<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      needsDelete = true;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      // wait, why did it delete my table?!?<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        .add("needsDelete", needsDelete)<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("isReadCmd", isReadCmd)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("exists", exists)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("desc", desc)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("presplit", opts.presplitRegions)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("replicas", opts.replicas)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .toString());<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>    // remove an existing table<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    if (needsDelete) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      if (admin.isTableEnabled(tableName)) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        admin.disableTable(tableName);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      admin.deleteTable(tableName);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>    // table creation is necessary<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    if (!exists || needsDelete) {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      desc = getTableDescriptor(opts);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      if (splits != null) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        if (LOG.isDebugEnabled()) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<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>      admin.createTable(desc, splits);<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      LOG.info("Table " + desc + " created");<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    return admin.tableExists(tableName);<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>  /**<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setCompressionType(opts.compression);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setBloomFilterType(opts.bloomType);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBlocksize(opts.blockSize);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    if (opts.inMemoryCF) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      family.setInMemory(true);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    desc.addFamily(family);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      desc.setRegionReplication(opts.replicas);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    return desc;<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>  /**<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   * generates splits based on total number of rows and specified split regions<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   */<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      int rowkey = jump * (1 + i);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      splits[i] = format(rowkey);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return splits;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  }<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  /*<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * Run all clients in this vm each to its own thread.<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   */<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    assert cmd != null;<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    @SuppressWarnings("unchecked")<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      final int index = i;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        @Override<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        public RunResult call() throws Exception {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>            @Override<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            public void setStatus(final String msg) throws IOException {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>              LOG.info(msg);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>          });<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.459"></a>
-<span class="sourceLineNo">460</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          return run;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      });<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    }<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    pool.shutdown();<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      try {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        results[i] = threads[i].get();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      } catch (ExecutionException e) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>        throw new IOException(e.getCause());<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    final String test = cmd.getSimpleName();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.475"></a>
-<span class="sourceLineNo">476</span>             + Arrays.toString(results));<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    Arrays.sort(results);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    long total = 0;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    for (RunResult result : results) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      total += result.duration;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    LOG.info("[" + test + "]"<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      + "\tMin: " + results[0] + "ms"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.485"></a>
-<span class="sourceLineNo">486</span><a name="line.486"></a>
-<span class="sourceLineNo">487</span>    con.close();<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    asyncCon.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    return results;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  /*<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Before we start up the job, write out an input file with instruction<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * per client regards which row they are to start on.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * @param cmd Command to run.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @throws IOException<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   */<a name="line.499"></a>
-<span class="sourceLineNo">500</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    assert cmd != null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    Job job = Job.getInstance(conf);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.509"></a>
-<span class="sourceLineNo">510</span><a name="line.510"></a>
-<span class="sourceLineNo">511</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    // this is default, but be explicit about it just in case.<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.514"></a>
-<span class="sourceLineNo">515</span><a name="line.515"></a>
-<span class="sourceLineNo">516</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputValueClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setReducerClass(LongSumReducer.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>    job.setNumReduceTasks(1);<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      Histogram.class,     // yammer metrics<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      );<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>    TableMapReduceUtil.initCredentials(job);<a name="line.534"></a>
-<span class="sourceLineNo">535</span><a name="line.535"></a>
-<span class="sourceLineNo">536</span>    job.waitForCompletion(true);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    return job;<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>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<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>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>  /*<a name="line.546"></a>
-<span class="sourceLineNo">547</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * @param c Configuration<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<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>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    return writeInputFile(c, opts, new Path("."));<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.556"></a>
-<span class="sourceLineNo">557</span>  throws IOException {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>    FileSystem fs = FileSystem.get(c);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    fs.mkdirs(inputDir);<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    // Make input random.<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Hash h = MurmurHash.getInstance();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    try {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>        TestOptions next = new TestOptions(opts);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        next.startRow = j * perClientRows;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.perClientRunRows = perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        String s = MAPPER.writeValueAsString(next);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        byte[] b = Bytes.toBytes(s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        m.put(hash, s);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>        out.println(e.getValue());<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    } finally {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      out.close();<a name="line.586"></a>
-<span class="sourceLineNo">587</span>    }<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    return inputDir;<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>   * Describes a command.<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   */<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  static class CmdDescriptor {<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private String name;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String description;<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      this.cmdClass = cmdClass;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.name = name;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.description = description;<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>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>      return cmdClass;<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>    public String getName() {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>      return name;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    public String getDescription() {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>      return description;<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><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * This makes tracking all these arguments a little easier.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>  static class TestOptions {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    String cmdName = null;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    boolean nomapred = false;<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    boolean filterAll = false;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    int startRow = 0;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    float size = 1.0f;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    int perClientRunRows = DEFAULT_ROWS_PER_GB;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    int numClientThreads = 1;<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    int totalRows = DEFAULT_ROWS_PER_GB;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    int measureAfter = 0;<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    float sampleRate = 1.0f;<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    double traceRate = 0.0;<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    String tableName = TABLE_NAME;<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    boolean flushCommits = true;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    boolean writeToWAL = true;<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    boolean autoFlush = false;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    boolean oneCon = false;<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    boolean useTags = false;<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    int noOfTags = 1;<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    boolean reportLatency = false;<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    int multiGet = 0;<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    int randomSleep = 0;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    boolean inMemoryCF = false;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    int presplitRegions = 0;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    int replicas = HTableDescriptor.DEFAULT_REGION_REPLICATION;<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    String splitPolicy = null;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    Compression.Algorithm compression = Compression.Algorithm.NONE;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    BloomType bloomType = BloomType.ROW;<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    int blockSize = HConstants.DEFAULT_BLOCKSIZE;<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    DataBlockEncoding blockEncoding = DataBlockEncoding.NONE;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    boolean valueRandom = false;<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    boolean valueZipf = false;<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    int valueSize = DEFAULT_VALUE_LENGTH;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    int period = (this.perClientRunRows / 10) == 0? perClientRunRows: perClientRunRows / 10;<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    int cycles = 1;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    int columns = 1;<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    int caching = 30;<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    boolean addColumns = true;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    MemoryCompactionPolicy inMemoryCompaction =<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        MemoryCompactionPolicy.valueOf(<a name="line.664"></a>
-<span class="sourceLineNo">665</span>            CompactingMemStore.COMPACTING_MEMSTORE_TYPE_DEFAULT);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    boolean asyncPrefetch = false;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    boolean cacheBlocks = true;<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    Scan.ReadType scanReadType = Scan.ReadType.DEFAULT;<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>    public TestOptions() {}<a name="line.670"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.BufferedMutatorParams;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Get;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Put;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.Result;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.Table;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.LongWritable;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.io.Text;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Job;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.Tool;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.hadoop.util.ToolRunner;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.Sampler;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.htrace.core.TraceScope;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.Logger;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.slf4j.LoggerFactory;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * command-line which test to run and how many clients are participating in<a name="line.118"></a>
+<span class="sourceLineNo">119</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.119"></a>
+<span class="sourceLineNo">120</span> *<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.123"></a>
+<span class="sourceLineNo">124</span> * paper, pages 8-10.<a name="line.124"></a>
+<span class="sourceLineNo">125</span> *<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.128"></a>
+<span class="sourceLineNo">129</span> * specified otherwise.<a name="line.129"></a>
+<span class="sourceLineNo">130</span> */<a name="line.130"></a>
+<span class="sourceLineNo">131</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.131"></a>
+<span class="sourceLineNo">132</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  static final String RANDOM_READ = "randomRead";<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  static {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  }<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
+<span class="sourceLineNo">156</span><a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
+<span class="sourceLineNo">243</span><a name="line.243"></a>
+<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
+<span class="sourceLineNo">249</span><a name="line.249"></a>
+<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
+<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
+<span class="sourceLineNo">261</span><a name="line.261"></a>
+<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
+<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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><a name="line.297"></a>
+<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
+<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        }<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>      ObjectMapper mapper = new ObjectMapper();<a name="line.309"></a>
+<span class="s

<TRUNCATED>

[18/44] hbase-site git commit: Published site at 8e6ff689e806138e602a46730886d8c5f524fdcd.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10000Test.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10000Test.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10000Test.html
index 418c60c..7cf23c4 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10000Test.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10000Test.html
@@ -64,2689 +64,2710 @@
 <span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.AsyncConnection;<a name="line.56"></a>
 <span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.AsyncTable;<a name="line.57"></a>
 <span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.BufferedMutator;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Get;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Put;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Result;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.111"></a>
-<span class="sourceLineNo">112</span><a name="line.112"></a>
-<span class="sourceLineNo">113</span>/**<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
-<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
-<span class="sourceLineNo">119</span> *<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
-<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
-<span class="sourceLineNo">124</span> *<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
-<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
-<span class="sourceLineNo">129</span> */<a name="line.129"></a>
-<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
-<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
-<span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // TODO : should we make this configurable<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private static final int TAG_LENGTH = 256;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  static {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        "Run async random read test");<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        "Run async random write test");<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.164"></a>
-<span class="sourceLineNo">165</span>        "Run async sequential read test");<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        "Run async sequential write test");<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        "Run async scan test (read every row)");<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      "Run random read test");<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      "Run random seek and scan 100 test");<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      "Run random write test");<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      "Run sequential read test");<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      "Run sequential write test");<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      "Run scan test (read every row)");<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "(make sure to use --rows=20)");<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  }<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * inner-class so we can find associated properties.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   */<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  protected static enum Counter {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    /** elapsed time */<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    ELAPSED_TIME,<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    /** number of rows */<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    public RunResult(long duration, Histogram hist) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      this.duration = duration;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.hist = hist;<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>    public final long duration;<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final Histogram hist;<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>    @Override<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    public String toString() {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      return Long.toString(duration);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>    @Override public int compareTo(RunResult o) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      return Long.compare(this.duration, o.duration);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
-<span class="sourceLineNo">234</span><a name="line.234"></a>
-<span class="sourceLineNo">235</span>  /**<a name="line.235"></a>
-<span class="sourceLineNo">236</span>   * Constructor<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * @param conf Configuration object<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   */<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    super(conf);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      String name, String description) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  /**<a name="line.249"></a>
-<span class="sourceLineNo">250</span>   * Implementations can have their status set.<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   */<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  interface Status {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    /**<a name="line.253"></a>
-<span class="sourceLineNo">254</span>     * Sets status<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * @param msg status message<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @throws IOException<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     */<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    void setStatus(final String msg) throws IOException;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  }<a name="line.259"></a>
-<span class="sourceLineNo">260</span><a name="line.260"></a>
-<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   */<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  public static class EvaluationMapTask<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>    /** configuration parameter name that contains the command */<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the PE impl */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>    @Override<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>      // this is required so that extensions of PE are instantiated within the<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // map reduce task...<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      try {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      } catch (Exception e) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      try {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        return Class.forName(className).asSubclass(type);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      } catch (ClassNotFoundException e) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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>    @Override<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.298"></a>
-<span class="sourceLineNo">299</span>           throws IOException, InterruptedException {<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>      Status status = new Status() {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        @Override<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        public void setStatus(String msg) {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>           context.setStatus(msg);<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><a name="line.307"></a>
-<span class="sourceLineNo">308</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      AsyncConnection asyncCon = null;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      try {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      } catch (ExecutionException e) {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>        throw new IOException(e);<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>      // Evaluation task<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      // Collect how much time the thing took. Report as map output and<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // to the ELAPSED_TIME counter.<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.progress();<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    }<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>  /*<a name="line.330"></a>
-<span class="sourceLineNo">331</span>   * If table does not already exist, create. Also create a table when<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   */<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      throw new IllegalStateException(<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    HTableDescriptor desc =<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    byte[][] splits = getSplits(opts);<a name="line.346"></a>
-<span class="sourceLineNo">347</span><a name="line.347"></a>
-<span class="sourceLineNo">348</span>    // recreate the table when user has requested presplit or when existing<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      needsDelete = true;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      // wait, why did it delete my table?!?<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        .add("needsDelete", needsDelete)<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("isReadCmd", isReadCmd)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("exists", exists)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("desc", desc)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("presplit", opts.presplitRegions)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("replicas", opts.replicas)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .toString());<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>    // remove an existing table<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    if (needsDelete) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      if (admin.isTableEnabled(tableName)) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        admin.disableTable(tableName);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      admin.deleteTable(tableName);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>    // table creation is necessary<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    if (!exists || needsDelete) {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      desc = getTableDescriptor(opts);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      if (splits != null) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        if (LOG.isDebugEnabled()) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<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>      admin.createTable(desc, splits);<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      LOG.info("Table " + desc + " created");<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    return admin.tableExists(tableName);<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>  /**<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setCompressionType(opts.compression);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setBloomFilterType(opts.bloomType);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBlocksize(opts.blockSize);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    if (opts.inMemoryCF) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      family.setInMemory(true);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    desc.addFamily(family);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      desc.setRegionReplication(opts.replicas);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    return desc;<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>  /**<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   * generates splits based on total number of rows and specified split regions<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   */<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      int rowkey = jump * (1 + i);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      splits[i] = format(rowkey);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return splits;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  }<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  /*<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * Run all clients in this vm each to its own thread.<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   */<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    assert cmd != null;<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    @SuppressWarnings("unchecked")<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      final int index = i;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        @Override<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        public RunResult call() throws Exception {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>            @Override<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            public void setStatus(final String msg) throws IOException {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>              LOG.info(msg);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>          });<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.459"></a>
-<span class="sourceLineNo">460</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          return run;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      });<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    }<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    pool.shutdown();<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      try {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        results[i] = threads[i].get();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      } catch (ExecutionException e) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>        throw new IOException(e.getCause());<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    final String test = cmd.getSimpleName();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.475"></a>
-<span class="sourceLineNo">476</span>             + Arrays.toString(results));<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    Arrays.sort(results);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    long total = 0;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    for (RunResult result : results) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      total += result.duration;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    LOG.info("[" + test + "]"<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      + "\tMin: " + results[0] + "ms"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.485"></a>
-<span class="sourceLineNo">486</span><a name="line.486"></a>
-<span class="sourceLineNo">487</span>    con.close();<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    asyncCon.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    return results;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  /*<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Before we start up the job, write out an input file with instruction<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * per client regards which row they are to start on.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * @param cmd Command to run.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @throws IOException<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   */<a name="line.499"></a>
-<span class="sourceLineNo">500</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    assert cmd != null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    Job job = Job.getInstance(conf);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.509"></a>
-<span class="sourceLineNo">510</span><a name="line.510"></a>
-<span class="sourceLineNo">511</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    // this is default, but be explicit about it just in case.<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.514"></a>
-<span class="sourceLineNo">515</span><a name="line.515"></a>
-<span class="sourceLineNo">516</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputValueClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setReducerClass(LongSumReducer.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>    job.setNumReduceTasks(1);<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      Histogram.class,     // yammer metrics<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      );<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>    TableMapReduceUtil.initCredentials(job);<a name="line.534"></a>
-<span class="sourceLineNo">535</span><a name="line.535"></a>
-<span class="sourceLineNo">536</span>    job.waitForCompletion(true);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    return job;<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>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<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>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>  /*<a name="line.546"></a>
-<span class="sourceLineNo">547</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * @param c Configuration<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<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>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    return writeInputFile(c, opts, new Path("."));<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.556"></a>
-<span class="sourceLineNo">557</span>  throws IOException {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>    FileSystem fs = FileSystem.get(c);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    fs.mkdirs(inputDir);<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    // Make input random.<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Hash h = MurmurHash.getInstance();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    try {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>        TestOptions next = new TestOptions(opts);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        next.startRow = j * perClientRows;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.perClientRunRows = perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        String s = MAPPER.writeValueAsString(next);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        byte[] b = Bytes.toBytes(s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        m.put(hash, s);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>        out.println(e.getValue());<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    } finally {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      out.close();<a name="line.586"></a>
-<span class="sourceLineNo">587</span>    }<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    return inputDir;<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>   * Describes a command.<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   */<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  static class CmdDescriptor {<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private String name;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String description;<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      this.cmdClass = cmdClass;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.name = name;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.description = description;<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>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>      return cmdClass;<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>    public String getName() {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>      return name;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    public String getDescription() {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>      return description;<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><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * This makes tracking all these arguments a little easier.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>  static class TestOptions {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    String cmdName = null;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    boolean nomapred = false;<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    boolean filterAll = false;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    int startRow = 0;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    float size = 1.0f;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    int perClientRunRows = DEFAULT_ROWS_PER_GB;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    int numClientThreads = 1;<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    int totalRows = DEFAULT_ROWS_PER_GB;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    int measureAfter = 0;<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    float sampleRate = 1.0f;<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    double traceRate = 0.0;<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    String tableName = TABLE_NAME;<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    boolean flushCommits = true;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    boolean writeToWAL = true;<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    boolean autoFlush = false;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    boolean oneCon = false;<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    boolean useTags = false;<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    int noOfTags = 1;<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    boolean reportLatency = false;<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    int multiGet = 0;<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    int randomSleep = 0;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    boolean inMemoryCF = false;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    int presplitRegions = 0;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    int replicas = HTableDescriptor.DEFAULT_REGION_REPLICATION;<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    String splitPolicy = null;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    Compression.Algorithm compression = Compression.Algorithm.NONE;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    BloomType bloomType = BloomType.ROW;<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    int blockSize = HConstants.DEFAULT_BLOCKSIZE;<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    DataBlockEncoding blockEncoding = DataBlockEncoding.NONE;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    boolean valueRandom = false;<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    boolean valueZipf = false;<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    int valueSize = DEFAULT_VALUE_LENGTH;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    int period = (this.perClientRunRows / 10) == 0? perClientRunRows: perClientRunRows / 10;<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    int cycles = 1;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    int columns = 1;<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    int caching = 30;<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    boolean addColumns = true;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    MemoryCompactionPolicy inMemoryCompaction =<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        MemoryCompactionPolicy.valueOf(<a name="line.664"></a>
-<span class="sourceLineNo">665</span>            CompactingMemStore.COMPACTING_MEMSTORE_TYPE_DEFAULT);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    boolean asyncPrefetch = false;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    boolean cacheBlocks = true;<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    Scan.ReadType scanReadType = Scan.ReadType.DEFAULT;<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>    public TestOptions() {}<a name="line.670"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.BufferedMutatorParams;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Get;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Put;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.Result;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.Table;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.LongWritable;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.io.Text;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Job;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.Tool;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.hadoop.util.ToolRunner;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.Sampler;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.htrace.core.TraceScope;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.Logger;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.slf4j.LoggerFactory;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * command-line which test to run and how many clients are participating in<a name="line.118"></a>
+<span class="sourceLineNo">119</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.119"></a>
+<span class="sourceLineNo">120</span> *<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.123"></a>
+<span class="sourceLineNo">124</span> * paper, pages 8-10.<a name="line.124"></a>
+<span class="sourceLineNo">125</span> *<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.128"></a>
+<span class="sourceLineNo">129</span> * specified otherwise.<a name="line.129"></a>
+<span class="sourceLineNo">130</span> */<a name="line.130"></a>
+<span class="sourceLineNo">131</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.131"></a>
+<span class="sourceLineNo">132</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  static final String RANDOM_READ = "randomRead";<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  static {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  }<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
+<span class="sourceLineNo">156</span><a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
+<span class="sourceLineNo">243</span><a name="line.243"></a>
+<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
+<span class="sourceLineNo">249</span><a name="line.249"></a>
+<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
+<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
+<span class="sourceLineNo">261</span><a name="line.261"></a>
+<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
+<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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><a name="line.297"></a>
+<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
+<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        }<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">3

<TRUNCATED>

[22/44] hbase-site git commit: Published site at 8e6ff689e806138e602a46730886d8c5f524fdcd.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.EvaluationMapTask.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.EvaluationMapTask.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.EvaluationMapTask.html
index 418c60c..7cf23c4 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.EvaluationMapTask.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.EvaluationMapTask.html
@@ -64,2689 +64,2710 @@
 <span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.AsyncConnection;<a name="line.56"></a>
 <span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.AsyncTable;<a name="line.57"></a>
 <span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.BufferedMutator;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Get;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Put;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Result;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.111"></a>
-<span class="sourceLineNo">112</span><a name="line.112"></a>
-<span class="sourceLineNo">113</span>/**<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
-<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
-<span class="sourceLineNo">119</span> *<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
-<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
-<span class="sourceLineNo">124</span> *<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
-<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
-<span class="sourceLineNo">129</span> */<a name="line.129"></a>
-<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
-<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
-<span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // TODO : should we make this configurable<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private static final int TAG_LENGTH = 256;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  static {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        "Run async random read test");<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        "Run async random write test");<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.164"></a>
-<span class="sourceLineNo">165</span>        "Run async sequential read test");<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        "Run async sequential write test");<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        "Run async scan test (read every row)");<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      "Run random read test");<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      "Run random seek and scan 100 test");<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      "Run random write test");<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      "Run sequential read test");<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      "Run sequential write test");<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      "Run scan test (read every row)");<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "(make sure to use --rows=20)");<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  }<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * inner-class so we can find associated properties.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   */<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  protected static enum Counter {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    /** elapsed time */<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    ELAPSED_TIME,<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    /** number of rows */<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    public RunResult(long duration, Histogram hist) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      this.duration = duration;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.hist = hist;<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>    public final long duration;<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final Histogram hist;<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>    @Override<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    public String toString() {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      return Long.toString(duration);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>    @Override public int compareTo(RunResult o) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      return Long.compare(this.duration, o.duration);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
-<span class="sourceLineNo">234</span><a name="line.234"></a>
-<span class="sourceLineNo">235</span>  /**<a name="line.235"></a>
-<span class="sourceLineNo">236</span>   * Constructor<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * @param conf Configuration object<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   */<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    super(conf);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      String name, String description) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  /**<a name="line.249"></a>
-<span class="sourceLineNo">250</span>   * Implementations can have their status set.<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   */<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  interface Status {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    /**<a name="line.253"></a>
-<span class="sourceLineNo">254</span>     * Sets status<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * @param msg status message<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @throws IOException<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     */<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    void setStatus(final String msg) throws IOException;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  }<a name="line.259"></a>
-<span class="sourceLineNo">260</span><a name="line.260"></a>
-<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   */<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  public static class EvaluationMapTask<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>    /** configuration parameter name that contains the command */<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the PE impl */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>    @Override<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>      // this is required so that extensions of PE are instantiated within the<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // map reduce task...<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      try {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      } catch (Exception e) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      try {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        return Class.forName(className).asSubclass(type);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      } catch (ClassNotFoundException e) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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>    @Override<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.298"></a>
-<span class="sourceLineNo">299</span>           throws IOException, InterruptedException {<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>      Status status = new Status() {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        @Override<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        public void setStatus(String msg) {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>           context.setStatus(msg);<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><a name="line.307"></a>
-<span class="sourceLineNo">308</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      AsyncConnection asyncCon = null;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      try {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      } catch (ExecutionException e) {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>        throw new IOException(e);<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>      // Evaluation task<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      // Collect how much time the thing took. Report as map output and<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // to the ELAPSED_TIME counter.<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.progress();<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    }<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>  /*<a name="line.330"></a>
-<span class="sourceLineNo">331</span>   * If table does not already exist, create. Also create a table when<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   */<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      throw new IllegalStateException(<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    HTableDescriptor desc =<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    byte[][] splits = getSplits(opts);<a name="line.346"></a>
-<span class="sourceLineNo">347</span><a name="line.347"></a>
-<span class="sourceLineNo">348</span>    // recreate the table when user has requested presplit or when existing<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      needsDelete = true;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      // wait, why did it delete my table?!?<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        .add("needsDelete", needsDelete)<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("isReadCmd", isReadCmd)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("exists", exists)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("desc", desc)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("presplit", opts.presplitRegions)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("replicas", opts.replicas)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .toString());<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>    // remove an existing table<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    if (needsDelete) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      if (admin.isTableEnabled(tableName)) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        admin.disableTable(tableName);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      admin.deleteTable(tableName);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>    // table creation is necessary<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    if (!exists || needsDelete) {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      desc = getTableDescriptor(opts);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      if (splits != null) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        if (LOG.isDebugEnabled()) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<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>      admin.createTable(desc, splits);<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      LOG.info("Table " + desc + " created");<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    return admin.tableExists(tableName);<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>  /**<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setCompressionType(opts.compression);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setBloomFilterType(opts.bloomType);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBlocksize(opts.blockSize);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    if (opts.inMemoryCF) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      family.setInMemory(true);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    desc.addFamily(family);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      desc.setRegionReplication(opts.replicas);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    return desc;<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>  /**<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   * generates splits based on total number of rows and specified split regions<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   */<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      int rowkey = jump * (1 + i);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      splits[i] = format(rowkey);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return splits;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  }<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  /*<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * Run all clients in this vm each to its own thread.<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   */<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    assert cmd != null;<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    @SuppressWarnings("unchecked")<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      final int index = i;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        @Override<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        public RunResult call() throws Exception {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>            @Override<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            public void setStatus(final String msg) throws IOException {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>              LOG.info(msg);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>          });<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.459"></a>
-<span class="sourceLineNo">460</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          return run;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      });<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    }<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    pool.shutdown();<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      try {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        results[i] = threads[i].get();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      } catch (ExecutionException e) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>        throw new IOException(e.getCause());<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    final String test = cmd.getSimpleName();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.475"></a>
-<span class="sourceLineNo">476</span>             + Arrays.toString(results));<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    Arrays.sort(results);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    long total = 0;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    for (RunResult result : results) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      total += result.duration;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    LOG.info("[" + test + "]"<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      + "\tMin: " + results[0] + "ms"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.485"></a>
-<span class="sourceLineNo">486</span><a name="line.486"></a>
-<span class="sourceLineNo">487</span>    con.close();<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    asyncCon.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    return results;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  /*<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Before we start up the job, write out an input file with instruction<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * per client regards which row they are to start on.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * @param cmd Command to run.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @throws IOException<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   */<a name="line.499"></a>
-<span class="sourceLineNo">500</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    assert cmd != null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    Job job = Job.getInstance(conf);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.509"></a>
-<span class="sourceLineNo">510</span><a name="line.510"></a>
-<span class="sourceLineNo">511</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    // this is default, but be explicit about it just in case.<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.514"></a>
-<span class="sourceLineNo">515</span><a name="line.515"></a>
-<span class="sourceLineNo">516</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputValueClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setReducerClass(LongSumReducer.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>    job.setNumReduceTasks(1);<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      Histogram.class,     // yammer metrics<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      );<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>    TableMapReduceUtil.initCredentials(job);<a name="line.534"></a>
-<span class="sourceLineNo">535</span><a name="line.535"></a>
-<span class="sourceLineNo">536</span>    job.waitForCompletion(true);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    return job;<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>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<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>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>  /*<a name="line.546"></a>
-<span class="sourceLineNo">547</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * @param c Configuration<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<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>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    return writeInputFile(c, opts, new Path("."));<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.556"></a>
-<span class="sourceLineNo">557</span>  throws IOException {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>    FileSystem fs = FileSystem.get(c);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    fs.mkdirs(inputDir);<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    // Make input random.<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Hash h = MurmurHash.getInstance();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    try {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>        TestOptions next = new TestOptions(opts);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        next.startRow = j * perClientRows;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.perClientRunRows = perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        String s = MAPPER.writeValueAsString(next);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        byte[] b = Bytes.toBytes(s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        m.put(hash, s);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>        out.println(e.getValue());<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    } finally {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      out.close();<a name="line.586"></a>
-<span class="sourceLineNo">587</span>    }<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    return inputDir;<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>   * Describes a command.<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   */<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  static class CmdDescriptor {<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private String name;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String description;<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      this.cmdClass = cmdClass;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.name = name;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.description = description;<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>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>      return cmdClass;<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>    public String getName() {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>      return name;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    public String getDescription() {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>      return description;<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><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * This makes tracking all these arguments a little easier.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>  static class TestOptions {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    String cmdName = null;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    boolean nomapred = false;<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    boolean filterAll = false;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    int startRow = 0;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    float size = 1.0f;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    int perClientRunRows = DEFAULT_ROWS_PER_GB;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    int numClientThreads = 1;<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    int totalRows = DEFAULT_ROWS_PER_GB;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    int measureAfter = 0;<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    float sampleRate = 1.0f;<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    double traceRate = 0.0;<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    String tableName = TABLE_NAME;<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    boolean flushCommits = true;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    boolean writeToWAL = true;<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    boolean autoFlush = false;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    boolean oneCon = false;<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    boolean useTags = false;<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    int noOfTags = 1;<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    boolean reportLatency = false;<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    int multiGet = 0;<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    int randomSleep = 0;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    boolean inMemoryCF = false;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    int presplitRegions = 0;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    int replicas = HTableDescriptor.DEFAULT_REGION_REPLICATION;<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    String splitPolicy = null;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    Compression.Algorithm compression = Compression.Algorithm.NONE;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    BloomType bloomType = BloomType.ROW;<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    int blockSize = HConstants.DEFAULT_BLOCKSIZE;<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    DataBlockEncoding blockEncoding = DataBlockEncoding.NONE;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    boolean valueRandom = false;<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    boolean valueZipf = false;<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    int valueSize = DEFAULT_VALUE_LENGTH;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    int period = (this.perClientRunRows / 10) == 0? perClientRunRows: perClientRunRows / 10;<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    int cycles = 1;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    int columns = 1;<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    int caching = 30;<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    boolean addColumns = true;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    MemoryCompactionPolicy inMemoryCompaction =<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        MemoryCompactionPolicy.valueOf(<a name="line.664"></a>
-<span class="sourceLineNo">665</span>            CompactingMemStore.COMPACTING_MEMSTORE_TYPE_DEFAULT);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    boolean asyncPrefetch = false;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    boolean cacheBlocks = true;<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    Scan.ReadType scanReadType = Scan.ReadType.DEFAULT;<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>    public TestOptions() {}<a name="line.670"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.BufferedMutatorParams;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Get;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Put;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.Result;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.Table;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.LongWritable;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.io.Text;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Job;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.Tool;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.hadoop.util.ToolRunner;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.Sampler;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.htrace.core.TraceScope;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.Logger;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.slf4j.LoggerFactory;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * command-line which test to run and how many clients are participating in<a name="line.118"></a>
+<span class="sourceLineNo">119</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.119"></a>
+<span class="sourceLineNo">120</span> *<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.123"></a>
+<span class="sourceLineNo">124</span> * paper, pages 8-10.<a name="line.124"></a>
+<span class="sourceLineNo">125</span> *<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.128"></a>
+<span class="sourceLineNo">129</span> * specified otherwise.<a name="line.129"></a>
+<span class="sourceLineNo">130</span> */<a name="line.130"></a>
+<span class="sourceLineNo">131</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.131"></a>
+<span class="sourceLineNo">132</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  static final String RANDOM_READ = "randomRead";<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  static {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  }<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
+<span class="sourceLineNo">156</span><a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
+<span class="sourceLineNo">243</span><a name="line.243"></a>
+<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
+<span class="sourceLineNo">249</span><a name="line.249"></a>
+<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
+<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
+<span class="sourceLineNo">261</span><a name="line.261"></a>
+<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
+<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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><a name="line.297"></a>
+<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
+<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        }<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>      ObjectMapper mapper = new ObjectMapper()

<TRUNCATED>

[04/44] hbase-site git commit: Published site at 8e6ff689e806138e602a46730886d8c5f524fdcd.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html
index 418c60c..7cf23c4 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html
@@ -64,2689 +64,2710 @@
 <span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.AsyncConnection;<a name="line.56"></a>
 <span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.AsyncTable;<a name="line.57"></a>
 <span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.BufferedMutator;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Get;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Put;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Result;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.111"></a>
-<span class="sourceLineNo">112</span><a name="line.112"></a>
-<span class="sourceLineNo">113</span>/**<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
-<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
-<span class="sourceLineNo">119</span> *<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
-<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
-<span class="sourceLineNo">124</span> *<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
-<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
-<span class="sourceLineNo">129</span> */<a name="line.129"></a>
-<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
-<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
-<span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // TODO : should we make this configurable<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private static final int TAG_LENGTH = 256;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  static {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        "Run async random read test");<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        "Run async random write test");<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.164"></a>
-<span class="sourceLineNo">165</span>        "Run async sequential read test");<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        "Run async sequential write test");<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        "Run async scan test (read every row)");<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      "Run random read test");<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      "Run random seek and scan 100 test");<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      "Run random write test");<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      "Run sequential read test");<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      "Run sequential write test");<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      "Run scan test (read every row)");<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "(make sure to use --rows=20)");<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  }<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * inner-class so we can find associated properties.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   */<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  protected static enum Counter {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    /** elapsed time */<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    ELAPSED_TIME,<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    /** number of rows */<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    public RunResult(long duration, Histogram hist) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      this.duration = duration;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.hist = hist;<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>    public final long duration;<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final Histogram hist;<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>    @Override<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    public String toString() {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      return Long.toString(duration);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>    @Override public int compareTo(RunResult o) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      return Long.compare(this.duration, o.duration);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
-<span class="sourceLineNo">234</span><a name="line.234"></a>
-<span class="sourceLineNo">235</span>  /**<a name="line.235"></a>
-<span class="sourceLineNo">236</span>   * Constructor<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * @param conf Configuration object<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   */<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    super(conf);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      String name, String description) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  /**<a name="line.249"></a>
-<span class="sourceLineNo">250</span>   * Implementations can have their status set.<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   */<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  interface Status {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    /**<a name="line.253"></a>
-<span class="sourceLineNo">254</span>     * Sets status<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * @param msg status message<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @throws IOException<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     */<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    void setStatus(final String msg) throws IOException;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  }<a name="line.259"></a>
-<span class="sourceLineNo">260</span><a name="line.260"></a>
-<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   */<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  public static class EvaluationMapTask<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>    /** configuration parameter name that contains the command */<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the PE impl */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>    @Override<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>      // this is required so that extensions of PE are instantiated within the<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // map reduce task...<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      try {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      } catch (Exception e) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      try {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        return Class.forName(className).asSubclass(type);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      } catch (ClassNotFoundException e) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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>    @Override<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.298"></a>
-<span class="sourceLineNo">299</span>           throws IOException, InterruptedException {<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>      Status status = new Status() {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        @Override<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        public void setStatus(String msg) {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>           context.setStatus(msg);<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><a name="line.307"></a>
-<span class="sourceLineNo">308</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      AsyncConnection asyncCon = null;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      try {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      } catch (ExecutionException e) {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>        throw new IOException(e);<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>      // Evaluation task<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      // Collect how much time the thing took. Report as map output and<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // to the ELAPSED_TIME counter.<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.progress();<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    }<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>  /*<a name="line.330"></a>
-<span class="sourceLineNo">331</span>   * If table does not already exist, create. Also create a table when<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   */<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      throw new IllegalStateException(<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    HTableDescriptor desc =<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    byte[][] splits = getSplits(opts);<a name="line.346"></a>
-<span class="sourceLineNo">347</span><a name="line.347"></a>
-<span class="sourceLineNo">348</span>    // recreate the table when user has requested presplit or when existing<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      needsDelete = true;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      // wait, why did it delete my table?!?<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        .add("needsDelete", needsDelete)<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("isReadCmd", isReadCmd)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("exists", exists)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("desc", desc)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("presplit", opts.presplitRegions)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("replicas", opts.replicas)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .toString());<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>    // remove an existing table<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    if (needsDelete) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      if (admin.isTableEnabled(tableName)) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        admin.disableTable(tableName);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      admin.deleteTable(tableName);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>    // table creation is necessary<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    if (!exists || needsDelete) {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      desc = getTableDescriptor(opts);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      if (splits != null) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        if (LOG.isDebugEnabled()) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<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>      admin.createTable(desc, splits);<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      LOG.info("Table " + desc + " created");<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    return admin.tableExists(tableName);<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>  /**<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setCompressionType(opts.compression);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setBloomFilterType(opts.bloomType);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBlocksize(opts.blockSize);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    if (opts.inMemoryCF) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      family.setInMemory(true);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    desc.addFamily(family);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      desc.setRegionReplication(opts.replicas);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    return desc;<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>  /**<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   * generates splits based on total number of rows and specified split regions<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   */<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      int rowkey = jump * (1 + i);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      splits[i] = format(rowkey);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return splits;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  }<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  /*<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * Run all clients in this vm each to its own thread.<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   */<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    assert cmd != null;<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    @SuppressWarnings("unchecked")<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      final int index = i;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        @Override<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        public RunResult call() throws Exception {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>            @Override<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            public void setStatus(final String msg) throws IOException {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>              LOG.info(msg);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>          });<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.459"></a>
-<span class="sourceLineNo">460</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          return run;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      });<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    }<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    pool.shutdown();<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      try {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        results[i] = threads[i].get();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      } catch (ExecutionException e) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>        throw new IOException(e.getCause());<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    final String test = cmd.getSimpleName();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.475"></a>
-<span class="sourceLineNo">476</span>             + Arrays.toString(results));<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    Arrays.sort(results);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    long total = 0;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    for (RunResult result : results) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      total += result.duration;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    LOG.info("[" + test + "]"<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      + "\tMin: " + results[0] + "ms"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.485"></a>
-<span class="sourceLineNo">486</span><a name="line.486"></a>
-<span class="sourceLineNo">487</span>    con.close();<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    asyncCon.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    return results;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  /*<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Before we start up the job, write out an input file with instruction<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * per client regards which row they are to start on.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * @param cmd Command to run.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @throws IOException<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   */<a name="line.499"></a>
-<span class="sourceLineNo">500</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    assert cmd != null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    Job job = Job.getInstance(conf);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.509"></a>
-<span class="sourceLineNo">510</span><a name="line.510"></a>
-<span class="sourceLineNo">511</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    // this is default, but be explicit about it just in case.<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.514"></a>
-<span class="sourceLineNo">515</span><a name="line.515"></a>
-<span class="sourceLineNo">516</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputValueClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setReducerClass(LongSumReducer.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>    job.setNumReduceTasks(1);<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      Histogram.class,     // yammer metrics<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      );<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>    TableMapReduceUtil.initCredentials(job);<a name="line.534"></a>
-<span class="sourceLineNo">535</span><a name="line.535"></a>
-<span class="sourceLineNo">536</span>    job.waitForCompletion(true);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    return job;<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>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<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>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>  /*<a name="line.546"></a>
-<span class="sourceLineNo">547</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * @param c Configuration<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<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>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    return writeInputFile(c, opts, new Path("."));<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.556"></a>
-<span class="sourceLineNo">557</span>  throws IOException {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>    FileSystem fs = FileSystem.get(c);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    fs.mkdirs(inputDir);<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    // Make input random.<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Hash h = MurmurHash.getInstance();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    try {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>        TestOptions next = new TestOptions(opts);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        next.startRow = j * perClientRows;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.perClientRunRows = perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        String s = MAPPER.writeValueAsString(next);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        byte[] b = Bytes.toBytes(s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        m.put(hash, s);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>        out.println(e.getValue());<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    } finally {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      out.close();<a name="line.586"></a>
-<span class="sourceLineNo">587</span>    }<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    return inputDir;<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>   * Describes a command.<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   */<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  static class CmdDescriptor {<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private String name;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String description;<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      this.cmdClass = cmdClass;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.name = name;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.description = description;<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>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>      return cmdClass;<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>    public String getName() {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>      return name;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    public String getDescription() {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>      return description;<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><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * This makes tracking all these arguments a little easier.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>  static class TestOptions {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    String cmdName = null;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    boolean nomapred = false;<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    boolean filterAll = false;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    int startRow = 0;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    float size = 1.0f;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    int perClientRunRows = DEFAULT_ROWS_PER_GB;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    int numClientThreads = 1;<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    int totalRows = DEFAULT_ROWS_PER_GB;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    int measureAfter = 0;<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    float sampleRate = 1.0f;<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    double traceRate = 0.0;<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    String tableName = TABLE_NAME;<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    boolean flushCommits = true;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    boolean writeToWAL = true;<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    boolean autoFlush = false;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    boolean oneCon = false;<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    boolean useTags = false;<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    int noOfTags = 1;<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    boolean reportLatency = false;<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    int multiGet = 0;<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    int randomSleep = 0;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    boolean inMemoryCF = false;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    int presplitRegions = 0;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    int replicas = HTableDescriptor.DEFAULT_REGION_REPLICATION;<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    String splitPolicy = null;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    Compression.Algorithm compression = Compression.Algorithm.NONE;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    BloomType bloomType = BloomType.ROW;<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    int blockSize = HConstants.DEFAULT_BLOCKSIZE;<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    DataBlockEncoding blockEncoding = DataBlockEncoding.NONE;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    boolean valueRandom = false;<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    boolean valueZipf = false;<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    int valueSize = DEFAULT_VALUE_LENGTH;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    int period = (this.perClientRunRows / 10) == 0? perClientRunRows: perClientRunRows / 10;<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    int cycles = 1;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    int columns = 1;<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    int caching = 30;<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    boolean addColumns = true;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    MemoryCompactionPolicy inMemoryCompaction =<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        MemoryCompactionPolicy.valueOf(<a name="line.664"></a>
-<span class="sourceLineNo">665</span>            CompactingMemStore.COMPACTING_MEMSTORE_TYPE_DEFAULT);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    boolean asyncPrefetch = false;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    boolean cacheBlocks = true;<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    Scan.ReadType scanReadType = Scan.ReadType.DEFAULT;<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>    public TestOptions() {}<a name="line.670"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.BufferedMutatorParams;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Get;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Put;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.Result;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.Table;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.LongWritable;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.io.Text;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Job;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.Tool;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.hadoop.util.ToolRunner;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.Sampler;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.htrace.core.TraceScope;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.Logger;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.slf4j.LoggerFactory;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * command-line which test to run and how many clients are participating in<a name="line.118"></a>
+<span class="sourceLineNo">119</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.119"></a>
+<span class="sourceLineNo">120</span> *<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.123"></a>
+<span class="sourceLineNo">124</span> * paper, pages 8-10.<a name="line.124"></a>
+<span class="sourceLineNo">125</span> *<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.128"></a>
+<span class="sourceLineNo">129</span> * specified otherwise.<a name="line.129"></a>
+<span class="sourceLineNo">130</span> */<a name="line.130"></a>
+<span class="sourceLineNo">131</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.131"></a>
+<span class="sourceLineNo">132</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  static final String RANDOM_READ = "randomRead";<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  static {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  }<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
+<span class="sourceLineNo">156</span><a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
+<span class="sourceLineNo">243</span><a name="line.243"></a>
+<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
+<span class="sourceLineNo">249</span><a name="line.249"></a>
+<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
+<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
+<span class="sourceLineNo">261</span><a name="line.261"></a>
+<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
+<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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><a name="line.297"></a>
+<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
+<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        }<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>      ObjectMapper mapper = new ObjectMapper();<a name="line.309"></a>
+<span class="source

<TRUNCATED>

[43/44] hbase-site git commit: Published site at 8e6ff689e806138e602a46730886d8c5f524fdcd.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/checkstyle-aggregate.html
----------------------------------------------------------------------
diff --git a/checkstyle-aggregate.html b/checkstyle-aggregate.html
index 1b5961d..6b1e876 100644
--- a/checkstyle-aggregate.html
+++ b/checkstyle-aggregate.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180506" />
+    <meta name="Date-Revision-yyyymmdd" content="20180507" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Checkstyle Results</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -284,7 +284,7 @@
 <td>3609</td>
 <td>0</td>
 <td>0</td>
-<td>15865</td></tr></table></div>
+<td>15875</td></tr></table></div>
 <div class="section">
 <h2><a name="Files"></a>Files</h2>
 <table border="0" class="table table-striped">
@@ -617,7 +617,7 @@
 <td><a href="#org.apache.hadoop.hbase.PerformanceEvaluation.java">org/apache/hadoop/hbase/PerformanceEvaluation.java</a></td>
 <td>0</td>
 <td>0</td>
-<td>31</td></tr>
+<td>34</td></tr>
 <tr class="a">
 <td><a href="#org.apache.hadoop.hbase.PerformanceEvaluationCommons.java">org/apache/hadoop/hbase/PerformanceEvaluationCommons.java</a></td>
 <td>0</td>
@@ -862,7 +862,7 @@
 <td><a href="#org.apache.hadoop.hbase.TestPerformanceEvaluation.java">org/apache/hadoop/hbase/TestPerformanceEvaluation.java</a></td>
 <td>0</td>
 <td>0</td>
-<td>2</td></tr>
+<td>9</td></tr>
 <tr class="b">
 <td><a href="#org.apache.hadoop.hbase.TestRegionRebalancing.java">org/apache/hadoop/hbase/TestRegionRebalancing.java</a></td>
 <td>0</td>
@@ -10322,12 +10322,12 @@
 <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>783</td>
+<td>797</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="b">
 <td></td>
 <td><a class="externalLink" href="http://checkstyle.sourceforge.net/config_javadoc.html#NonEmptyAtclauseDescription">NonEmptyAtclauseDescription</a></td>
-<td>3836</td>
+<td>3822</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="a">
 <td>misc</td>
@@ -10337,7 +10337,7 @@
 <tr class="b">
 <td></td>
 <td><a class="externalLink" href="http://checkstyle.sourceforge.net/config_misc.html#UpperEll">UpperEll</a></td>
-<td>61</td>
+<td>71</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="a">
 <td>sizes</td>
@@ -14536,7 +14536,7 @@
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
+<td>JavadocTagContinuationIndentation</td>
 <td>Javadoc comment at column 26 has parse error. Missed HTML close tag 'arg'. Sometimes it means that close tag missed for one of previous tags.</td>
 <td>44</td></tr></table></div>
 <div class="section">
@@ -15172,7 +15172,7 @@
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
+<td>JavadocTagContinuationIndentation</td>
 <td>Javadoc comment at column 4 has parse error. Missed HTML close tag 'pre'. Sometimes it means that close tag missed for one of previous tags.</td>
 <td>59</td></tr></table></div>
 <div class="section">
@@ -16927,7 +16927,7 @@
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
+<td>JavadocTagContinuationIndentation</td>
 <td>Javadoc comment at column 19 has parse error. Details: no viable alternative at input '&lt;code&gt;\n   *   List&lt;Future&lt;' while parsing HTML_TAG</td>
 <td>167</td></tr></table></div>
 <div class="section">
@@ -17001,197 +17001,215 @@
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>256</td></tr>
+<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>'method def' child have incorrect indentation level 11, expected level should be one of the following: 10, 12.</td>
-<td>304</td></tr>
+<td>305</td></tr>
 <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 105).</td>
-<td>320</td></tr>
+<td>321</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>419</td></tr>
+<td>420</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>452</td></tr>
+<td>453</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 call rparen' have incorrect indentation level 6, expected level should be 4.</td>
-<td>532</td></tr>
+<td>533</td></tr>
+<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>670</td></tr>
+<tr class="a">
+<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>670</td></tr>
 <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>670</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>1094</td></tr>
-<tr class="a">
+<td>1105</td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
-<td>1095</td></tr>
-<tr class="b">
+<td>1106</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>1099</td></tr>
-<tr class="a">
+<td>1110</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>1108</td></tr>
-<tr class="b">
+<td>1119</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 103).</td>
-<td>1167</td></tr>
-<tr class="a">
+<td>1178</td></tr>
+<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>1170</td></tr>
-<tr class="b">
+<td>1181</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>1262</td></tr>
-<tr class="a">
+<td>1273</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>1264</td></tr>
-<tr class="b">
+<td>1275</td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
-<td>1269</td></tr>
-<tr class="a">
+<td>1280</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>1422</td></tr>
-<tr class="b">
+<td>1433</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 102).</td>
-<td>1428</td></tr>
-<tr class="a">
+<td>1439</td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
-<td>1667</td></tr>
-<tr class="b">
+<td>1680</td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
-<td>1711</td></tr>
-<tr class="a">
+<td>1724</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>1817</td></tr>
-<tr class="b">
+<td>1830</td></tr>
+<tr class="a">
 <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>1961</td></tr>
-<tr class="a">
+<td>1974</td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
-<td>2107</td></tr>
-<tr class="b">
+<td>2120</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>2265</td></tr>
-<tr class="a">
+<td>2278</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>2266</td></tr>
-<tr class="b">
+<td>2279</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>2298</td></tr>
-<tr class="a">
+<td>2311</td></tr>
+<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>2357</td></tr>
-<tr class="b">
+<td>2370</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 118).</td>
-<td>2361</td></tr>
-<tr class="a">
+<td>2374</td></tr>
+<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>2365</td></tr>
-<tr class="b">
+<td>2378</td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
-<td>Method length is 266 lines (max allowed is 150).</td>
-<td>2393</td></tr>
-<tr class="a">
+<td>Method length is 273 lines (max allowed is 150).</td>
+<td>2407</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>2533</td></tr>
-<tr class="b">
+<td>2547</td></tr>
+<tr class="a">
 <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>2562</td></tr></table></div>
+<td>2576</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.PerformanceEvaluationCommons.java">org/apache/hadoop/hbase/PerformanceEvaluationCommons.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>design</td>
 <td>HideUtilityClassConstructor</td>
@@ -17200,409 +17218,409 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.PrivateCellUtil.java">org/apache/hadoop/hbase/PrivateCellUtil.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>843</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>844</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>845</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>863</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>864</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>865</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>984</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>985</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>986</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>987</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>988</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>1010</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>1203</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>1204</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>1214</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>1215</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>1228</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>1229</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>1243</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>1244</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>1281</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>1282</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>2140</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>2141</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>2142</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>2175</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>2190</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>2266</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>2267</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>2281</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>2282</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>2296</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>2312</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>2313</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>2328</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>2346</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>2362</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>2378</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>2395</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>2415</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>2431</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>2448</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>2452</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>2455</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>2459</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>'else' construct must use '{}'s.</td>
 <td>2460</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>2465</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>2478</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>2491</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>2504</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>2517</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>2596</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>2735</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>2753</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>2761</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>2776</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>2787</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>2802</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>2807</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>2815</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>2881</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>2882</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>2883</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>2884</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>2906</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>2925</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>
@@ -17611,25 +17629,25 @@
 <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">
-<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.Configuration' import.</td>
 <td>21</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.regionserver.AnnotationReadingPriorityFunction' import.</td>
 <td>23</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>
@@ -17638,19 +17656,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.RESTApiClusterManager.java">org/apache/hadoop/hbase/RESTApiClusterManager.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 'javax.ws.rs.client.Client' import.</td>
 <td>31</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>
@@ -17659,13 +17677,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.RegionLoad.java">org/apache/hadoop/hbase/RegionLoad.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>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
@@ -17674,73 +17692,73 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.RegionLocations.java">org/apache/hadoop/hbase/RegionLocations.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>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
 <td>72</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>120</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>143</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>146</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>147</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>149</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 101).</td>
 <td>154</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>170</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>194</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>266</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>
@@ -17749,19 +17767,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.RegionStateListener.java">org/apache/hadoop/hbase/RegionStateListener.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>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>36</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>
@@ -17770,31 +17788,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ResourceChecker.java">org/apache/hadoop/hbase/ResourceChecker.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>87</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>
 <td>'{' at column 43 should have line break after.</td>
 <td>94</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>145</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>
@@ -17803,79 +17821,79 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ScanPerformanceEvaluation.java">org/apache/hadoop/hbase/ScanPerformanceEvaluation.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.Connection' import.</td>
 <td>29</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 155).</td>
 <td>82</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>198</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 108).</td>
 <td>200</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>255</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 108).</td>
 <td>257</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>325</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 108).</td>
 <td>327</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 108).</td>
 <td>330</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 106).</td>
 <td>381</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 108).</td>
 <td>383</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>
@@ -17884,37 +17902,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ScheduledChore.java">org/apache/hadoop/hbase/ScheduledChore.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>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>176</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>180</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>189</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>213</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>
@@ -17923,13 +17941,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.Server.java">org/apache/hadoop/hbase/Server.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>
@@ -17938,13 +17956,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ServerLoad.java">org/apache/hadoop/hbase/ServerLoad.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>NeedBraces</td>
@@ -17953,151 +17971,151 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ServerName.java">org/apache/hadoop/hbase/ServerName.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>124</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>131</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>133</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>207</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>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>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>209</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>219</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>246</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>247</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>248</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>250</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>267</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>269</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>276</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>356</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>357</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>358</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>363</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>364</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>370</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>371</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>398</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>409</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>
@@ -18106,13 +18124,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.SplitLogCounters.java">org/apache/hadoop/hbase/SplitLogCounters.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>
@@ -18121,31 +18139,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.SplitLogTask.java">org/apache/hadoop/hbase/SplitLogTask.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.exceptions.DeserializationException' import.</td>
 <td>23</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.hbase.util.Bytes' import.</td>
 <td>27</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>131</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>
@@ -18154,25 +18172,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.StripeCompactionsPerformanceEvaluation.java">org/apache/hadoop/hbase/StripeCompactionsPerformanceEvaluation.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>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>110</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td>114</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>
@@ -18181,55 +18199,55 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TableDescriptors.java">org/apache/hadoop/hbase/TableDescriptors.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.TableDescriptor' import.</td>
 <td>24</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>33</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>35</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>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>52</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>60</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>66</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>
@@ -18238,43 +18256,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TableInfoMissingException.java">org/apache/hadoop/hbase/TableInfoMissingException.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>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>35</td></tr>
-<tr class="b">
+<tr class="a">
 <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>35</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 followed by whitespace.</td>
 <td>39</td></tr>
-<tr class="b">
+<tr class="a">
 <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>39</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 followed by whitespace.</td>
 <td>43</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
@@ -18283,109 +18301,109 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TableName.java">org/apache/hadoop/hbase/TableName.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>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>123</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>125</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>127</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>130</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>132</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>134</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>135</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>136</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 have incorrect indentation level 6, expected level should be 4.</td>
 <td>178</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 109).</td>
 <td>186</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 102).</td>
 <td>190</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>428</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>429</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>457</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>510</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>511</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>
@@ -18394,13 +18412,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TableNotDisabledException.java">org/apache/hadoop/hbase/TableNotDisabledException.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>
@@ -18409,13 +18427,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TableNotEnabledException.java">org/apache/hadoop/hbase/TableNotEnabledException.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>
@@ -18424,13 +18442,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TableNotFoundException.java">org/apache/hadoop/hbase/TableNotFoundException.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>
@@ -18439,13 +18457,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TagType.java">org/apache/hadoop/hbase/TagType.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>design</td>
 <td>HideUtilityClassConstructor</td>
@@ -18454,19 +18472,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestCheckTestClasses.java">org/apache/hadoop/hbase/TestCheckTestClasses.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.testclassification.MediumTests' 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>imports</td>
 <td>RedundantImport</td>
@@ -18475,13 +18493,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestClassFinder.java">org/apache/hadoop/hbase/TestClassFinder.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>blocks</td>
 <td>NeedBraces</td>
@@ -18490,19 +18508,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestClientClusterStatus.java">org/apache/hadoop/hbase/TestClientClusterStatus.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>UnusedImports</td>
 <td>Unused import - org.apache.hadoop.hbase.util.Threads.</td>
 <td>40</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>
@@ -18511,13 +18529,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestClientOperationTimeout.java">org/apache/hadoop/hbase/TestClientOperationTimeout.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>
@@ -18526,13 +18544,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestClusterPortAssignment.java">org/apache/hadoop/hbase/TestClusterPortAssignment.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>UnusedImports</td>
@@ -18541,13 +18559,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestFSTableDescriptorForceCreation.java">org/apache/hadoop/hbase/TestFSTableDescriptorForceCreation.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>
@@ -18556,37 +18574,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestGlobalMemStoreSize.java">org/apache/hadoop/hbase/TestGlobalMemStoreSize.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>73</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>153</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>154</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>155</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>
@@ -18595,13 +18613,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestHBaseConfiguration.java">org/apache/hadoop/hbase/TestHBaseConfiguration.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>
@@ -18610,55 +18628,55 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestHBaseTestingUtility.java">org/apache/hadoop/hbase/TestHBaseTestingUtility.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>UnusedImports</td>
 <td>Unused import - java.io.IOException.</td>
 <td>29</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - java.util.HashMap.</td>
 <td>30</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - java.util.Map.</td>
 <td>32</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - java.util.Map.Entry.</td>
 <td>33</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>79</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 followed by whitespace.</td>
 <td>202</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>206</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>
@@ -18667,13 +18685,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestHColumnDescriptor.java">org/apache/hadoop/hbase/TestHColumnDescriptor.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>annotation</td>
 <td>MissingDeprecated</td>
@@ -18682,13 +18700,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestHColumnDescriptorDefaultVersions.java">org/apache/hadoop/hbase/TestHColumnDescriptorDefaultVersions.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>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -18697,73 +18715,73 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestHTableDescriptor.java">org/apache/hadoop/hbase/TestHTableDescriptor.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>annotation</td>
 <td>MissingDeprecated</td>
 <td>Must include both @java.lang.Deprecated annotation and @deprecated Javadoc tag with description.</td>
 <td>45</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>121</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>138</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>175</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>188</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 have incorrect indentation level 6, expected level should be one of the following: 4, 31.</td>
 <td>189</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 have incorrect indentation level 6, expected level should be one of the following: 4, 31.</td>
 <td>191</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 have incorrect indentation level 6, expected level should be one of the following: 4, 31.</td>
 <td>192</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>194</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 have incorrect indentation level 6, expected level should be one of the following: 4, 33.</td>
 <td>195</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>
@@ -18772,25 +18790,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestIOFencing.java">org/apache/hadoop/hbase/TestIOFencing.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>UnusedImports</td>
 <td>Unused import - org.apache.hadoop.hbase.regionserver.Store.</td>
 <td>44</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
 <td>92</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>
@@ -18799,13 +18817,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestInfoServers.java">org/apache/hadoop/hbase/TestInfoServers.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>
@@ -18814,25 +18832,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestJMXConnectorServer.java">org/apache/hadoop/hbase/TestJMXConnectorServer.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>UnusedImports</td>
 <td>Unused import - org.apache.hadoop.hbase.security.access.AccessControlLists.</td>
 <td>31</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - org.apache.hadoop.hbase.util.Threads.</td>
 <td>35</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>
@@ -18841,25 +18859,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestKeyValue.java">org/apache/hadoop/hbase/TestKeyValue.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>'HBaseClassTestRule' have incorrect indentation level 2, expected level should be 4.</td>
 <td>51</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>188</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>
@@ -18868,13 +18886,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestLocalHBaseCluster.java">org/apache/hadoop/hbase/TestLocalHBaseCluster.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>
@@ -18883,37 +18901,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestMetaTableAccessor.java">org/apache/hadoop/hbase/TestMetaTableAccessor.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>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>111</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>112</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>219</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>220</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>
@@ -18922,49 +18940,49 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestMetaTableAccessorNoCluster.java">org/apache/hadoop/hbase/TestMetaTableAccessorNoCluster.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 105).</td>
 <td>116</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>126</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>127</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>'(' have incorrect indentation level 6, expected level should be 8.</td>
 <td>194</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>194</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 122).</td>
 <td>205</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>
@@ -18973,205 +18991,205 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestMetaTableLocator.java">org/apache/hadoop/hbase/TestMetaTableLocator.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>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>129</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>150</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>151</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>152</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 call' child have incorrect indentation level 4, expected level should be 6.</td>
 <td>160</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>'while' construct must use '{}'s.</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>210</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>211</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>212</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>213</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>230</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>231</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>232</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>233</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>243</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>244</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>245</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>246</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 have incorrect indentation level 8, expected level should be 4.</td>
 <td>260</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 have incorrect indentation level 8, expected level should be 4.</td>
 <td>261</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 have incorrect indentation level 8, expected level should be 4.</td>
 <td>263</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>282</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>283</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>284</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>306</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 109).</td>
 <td>309</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 103).</td>
 <td>310</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>311</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 112).</td>
 <td>312</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>315</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
 <td>346</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>'while' construct must use '{}'s.</td>
 <td>375</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>EmptyStatement</td>
@@ -19180,19 +19198,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestMovedRegionsCleaner.java">org/apache/hadoop/hbase/TestMovedRegionsCleaner.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>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>77</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>
@@ -19201,25 +19219,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestMultiVersions.java">org/apache/hadoop/hbase/TestMultiVersions.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>'object def rcurly' have incorrect indentation level 5, expected level should be one of the following: 4, 6.</td>
 <td>112</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>195</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
@@ -19228,25 +19246,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestNamespace.java">org/apache/hadoop/hbase/TestNamespace.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 105).</td>
 <td>225</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 105).</td>
 <td>355</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>
@@ -19255,13 +19273,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestNodeHealthCheckChore.java">org/apache/hadoop/hbase/TestNodeHealthCheckChore.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>NeedBraces</td>
@@ -19270,235 +19288,235 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestPartialResultsFromClientSide.java">org/apache/hadoop/hbase/TestPartialResultsFromClientSide.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>142</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>177</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>210</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>248</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>321</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>341</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>375</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>396</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>404</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-cla

<TRUNCATED>

[25/44] hbase-site git commit: Published site at 8e6ff689e806138e602a46730886d8c5f524fdcd.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndPutTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndPutTest.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndPutTest.html
index 418c60c..7cf23c4 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndPutTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndPutTest.html
@@ -64,2689 +64,2710 @@
 <span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.AsyncConnection;<a name="line.56"></a>
 <span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.AsyncTable;<a name="line.57"></a>
 <span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.BufferedMutator;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Get;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Put;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Result;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.111"></a>
-<span class="sourceLineNo">112</span><a name="line.112"></a>
-<span class="sourceLineNo">113</span>/**<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
-<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
-<span class="sourceLineNo">119</span> *<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
-<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
-<span class="sourceLineNo">124</span> *<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
-<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
-<span class="sourceLineNo">129</span> */<a name="line.129"></a>
-<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
-<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
-<span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // TODO : should we make this configurable<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private static final int TAG_LENGTH = 256;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  static {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        "Run async random read test");<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        "Run async random write test");<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.164"></a>
-<span class="sourceLineNo">165</span>        "Run async sequential read test");<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        "Run async sequential write test");<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        "Run async scan test (read every row)");<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      "Run random read test");<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      "Run random seek and scan 100 test");<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      "Run random write test");<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      "Run sequential read test");<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      "Run sequential write test");<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      "Run scan test (read every row)");<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "(make sure to use --rows=20)");<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  }<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * inner-class so we can find associated properties.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   */<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  protected static enum Counter {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    /** elapsed time */<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    ELAPSED_TIME,<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    /** number of rows */<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    public RunResult(long duration, Histogram hist) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      this.duration = duration;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.hist = hist;<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>    public final long duration;<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final Histogram hist;<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>    @Override<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    public String toString() {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      return Long.toString(duration);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>    @Override public int compareTo(RunResult o) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      return Long.compare(this.duration, o.duration);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
-<span class="sourceLineNo">234</span><a name="line.234"></a>
-<span class="sourceLineNo">235</span>  /**<a name="line.235"></a>
-<span class="sourceLineNo">236</span>   * Constructor<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * @param conf Configuration object<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   */<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    super(conf);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      String name, String description) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  /**<a name="line.249"></a>
-<span class="sourceLineNo">250</span>   * Implementations can have their status set.<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   */<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  interface Status {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    /**<a name="line.253"></a>
-<span class="sourceLineNo">254</span>     * Sets status<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * @param msg status message<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @throws IOException<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     */<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    void setStatus(final String msg) throws IOException;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  }<a name="line.259"></a>
-<span class="sourceLineNo">260</span><a name="line.260"></a>
-<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   */<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  public static class EvaluationMapTask<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>    /** configuration parameter name that contains the command */<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the PE impl */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>    @Override<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>      // this is required so that extensions of PE are instantiated within the<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // map reduce task...<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      try {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      } catch (Exception e) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      try {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        return Class.forName(className).asSubclass(type);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      } catch (ClassNotFoundException e) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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>    @Override<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.298"></a>
-<span class="sourceLineNo">299</span>           throws IOException, InterruptedException {<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>      Status status = new Status() {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        @Override<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        public void setStatus(String msg) {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>           context.setStatus(msg);<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><a name="line.307"></a>
-<span class="sourceLineNo">308</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      AsyncConnection asyncCon = null;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      try {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      } catch (ExecutionException e) {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>        throw new IOException(e);<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>      // Evaluation task<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      // Collect how much time the thing took. Report as map output and<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // to the ELAPSED_TIME counter.<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.progress();<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    }<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>  /*<a name="line.330"></a>
-<span class="sourceLineNo">331</span>   * If table does not already exist, create. Also create a table when<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   */<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      throw new IllegalStateException(<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    HTableDescriptor desc =<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    byte[][] splits = getSplits(opts);<a name="line.346"></a>
-<span class="sourceLineNo">347</span><a name="line.347"></a>
-<span class="sourceLineNo">348</span>    // recreate the table when user has requested presplit or when existing<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      needsDelete = true;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      // wait, why did it delete my table?!?<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        .add("needsDelete", needsDelete)<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("isReadCmd", isReadCmd)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("exists", exists)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("desc", desc)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("presplit", opts.presplitRegions)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("replicas", opts.replicas)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .toString());<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>    // remove an existing table<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    if (needsDelete) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      if (admin.isTableEnabled(tableName)) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        admin.disableTable(tableName);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      admin.deleteTable(tableName);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>    // table creation is necessary<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    if (!exists || needsDelete) {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      desc = getTableDescriptor(opts);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      if (splits != null) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        if (LOG.isDebugEnabled()) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<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>      admin.createTable(desc, splits);<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      LOG.info("Table " + desc + " created");<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    return admin.tableExists(tableName);<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>  /**<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setCompressionType(opts.compression);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setBloomFilterType(opts.bloomType);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBlocksize(opts.blockSize);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    if (opts.inMemoryCF) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      family.setInMemory(true);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    desc.addFamily(family);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      desc.setRegionReplication(opts.replicas);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    return desc;<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>  /**<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   * generates splits based on total number of rows and specified split regions<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   */<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      int rowkey = jump * (1 + i);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      splits[i] = format(rowkey);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return splits;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  }<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  /*<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * Run all clients in this vm each to its own thread.<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   */<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    assert cmd != null;<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    @SuppressWarnings("unchecked")<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      final int index = i;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        @Override<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        public RunResult call() throws Exception {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>            @Override<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            public void setStatus(final String msg) throws IOException {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>              LOG.info(msg);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>          });<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.459"></a>
-<span class="sourceLineNo">460</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          return run;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      });<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    }<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    pool.shutdown();<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      try {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        results[i] = threads[i].get();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      } catch (ExecutionException e) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>        throw new IOException(e.getCause());<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    final String test = cmd.getSimpleName();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.475"></a>
-<span class="sourceLineNo">476</span>             + Arrays.toString(results));<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    Arrays.sort(results);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    long total = 0;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    for (RunResult result : results) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      total += result.duration;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    LOG.info("[" + test + "]"<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      + "\tMin: " + results[0] + "ms"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.485"></a>
-<span class="sourceLineNo">486</span><a name="line.486"></a>
-<span class="sourceLineNo">487</span>    con.close();<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    asyncCon.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    return results;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  /*<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Before we start up the job, write out an input file with instruction<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * per client regards which row they are to start on.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * @param cmd Command to run.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @throws IOException<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   */<a name="line.499"></a>
-<span class="sourceLineNo">500</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    assert cmd != null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    Job job = Job.getInstance(conf);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.509"></a>
-<span class="sourceLineNo">510</span><a name="line.510"></a>
-<span class="sourceLineNo">511</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    // this is default, but be explicit about it just in case.<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.514"></a>
-<span class="sourceLineNo">515</span><a name="line.515"></a>
-<span class="sourceLineNo">516</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputValueClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setReducerClass(LongSumReducer.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>    job.setNumReduceTasks(1);<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      Histogram.class,     // yammer metrics<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      );<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>    TableMapReduceUtil.initCredentials(job);<a name="line.534"></a>
-<span class="sourceLineNo">535</span><a name="line.535"></a>
-<span class="sourceLineNo">536</span>    job.waitForCompletion(true);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    return job;<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>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<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>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>  /*<a name="line.546"></a>
-<span class="sourceLineNo">547</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * @param c Configuration<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<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>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    return writeInputFile(c, opts, new Path("."));<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.556"></a>
-<span class="sourceLineNo">557</span>  throws IOException {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>    FileSystem fs = FileSystem.get(c);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    fs.mkdirs(inputDir);<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    // Make input random.<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Hash h = MurmurHash.getInstance();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    try {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>        TestOptions next = new TestOptions(opts);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        next.startRow = j * perClientRows;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.perClientRunRows = perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        String s = MAPPER.writeValueAsString(next);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        byte[] b = Bytes.toBytes(s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        m.put(hash, s);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>        out.println(e.getValue());<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    } finally {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      out.close();<a name="line.586"></a>
-<span class="sourceLineNo">587</span>    }<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    return inputDir;<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>   * Describes a command.<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   */<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  static class CmdDescriptor {<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private String name;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String description;<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      this.cmdClass = cmdClass;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.name = name;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.description = description;<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>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>      return cmdClass;<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>    public String getName() {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>      return name;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    public String getDescription() {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>      return description;<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><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * This makes tracking all these arguments a little easier.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>  static class TestOptions {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    String cmdName = null;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    boolean nomapred = false;<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    boolean filterAll = false;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    int startRow = 0;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    float size = 1.0f;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    int perClientRunRows = DEFAULT_ROWS_PER_GB;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    int numClientThreads = 1;<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    int totalRows = DEFAULT_ROWS_PER_GB;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    int measureAfter = 0;<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    float sampleRate = 1.0f;<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    double traceRate = 0.0;<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    String tableName = TABLE_NAME;<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    boolean flushCommits = true;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    boolean writeToWAL = true;<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    boolean autoFlush = false;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    boolean oneCon = false;<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    boolean useTags = false;<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    int noOfTags = 1;<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    boolean reportLatency = false;<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    int multiGet = 0;<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    int randomSleep = 0;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    boolean inMemoryCF = false;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    int presplitRegions = 0;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    int replicas = HTableDescriptor.DEFAULT_REGION_REPLICATION;<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    String splitPolicy = null;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    Compression.Algorithm compression = Compression.Algorithm.NONE;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    BloomType bloomType = BloomType.ROW;<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    int blockSize = HConstants.DEFAULT_BLOCKSIZE;<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    DataBlockEncoding blockEncoding = DataBlockEncoding.NONE;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    boolean valueRandom = false;<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    boolean valueZipf = false;<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    int valueSize = DEFAULT_VALUE_LENGTH;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    int period = (this.perClientRunRows / 10) == 0? perClientRunRows: perClientRunRows / 10;<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    int cycles = 1;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    int columns = 1;<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    int caching = 30;<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    boolean addColumns = true;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    MemoryCompactionPolicy inMemoryCompaction =<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        MemoryCompactionPolicy.valueOf(<a name="line.664"></a>
-<span class="sourceLineNo">665</span>            CompactingMemStore.COMPACTING_MEMSTORE_TYPE_DEFAULT);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    boolean asyncPrefetch = false;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    boolean cacheBlocks = true;<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    Scan.ReadType scanReadType = Scan.ReadType.DEFAULT;<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>    public TestOptions() {}<a name="line.670"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.BufferedMutatorParams;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Get;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Put;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.Result;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.Table;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.LongWritable;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.io.Text;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Job;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.Tool;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.hadoop.util.ToolRunner;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.Sampler;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.htrace.core.TraceScope;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.Logger;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.slf4j.LoggerFactory;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * command-line which test to run and how many clients are participating in<a name="line.118"></a>
+<span class="sourceLineNo">119</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.119"></a>
+<span class="sourceLineNo">120</span> *<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.123"></a>
+<span class="sourceLineNo">124</span> * paper, pages 8-10.<a name="line.124"></a>
+<span class="sourceLineNo">125</span> *<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.128"></a>
+<span class="sourceLineNo">129</span> * specified otherwise.<a name="line.129"></a>
+<span class="sourceLineNo">130</span> */<a name="line.130"></a>
+<span class="sourceLineNo">131</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.131"></a>
+<span class="sourceLineNo">132</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  static final String RANDOM_READ = "randomRead";<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  static {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  }<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
+<span class="sourceLineNo">156</span><a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
+<span class="sourceLineNo">243</span><a name="line.243"></a>
+<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
+<span class="sourceLineNo">249</span><a name="line.249"></a>
+<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
+<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
+<span class="sourceLineNo">261</span><a name="line.261"></a>
+<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
+<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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><a name="line.297"></a>
+<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
+<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        }<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>      ObjectMapper mapper = new ObjectMapper();<a name="

<TRUNCATED>

[38/44] hbase-site git commit: Published site at 8e6ff689e806138e602a46730886d8c5f524fdcd.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.html
index 5487092..b684b50 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.html
@@ -119,7 +119,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.LimitedPrivate(value="Tools")
-public class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.131">PerformanceEvaluation</a>
+public class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.132">PerformanceEvaluation</a>
 extends org.apache.hadoop.conf.Configured
 implements org.apache.hadoop.util.Tool</pre>
 <div class="block">Script used evaluating HBase performance and scalability.  Runs a HBase
@@ -619,7 +619,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>RANDOM_SEEK_SCAN</h4>
-<pre>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/PerformanceEvaluation.html#line.132">RANDOM_SEEK_SCAN</a></pre>
+<pre>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/PerformanceEvaluation.html#line.133">RANDOM_SEEK_SCAN</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.PerformanceEvaluation.RANDOM_SEEK_SCAN">Constant Field Values</a></dd>
@@ -632,7 +632,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>RANDOM_READ</h4>
-<pre>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/PerformanceEvaluation.html#line.133">RANDOM_READ</a></pre>
+<pre>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/PerformanceEvaluation.html#line.134">RANDOM_READ</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.PerformanceEvaluation.RANDOM_READ">Constant Field Values</a></dd>
@@ -645,7 +645,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.134">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.135">LOG</a></pre>
 </li>
 </ul>
 <a name="MAPPER">
@@ -654,7 +654,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>MAPPER</h4>
-<pre>private static final&nbsp;com.fasterxml.jackson.databind.ObjectMapper <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.135">MAPPER</a></pre>
+<pre>private static final&nbsp;com.fasterxml.jackson.databind.ObjectMapper <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.136">MAPPER</a></pre>
 </li>
 </ul>
 <a name="TABLE_NAME">
@@ -663,7 +663,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>TABLE_NAME</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/PerformanceEvaluation.html#line.140">TABLE_NAME</a></pre>
+<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/PerformanceEvaluation.html#line.141">TABLE_NAME</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.PerformanceEvaluation.TABLE_NAME">Constant Field Values</a></dd>
@@ -676,7 +676,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>FAMILY_NAME</h4>
-<pre>public static final&nbsp;byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.141">FAMILY_NAME</a></pre>
+<pre>public static final&nbsp;byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.142">FAMILY_NAME</a></pre>
 </li>
 </ul>
 <a name="COLUMN_ZERO">
@@ -685,7 +685,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>COLUMN_ZERO</h4>
-<pre>public static final&nbsp;byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.142">COLUMN_ZERO</a></pre>
+<pre>public static final&nbsp;byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.143">COLUMN_ZERO</a></pre>
 </li>
 </ul>
 <a name="DEFAULT_VALUE_LENGTH">
@@ -694,7 +694,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_VALUE_LENGTH</h4>
-<pre>public static final&nbsp;int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.143">DEFAULT_VALUE_LENGTH</a></pre>
+<pre>public static final&nbsp;int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.144">DEFAULT_VALUE_LENGTH</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.PerformanceEvaluation.DEFAULT_VALUE_LENGTH">Constant Field Values</a></dd>
@@ -707,7 +707,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>ROW_LENGTH</h4>
-<pre>public static final&nbsp;int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.144">ROW_LENGTH</a></pre>
+<pre>public static final&nbsp;int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.145">ROW_LENGTH</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.PerformanceEvaluation.ROW_LENGTH">Constant Field Values</a></dd>
@@ -720,7 +720,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>ONE_GB</h4>
-<pre>private static final&nbsp;int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.146">ONE_GB</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.147">ONE_GB</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.PerformanceEvaluation.ONE_GB">Constant Field Values</a></dd>
@@ -733,7 +733,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_ROWS_PER_GB</h4>
-<pre>private static final&nbsp;int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.147">DEFAULT_ROWS_PER_GB</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.148">DEFAULT_ROWS_PER_GB</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.PerformanceEvaluation.DEFAULT_ROWS_PER_GB">Constant Field Values</a></dd>
@@ -746,7 +746,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>TAG_LENGTH</h4>
-<pre>private static final&nbsp;int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.149">TAG_LENGTH</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.150">TAG_LENGTH</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.PerformanceEvaluation.TAG_LENGTH">Constant Field Values</a></dd>
@@ -759,7 +759,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>FMT</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/text/DecimalFormat.html?is-external=true" title="class or interface in java.text">DecimalFormat</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.150">FMT</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/text/DecimalFormat.html?is-external=true" title="class or interface in java.text">DecimalFormat</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.151">FMT</a></pre>
 </li>
 </ul>
 <a name="CXT">
@@ -768,7 +768,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>CXT</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/math/MathContext.html?is-external=true" title="class or interface in java.math">MathContext</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.151">CXT</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/math/MathContext.html?is-external=true" title="class or interface in java.math">MathContext</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.152">CXT</a></pre>
 </li>
 </ul>
 <a name="MS_PER_SEC">
@@ -777,7 +777,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>MS_PER_SEC</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html?is-external=true" title="class or interface in java.math">BigDecimal</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.152">MS_PER_SEC</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html?is-external=true" title="class or interface in java.math">BigDecimal</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.153">MS_PER_SEC</a></pre>
 </li>
 </ul>
 <a name="BYTES_PER_MB">
@@ -786,7 +786,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>BYTES_PER_MB</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html?is-external=true" title="class or interface in java.math">BigDecimal</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.153">BYTES_PER_MB</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html?is-external=true" title="class or interface in java.math">BigDecimal</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.154">BYTES_PER_MB</a></pre>
 </li>
 </ul>
 <a name="DEFAULT_OPTS">
@@ -795,7 +795,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_OPTS</h4>
-<pre>private static final&nbsp;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.154">DEFAULT_OPTS</a></pre>
+<pre>private static final&nbsp;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.155">DEFAULT_OPTS</a></pre>
 </li>
 </ul>
 <a name="COMMANDS">
@@ -804,7 +804,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>COMMANDS</h4>
-<pre>private static&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="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.CmdDescriptor.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.CmdDescriptor</a>&gt; <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.156">COMMANDS</a></pre>
+<pre>private static&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="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.CmdDescriptor.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.CmdDescriptor</a>&gt; <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.157">COMMANDS</a></pre>
 </li>
 </ul>
 <a name="PERF_EVAL_DIR">
@@ -813,7 +813,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>PERF_EVAL_DIR</h4>
-<pre>private static final&nbsp;org.apache.hadoop.fs.Path <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.157">PERF_EVAL_DIR</a></pre>
+<pre>private static final&nbsp;org.apache.hadoop.fs.Path <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.158">PERF_EVAL_DIR</a></pre>
 </li>
 </ul>
 <a name="JOB_INPUT_FILENAME">
@@ -822,7 +822,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>JOB_INPUT_FILENAME</h4>
-<pre>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> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.544">JOB_INPUT_FILENAME</a></pre>
+<pre>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> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.545">JOB_INPUT_FILENAME</a></pre>
 <div class="block">Each client has one mapper to do the work,  and client do the resulting count in a map task.</div>
 </li>
 </ul>
@@ -840,7 +840,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>PerformanceEvaluation</h4>
-<pre>public&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.239">PerformanceEvaluation</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>public&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.240">PerformanceEvaluation</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <div class="block">Constructor</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -862,7 +862,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>addCommandDescriptor</h4>
-<pre>protected static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.243">addCommandDescriptor</a>(<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/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a>&gt;&nbsp;cmdClass,
+<pre>protected static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.244">addCommandDescriptor</a>(<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/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a>&gt;&nbsp;cmdClass,
                                            <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;description)</pre>
 </li>
@@ -873,7 +873,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>checkTable</h4>
-<pre>static&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.335">checkTable</a>(org.apache.hadoop.hbase.client.Admin&nbsp;admin,
+<pre>static&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.336">checkTable</a>(org.apache.hadoop.hbase.client.Admin&nbsp;admin,
                           <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;opts)
                    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>
@@ -888,7 +888,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableDescriptor</h4>
-<pre>protected static&nbsp;org.apache.hadoop.hbase.HTableDescriptor&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.394">getTableDescriptor</a>(<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;opts)</pre>
+<pre>protected static&nbsp;org.apache.hadoop.hbase.HTableDescriptor&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.395">getTableDescriptor</a>(<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;opts)</pre>
 <div class="block">Create an HTableDescriptor from provided TestOptions.</div>
 </li>
 </ul>
@@ -898,7 +898,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>getSplits</h4>
-<pre>protected static&nbsp;byte[][]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.418">getSplits</a>(<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;opts)</pre>
+<pre>protected static&nbsp;byte[][]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.419">getSplits</a>(<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;opts)</pre>
 <div class="block">generates splits based on total number of rows and specified split regions</div>
 </li>
 </ul>
@@ -908,7 +908,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>doLocalClients</h4>
-<pre>static&nbsp;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.RunResult</a>[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.435">doLocalClients</a>(<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;opts,
+<pre>static&nbsp;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.RunResult</a>[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.436">doLocalClients</a>(<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;opts,
                                                         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>,
                                                         <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a>,
@@ -927,7 +927,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>doMapReduce</h4>
-<pre>static&nbsp;org.apache.hadoop.mapreduce.Job&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.500">doMapReduce</a>(<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;opts,
+<pre>static&nbsp;org.apache.hadoop.mapreduce.Job&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.501">doMapReduce</a>(<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;opts,
                                                    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>,
                                                    <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a>,
@@ -946,7 +946,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>writeInputFile</h4>
-<pre>static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.552">writeInputFile</a>(org.apache.hadoop.conf.Configuration&nbsp;c,
+<pre>static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.553">writeInputFile</a>(org.apache.hadoop.conf.Configuration&nbsp;c,
                                                 <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;opts)
                                          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>
@@ -961,7 +961,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>writeInputFile</h4>
-<pre>static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.556">writeInputFile</a>(org.apache.hadoop.conf.Configuration&nbsp;c,
+<pre>static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.557">writeInputFile</a>(org.apache.hadoop.conf.Configuration&nbsp;c,
                                                 <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;opts,
                                                 org.apache.hadoop.fs.Path&nbsp;basedir)
                                          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>
@@ -977,7 +977,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>calculateMbps</h4>
-<pre>private 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/PerformanceEvaluation.html#line.2150">calculateMbps</a>(int&nbsp;rows,
+<pre>private 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/PerformanceEvaluation.html#line.2163">calculateMbps</a>(int&nbsp;rows,
                                     long&nbsp;timeMs,
                                     int&nbsp;valueSize,
                                     int&nbsp;columns)</pre>
@@ -997,7 +997,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>format</h4>
-<pre>public static&nbsp;byte[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2165">format</a>(int&nbsp;number)</pre>
+<pre>public static&nbsp;byte[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2178">format</a>(int&nbsp;number)</pre>
 </li>
 </ul>
 <a name="generateData-java.util.Random-int-">
@@ -1006,7 +1006,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>generateData</h4>
-<pre>public static&nbsp;byte[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2181">generateData</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a>&nbsp;r,
+<pre>public static&nbsp;byte[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2194">generateData</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a>&nbsp;r,
                                   int&nbsp;length)</pre>
 </li>
 </ul>
@@ -1016,7 +1016,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>getRandomRow</h4>
-<pre>static&nbsp;byte[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2203">getRandomRow</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a>&nbsp;random,
+<pre>static&nbsp;byte[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2216">getRandomRow</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a>&nbsp;random,
                            int&nbsp;totalRows)</pre>
 </li>
 </ul>
@@ -1026,7 +1026,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>generateRandomRow</h4>
-<pre>static&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2207">generateRandomRow</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a>&nbsp;random,
+<pre>static&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2220">generateRandomRow</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a>&nbsp;random,
                              int&nbsp;totalRows)</pre>
 </li>
 </ul>
@@ -1036,7 +1036,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>runOneClient</h4>
-<pre>static&nbsp;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.RunResult</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2211">runOneClient</a>(<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/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a>&gt;&nbsp;cmd,
+<pre>static&nbsp;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.RunResult</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2224">runOneClient</a>(<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/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a>&gt;&nbsp;cmd,
                                                     org.apache.hadoop.conf.Configuration&nbsp;conf,
                                                     org.apache.hadoop.hbase.client.Connection&nbsp;con,
                                                     org.apache.hadoop.hbase.client.AsyncConnection&nbsp;asyncCon,
@@ -1057,7 +1057,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>getAverageValueLength</h4>
-<pre>private static&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2249">getAverageValueLength</a>(<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;opts)</pre>
+<pre>private static&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2262">getAverageValueLength</a>(<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;opts)</pre>
 </li>
 </ul>
 <a name="runTest-java.lang.Class-org.apache.hadoop.hbase.PerformanceEvaluation.TestOptions-">
@@ -1066,7 +1066,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>runTest</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2253">runTest</a>(<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/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a>&gt;&nbsp;cmd,
+<pre>private&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2266">runTest</a>(<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/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a>&gt;&nbsp;cmd,
                      <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;opts)
               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>,
                      <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a>,
@@ -1087,7 +1087,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>printUsage</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2275">printUsage</a>()</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2288">printUsage</a>()</pre>
 </li>
 </ul>
 <a name="printUsage-java.lang.String-">
@@ -1096,7 +1096,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>printUsage</h4>
-<pre>protected static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2279">printUsage</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;message)</pre>
+<pre>protected static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2292">printUsage</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;message)</pre>
 </li>
 </ul>
 <a name="printUsageAndExit-java.lang.String-int-">
@@ -1105,7 +1105,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>printUsageAndExit</h4>
-<pre>protected static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2283">printUsageAndExit</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;message,
+<pre>protected static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2296">printUsageAndExit</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;message,
                                         int&nbsp;exitCode)</pre>
 </li>
 </ul>
@@ -1115,7 +1115,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>printUsage</h4>
-<pre>protected static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2288">printUsage</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;className,
+<pre>protected static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2301">printUsage</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;className,
                                  <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;message)</pre>
 </li>
 </ul>
@@ -1125,7 +1125,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>parseOpts</h4>
-<pre>static&nbsp;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2393">parseOpts</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Queue.html?is-external=true" title="class or interface in java.util">Queue</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;args)</pre>
+<pre>static&nbsp;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2407">parseOpts</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Queue.html?is-external=true" title="class or interface in java.util">Queue</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;args)</pre>
 <div class="block">Parse options passed in via an arguments array. Assumes that array has been split
  on white-space and placed into a <code>Queue</code>. Any unknown arguments will remain
  in the queue at the conclusion of this method call. It's up to the caller to deal
@@ -1138,7 +1138,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>calculateRowsAndSize</h4>
-<pre>static&nbsp;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2660">calculateRowsAndSize</a>(<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;opts)</pre>
+<pre>static&nbsp;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2681">calculateRowsAndSize</a>(<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;opts)</pre>
 </li>
 </ul>
 <a name="getRowsPerGB-org.apache.hadoop.hbase.PerformanceEvaluation.TestOptions-">
@@ -1147,7 +1147,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>getRowsPerGB</h4>
-<pre>static&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2678">getRowsPerGB</a>(<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;opts)</pre>
+<pre>static&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2699">getRowsPerGB</a>(<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;opts)</pre>
 </li>
 </ul>
 <a name="run-java.lang.String:A-">
@@ -1156,7 +1156,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2683">run</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)
+<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2704">run</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/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -1172,7 +1172,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>isCommandClass</h4>
-<pre>private static&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2728">isCommandClass</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;cmd)</pre>
+<pre>private static&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2749">isCommandClass</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;cmd)</pre>
 </li>
 </ul>
 <a name="determineCommandClass-java.lang.String-">
@@ -1181,7 +1181,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>determineCommandClass</h4>
-<pre>private static&nbsp;<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/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a>&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2732">determineCommandClass</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;cmd)</pre>
+<pre>private static&nbsp;<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/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a>&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2753">determineCommandClass</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;cmd)</pre>
 </li>
 </ul>
 <a name="main-java.lang.String:A-">
@@ -1190,7 +1190,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>main</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2737">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)
+<pre>public static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2758">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/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/org/apache/hadoop/hbase/TestPerformanceEvaluation.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/TestPerformanceEvaluation.html b/testdevapidocs/org/apache/hadoop/hbase/TestPerformanceEvaluation.html
index 8c6b046..ce6402c 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/TestPerformanceEvaluation.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/TestPerformanceEvaluation.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10};
 var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -191,15 +191,19 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </tr>
 <tr id="i5" class="rowColor">
 <td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/TestPerformanceEvaluation.html#testSizeCalculation--">testSizeCalculation</a></span>()</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/TestPerformanceEvaluation.html#testSetBufferSizeOption--">testSetBufferSizeOption</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i6" class="altColor">
 <td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/TestPerformanceEvaluation.html#testSizeCalculation--">testSizeCalculation</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i7" class="rowColor">
+<td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/TestPerformanceEvaluation.html#testWriteInputFile--">testWriteInputFile</a></span>()</code>
 <div class="block">Exercise the mr spec writing.</div>
 </td>
 </tr>
-<tr id="i7" class="rowColor">
+<tr id="i8" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/TestPerformanceEvaluation.html#testZipfian--">testZipfian</a></span>()</code>&nbsp;</td>
 </tr>
@@ -343,13 +347,22 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </dl>
 </li>
 </ul>
+<a name="testSetBufferSizeOption--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testSetBufferSizeOption</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestPerformanceEvaluation.html#line.182">testSetBufferSizeOption</a>()</pre>
+</li>
+</ul>
 <a name="testParseOptsWithThreads--">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>testParseOptsWithThreads</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestPerformanceEvaluation.html#line.182">testParseOptsWithThreads</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestPerformanceEvaluation.html#line.192">testParseOptsWithThreads</a>()</pre>
 </li>
 </ul>
 <a name="testParseOptsWrongThreads--">
@@ -358,7 +371,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testParseOptsWrongThreads</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestPerformanceEvaluation.html#line.196">testParseOptsWrongThreads</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestPerformanceEvaluation.html#line.206">testParseOptsWrongThreads</a>()</pre>
 </li>
 </ul>
 <a name="testParseOptsNoThreads--">
@@ -367,7 +380,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testParseOptsNoThreads</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestPerformanceEvaluation.html#line.211">testParseOptsNoThreads</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestPerformanceEvaluation.html#line.221">testParseOptsNoThreads</a>()</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/org/apache/hadoop/hbase/backup/TestIncrementalBackupWithBulkLoad.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/backup/TestIncrementalBackupWithBulkLoad.html b/testdevapidocs/org/apache/hadoop/hbase/backup/TestIncrementalBackupWithBulkLoad.html
index ae7d289..f114cd4 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/backup/TestIncrementalBackupWithBulkLoad.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/backup/TestIncrementalBackupWithBulkLoad.html
@@ -18,8 +18,8 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":9,"i1":10};
-var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
+var methods = {"i0":10};
+var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
 var tableTab = "tableTab";
@@ -114,7 +114,7 @@ var activeTableTab = "activeTableTab";
 <li class="blockList">
 <hr>
 <br>
-<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupWithBulkLoad.html#line.61">TestIncrementalBackupWithBulkLoad</a>
+<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupWithBulkLoad.html#line.56">TestIncrementalBackupWithBulkLoad</a>
 extends <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.html" title="class in org.apache.hadoop.hbase.backup">TestBackupBase</a></pre>
 <div class="block">1. Create table t1
  2. Load data to t1
@@ -185,7 +185,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.ht
 <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/backup/TestIncrementalBackupWithBulkLoad.html#TestIncrementalBackupWithBulkLoad-java.lang.Boolean-">TestIncrementalBackupWithBulkLoad</a></span>(<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;b)</code>&nbsp;</td>
+<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupWithBulkLoad.html#TestIncrementalBackupWithBulkLoad--">TestIncrementalBackupWithBulkLoad</a></span>()</code>&nbsp;</td>
 </tr>
 </table>
 </li>
@@ -197,16 +197,12 @@ extends <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.ht
 </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">&nbsp;</span></span></caption>
+<caption><span id="t0" class="activeTableTab"><span>All Methods</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">&nbsp;</span></span></caption>
 <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>static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<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>[]&gt;</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupWithBulkLoad.html#data--">data</a></span>()</code>&nbsp;</td>
-</tr>
-<tr id="i1" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupWithBulkLoad.html#TestIncBackupDeleteTable--">TestIncBackupDeleteTable</a></span>()</code>&nbsp;</td>
 </tr>
@@ -245,7 +241,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>CLASS_RULE</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupWithBulkLoad.html#line.64">CLASS_RULE</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupWithBulkLoad.html#line.59">CLASS_RULE</a></pre>
 </li>
 </ul>
 <a name="LOG">
@@ -254,7 +250,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.ht
 <ul class="blockListLast">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupWithBulkLoad.html#line.67">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupWithBulkLoad.html#line.62">LOG</a></pre>
 </li>
 </ul>
 </li>
@@ -265,13 +261,13 @@ extends <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.ht
 <!--   -->
 </a>
 <h3>Constructor Detail</h3>
-<a name="TestIncrementalBackupWithBulkLoad-java.lang.Boolean-">
+<a name="TestIncrementalBackupWithBulkLoad--">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TestIncrementalBackupWithBulkLoad</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupWithBulkLoad.html#line.77">TestIncrementalBackupWithBulkLoad</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;b)</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupWithBulkLoad.html#line.56">TestIncrementalBackupWithBulkLoad</a>()</pre>
 </li>
 </ul>
 </li>
@@ -282,22 +278,13 @@ extends <a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupBase.ht
 <!--   -->
 </a>
 <h3>Method Detail</h3>
-<a name="data--">
-<!--   -->
-</a>
-<ul class="blockList">
-<li class="blockList">
-<h4>data</h4>
-<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<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>[]&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupWithBulkLoad.html#line.70">data</a>()</pre>
-</li>
-</ul>
 <a name="TestIncBackupDeleteTable--">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TestIncBackupDeleteTable</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupWithBulkLoad.html#line.82">TestIncBackupDeleteTable</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/backup/TestIncrementalBackupWithBulkLoad.html#line.66">TestIncBackupDeleteTable</a>()
                               throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/org/apache/hadoop/hbase/backup/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/backup/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/backup/package-tree.html
index e159b3f..3168ee3 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/backup/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/backup/package-tree.html
@@ -145,8 +145,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupDeleteWithFailures.Failure.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">TestBackupDeleteWithFailures.Failure</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">TestIncrementalBackupMergeWithFailures.FailurePhase</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupDeleteWithFailures.Failure.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">TestBackupDeleteWithFailures.Failure</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
index 04e7385..27b1eca 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -569,15 +569,15 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">PerformanceEvaluation.Counter</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/IntegrationTestDDLMasterFailover.ACTION.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">IntegrationTestDDLMasterFailover.ACTION</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ScanPerformanceEvaluation.ScanCounter.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ScanPerformanceEvaluation.ScanCounter</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/IntegrationTestRegionReplicaPerf.Stat.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">IntegrationTestRegionReplicaPerf.Stat</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/RESTApiClusterManager.RoleCommand.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">RESTApiClusterManager.RoleCommand</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ClusterManager.ServiceType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ClusterManager.ServiceType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HBaseClusterManager.CommandProvider.Operation.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HBaseClusterManager.CommandProvider.Operation</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ResourceChecker.Phase.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ResourceChecker.Phase</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/IntegrationTestDDLMasterFailover.ACTION.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">IntegrationTestDDLMasterFailover.ACTION</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">PerformanceEvaluation.Counter</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/RESTApiClusterManager.Service.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">RESTApiClusterManager.Service</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/IntegrationTestRegionReplicaPerf.Stat.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">IntegrationTestRegionReplicaPerf.Stat</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ResourceChecker.Phase.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ResourceChecker.Phase</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ClusterManager.ServiceType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ClusterManager.ServiceType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
index 6be1f69..ffff9f6 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -655,11 +655,11 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestAtomicOperation.TestStep</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestRegionServerReadRequestMetrics.Metric.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestRegionServerReadRequestMetrics.Metric</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestMultiLogThreshold.ActionType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestMultiLogThreshold.ActionType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DataBlockEncodingTool.Manipulation.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DataBlockEncodingTool.Manipulation</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestCacheOnWriteInSchema.CacheOnWriteType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestCacheOnWriteInSchema.CacheOnWriteType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestMultiLogThreshold.ActionType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestMultiLogThreshold.ActionType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestAtomicOperation.TestStep</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestRegionServerReadRequestMetrics.Metric.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestRegionServerReadRequestMetrics.Metric</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
index 1a43271..1d0bd63 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
@@ -253,9 +253,9 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestLoadAndVerify.Counters.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestLoadAndVerify.Counters</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Generator.Counts.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestBigLinkedList.Generator.Counts</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Verify.Counts.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestBigLinkedList.Verify.Counts</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Generator.Counts.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestBigLinkedList.Generator.Counts</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestLoadAndVerify.Counters.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestLoadAndVerify.Counters</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestWithCellVisibilityLoadAndVerify.Counters.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestWithCellVisibilityLoadAndVerify.Counters</span></a></li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
index 4edd3f8..cc06fe6 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
@@ -139,9 +139,9 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">IOTestProvider.AllowedOperations</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/FaultyFSLog.FailureType.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">FaultyFSLog.FailureType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/TestWALSplit.Corruptions.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">TestWALSplit.Corruptions</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">IOTestProvider.AllowedOperations</span></a></li>
 </ul>
 </li>
 </ul>


[31/44] hbase-site git commit: Published site at 8e6ff689e806138e602a46730886d8c5f524fdcd.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html
index 418c60c..7cf23c4 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html
@@ -64,2689 +64,2710 @@
 <span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.AsyncConnection;<a name="line.56"></a>
 <span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.AsyncTable;<a name="line.57"></a>
 <span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.BufferedMutator;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Get;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Put;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Result;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.111"></a>
-<span class="sourceLineNo">112</span><a name="line.112"></a>
-<span class="sourceLineNo">113</span>/**<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
-<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
-<span class="sourceLineNo">119</span> *<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
-<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
-<span class="sourceLineNo">124</span> *<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
-<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
-<span class="sourceLineNo">129</span> */<a name="line.129"></a>
-<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
-<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
-<span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // TODO : should we make this configurable<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private static final int TAG_LENGTH = 256;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  static {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        "Run async random read test");<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        "Run async random write test");<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.164"></a>
-<span class="sourceLineNo">165</span>        "Run async sequential read test");<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        "Run async sequential write test");<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        "Run async scan test (read every row)");<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      "Run random read test");<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      "Run random seek and scan 100 test");<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      "Run random write test");<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      "Run sequential read test");<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      "Run sequential write test");<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      "Run scan test (read every row)");<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "(make sure to use --rows=20)");<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  }<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * inner-class so we can find associated properties.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   */<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  protected static enum Counter {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    /** elapsed time */<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    ELAPSED_TIME,<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    /** number of rows */<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    public RunResult(long duration, Histogram hist) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      this.duration = duration;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.hist = hist;<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>    public final long duration;<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final Histogram hist;<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>    @Override<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    public String toString() {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      return Long.toString(duration);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>    @Override public int compareTo(RunResult o) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      return Long.compare(this.duration, o.duration);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
-<span class="sourceLineNo">234</span><a name="line.234"></a>
-<span class="sourceLineNo">235</span>  /**<a name="line.235"></a>
-<span class="sourceLineNo">236</span>   * Constructor<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * @param conf Configuration object<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   */<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    super(conf);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      String name, String description) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  /**<a name="line.249"></a>
-<span class="sourceLineNo">250</span>   * Implementations can have their status set.<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   */<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  interface Status {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    /**<a name="line.253"></a>
-<span class="sourceLineNo">254</span>     * Sets status<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * @param msg status message<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @throws IOException<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     */<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    void setStatus(final String msg) throws IOException;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  }<a name="line.259"></a>
-<span class="sourceLineNo">260</span><a name="line.260"></a>
-<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   */<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  public static class EvaluationMapTask<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>    /** configuration parameter name that contains the command */<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the PE impl */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>    @Override<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>      // this is required so that extensions of PE are instantiated within the<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // map reduce task...<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      try {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      } catch (Exception e) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      try {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        return Class.forName(className).asSubclass(type);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      } catch (ClassNotFoundException e) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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>    @Override<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.298"></a>
-<span class="sourceLineNo">299</span>           throws IOException, InterruptedException {<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>      Status status = new Status() {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        @Override<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        public void setStatus(String msg) {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>           context.setStatus(msg);<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><a name="line.307"></a>
-<span class="sourceLineNo">308</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      AsyncConnection asyncCon = null;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      try {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      } catch (ExecutionException e) {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>        throw new IOException(e);<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>      // Evaluation task<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      // Collect how much time the thing took. Report as map output and<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // to the ELAPSED_TIME counter.<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.progress();<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    }<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>  /*<a name="line.330"></a>
-<span class="sourceLineNo">331</span>   * If table does not already exist, create. Also create a table when<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   */<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      throw new IllegalStateException(<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    HTableDescriptor desc =<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    byte[][] splits = getSplits(opts);<a name="line.346"></a>
-<span class="sourceLineNo">347</span><a name="line.347"></a>
-<span class="sourceLineNo">348</span>    // recreate the table when user has requested presplit or when existing<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      needsDelete = true;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      // wait, why did it delete my table?!?<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        .add("needsDelete", needsDelete)<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("isReadCmd", isReadCmd)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("exists", exists)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("desc", desc)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("presplit", opts.presplitRegions)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("replicas", opts.replicas)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .toString());<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>    // remove an existing table<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    if (needsDelete) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      if (admin.isTableEnabled(tableName)) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        admin.disableTable(tableName);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      admin.deleteTable(tableName);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>    // table creation is necessary<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    if (!exists || needsDelete) {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      desc = getTableDescriptor(opts);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      if (splits != null) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        if (LOG.isDebugEnabled()) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<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>      admin.createTable(desc, splits);<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      LOG.info("Table " + desc + " created");<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    return admin.tableExists(tableName);<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>  /**<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setCompressionType(opts.compression);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setBloomFilterType(opts.bloomType);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBlocksize(opts.blockSize);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    if (opts.inMemoryCF) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      family.setInMemory(true);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    desc.addFamily(family);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      desc.setRegionReplication(opts.replicas);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    return desc;<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>  /**<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   * generates splits based on total number of rows and specified split regions<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   */<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      int rowkey = jump * (1 + i);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      splits[i] = format(rowkey);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return splits;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  }<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  /*<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * Run all clients in this vm each to its own thread.<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   */<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    assert cmd != null;<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    @SuppressWarnings("unchecked")<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      final int index = i;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        @Override<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        public RunResult call() throws Exception {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>            @Override<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            public void setStatus(final String msg) throws IOException {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>              LOG.info(msg);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>          });<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.459"></a>
-<span class="sourceLineNo">460</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          return run;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      });<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    }<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    pool.shutdown();<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      try {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        results[i] = threads[i].get();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      } catch (ExecutionException e) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>        throw new IOException(e.getCause());<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    final String test = cmd.getSimpleName();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.475"></a>
-<span class="sourceLineNo">476</span>             + Arrays.toString(results));<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    Arrays.sort(results);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    long total = 0;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    for (RunResult result : results) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      total += result.duration;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    LOG.info("[" + test + "]"<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      + "\tMin: " + results[0] + "ms"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.485"></a>
-<span class="sourceLineNo">486</span><a name="line.486"></a>
-<span class="sourceLineNo">487</span>    con.close();<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    asyncCon.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    return results;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  /*<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Before we start up the job, write out an input file with instruction<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * per client regards which row they are to start on.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * @param cmd Command to run.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @throws IOException<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   */<a name="line.499"></a>
-<span class="sourceLineNo">500</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    assert cmd != null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    Job job = Job.getInstance(conf);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.509"></a>
-<span class="sourceLineNo">510</span><a name="line.510"></a>
-<span class="sourceLineNo">511</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    // this is default, but be explicit about it just in case.<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.514"></a>
-<span class="sourceLineNo">515</span><a name="line.515"></a>
-<span class="sourceLineNo">516</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputValueClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setReducerClass(LongSumReducer.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>    job.setNumReduceTasks(1);<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      Histogram.class,     // yammer metrics<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      );<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>    TableMapReduceUtil.initCredentials(job);<a name="line.534"></a>
-<span class="sourceLineNo">535</span><a name="line.535"></a>
-<span class="sourceLineNo">536</span>    job.waitForCompletion(true);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    return job;<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>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<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>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>  /*<a name="line.546"></a>
-<span class="sourceLineNo">547</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * @param c Configuration<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<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>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    return writeInputFile(c, opts, new Path("."));<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.556"></a>
-<span class="sourceLineNo">557</span>  throws IOException {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>    FileSystem fs = FileSystem.get(c);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    fs.mkdirs(inputDir);<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    // Make input random.<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Hash h = MurmurHash.getInstance();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    try {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>        TestOptions next = new TestOptions(opts);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        next.startRow = j * perClientRows;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.perClientRunRows = perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        String s = MAPPER.writeValueAsString(next);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        byte[] b = Bytes.toBytes(s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        m.put(hash, s);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>        out.println(e.getValue());<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    } finally {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      out.close();<a name="line.586"></a>
-<span class="sourceLineNo">587</span>    }<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    return inputDir;<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>   * Describes a command.<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   */<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  static class CmdDescriptor {<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private String name;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String description;<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      this.cmdClass = cmdClass;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.name = name;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.description = description;<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>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>      return cmdClass;<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>    public String getName() {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>      return name;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    public String getDescription() {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>      return description;<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><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * This makes tracking all these arguments a little easier.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>  static class TestOptions {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    String cmdName = null;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    boolean nomapred = false;<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    boolean filterAll = false;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    int startRow = 0;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    float size = 1.0f;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    int perClientRunRows = DEFAULT_ROWS_PER_GB;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    int numClientThreads = 1;<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    int totalRows = DEFAULT_ROWS_PER_GB;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    int measureAfter = 0;<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    float sampleRate = 1.0f;<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    double traceRate = 0.0;<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    String tableName = TABLE_NAME;<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    boolean flushCommits = true;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    boolean writeToWAL = true;<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    boolean autoFlush = false;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    boolean oneCon = false;<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    boolean useTags = false;<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    int noOfTags = 1;<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    boolean reportLatency = false;<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    int multiGet = 0;<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    int randomSleep = 0;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    boolean inMemoryCF = false;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    int presplitRegions = 0;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    int replicas = HTableDescriptor.DEFAULT_REGION_REPLICATION;<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    String splitPolicy = null;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    Compression.Algorithm compression = Compression.Algorithm.NONE;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    BloomType bloomType = BloomType.ROW;<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    int blockSize = HConstants.DEFAULT_BLOCKSIZE;<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    DataBlockEncoding blockEncoding = DataBlockEncoding.NONE;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    boolean valueRandom = false;<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    boolean valueZipf = false;<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    int valueSize = DEFAULT_VALUE_LENGTH;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    int period = (this.perClientRunRows / 10) == 0? perClientRunRows: perClientRunRows / 10;<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    int cycles = 1;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    int columns = 1;<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    int caching = 30;<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    boolean addColumns = true;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    MemoryCompactionPolicy inMemoryCompaction =<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        MemoryCompactionPolicy.valueOf(<a name="line.664"></a>
-<span class="sourceLineNo">665</span>            CompactingMemStore.COMPACTING_MEMSTORE_TYPE_DEFAULT);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    boolean asyncPrefetch = false;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    boolean cacheBlocks = true;<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    Scan.ReadType scanReadType = Scan.ReadType.DEFAULT;<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>    public TestOptions() {}<a name="line.670"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.BufferedMutatorParams;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Get;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Put;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.Result;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.Table;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.LongWritable;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.io.Text;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Job;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.Tool;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.hadoop.util.ToolRunner;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.Sampler;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.htrace.core.TraceScope;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.Logger;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.slf4j.LoggerFactory;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * command-line which test to run and how many clients are participating in<a name="line.118"></a>
+<span class="sourceLineNo">119</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.119"></a>
+<span class="sourceLineNo">120</span> *<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.123"></a>
+<span class="sourceLineNo">124</span> * paper, pages 8-10.<a name="line.124"></a>
+<span class="sourceLineNo">125</span> *<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.128"></a>
+<span class="sourceLineNo">129</span> * specified otherwise.<a name="line.129"></a>
+<span class="sourceLineNo">130</span> */<a name="line.130"></a>
+<span class="sourceLineNo">131</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.131"></a>
+<span class="sourceLineNo">132</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  static final String RANDOM_READ = "randomRead";<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  static {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  }<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
+<span class="sourceLineNo">156</span><a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
+<span class="sourceLineNo">243</span><a name="line.243"></a>
+<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
+<span class="sourceLineNo">249</span><a name="line.249"></a>
+<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
+<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
+<span class="sourceLineNo">261</span><a name="line.261"></a>
+<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
+<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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><a name="line.297"></a>
+<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
+<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        }<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>      ObjectMapper mapper = new ObjectMapper();<a name="line.

<TRUNCATED>

[07/44] hbase-site git commit: Published site at 8e6ff689e806138e602a46730886d8c5f524fdcd.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Status.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Status.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Status.html
index 418c60c..7cf23c4 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Status.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Status.html
@@ -64,2689 +64,2710 @@
 <span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.AsyncConnection;<a name="line.56"></a>
 <span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.AsyncTable;<a name="line.57"></a>
 <span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.BufferedMutator;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Get;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Put;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Result;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.111"></a>
-<span class="sourceLineNo">112</span><a name="line.112"></a>
-<span class="sourceLineNo">113</span>/**<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
-<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
-<span class="sourceLineNo">119</span> *<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
-<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
-<span class="sourceLineNo">124</span> *<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
-<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
-<span class="sourceLineNo">129</span> */<a name="line.129"></a>
-<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
-<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
-<span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // TODO : should we make this configurable<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private static final int TAG_LENGTH = 256;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  static {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        "Run async random read test");<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        "Run async random write test");<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.164"></a>
-<span class="sourceLineNo">165</span>        "Run async sequential read test");<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        "Run async sequential write test");<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        "Run async scan test (read every row)");<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      "Run random read test");<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      "Run random seek and scan 100 test");<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      "Run random write test");<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      "Run sequential read test");<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      "Run sequential write test");<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      "Run scan test (read every row)");<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "(make sure to use --rows=20)");<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  }<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * inner-class so we can find associated properties.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   */<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  protected static enum Counter {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    /** elapsed time */<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    ELAPSED_TIME,<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    /** number of rows */<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    public RunResult(long duration, Histogram hist) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      this.duration = duration;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.hist = hist;<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>    public final long duration;<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final Histogram hist;<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>    @Override<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    public String toString() {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      return Long.toString(duration);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>    @Override public int compareTo(RunResult o) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      return Long.compare(this.duration, o.duration);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
-<span class="sourceLineNo">234</span><a name="line.234"></a>
-<span class="sourceLineNo">235</span>  /**<a name="line.235"></a>
-<span class="sourceLineNo">236</span>   * Constructor<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * @param conf Configuration object<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   */<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    super(conf);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      String name, String description) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  /**<a name="line.249"></a>
-<span class="sourceLineNo">250</span>   * Implementations can have their status set.<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   */<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  interface Status {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    /**<a name="line.253"></a>
-<span class="sourceLineNo">254</span>     * Sets status<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * @param msg status message<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @throws IOException<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     */<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    void setStatus(final String msg) throws IOException;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  }<a name="line.259"></a>
-<span class="sourceLineNo">260</span><a name="line.260"></a>
-<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   */<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  public static class EvaluationMapTask<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>    /** configuration parameter name that contains the command */<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the PE impl */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>    @Override<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>      // this is required so that extensions of PE are instantiated within the<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // map reduce task...<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      try {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      } catch (Exception e) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      try {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        return Class.forName(className).asSubclass(type);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      } catch (ClassNotFoundException e) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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>    @Override<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.298"></a>
-<span class="sourceLineNo">299</span>           throws IOException, InterruptedException {<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>      Status status = new Status() {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        @Override<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        public void setStatus(String msg) {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>           context.setStatus(msg);<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><a name="line.307"></a>
-<span class="sourceLineNo">308</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      AsyncConnection asyncCon = null;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      try {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      } catch (ExecutionException e) {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>        throw new IOException(e);<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>      // Evaluation task<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      // Collect how much time the thing took. Report as map output and<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // to the ELAPSED_TIME counter.<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.progress();<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    }<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>  /*<a name="line.330"></a>
-<span class="sourceLineNo">331</span>   * If table does not already exist, create. Also create a table when<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   */<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      throw new IllegalStateException(<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    HTableDescriptor desc =<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    byte[][] splits = getSplits(opts);<a name="line.346"></a>
-<span class="sourceLineNo">347</span><a name="line.347"></a>
-<span class="sourceLineNo">348</span>    // recreate the table when user has requested presplit or when existing<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      needsDelete = true;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      // wait, why did it delete my table?!?<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        .add("needsDelete", needsDelete)<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("isReadCmd", isReadCmd)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("exists", exists)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("desc", desc)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("presplit", opts.presplitRegions)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("replicas", opts.replicas)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .toString());<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>    // remove an existing table<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    if (needsDelete) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      if (admin.isTableEnabled(tableName)) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        admin.disableTable(tableName);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      admin.deleteTable(tableName);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>    // table creation is necessary<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    if (!exists || needsDelete) {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      desc = getTableDescriptor(opts);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      if (splits != null) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        if (LOG.isDebugEnabled()) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<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>      admin.createTable(desc, splits);<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      LOG.info("Table " + desc + " created");<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    return admin.tableExists(tableName);<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>  /**<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setCompressionType(opts.compression);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setBloomFilterType(opts.bloomType);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBlocksize(opts.blockSize);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    if (opts.inMemoryCF) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      family.setInMemory(true);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    desc.addFamily(family);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      desc.setRegionReplication(opts.replicas);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    return desc;<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>  /**<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   * generates splits based on total number of rows and specified split regions<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   */<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      int rowkey = jump * (1 + i);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      splits[i] = format(rowkey);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return splits;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  }<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  /*<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * Run all clients in this vm each to its own thread.<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   */<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    assert cmd != null;<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    @SuppressWarnings("unchecked")<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      final int index = i;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        @Override<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        public RunResult call() throws Exception {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>            @Override<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            public void setStatus(final String msg) throws IOException {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>              LOG.info(msg);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>          });<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.459"></a>
-<span class="sourceLineNo">460</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          return run;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      });<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    }<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    pool.shutdown();<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      try {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        results[i] = threads[i].get();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      } catch (ExecutionException e) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>        throw new IOException(e.getCause());<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    final String test = cmd.getSimpleName();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.475"></a>
-<span class="sourceLineNo">476</span>             + Arrays.toString(results));<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    Arrays.sort(results);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    long total = 0;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    for (RunResult result : results) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      total += result.duration;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    LOG.info("[" + test + "]"<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      + "\tMin: " + results[0] + "ms"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.485"></a>
-<span class="sourceLineNo">486</span><a name="line.486"></a>
-<span class="sourceLineNo">487</span>    con.close();<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    asyncCon.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    return results;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  /*<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Before we start up the job, write out an input file with instruction<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * per client regards which row they are to start on.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * @param cmd Command to run.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @throws IOException<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   */<a name="line.499"></a>
-<span class="sourceLineNo">500</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    assert cmd != null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    Job job = Job.getInstance(conf);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.509"></a>
-<span class="sourceLineNo">510</span><a name="line.510"></a>
-<span class="sourceLineNo">511</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    // this is default, but be explicit about it just in case.<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.514"></a>
-<span class="sourceLineNo">515</span><a name="line.515"></a>
-<span class="sourceLineNo">516</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputValueClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setReducerClass(LongSumReducer.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>    job.setNumReduceTasks(1);<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      Histogram.class,     // yammer metrics<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      );<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>    TableMapReduceUtil.initCredentials(job);<a name="line.534"></a>
-<span class="sourceLineNo">535</span><a name="line.535"></a>
-<span class="sourceLineNo">536</span>    job.waitForCompletion(true);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    return job;<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>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<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>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>  /*<a name="line.546"></a>
-<span class="sourceLineNo">547</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * @param c Configuration<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<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>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    return writeInputFile(c, opts, new Path("."));<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.556"></a>
-<span class="sourceLineNo">557</span>  throws IOException {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>    FileSystem fs = FileSystem.get(c);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    fs.mkdirs(inputDir);<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    // Make input random.<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Hash h = MurmurHash.getInstance();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    try {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>        TestOptions next = new TestOptions(opts);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        next.startRow = j * perClientRows;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.perClientRunRows = perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        String s = MAPPER.writeValueAsString(next);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        byte[] b = Bytes.toBytes(s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        m.put(hash, s);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>        out.println(e.getValue());<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    } finally {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      out.close();<a name="line.586"></a>
-<span class="sourceLineNo">587</span>    }<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    return inputDir;<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>   * Describes a command.<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   */<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  static class CmdDescriptor {<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private String name;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String description;<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      this.cmdClass = cmdClass;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.name = name;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.description = description;<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>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>      return cmdClass;<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>    public String getName() {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>      return name;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    public String getDescription() {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>      return description;<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><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * This makes tracking all these arguments a little easier.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>  static class TestOptions {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    String cmdName = null;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    boolean nomapred = false;<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    boolean filterAll = false;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    int startRow = 0;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    float size = 1.0f;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    int perClientRunRows = DEFAULT_ROWS_PER_GB;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    int numClientThreads = 1;<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    int totalRows = DEFAULT_ROWS_PER_GB;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    int measureAfter = 0;<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    float sampleRate = 1.0f;<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    double traceRate = 0.0;<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    String tableName = TABLE_NAME;<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    boolean flushCommits = true;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    boolean writeToWAL = true;<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    boolean autoFlush = false;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    boolean oneCon = false;<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    boolean useTags = false;<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    int noOfTags = 1;<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    boolean reportLatency = false;<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    int multiGet = 0;<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    int randomSleep = 0;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    boolean inMemoryCF = false;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    int presplitRegions = 0;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    int replicas = HTableDescriptor.DEFAULT_REGION_REPLICATION;<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    String splitPolicy = null;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    Compression.Algorithm compression = Compression.Algorithm.NONE;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    BloomType bloomType = BloomType.ROW;<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    int blockSize = HConstants.DEFAULT_BLOCKSIZE;<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    DataBlockEncoding blockEncoding = DataBlockEncoding.NONE;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    boolean valueRandom = false;<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    boolean valueZipf = false;<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    int valueSize = DEFAULT_VALUE_LENGTH;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    int period = (this.perClientRunRows / 10) == 0? perClientRunRows: perClientRunRows / 10;<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    int cycles = 1;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    int columns = 1;<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    int caching = 30;<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    boolean addColumns = true;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    MemoryCompactionPolicy inMemoryCompaction =<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        MemoryCompactionPolicy.valueOf(<a name="line.664"></a>
-<span class="sourceLineNo">665</span>            CompactingMemStore.COMPACTING_MEMSTORE_TYPE_DEFAULT);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    boolean asyncPrefetch = false;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    boolean cacheBlocks = true;<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    Scan.ReadType scanReadType = Scan.ReadType.DEFAULT;<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>    public TestOptions() {}<a name="line.670"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.BufferedMutatorParams;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Get;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Put;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.Result;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.Table;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.LongWritable;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.io.Text;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Job;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.Tool;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.hadoop.util.ToolRunner;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.Sampler;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.htrace.core.TraceScope;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.Logger;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.slf4j.LoggerFactory;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * command-line which test to run and how many clients are participating in<a name="line.118"></a>
+<span class="sourceLineNo">119</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.119"></a>
+<span class="sourceLineNo">120</span> *<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.123"></a>
+<span class="sourceLineNo">124</span> * paper, pages 8-10.<a name="line.124"></a>
+<span class="sourceLineNo">125</span> *<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.128"></a>
+<span class="sourceLineNo">129</span> * specified otherwise.<a name="line.129"></a>
+<span class="sourceLineNo">130</span> */<a name="line.130"></a>
+<span class="sourceLineNo">131</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.131"></a>
+<span class="sourceLineNo">132</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  static final String RANDOM_READ = "randomRead";<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  static {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  }<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
+<span class="sourceLineNo">156</span><a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
+<span class="sourceLineNo">243</span><a name="line.243"></a>
+<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
+<span class="sourceLineNo">249</span><a name="line.249"></a>
+<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
+<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
+<span class="sourceLineNo">261</span><a name="line.261"></a>
+<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
+<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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><a name="line.297"></a>
+<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
+<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        }<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>      ObjectMapper mapper = new ObjectMapper();<a name="line.309"></a>
+<span class="sourceLineNo">31

<TRUNCATED>

[13/44] hbase-site git commit: Published site at 8e6ff689e806138e602a46730886d8c5f524fdcd.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomSeekScanTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomSeekScanTest.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomSeekScanTest.html
index 418c60c..7cf23c4 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomSeekScanTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomSeekScanTest.html
@@ -64,2689 +64,2710 @@
 <span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.AsyncConnection;<a name="line.56"></a>
 <span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.AsyncTable;<a name="line.57"></a>
 <span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.BufferedMutator;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Get;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Put;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Result;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.111"></a>
-<span class="sourceLineNo">112</span><a name="line.112"></a>
-<span class="sourceLineNo">113</span>/**<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
-<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
-<span class="sourceLineNo">119</span> *<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
-<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
-<span class="sourceLineNo">124</span> *<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
-<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
-<span class="sourceLineNo">129</span> */<a name="line.129"></a>
-<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
-<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
-<span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // TODO : should we make this configurable<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private static final int TAG_LENGTH = 256;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  static {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        "Run async random read test");<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        "Run async random write test");<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.164"></a>
-<span class="sourceLineNo">165</span>        "Run async sequential read test");<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        "Run async sequential write test");<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        "Run async scan test (read every row)");<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      "Run random read test");<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      "Run random seek and scan 100 test");<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      "Run random write test");<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      "Run sequential read test");<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      "Run sequential write test");<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      "Run scan test (read every row)");<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "(make sure to use --rows=20)");<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  }<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * inner-class so we can find associated properties.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   */<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  protected static enum Counter {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    /** elapsed time */<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    ELAPSED_TIME,<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    /** number of rows */<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    public RunResult(long duration, Histogram hist) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      this.duration = duration;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.hist = hist;<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>    public final long duration;<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final Histogram hist;<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>    @Override<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    public String toString() {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      return Long.toString(duration);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>    @Override public int compareTo(RunResult o) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      return Long.compare(this.duration, o.duration);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
-<span class="sourceLineNo">234</span><a name="line.234"></a>
-<span class="sourceLineNo">235</span>  /**<a name="line.235"></a>
-<span class="sourceLineNo">236</span>   * Constructor<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * @param conf Configuration object<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   */<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    super(conf);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      String name, String description) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  /**<a name="line.249"></a>
-<span class="sourceLineNo">250</span>   * Implementations can have their status set.<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   */<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  interface Status {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    /**<a name="line.253"></a>
-<span class="sourceLineNo">254</span>     * Sets status<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * @param msg status message<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @throws IOException<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     */<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    void setStatus(final String msg) throws IOException;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  }<a name="line.259"></a>
-<span class="sourceLineNo">260</span><a name="line.260"></a>
-<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   */<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  public static class EvaluationMapTask<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>    /** configuration parameter name that contains the command */<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the PE impl */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>    @Override<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>      // this is required so that extensions of PE are instantiated within the<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // map reduce task...<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      try {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      } catch (Exception e) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      try {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        return Class.forName(className).asSubclass(type);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      } catch (ClassNotFoundException e) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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>    @Override<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.298"></a>
-<span class="sourceLineNo">299</span>           throws IOException, InterruptedException {<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>      Status status = new Status() {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        @Override<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        public void setStatus(String msg) {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>           context.setStatus(msg);<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><a name="line.307"></a>
-<span class="sourceLineNo">308</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      AsyncConnection asyncCon = null;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      try {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      } catch (ExecutionException e) {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>        throw new IOException(e);<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>      // Evaluation task<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      // Collect how much time the thing took. Report as map output and<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // to the ELAPSED_TIME counter.<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.progress();<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    }<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>  /*<a name="line.330"></a>
-<span class="sourceLineNo">331</span>   * If table does not already exist, create. Also create a table when<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   */<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      throw new IllegalStateException(<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    HTableDescriptor desc =<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    byte[][] splits = getSplits(opts);<a name="line.346"></a>
-<span class="sourceLineNo">347</span><a name="line.347"></a>
-<span class="sourceLineNo">348</span>    // recreate the table when user has requested presplit or when existing<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      needsDelete = true;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      // wait, why did it delete my table?!?<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        .add("needsDelete", needsDelete)<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("isReadCmd", isReadCmd)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("exists", exists)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("desc", desc)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("presplit", opts.presplitRegions)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("replicas", opts.replicas)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .toString());<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>    // remove an existing table<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    if (needsDelete) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      if (admin.isTableEnabled(tableName)) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        admin.disableTable(tableName);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      admin.deleteTable(tableName);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>    // table creation is necessary<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    if (!exists || needsDelete) {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      desc = getTableDescriptor(opts);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      if (splits != null) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        if (LOG.isDebugEnabled()) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<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>      admin.createTable(desc, splits);<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      LOG.info("Table " + desc + " created");<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    return admin.tableExists(tableName);<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>  /**<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setCompressionType(opts.compression);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setBloomFilterType(opts.bloomType);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBlocksize(opts.blockSize);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    if (opts.inMemoryCF) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      family.setInMemory(true);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    desc.addFamily(family);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      desc.setRegionReplication(opts.replicas);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    return desc;<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>  /**<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   * generates splits based on total number of rows and specified split regions<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   */<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      int rowkey = jump * (1 + i);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      splits[i] = format(rowkey);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return splits;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  }<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  /*<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * Run all clients in this vm each to its own thread.<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   */<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    assert cmd != null;<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    @SuppressWarnings("unchecked")<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      final int index = i;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        @Override<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        public RunResult call() throws Exception {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>            @Override<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            public void setStatus(final String msg) throws IOException {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>              LOG.info(msg);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>          });<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.459"></a>
-<span class="sourceLineNo">460</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          return run;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      });<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    }<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    pool.shutdown();<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      try {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        results[i] = threads[i].get();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      } catch (ExecutionException e) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>        throw new IOException(e.getCause());<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    final String test = cmd.getSimpleName();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.475"></a>
-<span class="sourceLineNo">476</span>             + Arrays.toString(results));<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    Arrays.sort(results);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    long total = 0;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    for (RunResult result : results) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      total += result.duration;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    LOG.info("[" + test + "]"<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      + "\tMin: " + results[0] + "ms"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.485"></a>
-<span class="sourceLineNo">486</span><a name="line.486"></a>
-<span class="sourceLineNo">487</span>    con.close();<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    asyncCon.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    return results;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  /*<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Before we start up the job, write out an input file with instruction<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * per client regards which row they are to start on.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * @param cmd Command to run.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @throws IOException<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   */<a name="line.499"></a>
-<span class="sourceLineNo">500</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    assert cmd != null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    Job job = Job.getInstance(conf);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.509"></a>
-<span class="sourceLineNo">510</span><a name="line.510"></a>
-<span class="sourceLineNo">511</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    // this is default, but be explicit about it just in case.<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.514"></a>
-<span class="sourceLineNo">515</span><a name="line.515"></a>
-<span class="sourceLineNo">516</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputValueClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setReducerClass(LongSumReducer.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>    job.setNumReduceTasks(1);<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      Histogram.class,     // yammer metrics<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      );<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>    TableMapReduceUtil.initCredentials(job);<a name="line.534"></a>
-<span class="sourceLineNo">535</span><a name="line.535"></a>
-<span class="sourceLineNo">536</span>    job.waitForCompletion(true);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    return job;<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>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<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>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>  /*<a name="line.546"></a>
-<span class="sourceLineNo">547</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * @param c Configuration<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<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>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    return writeInputFile(c, opts, new Path("."));<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.556"></a>
-<span class="sourceLineNo">557</span>  throws IOException {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>    FileSystem fs = FileSystem.get(c);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    fs.mkdirs(inputDir);<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    // Make input random.<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Hash h = MurmurHash.getInstance();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    try {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>        TestOptions next = new TestOptions(opts);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        next.startRow = j * perClientRows;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.perClientRunRows = perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        String s = MAPPER.writeValueAsString(next);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        byte[] b = Bytes.toBytes(s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        m.put(hash, s);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>        out.println(e.getValue());<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    } finally {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      out.close();<a name="line.586"></a>
-<span class="sourceLineNo">587</span>    }<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    return inputDir;<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>   * Describes a command.<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   */<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  static class CmdDescriptor {<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private String name;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String description;<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      this.cmdClass = cmdClass;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.name = name;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.description = description;<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>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>      return cmdClass;<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>    public String getName() {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>      return name;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    public String getDescription() {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>      return description;<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><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * This makes tracking all these arguments a little easier.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>  static class TestOptions {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    String cmdName = null;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    boolean nomapred = false;<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    boolean filterAll = false;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    int startRow = 0;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    float size = 1.0f;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    int perClientRunRows = DEFAULT_ROWS_PER_GB;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    int numClientThreads = 1;<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    int totalRows = DEFAULT_ROWS_PER_GB;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    int measureAfter = 0;<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    float sampleRate = 1.0f;<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    double traceRate = 0.0;<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    String tableName = TABLE_NAME;<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    boolean flushCommits = true;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    boolean writeToWAL = true;<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    boolean autoFlush = false;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    boolean oneCon = false;<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    boolean useTags = false;<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    int noOfTags = 1;<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    boolean reportLatency = false;<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    int multiGet = 0;<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    int randomSleep = 0;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    boolean inMemoryCF = false;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    int presplitRegions = 0;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    int replicas = HTableDescriptor.DEFAULT_REGION_REPLICATION;<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    String splitPolicy = null;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    Compression.Algorithm compression = Compression.Algorithm.NONE;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    BloomType bloomType = BloomType.ROW;<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    int blockSize = HConstants.DEFAULT_BLOCKSIZE;<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    DataBlockEncoding blockEncoding = DataBlockEncoding.NONE;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    boolean valueRandom = false;<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    boolean valueZipf = false;<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    int valueSize = DEFAULT_VALUE_LENGTH;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    int period = (this.perClientRunRows / 10) == 0? perClientRunRows: perClientRunRows / 10;<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    int cycles = 1;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    int columns = 1;<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    int caching = 30;<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    boolean addColumns = true;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    MemoryCompactionPolicy inMemoryCompaction =<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        MemoryCompactionPolicy.valueOf(<a name="line.664"></a>
-<span class="sourceLineNo">665</span>            CompactingMemStore.COMPACTING_MEMSTORE_TYPE_DEFAULT);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    boolean asyncPrefetch = false;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    boolean cacheBlocks = true;<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    Scan.ReadType scanReadType = Scan.ReadType.DEFAULT;<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>    public TestOptions() {}<a name="line.670"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.BufferedMutatorParams;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Get;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Put;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.Result;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.Table;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.LongWritable;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.io.Text;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Job;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.Tool;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.hadoop.util.ToolRunner;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.Sampler;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.htrace.core.TraceScope;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.Logger;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.slf4j.LoggerFactory;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * command-line which test to run and how many clients are participating in<a name="line.118"></a>
+<span class="sourceLineNo">119</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.119"></a>
+<span class="sourceLineNo">120</span> *<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.123"></a>
+<span class="sourceLineNo">124</span> * paper, pages 8-10.<a name="line.124"></a>
+<span class="sourceLineNo">125</span> *<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.128"></a>
+<span class="sourceLineNo">129</span> * specified otherwise.<a name="line.129"></a>
+<span class="sourceLineNo">130</span> */<a name="line.130"></a>
+<span class="sourceLineNo">131</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.131"></a>
+<span class="sourceLineNo">132</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  static final String RANDOM_READ = "randomRead";<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  static {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  }<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
+<span class="sourceLineNo">156</span><a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
+<span class="sourceLineNo">243</span><a name="line.243"></a>
+<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
+<span class="sourceLineNo">249</span><a name="line.249"></a>
+<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
+<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
+<span class="sourceLineNo">261</span><a name="line.261"></a>
+<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
+<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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><a name="line.297"></a>
+<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
+<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        }<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>      ObjectMapper mapper = new ObjectMap

<TRUNCATED>

[37/44] hbase-site git commit: Published site at 8e6ff689e806138e602a46730886d8c5f524fdcd.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AppendTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AppendTest.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AppendTest.html
index 418c60c..7cf23c4 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AppendTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AppendTest.html
@@ -64,2689 +64,2710 @@
 <span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.AsyncConnection;<a name="line.56"></a>
 <span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.AsyncTable;<a name="line.57"></a>
 <span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.BufferedMutator;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Get;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Put;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Result;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.111"></a>
-<span class="sourceLineNo">112</span><a name="line.112"></a>
-<span class="sourceLineNo">113</span>/**<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
-<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
-<span class="sourceLineNo">119</span> *<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
-<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
-<span class="sourceLineNo">124</span> *<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
-<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
-<span class="sourceLineNo">129</span> */<a name="line.129"></a>
-<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
-<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
-<span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // TODO : should we make this configurable<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private static final int TAG_LENGTH = 256;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  static {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        "Run async random read test");<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        "Run async random write test");<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.164"></a>
-<span class="sourceLineNo">165</span>        "Run async sequential read test");<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        "Run async sequential write test");<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        "Run async scan test (read every row)");<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      "Run random read test");<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      "Run random seek and scan 100 test");<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      "Run random write test");<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      "Run sequential read test");<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      "Run sequential write test");<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      "Run scan test (read every row)");<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "(make sure to use --rows=20)");<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  }<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * inner-class so we can find associated properties.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   */<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  protected static enum Counter {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    /** elapsed time */<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    ELAPSED_TIME,<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    /** number of rows */<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    public RunResult(long duration, Histogram hist) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      this.duration = duration;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.hist = hist;<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>    public final long duration;<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final Histogram hist;<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>    @Override<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    public String toString() {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      return Long.toString(duration);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>    @Override public int compareTo(RunResult o) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      return Long.compare(this.duration, o.duration);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
-<span class="sourceLineNo">234</span><a name="line.234"></a>
-<span class="sourceLineNo">235</span>  /**<a name="line.235"></a>
-<span class="sourceLineNo">236</span>   * Constructor<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * @param conf Configuration object<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   */<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    super(conf);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      String name, String description) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  /**<a name="line.249"></a>
-<span class="sourceLineNo">250</span>   * Implementations can have their status set.<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   */<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  interface Status {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    /**<a name="line.253"></a>
-<span class="sourceLineNo">254</span>     * Sets status<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * @param msg status message<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @throws IOException<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     */<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    void setStatus(final String msg) throws IOException;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  }<a name="line.259"></a>
-<span class="sourceLineNo">260</span><a name="line.260"></a>
-<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   */<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  public static class EvaluationMapTask<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>    /** configuration parameter name that contains the command */<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the PE impl */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>    @Override<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>      // this is required so that extensions of PE are instantiated within the<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // map reduce task...<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      try {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      } catch (Exception e) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      try {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        return Class.forName(className).asSubclass(type);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      } catch (ClassNotFoundException e) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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>    @Override<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.298"></a>
-<span class="sourceLineNo">299</span>           throws IOException, InterruptedException {<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>      Status status = new Status() {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        @Override<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        public void setStatus(String msg) {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>           context.setStatus(msg);<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><a name="line.307"></a>
-<span class="sourceLineNo">308</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      AsyncConnection asyncCon = null;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      try {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      } catch (ExecutionException e) {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>        throw new IOException(e);<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>      // Evaluation task<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      // Collect how much time the thing took. Report as map output and<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // to the ELAPSED_TIME counter.<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.progress();<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    }<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>  /*<a name="line.330"></a>
-<span class="sourceLineNo">331</span>   * If table does not already exist, create. Also create a table when<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   */<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      throw new IllegalStateException(<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    HTableDescriptor desc =<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    byte[][] splits = getSplits(opts);<a name="line.346"></a>
-<span class="sourceLineNo">347</span><a name="line.347"></a>
-<span class="sourceLineNo">348</span>    // recreate the table when user has requested presplit or when existing<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      needsDelete = true;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      // wait, why did it delete my table?!?<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        .add("needsDelete", needsDelete)<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("isReadCmd", isReadCmd)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("exists", exists)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("desc", desc)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("presplit", opts.presplitRegions)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("replicas", opts.replicas)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .toString());<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>    // remove an existing table<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    if (needsDelete) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      if (admin.isTableEnabled(tableName)) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        admin.disableTable(tableName);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      admin.deleteTable(tableName);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>    // table creation is necessary<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    if (!exists || needsDelete) {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      desc = getTableDescriptor(opts);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      if (splits != null) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        if (LOG.isDebugEnabled()) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<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>      admin.createTable(desc, splits);<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      LOG.info("Table " + desc + " created");<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    return admin.tableExists(tableName);<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>  /**<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setCompressionType(opts.compression);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setBloomFilterType(opts.bloomType);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBlocksize(opts.blockSize);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    if (opts.inMemoryCF) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      family.setInMemory(true);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    desc.addFamily(family);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      desc.setRegionReplication(opts.replicas);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    return desc;<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>  /**<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   * generates splits based on total number of rows and specified split regions<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   */<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      int rowkey = jump * (1 + i);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      splits[i] = format(rowkey);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return splits;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  }<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  /*<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * Run all clients in this vm each to its own thread.<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   */<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    assert cmd != null;<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    @SuppressWarnings("unchecked")<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      final int index = i;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        @Override<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        public RunResult call() throws Exception {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>            @Override<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            public void setStatus(final String msg) throws IOException {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>              LOG.info(msg);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>          });<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.459"></a>
-<span class="sourceLineNo">460</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          return run;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      });<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    }<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    pool.shutdown();<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      try {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        results[i] = threads[i].get();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      } catch (ExecutionException e) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>        throw new IOException(e.getCause());<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    final String test = cmd.getSimpleName();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.475"></a>
-<span class="sourceLineNo">476</span>             + Arrays.toString(results));<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    Arrays.sort(results);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    long total = 0;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    for (RunResult result : results) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      total += result.duration;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    LOG.info("[" + test + "]"<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      + "\tMin: " + results[0] + "ms"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.485"></a>
-<span class="sourceLineNo">486</span><a name="line.486"></a>
-<span class="sourceLineNo">487</span>    con.close();<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    asyncCon.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    return results;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  /*<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Before we start up the job, write out an input file with instruction<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * per client regards which row they are to start on.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * @param cmd Command to run.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @throws IOException<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   */<a name="line.499"></a>
-<span class="sourceLineNo">500</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    assert cmd != null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    Job job = Job.getInstance(conf);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.509"></a>
-<span class="sourceLineNo">510</span><a name="line.510"></a>
-<span class="sourceLineNo">511</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    // this is default, but be explicit about it just in case.<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.514"></a>
-<span class="sourceLineNo">515</span><a name="line.515"></a>
-<span class="sourceLineNo">516</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputValueClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setReducerClass(LongSumReducer.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>    job.setNumReduceTasks(1);<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      Histogram.class,     // yammer metrics<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      );<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>    TableMapReduceUtil.initCredentials(job);<a name="line.534"></a>
-<span class="sourceLineNo">535</span><a name="line.535"></a>
-<span class="sourceLineNo">536</span>    job.waitForCompletion(true);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    return job;<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>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<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>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>  /*<a name="line.546"></a>
-<span class="sourceLineNo">547</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * @param c Configuration<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<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>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    return writeInputFile(c, opts, new Path("."));<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.556"></a>
-<span class="sourceLineNo">557</span>  throws IOException {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>    FileSystem fs = FileSystem.get(c);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    fs.mkdirs(inputDir);<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    // Make input random.<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Hash h = MurmurHash.getInstance();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    try {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>        TestOptions next = new TestOptions(opts);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        next.startRow = j * perClientRows;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.perClientRunRows = perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        String s = MAPPER.writeValueAsString(next);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        byte[] b = Bytes.toBytes(s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        m.put(hash, s);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>        out.println(e.getValue());<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    } finally {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      out.close();<a name="line.586"></a>
-<span class="sourceLineNo">587</span>    }<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    return inputDir;<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>   * Describes a command.<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   */<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  static class CmdDescriptor {<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private String name;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String description;<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      this.cmdClass = cmdClass;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.name = name;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.description = description;<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>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>      return cmdClass;<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>    public String getName() {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>      return name;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    public String getDescription() {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>      return description;<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><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * This makes tracking all these arguments a little easier.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>  static class TestOptions {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    String cmdName = null;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    boolean nomapred = false;<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    boolean filterAll = false;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    int startRow = 0;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    float size = 1.0f;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    int perClientRunRows = DEFAULT_ROWS_PER_GB;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    int numClientThreads = 1;<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    int totalRows = DEFAULT_ROWS_PER_GB;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    int measureAfter = 0;<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    float sampleRate = 1.0f;<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    double traceRate = 0.0;<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    String tableName = TABLE_NAME;<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    boolean flushCommits = true;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    boolean writeToWAL = true;<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    boolean autoFlush = false;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    boolean oneCon = false;<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    boolean useTags = false;<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    int noOfTags = 1;<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    boolean reportLatency = false;<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    int multiGet = 0;<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    int randomSleep = 0;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    boolean inMemoryCF = false;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    int presplitRegions = 0;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    int replicas = HTableDescriptor.DEFAULT_REGION_REPLICATION;<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    String splitPolicy = null;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    Compression.Algorithm compression = Compression.Algorithm.NONE;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    BloomType bloomType = BloomType.ROW;<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    int blockSize = HConstants.DEFAULT_BLOCKSIZE;<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    DataBlockEncoding blockEncoding = DataBlockEncoding.NONE;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    boolean valueRandom = false;<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    boolean valueZipf = false;<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    int valueSize = DEFAULT_VALUE_LENGTH;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    int period = (this.perClientRunRows / 10) == 0? perClientRunRows: perClientRunRows / 10;<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    int cycles = 1;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    int columns = 1;<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    int caching = 30;<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    boolean addColumns = true;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    MemoryCompactionPolicy inMemoryCompaction =<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        MemoryCompactionPolicy.valueOf(<a name="line.664"></a>
-<span class="sourceLineNo">665</span>            CompactingMemStore.COMPACTING_MEMSTORE_TYPE_DEFAULT);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    boolean asyncPrefetch = false;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    boolean cacheBlocks = true;<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    Scan.ReadType scanReadType = Scan.ReadType.DEFAULT;<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>    public TestOptions() {}<a name="line.670"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.BufferedMutatorParams;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Get;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Put;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.Result;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.Table;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.LongWritable;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.io.Text;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Job;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.Tool;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.hadoop.util.ToolRunner;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.Sampler;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.htrace.core.TraceScope;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.Logger;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.slf4j.LoggerFactory;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * command-line which test to run and how many clients are participating in<a name="line.118"></a>
+<span class="sourceLineNo">119</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.119"></a>
+<span class="sourceLineNo">120</span> *<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.123"></a>
+<span class="sourceLineNo">124</span> * paper, pages 8-10.<a name="line.124"></a>
+<span class="sourceLineNo">125</span> *<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.128"></a>
+<span class="sourceLineNo">129</span> * specified otherwise.<a name="line.129"></a>
+<span class="sourceLineNo">130</span> */<a name="line.130"></a>
+<span class="sourceLineNo">131</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.131"></a>
+<span class="sourceLineNo">132</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  static final String RANDOM_READ = "randomRead";<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  static {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  }<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
+<span class="sourceLineNo">156</span><a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
+<span class="sourceLineNo">243</span><a name="line.243"></a>
+<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
+<span class="sourceLineNo">249</span><a name="line.249"></a>
+<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
+<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
+<span class="sourceLineNo">261</span><a name="line.261"></a>
+<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
+<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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><a name="line.297"></a>
+<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
+<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        }<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>      ObjectMapper mapper = new ObjectMapper();<a name="line.309"></a>
+<span cla

<TRUNCATED>

[35/44] hbase-site git commit: Published site at 8e6ff689e806138e602a46730886d8c5f524fdcd.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomWriteTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomWriteTest.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomWriteTest.html
index 418c60c..7cf23c4 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomWriteTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomWriteTest.html
@@ -64,2689 +64,2710 @@
 <span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.AsyncConnection;<a name="line.56"></a>
 <span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.AsyncTable;<a name="line.57"></a>
 <span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.BufferedMutator;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Get;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Put;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Result;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.111"></a>
-<span class="sourceLineNo">112</span><a name="line.112"></a>
-<span class="sourceLineNo">113</span>/**<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
-<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
-<span class="sourceLineNo">119</span> *<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
-<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
-<span class="sourceLineNo">124</span> *<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
-<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
-<span class="sourceLineNo">129</span> */<a name="line.129"></a>
-<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
-<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
-<span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // TODO : should we make this configurable<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private static final int TAG_LENGTH = 256;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  static {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        "Run async random read test");<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        "Run async random write test");<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.164"></a>
-<span class="sourceLineNo">165</span>        "Run async sequential read test");<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        "Run async sequential write test");<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        "Run async scan test (read every row)");<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      "Run random read test");<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      "Run random seek and scan 100 test");<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      "Run random write test");<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      "Run sequential read test");<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      "Run sequential write test");<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      "Run scan test (read every row)");<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "(make sure to use --rows=20)");<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  }<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * inner-class so we can find associated properties.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   */<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  protected static enum Counter {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    /** elapsed time */<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    ELAPSED_TIME,<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    /** number of rows */<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    public RunResult(long duration, Histogram hist) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      this.duration = duration;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.hist = hist;<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>    public final long duration;<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final Histogram hist;<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>    @Override<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    public String toString() {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      return Long.toString(duration);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>    @Override public int compareTo(RunResult o) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      return Long.compare(this.duration, o.duration);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
-<span class="sourceLineNo">234</span><a name="line.234"></a>
-<span class="sourceLineNo">235</span>  /**<a name="line.235"></a>
-<span class="sourceLineNo">236</span>   * Constructor<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * @param conf Configuration object<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   */<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    super(conf);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      String name, String description) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  /**<a name="line.249"></a>
-<span class="sourceLineNo">250</span>   * Implementations can have their status set.<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   */<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  interface Status {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    /**<a name="line.253"></a>
-<span class="sourceLineNo">254</span>     * Sets status<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * @param msg status message<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @throws IOException<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     */<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    void setStatus(final String msg) throws IOException;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  }<a name="line.259"></a>
-<span class="sourceLineNo">260</span><a name="line.260"></a>
-<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   */<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  public static class EvaluationMapTask<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>    /** configuration parameter name that contains the command */<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the PE impl */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>    @Override<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>      // this is required so that extensions of PE are instantiated within the<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // map reduce task...<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      try {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      } catch (Exception e) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      try {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        return Class.forName(className).asSubclass(type);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      } catch (ClassNotFoundException e) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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>    @Override<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.298"></a>
-<span class="sourceLineNo">299</span>           throws IOException, InterruptedException {<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>      Status status = new Status() {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        @Override<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        public void setStatus(String msg) {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>           context.setStatus(msg);<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><a name="line.307"></a>
-<span class="sourceLineNo">308</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      AsyncConnection asyncCon = null;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      try {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      } catch (ExecutionException e) {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>        throw new IOException(e);<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>      // Evaluation task<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      // Collect how much time the thing took. Report as map output and<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // to the ELAPSED_TIME counter.<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.progress();<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    }<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>  /*<a name="line.330"></a>
-<span class="sourceLineNo">331</span>   * If table does not already exist, create. Also create a table when<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   */<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      throw new IllegalStateException(<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    HTableDescriptor desc =<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    byte[][] splits = getSplits(opts);<a name="line.346"></a>
-<span class="sourceLineNo">347</span><a name="line.347"></a>
-<span class="sourceLineNo">348</span>    // recreate the table when user has requested presplit or when existing<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      needsDelete = true;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      // wait, why did it delete my table?!?<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        .add("needsDelete", needsDelete)<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("isReadCmd", isReadCmd)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("exists", exists)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("desc", desc)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("presplit", opts.presplitRegions)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("replicas", opts.replicas)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .toString());<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>    // remove an existing table<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    if (needsDelete) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      if (admin.isTableEnabled(tableName)) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        admin.disableTable(tableName);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      admin.deleteTable(tableName);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>    // table creation is necessary<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    if (!exists || needsDelete) {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      desc = getTableDescriptor(opts);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      if (splits != null) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        if (LOG.isDebugEnabled()) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<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>      admin.createTable(desc, splits);<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      LOG.info("Table " + desc + " created");<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    return admin.tableExists(tableName);<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>  /**<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setCompressionType(opts.compression);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setBloomFilterType(opts.bloomType);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBlocksize(opts.blockSize);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    if (opts.inMemoryCF) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      family.setInMemory(true);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    desc.addFamily(family);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      desc.setRegionReplication(opts.replicas);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    return desc;<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>  /**<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   * generates splits based on total number of rows and specified split regions<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   */<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      int rowkey = jump * (1 + i);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      splits[i] = format(rowkey);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return splits;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  }<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  /*<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * Run all clients in this vm each to its own thread.<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   */<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    assert cmd != null;<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    @SuppressWarnings("unchecked")<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      final int index = i;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        @Override<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        public RunResult call() throws Exception {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>            @Override<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            public void setStatus(final String msg) throws IOException {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>              LOG.info(msg);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>          });<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.459"></a>
-<span class="sourceLineNo">460</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          return run;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      });<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    }<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    pool.shutdown();<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      try {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        results[i] = threads[i].get();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      } catch (ExecutionException e) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>        throw new IOException(e.getCause());<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    final String test = cmd.getSimpleName();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.475"></a>
-<span class="sourceLineNo">476</span>             + Arrays.toString(results));<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    Arrays.sort(results);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    long total = 0;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    for (RunResult result : results) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      total += result.duration;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    LOG.info("[" + test + "]"<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      + "\tMin: " + results[0] + "ms"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.485"></a>
-<span class="sourceLineNo">486</span><a name="line.486"></a>
-<span class="sourceLineNo">487</span>    con.close();<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    asyncCon.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    return results;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  /*<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Before we start up the job, write out an input file with instruction<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * per client regards which row they are to start on.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * @param cmd Command to run.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @throws IOException<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   */<a name="line.499"></a>
-<span class="sourceLineNo">500</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    assert cmd != null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    Job job = Job.getInstance(conf);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.509"></a>
-<span class="sourceLineNo">510</span><a name="line.510"></a>
-<span class="sourceLineNo">511</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    // this is default, but be explicit about it just in case.<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.514"></a>
-<span class="sourceLineNo">515</span><a name="line.515"></a>
-<span class="sourceLineNo">516</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputValueClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setReducerClass(LongSumReducer.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>    job.setNumReduceTasks(1);<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      Histogram.class,     // yammer metrics<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      );<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>    TableMapReduceUtil.initCredentials(job);<a name="line.534"></a>
-<span class="sourceLineNo">535</span><a name="line.535"></a>
-<span class="sourceLineNo">536</span>    job.waitForCompletion(true);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    return job;<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>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<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>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>  /*<a name="line.546"></a>
-<span class="sourceLineNo">547</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * @param c Configuration<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<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>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    return writeInputFile(c, opts, new Path("."));<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.556"></a>
-<span class="sourceLineNo">557</span>  throws IOException {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>    FileSystem fs = FileSystem.get(c);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    fs.mkdirs(inputDir);<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    // Make input random.<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Hash h = MurmurHash.getInstance();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    try {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>        TestOptions next = new TestOptions(opts);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        next.startRow = j * perClientRows;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.perClientRunRows = perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        String s = MAPPER.writeValueAsString(next);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        byte[] b = Bytes.toBytes(s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        m.put(hash, s);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>        out.println(e.getValue());<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    } finally {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      out.close();<a name="line.586"></a>
-<span class="sourceLineNo">587</span>    }<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    return inputDir;<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>   * Describes a command.<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   */<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  static class CmdDescriptor {<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private String name;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String description;<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      this.cmdClass = cmdClass;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.name = name;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.description = description;<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>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>      return cmdClass;<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>    public String getName() {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>      return name;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    public String getDescription() {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>      return description;<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><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * This makes tracking all these arguments a little easier.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>  static class TestOptions {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    String cmdName = null;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    boolean nomapred = false;<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    boolean filterAll = false;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    int startRow = 0;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    float size = 1.0f;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    int perClientRunRows = DEFAULT_ROWS_PER_GB;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    int numClientThreads = 1;<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    int totalRows = DEFAULT_ROWS_PER_GB;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    int measureAfter = 0;<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    float sampleRate = 1.0f;<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    double traceRate = 0.0;<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    String tableName = TABLE_NAME;<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    boolean flushCommits = true;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    boolean writeToWAL = true;<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    boolean autoFlush = false;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    boolean oneCon = false;<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    boolean useTags = false;<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    int noOfTags = 1;<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    boolean reportLatency = false;<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    int multiGet = 0;<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    int randomSleep = 0;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    boolean inMemoryCF = false;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    int presplitRegions = 0;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    int replicas = HTableDescriptor.DEFAULT_REGION_REPLICATION;<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    String splitPolicy = null;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    Compression.Algorithm compression = Compression.Algorithm.NONE;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    BloomType bloomType = BloomType.ROW;<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    int blockSize = HConstants.DEFAULT_BLOCKSIZE;<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    DataBlockEncoding blockEncoding = DataBlockEncoding.NONE;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    boolean valueRandom = false;<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    boolean valueZipf = false;<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    int valueSize = DEFAULT_VALUE_LENGTH;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    int period = (this.perClientRunRows / 10) == 0? perClientRunRows: perClientRunRows / 10;<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    int cycles = 1;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    int columns = 1;<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    int caching = 30;<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    boolean addColumns = true;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    MemoryCompactionPolicy inMemoryCompaction =<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        MemoryCompactionPolicy.valueOf(<a name="line.664"></a>
-<span class="sourceLineNo">665</span>            CompactingMemStore.COMPACTING_MEMSTORE_TYPE_DEFAULT);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    boolean asyncPrefetch = false;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    boolean cacheBlocks = true;<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    Scan.ReadType scanReadType = Scan.ReadType.DEFAULT;<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>    public TestOptions() {}<a name="line.670"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.BufferedMutatorParams;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Get;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Put;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.Result;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.Table;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.LongWritable;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.io.Text;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Job;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.Tool;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.hadoop.util.ToolRunner;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.Sampler;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.htrace.core.TraceScope;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.Logger;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.slf4j.LoggerFactory;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * command-line which test to run and how many clients are participating in<a name="line.118"></a>
+<span class="sourceLineNo">119</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.119"></a>
+<span class="sourceLineNo">120</span> *<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.123"></a>
+<span class="sourceLineNo">124</span> * paper, pages 8-10.<a name="line.124"></a>
+<span class="sourceLineNo">125</span> *<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.128"></a>
+<span class="sourceLineNo">129</span> * specified otherwise.<a name="line.129"></a>
+<span class="sourceLineNo">130</span> */<a name="line.130"></a>
+<span class="sourceLineNo">131</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.131"></a>
+<span class="sourceLineNo">132</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  static final String RANDOM_READ = "randomRead";<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  static {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  }<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
+<span class="sourceLineNo">156</span><a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
+<span class="sourceLineNo">243</span><a name="line.243"></a>
+<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
+<span class="sourceLineNo">249</span><a name="line.249"></a>
+<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
+<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
+<span class="sourceLineNo">261</span><a name="line.261"></a>
+<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
+<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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><a name="line.297"></a>
+<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
+<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        }<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>      ObjectMapper mapper = new

<TRUNCATED>

[32/44] hbase-site git commit: Published site at 8e6ff689e806138e602a46730886d8c5f524fdcd.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialWriteTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialWriteTest.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialWriteTest.html
index 418c60c..7cf23c4 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialWriteTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialWriteTest.html
@@ -64,2689 +64,2710 @@
 <span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.AsyncConnection;<a name="line.56"></a>
 <span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.AsyncTable;<a name="line.57"></a>
 <span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.BufferedMutator;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Get;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Put;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Result;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.111"></a>
-<span class="sourceLineNo">112</span><a name="line.112"></a>
-<span class="sourceLineNo">113</span>/**<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
-<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
-<span class="sourceLineNo">119</span> *<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
-<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
-<span class="sourceLineNo">124</span> *<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
-<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
-<span class="sourceLineNo">129</span> */<a name="line.129"></a>
-<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
-<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
-<span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // TODO : should we make this configurable<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private static final int TAG_LENGTH = 256;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  static {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        "Run async random read test");<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        "Run async random write test");<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.164"></a>
-<span class="sourceLineNo">165</span>        "Run async sequential read test");<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        "Run async sequential write test");<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        "Run async scan test (read every row)");<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      "Run random read test");<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      "Run random seek and scan 100 test");<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      "Run random write test");<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      "Run sequential read test");<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      "Run sequential write test");<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      "Run scan test (read every row)");<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "(make sure to use --rows=20)");<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  }<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * inner-class so we can find associated properties.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   */<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  protected static enum Counter {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    /** elapsed time */<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    ELAPSED_TIME,<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    /** number of rows */<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    public RunResult(long duration, Histogram hist) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      this.duration = duration;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.hist = hist;<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>    public final long duration;<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final Histogram hist;<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>    @Override<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    public String toString() {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      return Long.toString(duration);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>    @Override public int compareTo(RunResult o) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      return Long.compare(this.duration, o.duration);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
-<span class="sourceLineNo">234</span><a name="line.234"></a>
-<span class="sourceLineNo">235</span>  /**<a name="line.235"></a>
-<span class="sourceLineNo">236</span>   * Constructor<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * @param conf Configuration object<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   */<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    super(conf);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      String name, String description) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  /**<a name="line.249"></a>
-<span class="sourceLineNo">250</span>   * Implementations can have their status set.<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   */<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  interface Status {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    /**<a name="line.253"></a>
-<span class="sourceLineNo">254</span>     * Sets status<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * @param msg status message<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @throws IOException<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     */<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    void setStatus(final String msg) throws IOException;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  }<a name="line.259"></a>
-<span class="sourceLineNo">260</span><a name="line.260"></a>
-<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   */<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  public static class EvaluationMapTask<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>    /** configuration parameter name that contains the command */<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the PE impl */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>    @Override<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>      // this is required so that extensions of PE are instantiated within the<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // map reduce task...<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      try {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      } catch (Exception e) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      try {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        return Class.forName(className).asSubclass(type);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      } catch (ClassNotFoundException e) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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>    @Override<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.298"></a>
-<span class="sourceLineNo">299</span>           throws IOException, InterruptedException {<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>      Status status = new Status() {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        @Override<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        public void setStatus(String msg) {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>           context.setStatus(msg);<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><a name="line.307"></a>
-<span class="sourceLineNo">308</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      AsyncConnection asyncCon = null;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      try {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      } catch (ExecutionException e) {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>        throw new IOException(e);<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>      // Evaluation task<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      // Collect how much time the thing took. Report as map output and<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // to the ELAPSED_TIME counter.<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.progress();<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    }<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>  /*<a name="line.330"></a>
-<span class="sourceLineNo">331</span>   * If table does not already exist, create. Also create a table when<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   */<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      throw new IllegalStateException(<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    HTableDescriptor desc =<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    byte[][] splits = getSplits(opts);<a name="line.346"></a>
-<span class="sourceLineNo">347</span><a name="line.347"></a>
-<span class="sourceLineNo">348</span>    // recreate the table when user has requested presplit or when existing<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      needsDelete = true;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      // wait, why did it delete my table?!?<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        .add("needsDelete", needsDelete)<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("isReadCmd", isReadCmd)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("exists", exists)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("desc", desc)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("presplit", opts.presplitRegions)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("replicas", opts.replicas)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .toString());<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>    // remove an existing table<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    if (needsDelete) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      if (admin.isTableEnabled(tableName)) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        admin.disableTable(tableName);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      admin.deleteTable(tableName);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>    // table creation is necessary<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    if (!exists || needsDelete) {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      desc = getTableDescriptor(opts);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      if (splits != null) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        if (LOG.isDebugEnabled()) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<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>      admin.createTable(desc, splits);<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      LOG.info("Table " + desc + " created");<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    return admin.tableExists(tableName);<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>  /**<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setCompressionType(opts.compression);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setBloomFilterType(opts.bloomType);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBlocksize(opts.blockSize);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    if (opts.inMemoryCF) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      family.setInMemory(true);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    desc.addFamily(family);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      desc.setRegionReplication(opts.replicas);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    return desc;<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>  /**<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   * generates splits based on total number of rows and specified split regions<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   */<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      int rowkey = jump * (1 + i);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      splits[i] = format(rowkey);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return splits;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  }<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  /*<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * Run all clients in this vm each to its own thread.<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   */<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    assert cmd != null;<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    @SuppressWarnings("unchecked")<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      final int index = i;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        @Override<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        public RunResult call() throws Exception {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>            @Override<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            public void setStatus(final String msg) throws IOException {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>              LOG.info(msg);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>          });<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.459"></a>
-<span class="sourceLineNo">460</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          return run;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      });<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    }<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    pool.shutdown();<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      try {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        results[i] = threads[i].get();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      } catch (ExecutionException e) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>        throw new IOException(e.getCause());<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    final String test = cmd.getSimpleName();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.475"></a>
-<span class="sourceLineNo">476</span>             + Arrays.toString(results));<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    Arrays.sort(results);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    long total = 0;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    for (RunResult result : results) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      total += result.duration;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    LOG.info("[" + test + "]"<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      + "\tMin: " + results[0] + "ms"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.485"></a>
-<span class="sourceLineNo">486</span><a name="line.486"></a>
-<span class="sourceLineNo">487</span>    con.close();<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    asyncCon.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    return results;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  /*<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Before we start up the job, write out an input file with instruction<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * per client regards which row they are to start on.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * @param cmd Command to run.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @throws IOException<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   */<a name="line.499"></a>
-<span class="sourceLineNo">500</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    assert cmd != null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    Job job = Job.getInstance(conf);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.509"></a>
-<span class="sourceLineNo">510</span><a name="line.510"></a>
-<span class="sourceLineNo">511</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    // this is default, but be explicit about it just in case.<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.514"></a>
-<span class="sourceLineNo">515</span><a name="line.515"></a>
-<span class="sourceLineNo">516</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputValueClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setReducerClass(LongSumReducer.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>    job.setNumReduceTasks(1);<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      Histogram.class,     // yammer metrics<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      );<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>    TableMapReduceUtil.initCredentials(job);<a name="line.534"></a>
-<span class="sourceLineNo">535</span><a name="line.535"></a>
-<span class="sourceLineNo">536</span>    job.waitForCompletion(true);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    return job;<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>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<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>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>  /*<a name="line.546"></a>
-<span class="sourceLineNo">547</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * @param c Configuration<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<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>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    return writeInputFile(c, opts, new Path("."));<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.556"></a>
-<span class="sourceLineNo">557</span>  throws IOException {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>    FileSystem fs = FileSystem.get(c);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    fs.mkdirs(inputDir);<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    // Make input random.<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Hash h = MurmurHash.getInstance();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    try {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>        TestOptions next = new TestOptions(opts);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        next.startRow = j * perClientRows;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.perClientRunRows = perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        String s = MAPPER.writeValueAsString(next);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        byte[] b = Bytes.toBytes(s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        m.put(hash, s);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>        out.println(e.getValue());<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    } finally {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      out.close();<a name="line.586"></a>
-<span class="sourceLineNo">587</span>    }<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    return inputDir;<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>   * Describes a command.<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   */<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  static class CmdDescriptor {<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private String name;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String description;<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      this.cmdClass = cmdClass;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.name = name;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.description = description;<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>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>      return cmdClass;<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>    public String getName() {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>      return name;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    public String getDescription() {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>      return description;<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><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * This makes tracking all these arguments a little easier.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>  static class TestOptions {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    String cmdName = null;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    boolean nomapred = false;<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    boolean filterAll = false;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    int startRow = 0;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    float size = 1.0f;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    int perClientRunRows = DEFAULT_ROWS_PER_GB;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    int numClientThreads = 1;<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    int totalRows = DEFAULT_ROWS_PER_GB;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    int measureAfter = 0;<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    float sampleRate = 1.0f;<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    double traceRate = 0.0;<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    String tableName = TABLE_NAME;<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    boolean flushCommits = true;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    boolean writeToWAL = true;<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    boolean autoFlush = false;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    boolean oneCon = false;<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    boolean useTags = false;<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    int noOfTags = 1;<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    boolean reportLatency = false;<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    int multiGet = 0;<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    int randomSleep = 0;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    boolean inMemoryCF = false;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    int presplitRegions = 0;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    int replicas = HTableDescriptor.DEFAULT_REGION_REPLICATION;<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    String splitPolicy = null;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    Compression.Algorithm compression = Compression.Algorithm.NONE;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    BloomType bloomType = BloomType.ROW;<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    int blockSize = HConstants.DEFAULT_BLOCKSIZE;<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    DataBlockEncoding blockEncoding = DataBlockEncoding.NONE;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    boolean valueRandom = false;<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    boolean valueZipf = false;<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    int valueSize = DEFAULT_VALUE_LENGTH;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    int period = (this.perClientRunRows / 10) == 0? perClientRunRows: perClientRunRows / 10;<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    int cycles = 1;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    int columns = 1;<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    int caching = 30;<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    boolean addColumns = true;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    MemoryCompactionPolicy inMemoryCompaction =<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        MemoryCompactionPolicy.valueOf(<a name="line.664"></a>
-<span class="sourceLineNo">665</span>            CompactingMemStore.COMPACTING_MEMSTORE_TYPE_DEFAULT);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    boolean asyncPrefetch = false;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    boolean cacheBlocks = true;<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    Scan.ReadType scanReadType = Scan.ReadType.DEFAULT;<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>    public TestOptions() {}<a name="line.670"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.BufferedMutatorParams;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Get;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Put;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.Result;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.Table;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.LongWritable;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.io.Text;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Job;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.Tool;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.hadoop.util.ToolRunner;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.Sampler;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.htrace.core.TraceScope;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.Logger;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.slf4j.LoggerFactory;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * command-line which test to run and how many clients are participating in<a name="line.118"></a>
+<span class="sourceLineNo">119</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.119"></a>
+<span class="sourceLineNo">120</span> *<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.123"></a>
+<span class="sourceLineNo">124</span> * paper, pages 8-10.<a name="line.124"></a>
+<span class="sourceLineNo">125</span> *<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.128"></a>
+<span class="sourceLineNo">129</span> * specified otherwise.<a name="line.129"></a>
+<span class="sourceLineNo">130</span> */<a name="line.130"></a>
+<span class="sourceLineNo">131</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.131"></a>
+<span class="sourceLineNo">132</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  static final String RANDOM_READ = "randomRead";<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  static {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  }<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
+<span class="sourceLineNo">156</span><a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
+<span class="sourceLineNo">243</span><a name="line.243"></a>
+<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
+<span class="sourceLineNo">249</span><a name="line.249"></a>
+<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
+<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
+<span class="sourceLineNo">261</span><a name="line.261"></a>
+<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
+<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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><a name="line.297"></a>
+<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
+<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        }<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>      Objec

<TRUNCATED>

[28/44] hbase-site git commit: Published site at 8e6ff689e806138e602a46730886d8c5f524fdcd.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html
index 418c60c..7cf23c4 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html
@@ -64,2689 +64,2710 @@
 <span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.AsyncConnection;<a name="line.56"></a>
 <span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.AsyncTable;<a name="line.57"></a>
 <span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.BufferedMutator;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Get;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Put;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Result;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.111"></a>
-<span class="sourceLineNo">112</span><a name="line.112"></a>
-<span class="sourceLineNo">113</span>/**<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
-<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
-<span class="sourceLineNo">119</span> *<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
-<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
-<span class="sourceLineNo">124</span> *<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
-<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
-<span class="sourceLineNo">129</span> */<a name="line.129"></a>
-<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
-<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
-<span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // TODO : should we make this configurable<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private static final int TAG_LENGTH = 256;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  static {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        "Run async random read test");<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        "Run async random write test");<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.164"></a>
-<span class="sourceLineNo">165</span>        "Run async sequential read test");<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        "Run async sequential write test");<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        "Run async scan test (read every row)");<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      "Run random read test");<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      "Run random seek and scan 100 test");<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      "Run random write test");<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      "Run sequential read test");<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      "Run sequential write test");<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      "Run scan test (read every row)");<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "(make sure to use --rows=20)");<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  }<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * inner-class so we can find associated properties.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   */<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  protected static enum Counter {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    /** elapsed time */<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    ELAPSED_TIME,<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    /** number of rows */<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    public RunResult(long duration, Histogram hist) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      this.duration = duration;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.hist = hist;<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>    public final long duration;<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final Histogram hist;<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>    @Override<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    public String toString() {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      return Long.toString(duration);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>    @Override public int compareTo(RunResult o) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      return Long.compare(this.duration, o.duration);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
-<span class="sourceLineNo">234</span><a name="line.234"></a>
-<span class="sourceLineNo">235</span>  /**<a name="line.235"></a>
-<span class="sourceLineNo">236</span>   * Constructor<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * @param conf Configuration object<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   */<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    super(conf);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      String name, String description) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  /**<a name="line.249"></a>
-<span class="sourceLineNo">250</span>   * Implementations can have their status set.<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   */<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  interface Status {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    /**<a name="line.253"></a>
-<span class="sourceLineNo">254</span>     * Sets status<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * @param msg status message<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @throws IOException<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     */<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    void setStatus(final String msg) throws IOException;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  }<a name="line.259"></a>
-<span class="sourceLineNo">260</span><a name="line.260"></a>
-<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   */<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  public static class EvaluationMapTask<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>    /** configuration parameter name that contains the command */<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the PE impl */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>    @Override<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>      // this is required so that extensions of PE are instantiated within the<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // map reduce task...<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      try {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      } catch (Exception e) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      try {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        return Class.forName(className).asSubclass(type);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      } catch (ClassNotFoundException e) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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>    @Override<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.298"></a>
-<span class="sourceLineNo">299</span>           throws IOException, InterruptedException {<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>      Status status = new Status() {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        @Override<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        public void setStatus(String msg) {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>           context.setStatus(msg);<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><a name="line.307"></a>
-<span class="sourceLineNo">308</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      AsyncConnection asyncCon = null;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      try {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      } catch (ExecutionException e) {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>        throw new IOException(e);<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>      // Evaluation task<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      // Collect how much time the thing took. Report as map output and<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // to the ELAPSED_TIME counter.<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.progress();<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    }<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>  /*<a name="line.330"></a>
-<span class="sourceLineNo">331</span>   * If table does not already exist, create. Also create a table when<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   */<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      throw new IllegalStateException(<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    HTableDescriptor desc =<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    byte[][] splits = getSplits(opts);<a name="line.346"></a>
-<span class="sourceLineNo">347</span><a name="line.347"></a>
-<span class="sourceLineNo">348</span>    // recreate the table when user has requested presplit or when existing<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      needsDelete = true;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      // wait, why did it delete my table?!?<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        .add("needsDelete", needsDelete)<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("isReadCmd", isReadCmd)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("exists", exists)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("desc", desc)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("presplit", opts.presplitRegions)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("replicas", opts.replicas)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .toString());<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>    // remove an existing table<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    if (needsDelete) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      if (admin.isTableEnabled(tableName)) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        admin.disableTable(tableName);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      admin.deleteTable(tableName);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>    // table creation is necessary<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    if (!exists || needsDelete) {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      desc = getTableDescriptor(opts);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      if (splits != null) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        if (LOG.isDebugEnabled()) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<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>      admin.createTable(desc, splits);<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      LOG.info("Table " + desc + " created");<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    return admin.tableExists(tableName);<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>  /**<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setCompressionType(opts.compression);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setBloomFilterType(opts.bloomType);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBlocksize(opts.blockSize);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    if (opts.inMemoryCF) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      family.setInMemory(true);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    desc.addFamily(family);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      desc.setRegionReplication(opts.replicas);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    return desc;<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>  /**<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   * generates splits based on total number of rows and specified split regions<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   */<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      int rowkey = jump * (1 + i);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      splits[i] = format(rowkey);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return splits;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  }<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  /*<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * Run all clients in this vm each to its own thread.<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   */<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    assert cmd != null;<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    @SuppressWarnings("unchecked")<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      final int index = i;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        @Override<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        public RunResult call() throws Exception {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>            @Override<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            public void setStatus(final String msg) throws IOException {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>              LOG.info(msg);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>          });<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.459"></a>
-<span class="sourceLineNo">460</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          return run;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      });<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    }<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    pool.shutdown();<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      try {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        results[i] = threads[i].get();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      } catch (ExecutionException e) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>        throw new IOException(e.getCause());<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    final String test = cmd.getSimpleName();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.475"></a>
-<span class="sourceLineNo">476</span>             + Arrays.toString(results));<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    Arrays.sort(results);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    long total = 0;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    for (RunResult result : results) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      total += result.duration;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    LOG.info("[" + test + "]"<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      + "\tMin: " + results[0] + "ms"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.485"></a>
-<span class="sourceLineNo">486</span><a name="line.486"></a>
-<span class="sourceLineNo">487</span>    con.close();<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    asyncCon.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    return results;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  /*<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Before we start up the job, write out an input file with instruction<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * per client regards which row they are to start on.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * @param cmd Command to run.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @throws IOException<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   */<a name="line.499"></a>
-<span class="sourceLineNo">500</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    assert cmd != null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    Job job = Job.getInstance(conf);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.509"></a>
-<span class="sourceLineNo">510</span><a name="line.510"></a>
-<span class="sourceLineNo">511</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    // this is default, but be explicit about it just in case.<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.514"></a>
-<span class="sourceLineNo">515</span><a name="line.515"></a>
-<span class="sourceLineNo">516</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputValueClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setReducerClass(LongSumReducer.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>    job.setNumReduceTasks(1);<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      Histogram.class,     // yammer metrics<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      );<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>    TableMapReduceUtil.initCredentials(job);<a name="line.534"></a>
-<span class="sourceLineNo">535</span><a name="line.535"></a>
-<span class="sourceLineNo">536</span>    job.waitForCompletion(true);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    return job;<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>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<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>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>  /*<a name="line.546"></a>
-<span class="sourceLineNo">547</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * @param c Configuration<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<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>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    return writeInputFile(c, opts, new Path("."));<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.556"></a>
-<span class="sourceLineNo">557</span>  throws IOException {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>    FileSystem fs = FileSystem.get(c);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    fs.mkdirs(inputDir);<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    // Make input random.<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Hash h = MurmurHash.getInstance();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    try {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>        TestOptions next = new TestOptions(opts);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        next.startRow = j * perClientRows;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.perClientRunRows = perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        String s = MAPPER.writeValueAsString(next);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        byte[] b = Bytes.toBytes(s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        m.put(hash, s);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>        out.println(e.getValue());<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    } finally {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      out.close();<a name="line.586"></a>
-<span class="sourceLineNo">587</span>    }<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    return inputDir;<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>   * Describes a command.<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   */<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  static class CmdDescriptor {<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private String name;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String description;<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      this.cmdClass = cmdClass;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.name = name;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.description = description;<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>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>      return cmdClass;<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>    public String getName() {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>      return name;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    public String getDescription() {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>      return description;<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><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * This makes tracking all these arguments a little easier.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>  static class TestOptions {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    String cmdName = null;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    boolean nomapred = false;<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    boolean filterAll = false;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    int startRow = 0;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    float size = 1.0f;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    int perClientRunRows = DEFAULT_ROWS_PER_GB;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    int numClientThreads = 1;<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    int totalRows = DEFAULT_ROWS_PER_GB;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    int measureAfter = 0;<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    float sampleRate = 1.0f;<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    double traceRate = 0.0;<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    String tableName = TABLE_NAME;<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    boolean flushCommits = true;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    boolean writeToWAL = true;<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    boolean autoFlush = false;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    boolean oneCon = false;<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    boolean useTags = false;<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    int noOfTags = 1;<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    boolean reportLatency = false;<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    int multiGet = 0;<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    int randomSleep = 0;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    boolean inMemoryCF = false;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    int presplitRegions = 0;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    int replicas = HTableDescriptor.DEFAULT_REGION_REPLICATION;<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    String splitPolicy = null;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    Compression.Algorithm compression = Compression.Algorithm.NONE;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    BloomType bloomType = BloomType.ROW;<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    int blockSize = HConstants.DEFAULT_BLOCKSIZE;<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    DataBlockEncoding blockEncoding = DataBlockEncoding.NONE;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    boolean valueRandom = false;<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    boolean valueZipf = false;<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    int valueSize = DEFAULT_VALUE_LENGTH;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    int period = (this.perClientRunRows / 10) == 0? perClientRunRows: perClientRunRows / 10;<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    int cycles = 1;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    int columns = 1;<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    int caching = 30;<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    boolean addColumns = true;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    MemoryCompactionPolicy inMemoryCompaction =<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        MemoryCompactionPolicy.valueOf(<a name="line.664"></a>
-<span class="sourceLineNo">665</span>            CompactingMemStore.COMPACTING_MEMSTORE_TYPE_DEFAULT);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    boolean asyncPrefetch = false;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    boolean cacheBlocks = true;<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    Scan.ReadType scanReadType = Scan.ReadType.DEFAULT;<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>    public TestOptions() {}<a name="line.670"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.BufferedMutatorParams;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Get;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Put;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.Result;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.Table;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.LongWritable;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.io.Text;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Job;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.Tool;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.hadoop.util.ToolRunner;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.Sampler;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.htrace.core.TraceScope;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.Logger;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.slf4j.LoggerFactory;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * command-line which test to run and how many clients are participating in<a name="line.118"></a>
+<span class="sourceLineNo">119</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.119"></a>
+<span class="sourceLineNo">120</span> *<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.123"></a>
+<span class="sourceLineNo">124</span> * paper, pages 8-10.<a name="line.124"></a>
+<span class="sourceLineNo">125</span> *<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.128"></a>
+<span class="sourceLineNo">129</span> * specified otherwise.<a name="line.129"></a>
+<span class="sourceLineNo">130</span> */<a name="line.130"></a>
+<span class="sourceLineNo">131</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.131"></a>
+<span class="sourceLineNo">132</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  static final String RANDOM_READ = "randomRead";<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  static {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  }<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
+<span class="sourceLineNo">156</span><a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
+<span class="sourceLineNo">243</span><a name="line.243"></a>
+<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
+<span class="sourceLineNo">249</span><a name="line.249"></a>
+<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
+<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
+<span class="sourceLineNo">261</span><a name="line.261"></a>
+<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
+<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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><a name="line.297"></a>
+<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
+<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        }<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>      ObjectMapper mapper = new ObjectMapper();<a name="line.309"></a>


<TRUNCATED>

[42/44] hbase-site git commit: Published site at 8e6ff689e806138e602a46730886d8c5f524fdcd.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/checkstyle.rss
----------------------------------------------------------------------
diff --git a/checkstyle.rss b/checkstyle.rss
index 62c7425..252788a 100644
--- a/checkstyle.rss
+++ b/checkstyle.rss
@@ -26,7 +26,7 @@ under the License.
     <copyright>&#169;2007 - 2018 The Apache Software Foundation</copyright>
     <item>
       <title>File: 3609,
-             Errors: 15865,
+             Errors: 15875,
              Warnings: 0,
              Infos: 0
       </title>
@@ -4605,7 +4605,7 @@ under the License.
                   0
                 </td>
                 <td>
-                  31
+                  34
                 </td>
               </tr>
                           <tr>
@@ -47473,7 +47473,7 @@ under the License.
                   0
                 </td>
                 <td>
-                  2
+                  9
                 </td>
               </tr>
                           <tr>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/coc.html
----------------------------------------------------------------------
diff --git a/coc.html b/coc.html
index eaef90d..951de45 100644
--- a/coc.html
+++ b/coc.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180506" />
+    <meta name="Date-Revision-yyyymmdd" content="20180507" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Code of Conduct Policy
@@ -375,7 +375,7 @@ email to <a class="externalLink" href="mailto:private@hbase.apache.org">the priv
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-06</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/dependencies.html
----------------------------------------------------------------------
diff --git a/dependencies.html b/dependencies.html
index 16b9067..24260bb 100644
--- a/dependencies.html
+++ b/dependencies.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180506" />
+    <meta name="Date-Revision-yyyymmdd" content="20180507" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Dependencies</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -440,7 +440,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-06</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/dependency-convergence.html
----------------------------------------------------------------------
diff --git a/dependency-convergence.html b/dependency-convergence.html
index 2e3f5f3..f76fb50 100644
--- a/dependency-convergence.html
+++ b/dependency-convergence.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180506" />
+    <meta name="Date-Revision-yyyymmdd" content="20180507" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Reactor Dependency Convergence</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -1105,7 +1105,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-06</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/dependency-info.html
----------------------------------------------------------------------
diff --git a/dependency-info.html b/dependency-info.html
index 3aed04a..49d0a12 100644
--- a/dependency-info.html
+++ b/dependency-info.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180506" />
+    <meta name="Date-Revision-yyyymmdd" content="20180507" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Dependency Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -313,7 +313,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-06</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/dependency-management.html
----------------------------------------------------------------------
diff --git a/dependency-management.html b/dependency-management.html
index 2a9ffd4..ce06f8c 100644
--- a/dependency-management.html
+++ b/dependency-management.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180506" />
+    <meta name="Date-Revision-yyyymmdd" content="20180507" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Dependency Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -969,7 +969,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-06</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/devapidocs/constant-values.html
----------------------------------------------------------------------
diff --git a/devapidocs/constant-values.html b/devapidocs/constant-values.html
index 22caf4d..170b4f1 100644
--- a/devapidocs/constant-values.html
+++ b/devapidocs/constant-values.html
@@ -3768,14 +3768,14 @@
 <!--   -->
 </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/Version.html#date">date</a></code></td>
-<td class="colLast"><code>"Sun May  6 14:39:27 UTC 2018"</code></td>
+<td class="colLast"><code>"Mon May  7 14:39:14 UTC 2018"</code></td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.revision">
 <!--   -->
 </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/Version.html#revision">revision</a></code></td>
-<td class="colLast"><code>"971f5350e81591e9360677f3617a399f453b6b96"</code></td>
+<td class="colLast"><code>"8e6ff689e806138e602a46730886d8c5f524fdcd"</code></td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.srcChecksum">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/Version.html b/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
index fa2ce6e..6ff7f3f 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
@@ -16,9 +16,9 @@
 <span class="sourceLineNo">008</span>@InterfaceAudience.Private<a name="line.8"></a>
 <span class="sourceLineNo">009</span>public class Version {<a name="line.9"></a>
 <span class="sourceLineNo">010</span>  public static final String version = "3.0.0-SNAPSHOT";<a name="line.10"></a>
-<span class="sourceLineNo">011</span>  public static final String revision = "971f5350e81591e9360677f3617a399f453b6b96";<a name="line.11"></a>
+<span class="sourceLineNo">011</span>  public static final String revision = "8e6ff689e806138e602a46730886d8c5f524fdcd";<a name="line.11"></a>
 <span class="sourceLineNo">012</span>  public static final String user = "jenkins";<a name="line.12"></a>
-<span class="sourceLineNo">013</span>  public static final String date = "Sun May  6 14:39:27 UTC 2018";<a name="line.13"></a>
+<span class="sourceLineNo">013</span>  public static final String date = "Mon May  7 14:39:14 UTC 2018";<a name="line.13"></a>
 <span class="sourceLineNo">014</span>  public static final String url = "git://jenkins-websites1.apache.org/home/jenkins/jenkins-slave/workspace/hbase_generate_website/hbase";<a name="line.14"></a>
 <span class="sourceLineNo">015</span>  public static final String srcChecksum = "ffc5680715ed56f21d5623cc15a65008";<a name="line.15"></a>
 <span class="sourceLineNo">016</span>}<a name="line.16"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/downloads.html
----------------------------------------------------------------------
diff --git a/downloads.html b/downloads.html
index 3d5dd1d..33b2194 100644
--- a/downloads.html
+++ b/downloads.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180506" />
+    <meta name="Date-Revision-yyyymmdd" content="20180507" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Apache HBase Downloads</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -366,7 +366,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-06</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/export_control.html
----------------------------------------------------------------------
diff --git a/export_control.html b/export_control.html
index 9aa099d..6943f2f 100644
--- a/export_control.html
+++ b/export_control.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180506" />
+    <meta name="Date-Revision-yyyymmdd" content="20180507" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Export Control
@@ -331,7 +331,7 @@ for more details.</p>
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-06</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/index.html
----------------------------------------------------------------------
diff --git a/index.html b/index.html
index b560ceb..8eca754 100644
--- a/index.html
+++ b/index.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180506" />
+    <meta name="Date-Revision-yyyymmdd" content="20180507" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Apache HBaseâ„¢ Home</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -409,7 +409,7 @@ Apache HBase is an open-source, distributed, versioned, non-relational database
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-06</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/integration.html
----------------------------------------------------------------------
diff --git a/integration.html b/integration.html
index b7b6dfa..eb303a6 100644
--- a/integration.html
+++ b/integration.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180506" />
+    <meta name="Date-Revision-yyyymmdd" content="20180507" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; CI Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -291,7 +291,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-06</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/issue-tracking.html
----------------------------------------------------------------------
diff --git a/issue-tracking.html b/issue-tracking.html
index 8a40570..a3f7b70 100644
--- a/issue-tracking.html
+++ b/issue-tracking.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180506" />
+    <meta name="Date-Revision-yyyymmdd" content="20180507" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Issue Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -288,7 +288,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-06</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/license.html
----------------------------------------------------------------------
diff --git a/license.html b/license.html
index c552c6c..85e0c3e 100644
--- a/license.html
+++ b/license.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180506" />
+    <meta name="Date-Revision-yyyymmdd" content="20180507" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Licenses</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -491,7 +491,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-06</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/mail-lists.html
----------------------------------------------------------------------
diff --git a/mail-lists.html b/mail-lists.html
index 33e2a9a..ca556c7 100644
--- a/mail-lists.html
+++ b/mail-lists.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180506" />
+    <meta name="Date-Revision-yyyymmdd" content="20180507" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Mailing Lists</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -341,7 +341,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-06</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/metrics.html
----------------------------------------------------------------------
diff --git a/metrics.html b/metrics.html
index 9a299b6..20611dc 100644
--- a/metrics.html
+++ b/metrics.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180506" />
+    <meta name="Date-Revision-yyyymmdd" content="20180507" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Apache HBase (TM) Metrics
@@ -459,7 +459,7 @@ export HBASE_REGIONSERVER_OPTS=&quot;$HBASE_JMX_OPTS -Dcom.sun.management.jmxrem
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-06</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/old_news.html
----------------------------------------------------------------------
diff --git a/old_news.html b/old_news.html
index 8d5e4da..8579ab4 100644
--- a/old_news.html
+++ b/old_news.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180506" />
+    <meta name="Date-Revision-yyyymmdd" content="20180507" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Old Apache HBase (TM) News
@@ -440,7 +440,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-06</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/plugin-management.html
----------------------------------------------------------------------
diff --git a/plugin-management.html b/plugin-management.html
index c60e2df..a8ebc89 100644
--- a/plugin-management.html
+++ b/plugin-management.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180506" />
+    <meta name="Date-Revision-yyyymmdd" content="20180507" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Plugin Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -440,7 +440,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-06</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/plugins.html
----------------------------------------------------------------------
diff --git a/plugins.html b/plugins.html
index 1a024bb..df69907 100644
--- a/plugins.html
+++ b/plugins.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180506" />
+    <meta name="Date-Revision-yyyymmdd" content="20180507" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Plugins</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -375,7 +375,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-06</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/poweredbyhbase.html
----------------------------------------------------------------------
diff --git a/poweredbyhbase.html b/poweredbyhbase.html
index 504ceba..b52ea95 100644
--- a/poweredbyhbase.html
+++ b/poweredbyhbase.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180506" />
+    <meta name="Date-Revision-yyyymmdd" content="20180507" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Powered By Apache HBase™</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -769,7 +769,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-06</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/project-info.html
----------------------------------------------------------------------
diff --git a/project-info.html b/project-info.html
index d45b00b..f658665 100644
--- a/project-info.html
+++ b/project-info.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180506" />
+    <meta name="Date-Revision-yyyymmdd" content="20180507" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -335,7 +335,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-06</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/project-reports.html
----------------------------------------------------------------------
diff --git a/project-reports.html b/project-reports.html
index 066a9be..ff73c9e 100644
--- a/project-reports.html
+++ b/project-reports.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180506" />
+    <meta name="Date-Revision-yyyymmdd" content="20180507" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Generated Reports</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -305,7 +305,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-06</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/project-summary.html
----------------------------------------------------------------------
diff --git a/project-summary.html b/project-summary.html
index 5676c06..41923e4 100644
--- a/project-summary.html
+++ b/project-summary.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180506" />
+    <meta name="Date-Revision-yyyymmdd" content="20180507" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Summary</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -331,7 +331,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-06</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/pseudo-distributed.html
----------------------------------------------------------------------
diff --git a/pseudo-distributed.html b/pseudo-distributed.html
index 1df99a9..3b32c5d 100644
--- a/pseudo-distributed.html
+++ b/pseudo-distributed.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180506" />
+    <meta name="Date-Revision-yyyymmdd" content="20180507" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
 Running Apache HBase (TM) in pseudo-distributed mode
@@ -308,7 +308,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-06</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/replication.html
----------------------------------------------------------------------
diff --git a/replication.html b/replication.html
index 5668751..cf558bf 100644
--- a/replication.html
+++ b/replication.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180506" />
+    <meta name="Date-Revision-yyyymmdd" content="20180507" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Apache HBase (TM) Replication
@@ -303,7 +303,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-06</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/resources.html
----------------------------------------------------------------------
diff --git a/resources.html b/resources.html
index 88e0a85..d6b2c10 100644
--- a/resources.html
+++ b/resources.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180506" />
+    <meta name="Date-Revision-yyyymmdd" content="20180507" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Other Apache HBase (TM) Resources</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -331,7 +331,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-06</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/source-repository.html
----------------------------------------------------------------------
diff --git a/source-repository.html b/source-repository.html
index f140572..1df62f3 100644
--- a/source-repository.html
+++ b/source-repository.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180506" />
+    <meta name="Date-Revision-yyyymmdd" content="20180507" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Source Code Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -299,7 +299,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-06</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/sponsors.html
----------------------------------------------------------------------
diff --git a/sponsors.html b/sponsors.html
index b3e25d8..c1f958f 100644
--- a/sponsors.html
+++ b/sponsors.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180506" />
+    <meta name="Date-Revision-yyyymmdd" content="20180507" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Apache HBase™ Sponsors</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -333,7 +333,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-06</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/supportingprojects.html
----------------------------------------------------------------------
diff --git a/supportingprojects.html b/supportingprojects.html
index 04e3301..93faed0 100644
--- a/supportingprojects.html
+++ b/supportingprojects.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180506" />
+    <meta name="Date-Revision-yyyymmdd" content="20180507" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Supporting Projects</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -520,7 +520,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-06</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/team-list.html
----------------------------------------------------------------------
diff --git a/team-list.html b/team-list.html
index 818cba6..a6573d7 100644
--- a/team-list.html
+++ b/team-list.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180506" />
+    <meta name="Date-Revision-yyyymmdd" content="20180507" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Team</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -730,7 +730,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-06</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/index-all.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/index-all.html b/testdevapidocs/index-all.html
index 87f6c2f..2b71a2b 100644
--- a/testdevapidocs/index-all.html
+++ b/testdevapidocs/index-all.html
@@ -2777,6 +2777,8 @@
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/BufferingScanResultConsumer.html#BufferingScanResultConsumer--">BufferingScanResultConsumer()</a></span> - Constructor for class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/BufferingScanResultConsumer.html" title="class in org.apache.hadoop.hbase.client">BufferingScanResultConsumer</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#bufferSize">bufferSize</a></span> - Variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/mob/compactions/TestMobCompactor.html#bufMut">bufMut</a></span> - Variable in class org.apache.hadoop.hbase.mob.compactions.<a href="org/apache/hadoop/hbase/mob/compactions/TestMobCompactor.html" title="class in org.apache.hadoop.hbase.mob.compactions">TestMobCompactor</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/coprocessor/TestMasterCoprocessorExceptionWithAbort.BuggyMasterObserver.html#BuggyMasterObserver--">BuggyMasterObserver()</a></span> - Constructor for class org.apache.hadoop.hbase.coprocessor.<a href="org/apache/hadoop/hbase/coprocessor/TestMasterCoprocessorExceptionWithAbort.BuggyMasterObserver.html" title="class in org.apache.hadoop.hbase.coprocessor">TestMasterCoprocessorExceptionWithAbort.BuggyMasterObserver</a></dt>
@@ -10738,8 +10740,6 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/backup/TestIncrementalBackup.html#data--">data()</a></span> - Static method in class org.apache.hadoop.hbase.backup.<a href="org/apache/hadoop/hbase/backup/TestIncrementalBackup.html" title="class in org.apache.hadoop.hbase.backup">TestIncrementalBackup</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/backup/TestIncrementalBackupWithBulkLoad.html#data--">data()</a></span> - Static method in class org.apache.hadoop.hbase.backup.<a href="org/apache/hadoop/hbase/backup/TestIncrementalBackupWithBulkLoad.html" title="class in org.apache.hadoop.hbase.backup">TestIncrementalBackupWithBulkLoad</a></dt>
-<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/backup/TestIncrementalBackupWithFailures.html#data--">data()</a></span> - Static method in class org.apache.hadoop.hbase.backup.<a href="org/apache/hadoop/hbase/backup/TestIncrementalBackupWithFailures.html" title="class in org.apache.hadoop.hbase.backup">TestIncrementalBackupWithFailures</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestAvoidCellReferencesIntoShippedBlocks.html#data">data</a></span> - Static variable in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestAvoidCellReferencesIntoShippedBlocks.html" title="class in org.apache.hadoop.hbase.client">TestAvoidCellReferencesIntoShippedBlocks</a></dt>
@@ -15342,6 +15342,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/regionserver/TestWALEntrySinkFilter.DevNullConnection.html#getBufferedMutator-org.apache.hadoop.hbase.client.BufferedMutatorParams-">getBufferedMutator(BufferedMutatorParams)</a></span> - Method in class org.apache.hadoop.hbase.replication.regionserver.<a href="org/apache/hadoop/hbase/replication/regionserver/TestWALEntrySinkFilter.DevNullConnection.html" title="class in org.apache.hadoop.hbase.replication.regionserver">TestWALEntrySinkFilter.DevNullConnection</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#getBufferSize--">getBufferSize()</a></span> - Method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/MockHStoreFile.html#getBulkLoadTimestamp--">getBulkLoadTimestamp()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/MockHStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">MockHStoreFile</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/regionserver/TestReplicationSourceManager.html#getBulkLoadWALEdit-java.util.NavigableMap-">getBulkLoadWALEdit(NavigableMap&lt;byte[], Integer&gt;)</a></span> - Method in class org.apache.hadoop.hbase.replication.regionserver.<a href="org/apache/hadoop/hbase/replication/regionserver/TestReplicationSourceManager.html" title="class in org.apache.hadoop.hbase.replication.regionserver">TestReplicationSourceManager</a></dt>
@@ -35076,6 +35078,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setBloomType-org.apache.hadoop.hbase.regionserver.BloomType-">setBloomType(BloomType)</a></span> - Method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setBufferSize-long-">setBufferSize(long)</a></span> - Method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestBlockEvictionFromClient.html#setCacheProperties-org.apache.hadoop.hbase.regionserver.HRegion-">setCacheProperties(HRegion)</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestBlockEvictionFromClient.html" title="class in org.apache.hadoop.hbase.client">TestBlockEvictionFromClient</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setCaching-int-">setCaching(int)</a></span> - Method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a></dt>
@@ -51215,7 +51219,7 @@
 <dd>
 <div class="block">1.</div>
 </dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/backup/TestIncrementalBackupWithBulkLoad.html#TestIncrementalBackupWithBulkLoad-java.lang.Boolean-">TestIncrementalBackupWithBulkLoad(Boolean)</a></span> - Constructor for class org.apache.hadoop.hbase.backup.<a href="org/apache/hadoop/hbase/backup/TestIncrementalBackupWithBulkLoad.html" title="class in org.apache.hadoop.hbase.backup">TestIncrementalBackupWithBulkLoad</a></dt>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/backup/TestIncrementalBackupWithBulkLoad.html#TestIncrementalBackupWithBulkLoad--">TestIncrementalBackupWithBulkLoad()</a></span> - Constructor for class org.apache.hadoop.hbase.backup.<a href="org/apache/hadoop/hbase/backup/TestIncrementalBackupWithBulkLoad.html" title="class in org.apache.hadoop.hbase.backup">TestIncrementalBackupWithBulkLoad</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/backup/TestIncrementalBackupWithFailures.html" title="class in org.apache.hadoop.hbase.backup"><span class="typeNameLink">TestIncrementalBackupWithFailures</span></a> - Class in <a href="org/apache/hadoop/hbase/backup/package-summary.html">org.apache.hadoop.hbase.backup</a></dt>
 <dd>&nbsp;</dd>
@@ -59554,6 +59558,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestScan.html#testSetAuthorizations--">testSetAuthorizations()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestScan.html" title="class in org.apache.hadoop.hbase.client">TestScan</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/TestPerformanceEvaluation.html#testSetBufferSizeOption--">testSetBufferSizeOption()</a></span> - Method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/TestPerformanceEvaluation.html" title="class in org.apache.hadoop.hbase">TestPerformanceEvaluation</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestCoprocessorDescriptor.html#testSetCoprocessor--">testSetCoprocessor()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestCoprocessorDescriptor.html" title="class in org.apache.hadoop.hbase.client">TestCoprocessorDescriptor</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/zookeeper/TestRecoverableZooKeeper.html#testSetDataVersionMismatchInLoop--">testSetDataVersionMismatchInLoop()</a></span> - Method in class org.apache.hadoop.hbase.zookeeper.<a href="org/apache/hadoop/hbase/zookeeper/TestRecoverableZooKeeper.html" title="class in org.apache.hadoop.hbase.zookeeper">TestRecoverableZooKeeper</a></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AppendTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AppendTest.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AppendTest.html
index 6571346..65d830d 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AppendTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AppendTest.html
@@ -133,7 +133,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1966">PerformanceEvaluation.AppendTest</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1979">PerformanceEvaluation.AppendTest</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.CASTableTest</a></pre>
 </li>
 </ul>
@@ -261,7 +261,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.CASTa
 <ul class="blockListLast">
 <li class="blockList">
 <h4>AppendTest</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AppendTest.html#line.1967">AppendTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AppendTest.html#line.1980">AppendTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
            <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
            <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -280,7 +280,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.CASTa
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testRow</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AppendTest.html#line.1972">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AppendTest.html#line.1985">testRow</a>(int&nbsp;i)
       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="overrideSpecifyLabel">Specified by:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html
index 5e92141..854bd4a 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html
@@ -128,7 +128,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1390">PerformanceEvaluation.AsyncRandomReadTest</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1401">PerformanceEvaluation.AsyncRandomReadTest</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.AsyncTableTest</a></pre>
 </li>
 </ul>
@@ -284,7 +284,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <ul class="blockList">
 <li class="blockList">
 <h4>consistency</h4>
-<pre>private final&nbsp;org.apache.hadoop.hbase.client.Consistency <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html#line.1391">consistency</a></pre>
+<pre>private final&nbsp;org.apache.hadoop.hbase.client.Consistency <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html#line.1402">consistency</a></pre>
 </li>
 </ul>
 <a name="gets">
@@ -293,7 +293,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <ul class="blockList">
 <li class="blockList">
 <h4>gets</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html?is-external=true" title="class or interface in java.util">ArrayList</a>&lt;org.apache.hadoop.hbase.client.Get&gt; <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html#line.1392">gets</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html?is-external=true" title="class or interface in java.util">ArrayList</a>&lt;org.apache.hadoop.hbase.client.Get&gt; <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html#line.1403">gets</a></pre>
 </li>
 </ul>
 <a name="rd">
@@ -302,7 +302,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <ul class="blockListLast">
 <li class="blockList">
 <h4>rd</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html#line.1393">rd</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html#line.1404">rd</a></pre>
 </li>
 </ul>
 </li>
@@ -319,7 +319,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <ul class="blockListLast">
 <li class="blockList">
 <h4>AsyncRandomReadTest</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html#line.1395">AsyncRandomReadTest</a>(org.apache.hadoop.hbase.client.AsyncConnection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html#line.1406">AsyncRandomReadTest</a>(org.apache.hadoop.hbase.client.AsyncConnection&nbsp;con,
                     <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
                     <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -338,7 +338,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <ul class="blockList">
 <li class="blockList">
 <h4>testRow</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html#line.1405">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html#line.1416">testRow</a>(int&nbsp;i)
       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>,
              <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <dl>
@@ -356,7 +356,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <ul class="blockList">
 <li class="blockList">
 <h4>runtime</h4>
-<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/RuntimeException.html?is-external=true" title="class or interface in java.lang">RuntimeException</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html#line.1440">runtime</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a>&nbsp;e)</pre>
+<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/RuntimeException.html?is-external=true" title="class or interface in java.lang">RuntimeException</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html#line.1451">runtime</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a>&nbsp;e)</pre>
 </li>
 </ul>
 <a name="propagate-java.util.concurrent.Callable-">
@@ -365,7 +365,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <ul class="blockList">
 <li class="blockList">
 <h4>propagate</h4>
-<pre>public static&nbsp;&lt;V&gt;&nbsp;V&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html#line.1447">propagate</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Callable.html?is-external=true" title="class or interface in java.util.concurrent">Callable</a>&lt;V&gt;&nbsp;callable)</pre>
+<pre>public static&nbsp;&lt;V&gt;&nbsp;V&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html#line.1458">propagate</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Callable.html?is-external=true" title="class or interface in java.util.concurrent">Callable</a>&lt;V&gt;&nbsp;callable)</pre>
 </li>
 </ul>
 <a name="getReportingPeriod--">
@@ -374,7 +374,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <ul class="blockList">
 <li class="blockList">
 <h4>getReportingPeriod</h4>
-<pre>protected&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html#line.1456">getReportingPeriod</a>()</pre>
+<pre>protected&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html#line.1467">getReportingPeriod</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getReportingPeriod--">getReportingPeriod</a></code>&nbsp;in class&nbsp;<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></code></dd>
@@ -387,7 +387,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testTakedown</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html#line.1462">testTakedown</a>()
+<pre>protected&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html#line.1473">testTakedown</a>()
                      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="overrideSpecifyLabel">Overrides:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomWriteTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomWriteTest.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomWriteTest.html
index 5d050d6..22febd5 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomWriteTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomWriteTest.html
@@ -128,7 +128,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1471">PerformanceEvaluation.AsyncRandomWriteTest</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1482">PerformanceEvaluation.AsyncRandomWriteTest</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.AsyncTableTest</a></pre>
 </li>
 </ul>
@@ -249,7 +249,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <ul class="blockListLast">
 <li class="blockList">
 <h4>AsyncRandomWriteTest</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomWriteTest.html#line.1472">AsyncRandomWriteTest</a>(org.apache.hadoop.hbase.client.AsyncConnection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomWriteTest.html#line.1483">AsyncRandomWriteTest</a>(org.apache.hadoop.hbase.client.AsyncConnection&nbsp;con,
                      <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
                      <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -268,7 +268,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testRow</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomWriteTest.html#line.1477">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomWriteTest.html#line.1488">testRow</a>(int&nbsp;i)
       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>,
              <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <dl>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html
index a686135..ca68f65 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html
@@ -128,7 +128,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1508">PerformanceEvaluation.AsyncScanTest</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1519">PerformanceEvaluation.AsyncScanTest</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.AsyncTableTest</a></pre>
 </li>
 </ul>
@@ -272,7 +272,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <ul class="blockList">
 <li class="blockList">
 <h4>testScanner</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.client.ResultScanner <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html#line.1509">testScanner</a></pre>
+<pre>private&nbsp;org.apache.hadoop.hbase.client.ResultScanner <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html#line.1520">testScanner</a></pre>
 </li>
 </ul>
 <a name="asyncTable">
@@ -281,7 +281,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <ul class="blockListLast">
 <li class="blockList">
 <h4>asyncTable</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.client.AsyncTable&lt;?&gt; <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html#line.1510">asyncTable</a></pre>
+<pre>private&nbsp;org.apache.hadoop.hbase.client.AsyncTable&lt;?&gt; <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html#line.1521">asyncTable</a></pre>
 </li>
 </ul>
 </li>
@@ -298,7 +298,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <ul class="blockListLast">
 <li class="blockList">
 <h4>AsyncScanTest</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html#line.1512">AsyncScanTest</a>(org.apache.hadoop.hbase.client.AsyncConnection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html#line.1523">AsyncScanTest</a>(org.apache.hadoop.hbase.client.AsyncConnection&nbsp;con,
               <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
               <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -317,7 +317,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <ul class="blockList">
 <li class="blockList">
 <h4>onStartup</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html#line.1517">onStartup</a>()
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html#line.1528">onStartup</a>()
         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="overrideSpecifyLabel">Overrides:</span></dt>
@@ -333,7 +333,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <ul class="blockList">
 <li class="blockList">
 <h4>testTakedown</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html#line.1524">testTakedown</a>()
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html#line.1535">testTakedown</a>()
            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="overrideSpecifyLabel">Overrides:</span></dt>
@@ -349,7 +349,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testRow</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html#line.1533">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html#line.1544">testRow</a>(int&nbsp;i)
       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="overrideSpecifyLabel">Specified by:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialReadTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialReadTest.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialReadTest.html
index ccf6211..8bb15e0 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialReadTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialReadTest.html
@@ -128,7 +128,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1557">PerformanceEvaluation.AsyncSequentialReadTest</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1568">PerformanceEvaluation.AsyncSequentialReadTest</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.AsyncTableTest</a></pre>
 </li>
 </ul>
@@ -249,7 +249,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <ul class="blockListLast">
 <li class="blockList">
 <h4>AsyncSequentialReadTest</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialReadTest.html#line.1558">AsyncSequentialReadTest</a>(org.apache.hadoop.hbase.client.AsyncConnection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialReadTest.html#line.1569">AsyncSequentialReadTest</a>(org.apache.hadoop.hbase.client.AsyncConnection&nbsp;con,
                         <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
                         <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -268,7 +268,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testRow</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialReadTest.html#line.1563">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialReadTest.html#line.1574">testRow</a>(int&nbsp;i)
       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>,
              <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <dl>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialWriteTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialWriteTest.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialWriteTest.html
index 379ef34..1a6b9c8 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialWriteTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialWriteTest.html
@@ -128,7 +128,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1582">PerformanceEvaluation.AsyncSequentialWriteTest</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1593">PerformanceEvaluation.AsyncSequentialWriteTest</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.AsyncTableTest</a></pre>
 </li>
 </ul>
@@ -249,7 +249,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <ul class="blockListLast">
 <li class="blockList">
 <h4>AsyncSequentialWriteTest</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialWriteTest.html#line.1583">AsyncSequentialWriteTest</a>(org.apache.hadoop.hbase.client.AsyncConnection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialWriteTest.html#line.1594">AsyncSequentialWriteTest</a>(org.apache.hadoop.hbase.client.AsyncConnection&nbsp;con,
                          <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
                          <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -268,7 +268,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testRow</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialWriteTest.html#line.1588">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialWriteTest.html#line.1599">testRow</a>(int&nbsp;i)
       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>,
              <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <dl>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html
index 271bda9..176fbf8 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html
@@ -127,7 +127,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>abstract static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1373">PerformanceEvaluation.AsyncTableTest</a>
+<pre>abstract static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1384">PerformanceEvaluation.AsyncTableTest</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.AsyncTest</a></pre>
 </li>
 </ul>
@@ -249,7 +249,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <ul class="blockListLast">
 <li class="blockList">
 <h4>table</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.client.AsyncTable&lt;?&gt; <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html#line.1374">table</a></pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.client.AsyncTable&lt;?&gt; <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html#line.1385">table</a></pre>
 </li>
 </ul>
 </li>
@@ -266,7 +266,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <ul class="blockListLast">
 <li class="blockList">
 <h4>AsyncTableTest</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html#line.1376">AsyncTableTest</a>(org.apache.hadoop.hbase.client.AsyncConnection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html#line.1387">AsyncTableTest</a>(org.apache.hadoop.hbase.client.AsyncConnection&nbsp;con,
                <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
                <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -285,7 +285,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <ul class="blockList">
 <li class="blockList">
 <h4>onStartup</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html#line.1381">onStartup</a>()
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html#line.1392">onStartup</a>()
         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="overrideSpecifyLabel">Specified by:</span></dt>
@@ -301,7 +301,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <ul class="blockListLast">
 <li class="blockList">
 <h4>onTakedown</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html#line.1386">onTakedown</a>()
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html#line.1397">onTakedown</a>()
          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="overrideSpecifyLabel">Specified by:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTest.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTest.html
index e8505f8..1c14b10 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTest.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>abstract static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1328">PerformanceEvaluation.AsyncTest</a>
+<pre>abstract static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1339">PerformanceEvaluation.AsyncTest</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></pre>
 </li>
 </ul>
@@ -230,7 +230,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestB
 <ul class="blockListLast">
 <li class="blockList">
 <h4>connection</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.client.AsyncConnection <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTest.html#line.1329">connection</a></pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.client.AsyncConnection <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTest.html#line.1340">connection</a></pre>
 </li>
 </ul>
 </li>
@@ -247,7 +247,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestB
 <ul class="blockListLast">
 <li class="blockList">
 <h4>AsyncTest</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTest.html#line.1331">AsyncTest</a>(org.apache.hadoop.hbase.client.AsyncConnection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTest.html#line.1342">AsyncTest</a>(org.apache.hadoop.hbase.client.AsyncConnection&nbsp;con,
           <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
           <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -266,7 +266,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestB
 <ul class="blockList">
 <li class="blockList">
 <h4>createConnection</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTest.html#line.1337">createConnection</a>()</pre>
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTest.html#line.1348">createConnection</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#createConnection--">createConnection</a></code>&nbsp;in class&nbsp;<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></code></dd>
@@ -279,7 +279,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestB
 <ul class="blockListLast">
 <li class="blockList">
 <h4>closeConnection</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTest.html#line.1348">closeConnection</a>()
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTest.html#line.1359">closeConnection</a>()
               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="overrideSpecifyLabel">Specified by:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html
index 3b5ab65..4092ce1 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html
@@ -127,7 +127,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>abstract static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1619">PerformanceEvaluation.BufferedMutatorTest</a>
+<pre>abstract static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1630">PerformanceEvaluation.BufferedMutatorTest</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Test.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.Test</a></pre>
 </li>
 </ul>
@@ -253,7 +253,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Test.
 <ul class="blockList">
 <li class="blockList">
 <h4>mutator</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.client.BufferedMutator <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html#line.1620">mutator</a></pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.client.BufferedMutator <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html#line.1631">mutator</a></pre>
 </li>
 </ul>
 <a name="table">
@@ -262,7 +262,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Test.
 <ul class="blockListLast">
 <li class="blockList">
 <h4>table</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.client.Table <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html#line.1621">table</a></pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.client.Table <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html#line.1632">table</a></pre>
 </li>
 </ul>
 </li>
@@ -279,7 +279,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Test.
 <ul class="blockListLast">
 <li class="blockList">
 <h4>BufferedMutatorTest</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html#line.1623">BufferedMutatorTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html#line.1634">BufferedMutatorTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
                     <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
                     <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -298,7 +298,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Test.
 <ul class="blockList">
 <li class="blockList">
 <h4>onStartup</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html#line.1628">onStartup</a>()
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html#line.1639">onStartup</a>()
         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="overrideSpecifyLabel">Specified by:</span></dt>
@@ -314,7 +314,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Test.
 <ul class="blockListLast">
 <li class="blockList">
 <h4>onTakedown</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html#line.1634">onTakedown</a>()
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html#line.1647">onTakedown</a>()
          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="overrideSpecifyLabel">Specified by:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html
index 7b42158..49cdd9c 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html
@@ -132,7 +132,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>abstract static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1931">PerformanceEvaluation.CASTableTest</a>
+<pre>abstract static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1944">PerformanceEvaluation.CASTableTest</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TableTest</a></pre>
 <div class="block">Base class for operations that are CAS-like; that read a value and then set it based off what
  they read. In this category is increment, append, checkAndPut, etc.
@@ -278,7 +278,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockListLast">
 <li class="blockList">
 <h4>qualifier</h4>
-<pre>private final&nbsp;byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html#line.1932">qualifier</a></pre>
+<pre>private final&nbsp;byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html#line.1945">qualifier</a></pre>
 </li>
 </ul>
 </li>
@@ -295,7 +295,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockListLast">
 <li class="blockList">
 <h4>CASTableTest</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html#line.1933">CASTableTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html#line.1946">CASTableTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
              <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
              <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -314,7 +314,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockList">
 <li class="blockList">
 <h4>getQualifier</h4>
-<pre>byte[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html#line.1938">getQualifier</a>()</pre>
+<pre>byte[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html#line.1951">getQualifier</a>()</pre>
 </li>
 </ul>
 <a name="getStartRow--">
@@ -323,7 +323,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockList">
 <li class="blockList">
 <h4>getStartRow</h4>
-<pre>int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html#line.1943">getStartRow</a>()</pre>
+<pre>int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html#line.1956">getStartRow</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getStartRow--">getStartRow</a></code>&nbsp;in class&nbsp;<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></code></dd>
@@ -336,7 +336,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getLastRow</h4>
-<pre>int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html#line.1948">getLastRow</a>()</pre>
+<pre>int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html#line.1961">getLastRow</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLastRow--">getLastRow</a></code>&nbsp;in class&nbsp;<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></code></dd>


[29/44] hbase-site git commit: Published site at 8e6ff689e806138e602a46730886d8c5f524fdcd.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html
index 418c60c..7cf23c4 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html
@@ -64,2689 +64,2710 @@
 <span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.AsyncConnection;<a name="line.56"></a>
 <span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.AsyncTable;<a name="line.57"></a>
 <span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.BufferedMutator;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Get;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Put;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Result;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.111"></a>
-<span class="sourceLineNo">112</span><a name="line.112"></a>
-<span class="sourceLineNo">113</span>/**<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
-<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
-<span class="sourceLineNo">119</span> *<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
-<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
-<span class="sourceLineNo">124</span> *<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
-<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
-<span class="sourceLineNo">129</span> */<a name="line.129"></a>
-<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
-<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
-<span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // TODO : should we make this configurable<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private static final int TAG_LENGTH = 256;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  static {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        "Run async random read test");<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        "Run async random write test");<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.164"></a>
-<span class="sourceLineNo">165</span>        "Run async sequential read test");<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        "Run async sequential write test");<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        "Run async scan test (read every row)");<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      "Run random read test");<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      "Run random seek and scan 100 test");<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      "Run random write test");<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      "Run sequential read test");<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      "Run sequential write test");<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      "Run scan test (read every row)");<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "(make sure to use --rows=20)");<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  }<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * inner-class so we can find associated properties.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   */<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  protected static enum Counter {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    /** elapsed time */<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    ELAPSED_TIME,<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    /** number of rows */<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    public RunResult(long duration, Histogram hist) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      this.duration = duration;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.hist = hist;<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>    public final long duration;<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final Histogram hist;<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>    @Override<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    public String toString() {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      return Long.toString(duration);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>    @Override public int compareTo(RunResult o) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      return Long.compare(this.duration, o.duration);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
-<span class="sourceLineNo">234</span><a name="line.234"></a>
-<span class="sourceLineNo">235</span>  /**<a name="line.235"></a>
-<span class="sourceLineNo">236</span>   * Constructor<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * @param conf Configuration object<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   */<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    super(conf);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      String name, String description) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  /**<a name="line.249"></a>
-<span class="sourceLineNo">250</span>   * Implementations can have their status set.<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   */<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  interface Status {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    /**<a name="line.253"></a>
-<span class="sourceLineNo">254</span>     * Sets status<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * @param msg status message<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @throws IOException<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     */<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    void setStatus(final String msg) throws IOException;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  }<a name="line.259"></a>
-<span class="sourceLineNo">260</span><a name="line.260"></a>
-<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   */<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  public static class EvaluationMapTask<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>    /** configuration parameter name that contains the command */<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the PE impl */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>    @Override<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>      // this is required so that extensions of PE are instantiated within the<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // map reduce task...<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      try {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      } catch (Exception e) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      try {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        return Class.forName(className).asSubclass(type);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      } catch (ClassNotFoundException e) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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>    @Override<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.298"></a>
-<span class="sourceLineNo">299</span>           throws IOException, InterruptedException {<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>      Status status = new Status() {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        @Override<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        public void setStatus(String msg) {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>           context.setStatus(msg);<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><a name="line.307"></a>
-<span class="sourceLineNo">308</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      AsyncConnection asyncCon = null;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      try {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      } catch (ExecutionException e) {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>        throw new IOException(e);<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>      // Evaluation task<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      // Collect how much time the thing took. Report as map output and<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // to the ELAPSED_TIME counter.<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.progress();<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    }<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>  /*<a name="line.330"></a>
-<span class="sourceLineNo">331</span>   * If table does not already exist, create. Also create a table when<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   */<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      throw new IllegalStateException(<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    HTableDescriptor desc =<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    byte[][] splits = getSplits(opts);<a name="line.346"></a>
-<span class="sourceLineNo">347</span><a name="line.347"></a>
-<span class="sourceLineNo">348</span>    // recreate the table when user has requested presplit or when existing<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      needsDelete = true;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      // wait, why did it delete my table?!?<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        .add("needsDelete", needsDelete)<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("isReadCmd", isReadCmd)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("exists", exists)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("desc", desc)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("presplit", opts.presplitRegions)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("replicas", opts.replicas)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .toString());<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>    // remove an existing table<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    if (needsDelete) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      if (admin.isTableEnabled(tableName)) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        admin.disableTable(tableName);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      admin.deleteTable(tableName);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>    // table creation is necessary<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    if (!exists || needsDelete) {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      desc = getTableDescriptor(opts);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      if (splits != null) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        if (LOG.isDebugEnabled()) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<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>      admin.createTable(desc, splits);<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      LOG.info("Table " + desc + " created");<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    return admin.tableExists(tableName);<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>  /**<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setCompressionType(opts.compression);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setBloomFilterType(opts.bloomType);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBlocksize(opts.blockSize);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    if (opts.inMemoryCF) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      family.setInMemory(true);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    desc.addFamily(family);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      desc.setRegionReplication(opts.replicas);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    return desc;<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>  /**<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   * generates splits based on total number of rows and specified split regions<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   */<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      int rowkey = jump * (1 + i);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      splits[i] = format(rowkey);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return splits;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  }<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  /*<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * Run all clients in this vm each to its own thread.<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   */<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    assert cmd != null;<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    @SuppressWarnings("unchecked")<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      final int index = i;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        @Override<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        public RunResult call() throws Exception {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>            @Override<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            public void setStatus(final String msg) throws IOException {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>              LOG.info(msg);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>          });<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.459"></a>
-<span class="sourceLineNo">460</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          return run;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      });<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    }<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    pool.shutdown();<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      try {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        results[i] = threads[i].get();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      } catch (ExecutionException e) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>        throw new IOException(e.getCause());<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    final String test = cmd.getSimpleName();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.475"></a>
-<span class="sourceLineNo">476</span>             + Arrays.toString(results));<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    Arrays.sort(results);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    long total = 0;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    for (RunResult result : results) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      total += result.duration;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    LOG.info("[" + test + "]"<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      + "\tMin: " + results[0] + "ms"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.485"></a>
-<span class="sourceLineNo">486</span><a name="line.486"></a>
-<span class="sourceLineNo">487</span>    con.close();<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    asyncCon.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    return results;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  /*<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Before we start up the job, write out an input file with instruction<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * per client regards which row they are to start on.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * @param cmd Command to run.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @throws IOException<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   */<a name="line.499"></a>
-<span class="sourceLineNo">500</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    assert cmd != null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    Job job = Job.getInstance(conf);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.509"></a>
-<span class="sourceLineNo">510</span><a name="line.510"></a>
-<span class="sourceLineNo">511</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    // this is default, but be explicit about it just in case.<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.514"></a>
-<span class="sourceLineNo">515</span><a name="line.515"></a>
-<span class="sourceLineNo">516</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputValueClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setReducerClass(LongSumReducer.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>    job.setNumReduceTasks(1);<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      Histogram.class,     // yammer metrics<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      );<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>    TableMapReduceUtil.initCredentials(job);<a name="line.534"></a>
-<span class="sourceLineNo">535</span><a name="line.535"></a>
-<span class="sourceLineNo">536</span>    job.waitForCompletion(true);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    return job;<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>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<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>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>  /*<a name="line.546"></a>
-<span class="sourceLineNo">547</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * @param c Configuration<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<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>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    return writeInputFile(c, opts, new Path("."));<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.556"></a>
-<span class="sourceLineNo">557</span>  throws IOException {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>    FileSystem fs = FileSystem.get(c);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    fs.mkdirs(inputDir);<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    // Make input random.<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Hash h = MurmurHash.getInstance();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    try {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>        TestOptions next = new TestOptions(opts);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        next.startRow = j * perClientRows;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.perClientRunRows = perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        String s = MAPPER.writeValueAsString(next);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        byte[] b = Bytes.toBytes(s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        m.put(hash, s);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>        out.println(e.getValue());<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    } finally {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      out.close();<a name="line.586"></a>
-<span class="sourceLineNo">587</span>    }<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    return inputDir;<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>   * Describes a command.<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   */<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  static class CmdDescriptor {<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private String name;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String description;<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      this.cmdClass = cmdClass;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.name = name;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.description = description;<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>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>      return cmdClass;<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>    public String getName() {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>      return name;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    public String getDescription() {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>      return description;<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><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * This makes tracking all these arguments a little easier.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>  static class TestOptions {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    String cmdName = null;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    boolean nomapred = false;<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    boolean filterAll = false;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    int startRow = 0;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    float size = 1.0f;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    int perClientRunRows = DEFAULT_ROWS_PER_GB;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    int numClientThreads = 1;<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    int totalRows = DEFAULT_ROWS_PER_GB;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    int measureAfter = 0;<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    float sampleRate = 1.0f;<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    double traceRate = 0.0;<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    String tableName = TABLE_NAME;<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    boolean flushCommits = true;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    boolean writeToWAL = true;<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    boolean autoFlush = false;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    boolean oneCon = false;<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    boolean useTags = false;<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    int noOfTags = 1;<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    boolean reportLatency = false;<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    int multiGet = 0;<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    int randomSleep = 0;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    boolean inMemoryCF = false;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    int presplitRegions = 0;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    int replicas = HTableDescriptor.DEFAULT_REGION_REPLICATION;<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    String splitPolicy = null;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    Compression.Algorithm compression = Compression.Algorithm.NONE;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    BloomType bloomType = BloomType.ROW;<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    int blockSize = HConstants.DEFAULT_BLOCKSIZE;<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    DataBlockEncoding blockEncoding = DataBlockEncoding.NONE;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    boolean valueRandom = false;<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    boolean valueZipf = false;<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    int valueSize = DEFAULT_VALUE_LENGTH;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    int period = (this.perClientRunRows / 10) == 0? perClientRunRows: perClientRunRows / 10;<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    int cycles = 1;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    int columns = 1;<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    int caching = 30;<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    boolean addColumns = true;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    MemoryCompactionPolicy inMemoryCompaction =<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        MemoryCompactionPolicy.valueOf(<a name="line.664"></a>
-<span class="sourceLineNo">665</span>            CompactingMemStore.COMPACTING_MEMSTORE_TYPE_DEFAULT);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    boolean asyncPrefetch = false;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    boolean cacheBlocks = true;<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    Scan.ReadType scanReadType = Scan.ReadType.DEFAULT;<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>    public TestOptions() {}<a name="line.670"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.BufferedMutatorParams;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Get;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Put;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.Result;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.Table;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.LongWritable;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.io.Text;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Job;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.Tool;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.hadoop.util.ToolRunner;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.Sampler;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.htrace.core.TraceScope;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.Logger;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.slf4j.LoggerFactory;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * command-line which test to run and how many clients are participating in<a name="line.118"></a>
+<span class="sourceLineNo">119</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.119"></a>
+<span class="sourceLineNo">120</span> *<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.123"></a>
+<span class="sourceLineNo">124</span> * paper, pages 8-10.<a name="line.124"></a>
+<span class="sourceLineNo">125</span> *<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.128"></a>
+<span class="sourceLineNo">129</span> * specified otherwise.<a name="line.129"></a>
+<span class="sourceLineNo">130</span> */<a name="line.130"></a>
+<span class="sourceLineNo">131</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.131"></a>
+<span class="sourceLineNo">132</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  static final String RANDOM_READ = "randomRead";<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  static {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  }<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
+<span class="sourceLineNo">156</span><a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
+<span class="sourceLineNo">243</span><a name="line.243"></a>
+<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
+<span class="sourceLineNo">249</span><a name="line.249"></a>
+<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
+<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
+<span class="sourceLineNo">261</span><a name="line.261"></a>
+<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
+<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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><a name="line.297"></a>
+<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
+<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        }<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>      ObjectMapper mapper = new Obje

<TRUNCATED>

[26/44] hbase-site git commit: Published site at 8e6ff689e806138e602a46730886d8c5f524fdcd.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndMutateTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndMutateTest.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndMutateTest.html
index 418c60c..7cf23c4 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndMutateTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndMutateTest.html
@@ -64,2689 +64,2710 @@
 <span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.AsyncConnection;<a name="line.56"></a>
 <span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.AsyncTable;<a name="line.57"></a>
 <span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.BufferedMutator;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Get;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Put;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Result;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.111"></a>
-<span class="sourceLineNo">112</span><a name="line.112"></a>
-<span class="sourceLineNo">113</span>/**<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
-<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
-<span class="sourceLineNo">119</span> *<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
-<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
-<span class="sourceLineNo">124</span> *<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
-<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
-<span class="sourceLineNo">129</span> */<a name="line.129"></a>
-<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
-<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
-<span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // TODO : should we make this configurable<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private static final int TAG_LENGTH = 256;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  static {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        "Run async random read test");<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        "Run async random write test");<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.164"></a>
-<span class="sourceLineNo">165</span>        "Run async sequential read test");<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        "Run async sequential write test");<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        "Run async scan test (read every row)");<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      "Run random read test");<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      "Run random seek and scan 100 test");<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      "Run random write test");<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      "Run sequential read test");<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      "Run sequential write test");<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      "Run scan test (read every row)");<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "(make sure to use --rows=20)");<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  }<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * inner-class so we can find associated properties.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   */<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  protected static enum Counter {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    /** elapsed time */<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    ELAPSED_TIME,<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    /** number of rows */<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    public RunResult(long duration, Histogram hist) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      this.duration = duration;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.hist = hist;<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>    public final long duration;<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final Histogram hist;<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>    @Override<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    public String toString() {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      return Long.toString(duration);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>    @Override public int compareTo(RunResult o) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      return Long.compare(this.duration, o.duration);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
-<span class="sourceLineNo">234</span><a name="line.234"></a>
-<span class="sourceLineNo">235</span>  /**<a name="line.235"></a>
-<span class="sourceLineNo">236</span>   * Constructor<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * @param conf Configuration object<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   */<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    super(conf);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      String name, String description) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  /**<a name="line.249"></a>
-<span class="sourceLineNo">250</span>   * Implementations can have their status set.<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   */<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  interface Status {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    /**<a name="line.253"></a>
-<span class="sourceLineNo">254</span>     * Sets status<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * @param msg status message<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @throws IOException<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     */<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    void setStatus(final String msg) throws IOException;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  }<a name="line.259"></a>
-<span class="sourceLineNo">260</span><a name="line.260"></a>
-<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   */<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  public static class EvaluationMapTask<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>    /** configuration parameter name that contains the command */<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the PE impl */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>    @Override<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>      // this is required so that extensions of PE are instantiated within the<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // map reduce task...<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      try {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      } catch (Exception e) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      try {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        return Class.forName(className).asSubclass(type);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      } catch (ClassNotFoundException e) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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>    @Override<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.298"></a>
-<span class="sourceLineNo">299</span>           throws IOException, InterruptedException {<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>      Status status = new Status() {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        @Override<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        public void setStatus(String msg) {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>           context.setStatus(msg);<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><a name="line.307"></a>
-<span class="sourceLineNo">308</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      AsyncConnection asyncCon = null;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      try {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      } catch (ExecutionException e) {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>        throw new IOException(e);<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>      // Evaluation task<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      // Collect how much time the thing took. Report as map output and<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // to the ELAPSED_TIME counter.<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.progress();<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    }<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>  /*<a name="line.330"></a>
-<span class="sourceLineNo">331</span>   * If table does not already exist, create. Also create a table when<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   */<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      throw new IllegalStateException(<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    HTableDescriptor desc =<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    byte[][] splits = getSplits(opts);<a name="line.346"></a>
-<span class="sourceLineNo">347</span><a name="line.347"></a>
-<span class="sourceLineNo">348</span>    // recreate the table when user has requested presplit or when existing<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      needsDelete = true;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      // wait, why did it delete my table?!?<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        .add("needsDelete", needsDelete)<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("isReadCmd", isReadCmd)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("exists", exists)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("desc", desc)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("presplit", opts.presplitRegions)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("replicas", opts.replicas)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .toString());<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>    // remove an existing table<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    if (needsDelete) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      if (admin.isTableEnabled(tableName)) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        admin.disableTable(tableName);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      admin.deleteTable(tableName);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>    // table creation is necessary<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    if (!exists || needsDelete) {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      desc = getTableDescriptor(opts);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      if (splits != null) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        if (LOG.isDebugEnabled()) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<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>      admin.createTable(desc, splits);<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      LOG.info("Table " + desc + " created");<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    return admin.tableExists(tableName);<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>  /**<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setCompressionType(opts.compression);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setBloomFilterType(opts.bloomType);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBlocksize(opts.blockSize);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    if (opts.inMemoryCF) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      family.setInMemory(true);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    desc.addFamily(family);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      desc.setRegionReplication(opts.replicas);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    return desc;<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>  /**<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   * generates splits based on total number of rows and specified split regions<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   */<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      int rowkey = jump * (1 + i);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      splits[i] = format(rowkey);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return splits;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  }<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  /*<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * Run all clients in this vm each to its own thread.<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   */<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    assert cmd != null;<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    @SuppressWarnings("unchecked")<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      final int index = i;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        @Override<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        public RunResult call() throws Exception {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>            @Override<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            public void setStatus(final String msg) throws IOException {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>              LOG.info(msg);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>          });<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.459"></a>
-<span class="sourceLineNo">460</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          return run;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      });<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    }<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    pool.shutdown();<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      try {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        results[i] = threads[i].get();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      } catch (ExecutionException e) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>        throw new IOException(e.getCause());<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    final String test = cmd.getSimpleName();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.475"></a>
-<span class="sourceLineNo">476</span>             + Arrays.toString(results));<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    Arrays.sort(results);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    long total = 0;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    for (RunResult result : results) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      total += result.duration;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    LOG.info("[" + test + "]"<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      + "\tMin: " + results[0] + "ms"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.485"></a>
-<span class="sourceLineNo">486</span><a name="line.486"></a>
-<span class="sourceLineNo">487</span>    con.close();<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    asyncCon.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    return results;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  /*<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Before we start up the job, write out an input file with instruction<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * per client regards which row they are to start on.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * @param cmd Command to run.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @throws IOException<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   */<a name="line.499"></a>
-<span class="sourceLineNo">500</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    assert cmd != null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    Job job = Job.getInstance(conf);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.509"></a>
-<span class="sourceLineNo">510</span><a name="line.510"></a>
-<span class="sourceLineNo">511</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    // this is default, but be explicit about it just in case.<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.514"></a>
-<span class="sourceLineNo">515</span><a name="line.515"></a>
-<span class="sourceLineNo">516</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputValueClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setReducerClass(LongSumReducer.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>    job.setNumReduceTasks(1);<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      Histogram.class,     // yammer metrics<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      );<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>    TableMapReduceUtil.initCredentials(job);<a name="line.534"></a>
-<span class="sourceLineNo">535</span><a name="line.535"></a>
-<span class="sourceLineNo">536</span>    job.waitForCompletion(true);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    return job;<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>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<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>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>  /*<a name="line.546"></a>
-<span class="sourceLineNo">547</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * @param c Configuration<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<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>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    return writeInputFile(c, opts, new Path("."));<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.556"></a>
-<span class="sourceLineNo">557</span>  throws IOException {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>    FileSystem fs = FileSystem.get(c);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    fs.mkdirs(inputDir);<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    // Make input random.<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Hash h = MurmurHash.getInstance();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    try {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>        TestOptions next = new TestOptions(opts);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        next.startRow = j * perClientRows;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.perClientRunRows = perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        String s = MAPPER.writeValueAsString(next);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        byte[] b = Bytes.toBytes(s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        m.put(hash, s);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>        out.println(e.getValue());<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    } finally {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      out.close();<a name="line.586"></a>
-<span class="sourceLineNo">587</span>    }<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    return inputDir;<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>   * Describes a command.<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   */<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  static class CmdDescriptor {<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private String name;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String description;<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      this.cmdClass = cmdClass;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.name = name;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.description = description;<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>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>      return cmdClass;<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>    public String getName() {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>      return name;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    public String getDescription() {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>      return description;<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><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * This makes tracking all these arguments a little easier.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>  static class TestOptions {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    String cmdName = null;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    boolean nomapred = false;<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    boolean filterAll = false;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    int startRow = 0;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    float size = 1.0f;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    int perClientRunRows = DEFAULT_ROWS_PER_GB;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    int numClientThreads = 1;<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    int totalRows = DEFAULT_ROWS_PER_GB;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    int measureAfter = 0;<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    float sampleRate = 1.0f;<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    double traceRate = 0.0;<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    String tableName = TABLE_NAME;<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    boolean flushCommits = true;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    boolean writeToWAL = true;<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    boolean autoFlush = false;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    boolean oneCon = false;<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    boolean useTags = false;<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    int noOfTags = 1;<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    boolean reportLatency = false;<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    int multiGet = 0;<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    int randomSleep = 0;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    boolean inMemoryCF = false;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    int presplitRegions = 0;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    int replicas = HTableDescriptor.DEFAULT_REGION_REPLICATION;<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    String splitPolicy = null;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    Compression.Algorithm compression = Compression.Algorithm.NONE;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    BloomType bloomType = BloomType.ROW;<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    int blockSize = HConstants.DEFAULT_BLOCKSIZE;<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    DataBlockEncoding blockEncoding = DataBlockEncoding.NONE;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    boolean valueRandom = false;<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    boolean valueZipf = false;<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    int valueSize = DEFAULT_VALUE_LENGTH;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    int period = (this.perClientRunRows / 10) == 0? perClientRunRows: perClientRunRows / 10;<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    int cycles = 1;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    int columns = 1;<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    int caching = 30;<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    boolean addColumns = true;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    MemoryCompactionPolicy inMemoryCompaction =<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        MemoryCompactionPolicy.valueOf(<a name="line.664"></a>
-<span class="sourceLineNo">665</span>            CompactingMemStore.COMPACTING_MEMSTORE_TYPE_DEFAULT);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    boolean asyncPrefetch = false;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    boolean cacheBlocks = true;<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    Scan.ReadType scanReadType = Scan.ReadType.DEFAULT;<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>    public TestOptions() {}<a name="line.670"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.BufferedMutatorParams;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Get;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Put;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.Result;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.Table;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.LongWritable;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.io.Text;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Job;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.Tool;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.hadoop.util.ToolRunner;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.Sampler;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.htrace.core.TraceScope;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.Logger;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.slf4j.LoggerFactory;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * command-line which test to run and how many clients are participating in<a name="line.118"></a>
+<span class="sourceLineNo">119</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.119"></a>
+<span class="sourceLineNo">120</span> *<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.123"></a>
+<span class="sourceLineNo">124</span> * paper, pages 8-10.<a name="line.124"></a>
+<span class="sourceLineNo">125</span> *<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.128"></a>
+<span class="sourceLineNo">129</span> * specified otherwise.<a name="line.129"></a>
+<span class="sourceLineNo">130</span> */<a name="line.130"></a>
+<span class="sourceLineNo">131</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.131"></a>
+<span class="sourceLineNo">132</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  static final String RANDOM_READ = "randomRead";<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  static {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  }<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
+<span class="sourceLineNo">156</span><a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
+<span class="sourceLineNo">243</span><a name="line.243"></a>
+<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
+<span class="sourceLineNo">249</span><a name="line.249"></a>
+<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
+<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
+<span class="sourceLineNo">261</span><a name="line.261"></a>
+<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
+<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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><a name="line.297"></a>
+<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
+<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        }<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>      ObjectMapper mapper = new ObjectMap

<TRUNCATED>

[39/44] hbase-site git commit: Published site at 8e6ff689e806138e602a46730886d8c5f524fdcd.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html
index bbaaccd..377b938 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10,"i34":10,"i35":10,"i36":10,"i37":10,"i38":10,"i39":10,"i40":10,"i41":10,"i42":10,"i43":10,"i44":10,"i45":10,"i46":10,"i47":10,"i48":10,"i49":10,"i50":10,"i51":10,"i52":10,"i53":10,"i54":10,"i55":10,"i56":10,"i57":10,"i58":10,"i59":10,"i60":10,"i61":10,"i62":10,"i63":10,"i64":10,"i65":10,"i66":10,"i67":10,"i68":10,"i69":10,"i70":10,"i71":10,"i72":10,"i73":10,"i74":10,"i75":10};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10,"i34":10,"i35":10,"i36":10,"i37":10,"i38":10,"i39":10,"i40":10,"i41":10,"i42":10,"i43":10,"i44":10,"i45":10,"i46":10,"i47":10,"i48":10,"i49":10,"i50":10,"i51":10,"i52":10,"i53":10,"i54":10,"i55":10,"i56":10,"i57":10,"i58":10,"i59":10,"i60":10,"i61":10,"i62":10,"i63":10,"i64":10,"i65":10,"i66":10,"i67":10,"i68":10,"i69":10,"i70":10,"i71":10,"i72":10,"i73":10,"i74":10,"i75":10,"i76":10,"i77":10};
 var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -113,7 +113,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.625">PerformanceEvaluation.TestOptions</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.626">PerformanceEvaluation.TestOptions</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">Wraps up options passed to <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.html" title="class in org.apache.hadoop.hbase"><code>PerformanceEvaluation</code></a>.
  This makes tracking all these arguments a little easier.
@@ -163,142 +163,146 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#bloomType">bloomType</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
+<td class="colFirst"><code>(package private) long</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#bufferSize">bufferSize</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#cacheBlocks">cacheBlocks</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#caching">caching</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) <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/PerformanceEvaluation.TestOptions.html#cmdName">cmdName</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#columns">columns</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) org.apache.hadoop.hbase.io.compress.Compression.Algorithm</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#compression">compression</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#cycles">cycles</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#filterAll">filterAll</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#flushCommits">flushCommits</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#inMemoryCF">inMemoryCF</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) org.apache.hadoop.hbase.MemoryCompactionPolicy</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#inMemoryCompaction">inMemoryCompaction</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#measureAfter">measureAfter</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#multiGet">multiGet</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#nomapred">nomapred</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#noOfTags">noOfTags</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#numClientThreads">numClientThreads</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#oneCon">oneCon</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#perClientRunRows">perClientRunRows</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#period">period</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#presplitRegions">presplitRegions</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#randomSleep">randomSleep</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#replicas">replicas</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#reportLatency">reportLatency</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) float</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#sampleRate">sampleRate</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) org.apache.hadoop.hbase.client.Scan.ReadType</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#scanReadType">scanReadType</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) float</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#size">size</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) <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/PerformanceEvaluation.TestOptions.html#splitPolicy">splitPolicy</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#startRow">startRow</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) <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/PerformanceEvaluation.TestOptions.html#tableName">tableName</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#totalRows">totalRows</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) double</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#traceRate">traceRate</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#useTags">useTags</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#valueRandom">valueRandom</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#valueSize">valueSize</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#valueZipf">valueZipf</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#writeToWAL">writeToWAL</a></span></code>&nbsp;</td>
 </tr>
@@ -356,290 +360,298 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#getBloomType--">getBloomType</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i4" class="altColor">
+<td class="colFirst"><code>long</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#getBufferSize--">getBufferSize</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i5" class="rowColor">
 <td class="colFirst"><code>int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#getCaching--">getCaching</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i5" class="rowColor">
+<tr id="i6" class="altColor">
 <td class="colFirst"><code><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/PerformanceEvaluation.TestOptions.html#getCmdName--">getCmdName</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i6" class="altColor">
+<tr id="i7" class="rowColor">
 <td class="colFirst"><code>int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#getColumns--">getColumns</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i7" class="rowColor">
+<tr id="i8" class="altColor">
 <td class="colFirst"><code>org.apache.hadoop.hbase.io.compress.Compression.Algorithm</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#getCompression--">getCompression</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i8" class="altColor">
+<tr id="i9" class="rowColor">
 <td class="colFirst"><code>int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#getCycles--">getCycles</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i9" class="rowColor">
+<tr id="i10" class="altColor">
 <td class="colFirst"><code>org.apache.hadoop.hbase.MemoryCompactionPolicy</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#getInMemoryCompaction--">getInMemoryCompaction</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i10" class="altColor">
+<tr id="i11" class="rowColor">
 <td class="colFirst"><code>int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#getMeasureAfter--">getMeasureAfter</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i11" class="rowColor">
+<tr id="i12" class="altColor">
 <td class="colFirst"><code>int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#getMultiGet--">getMultiGet</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i12" class="altColor">
+<tr id="i13" class="rowColor">
 <td class="colFirst"><code>int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#getNoOfTags--">getNoOfTags</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i13" class="rowColor">
+<tr id="i14" class="altColor">
 <td class="colFirst"><code>int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#getNumClientThreads--">getNumClientThreads</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i14" class="altColor">
+<tr id="i15" class="rowColor">
 <td class="colFirst"><code>int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#getPerClientRunRows--">getPerClientRunRows</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i15" class="rowColor">
+<tr id="i16" class="altColor">
 <td class="colFirst"><code>int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#getPeriod--">getPeriod</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i16" class="altColor">
+<tr id="i17" class="rowColor">
 <td class="colFirst"><code>int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#getPresplitRegions--">getPresplitRegions</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i17" class="rowColor">
+<tr id="i18" class="altColor">
 <td class="colFirst"><code>int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#getRandomSleep--">getRandomSleep</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i18" class="altColor">
+<tr id="i19" class="rowColor">
 <td class="colFirst"><code>int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#getReplicas--">getReplicas</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i19" class="rowColor">
+<tr id="i20" class="altColor">
 <td class="colFirst"><code>float</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#getSampleRate--">getSampleRate</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i20" class="altColor">
+<tr id="i21" class="rowColor">
 <td class="colFirst"><code>float</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#getSize--">getSize</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i21" class="rowColor">
+<tr id="i22" class="altColor">
 <td class="colFirst"><code><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/PerformanceEvaluation.TestOptions.html#getSplitPolicy--">getSplitPolicy</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i22" class="altColor">
+<tr id="i23" class="rowColor">
 <td class="colFirst"><code>int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#getStartRow--">getStartRow</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i23" class="rowColor">
+<tr id="i24" class="altColor">
 <td class="colFirst"><code><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/PerformanceEvaluation.TestOptions.html#getTableName--">getTableName</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i24" class="altColor">
+<tr id="i25" class="rowColor">
 <td class="colFirst"><code>int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#getTotalRows--">getTotalRows</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i25" class="rowColor">
+<tr id="i26" class="altColor">
 <td class="colFirst"><code>double</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#getTraceRate--">getTraceRate</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i26" class="altColor">
+<tr id="i27" class="rowColor">
 <td class="colFirst"><code>int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#getValueSize--">getValueSize</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i27" class="rowColor">
+<tr id="i28" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#isAutoFlush--">isAutoFlush</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i28" class="altColor">
+<tr id="i29" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#isFilterAll--">isFilterAll</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i29" class="rowColor">
+<tr id="i30" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#isFlushCommits--">isFlushCommits</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i30" class="altColor">
+<tr id="i31" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#isInMemoryCF--">isInMemoryCF</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i31" class="rowColor">
+<tr id="i32" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#isNomapred--">isNomapred</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i32" class="altColor">
+<tr id="i33" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#isOneCon--">isOneCon</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i33" class="rowColor">
+<tr id="i34" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#isReportLatency--">isReportLatency</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i34" class="altColor">
+<tr id="i35" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#isUseTags--">isUseTags</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i35" class="rowColor">
+<tr id="i36" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#isValueRandom--">isValueRandom</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i36" class="altColor">
+<tr id="i37" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#isValueZipf--">isValueZipf</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i37" class="rowColor">
+<tr id="i38" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#isWriteToWAL--">isWriteToWAL</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i38" class="altColor">
+<tr id="i39" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setAddColumns-boolean-">setAddColumns</a></span>(boolean&nbsp;addColumns)</code>&nbsp;</td>
 </tr>
-<tr id="i39" class="rowColor">
+<tr id="i40" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setAutoFlush-boolean-">setAutoFlush</a></span>(boolean&nbsp;autoFlush)</code>&nbsp;</td>
 </tr>
-<tr id="i40" class="altColor">
+<tr id="i41" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setBlockEncoding-org.apache.hadoop.hbase.io.encoding.DataBlockEncoding-">setBlockEncoding</a></span>(org.apache.hadoop.hbase.io.encoding.DataBlockEncoding&nbsp;blockEncoding)</code>&nbsp;</td>
 </tr>
-<tr id="i41" class="rowColor">
+<tr id="i42" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setBlockSize-int-">setBlockSize</a></span>(int&nbsp;blockSize)</code>&nbsp;</td>
 </tr>
-<tr id="i42" class="altColor">
+<tr id="i43" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setBloomType-org.apache.hadoop.hbase.regionserver.BloomType-">setBloomType</a></span>(org.apache.hadoop.hbase.regionserver.BloomType&nbsp;bloomType)</code>&nbsp;</td>
 </tr>
-<tr id="i43" class="rowColor">
+<tr id="i44" class="altColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setBufferSize-long-">setBufferSize</a></span>(long&nbsp;bufferSize)</code>&nbsp;</td>
+</tr>
+<tr id="i45" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setCaching-int-">setCaching</a></span>(int&nbsp;caching)</code>&nbsp;</td>
 </tr>
-<tr id="i44" class="altColor">
+<tr id="i46" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setCmdName-java.lang.String-">setCmdName</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;cmdName)</code>&nbsp;</td>
 </tr>
-<tr id="i45" class="rowColor">
+<tr id="i47" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setColumns-int-">setColumns</a></span>(int&nbsp;columns)</code>&nbsp;</td>
 </tr>
-<tr id="i46" class="altColor">
+<tr id="i48" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setCompression-org.apache.hadoop.hbase.io.compress.Compression.Algorithm-">setCompression</a></span>(org.apache.hadoop.hbase.io.compress.Compression.Algorithm&nbsp;compression)</code>&nbsp;</td>
 </tr>
-<tr id="i47" class="rowColor">
+<tr id="i49" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setCycles-int-">setCycles</a></span>(int&nbsp;cycles)</code>&nbsp;</td>
 </tr>
-<tr id="i48" class="altColor">
+<tr id="i50" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setFilterAll-boolean-">setFilterAll</a></span>(boolean&nbsp;filterAll)</code>&nbsp;</td>
 </tr>
-<tr id="i49" class="rowColor">
+<tr id="i51" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setFlushCommits-boolean-">setFlushCommits</a></span>(boolean&nbsp;flushCommits)</code>&nbsp;</td>
 </tr>
-<tr id="i50" class="altColor">
+<tr id="i52" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setInMemoryCF-boolean-">setInMemoryCF</a></span>(boolean&nbsp;inMemoryCF)</code>&nbsp;</td>
 </tr>
-<tr id="i51" class="rowColor">
+<tr id="i53" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setInMemoryCompaction-org.apache.hadoop.hbase.MemoryCompactionPolicy-">setInMemoryCompaction</a></span>(org.apache.hadoop.hbase.MemoryCompactionPolicy&nbsp;inMemoryCompaction)</code>&nbsp;</td>
 </tr>
-<tr id="i52" class="altColor">
+<tr id="i54" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setMeasureAfter-int-">setMeasureAfter</a></span>(int&nbsp;measureAfter)</code>&nbsp;</td>
 </tr>
-<tr id="i53" class="rowColor">
+<tr id="i55" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setMultiGet-int-">setMultiGet</a></span>(int&nbsp;multiGet)</code>&nbsp;</td>
 </tr>
-<tr id="i54" class="altColor">
+<tr id="i56" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setNomapred-boolean-">setNomapred</a></span>(boolean&nbsp;nomapred)</code>&nbsp;</td>
 </tr>
-<tr id="i55" class="rowColor">
+<tr id="i57" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setNoOfTags-int-">setNoOfTags</a></span>(int&nbsp;noOfTags)</code>&nbsp;</td>
 </tr>
-<tr id="i56" class="altColor">
+<tr id="i58" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setNumClientThreads-int-">setNumClientThreads</a></span>(int&nbsp;numClientThreads)</code>&nbsp;</td>
 </tr>
-<tr id="i57" class="rowColor">
+<tr id="i59" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setOneCon-boolean-">setOneCon</a></span>(boolean&nbsp;oneCon)</code>&nbsp;</td>
 </tr>
-<tr id="i58" class="altColor">
+<tr id="i60" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setPerClientRunRows-int-">setPerClientRunRows</a></span>(int&nbsp;perClientRunRows)</code>&nbsp;</td>
 </tr>
-<tr id="i59" class="rowColor">
+<tr id="i61" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setPeriod-int-">setPeriod</a></span>(int&nbsp;period)</code>&nbsp;</td>
 </tr>
-<tr id="i60" class="altColor">
+<tr id="i62" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setPresplitRegions-int-">setPresplitRegions</a></span>(int&nbsp;presplitRegions)</code>&nbsp;</td>
 </tr>
-<tr id="i61" class="rowColor">
+<tr id="i63" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setRandomSleep-int-">setRandomSleep</a></span>(int&nbsp;randomSleep)</code>&nbsp;</td>
 </tr>
-<tr id="i62" class="altColor">
+<tr id="i64" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setReplicas-int-">setReplicas</a></span>(int&nbsp;replicas)</code>&nbsp;</td>
 </tr>
-<tr id="i63" class="rowColor">
+<tr id="i65" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setReportLatency-boolean-">setReportLatency</a></span>(boolean&nbsp;reportLatency)</code>&nbsp;</td>
 </tr>
-<tr id="i64" class="altColor">
+<tr id="i66" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setSampleRate-float-">setSampleRate</a></span>(float&nbsp;sampleRate)</code>&nbsp;</td>
 </tr>
-<tr id="i65" class="rowColor">
+<tr id="i67" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setSize-float-">setSize</a></span>(float&nbsp;size)</code>&nbsp;</td>
 </tr>
-<tr id="i66" class="altColor">
+<tr id="i68" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setSplitPolicy-java.lang.String-">setSplitPolicy</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;splitPolicy)</code>&nbsp;</td>
 </tr>
-<tr id="i67" class="rowColor">
+<tr id="i69" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setStartRow-int-">setStartRow</a></span>(int&nbsp;startRow)</code>&nbsp;</td>
 </tr>
-<tr id="i68" class="altColor">
+<tr id="i70" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setTableName-java.lang.String-">setTableName</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;tableName)</code>&nbsp;</td>
 </tr>
-<tr id="i69" class="rowColor">
+<tr id="i71" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setTotalRows-int-">setTotalRows</a></span>(int&nbsp;totalRows)</code>&nbsp;</td>
 </tr>
-<tr id="i70" class="altColor">
+<tr id="i72" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setTraceRate-double-">setTraceRate</a></span>(double&nbsp;traceRate)</code>&nbsp;</td>
 </tr>
-<tr id="i71" class="rowColor">
+<tr id="i73" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setUseTags-boolean-">setUseTags</a></span>(boolean&nbsp;useTags)</code>&nbsp;</td>
 </tr>
-<tr id="i72" class="altColor">
+<tr id="i74" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setValueRandom-boolean-">setValueRandom</a></span>(boolean&nbsp;valueRandom)</code>&nbsp;</td>
 </tr>
-<tr id="i73" class="rowColor">
+<tr id="i75" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setValueSize-int-">setValueSize</a></span>(int&nbsp;valueSize)</code>&nbsp;</td>
 </tr>
-<tr id="i74" class="altColor">
+<tr id="i76" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setValueZipf-boolean-">setValueZipf</a></span>(boolean&nbsp;valueZipf)</code>&nbsp;</td>
 </tr>
-<tr id="i75" class="rowColor">
+<tr id="i77" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setWriteToWAL-boolean-">setWriteToWAL</a></span>(boolean&nbsp;writeToWAL)</code>&nbsp;</td>
 </tr>
@@ -671,7 +683,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>cmdName</h4>
-<pre><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/PerformanceEvaluation.TestOptions.html#line.626">cmdName</a></pre>
+<pre><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/PerformanceEvaluation.TestOptions.html#line.627">cmdName</a></pre>
 </li>
 </ul>
 <a name="nomapred">
@@ -680,7 +692,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>nomapred</h4>
-<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.627">nomapred</a></pre>
+<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.628">nomapred</a></pre>
 </li>
 </ul>
 <a name="filterAll">
@@ -689,7 +701,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>filterAll</h4>
-<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.628">filterAll</a></pre>
+<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.629">filterAll</a></pre>
 </li>
 </ul>
 <a name="startRow">
@@ -698,7 +710,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>startRow</h4>
-<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.629">startRow</a></pre>
+<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.630">startRow</a></pre>
 </li>
 </ul>
 <a name="size">
@@ -707,7 +719,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>size</h4>
-<pre>float <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.630">size</a></pre>
+<pre>float <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.631">size</a></pre>
 </li>
 </ul>
 <a name="perClientRunRows">
@@ -716,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>perClientRunRows</h4>
-<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.631">perClientRunRows</a></pre>
+<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.632">perClientRunRows</a></pre>
 </li>
 </ul>
 <a name="numClientThreads">
@@ -725,7 +737,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>numClientThreads</h4>
-<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.632">numClientThreads</a></pre>
+<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.633">numClientThreads</a></pre>
 </li>
 </ul>
 <a name="totalRows">
@@ -734,7 +746,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>totalRows</h4>
-<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.633">totalRows</a></pre>
+<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.634">totalRows</a></pre>
 </li>
 </ul>
 <a name="measureAfter">
@@ -743,7 +755,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>measureAfter</h4>
-<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.634">measureAfter</a></pre>
+<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.635">measureAfter</a></pre>
 </li>
 </ul>
 <a name="sampleRate">
@@ -752,7 +764,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>sampleRate</h4>
-<pre>float <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.635">sampleRate</a></pre>
+<pre>float <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.636">sampleRate</a></pre>
 </li>
 </ul>
 <a name="traceRate">
@@ -761,7 +773,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>traceRate</h4>
-<pre>double <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.636">traceRate</a></pre>
+<pre>double <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.637">traceRate</a></pre>
 </li>
 </ul>
 <a name="tableName">
@@ -770,7 +782,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>tableName</h4>
-<pre><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/PerformanceEvaluation.TestOptions.html#line.637">tableName</a></pre>
+<pre><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/PerformanceEvaluation.TestOptions.html#line.638">tableName</a></pre>
 </li>
 </ul>
 <a name="flushCommits">
@@ -779,7 +791,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>flushCommits</h4>
-<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.638">flushCommits</a></pre>
+<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.639">flushCommits</a></pre>
 </li>
 </ul>
 <a name="writeToWAL">
@@ -788,7 +800,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>writeToWAL</h4>
-<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.639">writeToWAL</a></pre>
+<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.640">writeToWAL</a></pre>
 </li>
 </ul>
 <a name="autoFlush">
@@ -797,7 +809,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>autoFlush</h4>
-<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.640">autoFlush</a></pre>
+<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.641">autoFlush</a></pre>
 </li>
 </ul>
 <a name="oneCon">
@@ -806,7 +818,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>oneCon</h4>
-<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.641">oneCon</a></pre>
+<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.642">oneCon</a></pre>
 </li>
 </ul>
 <a name="useTags">
@@ -815,7 +827,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>useTags</h4>
-<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.642">useTags</a></pre>
+<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.643">useTags</a></pre>
 </li>
 </ul>
 <a name="noOfTags">
@@ -824,7 +836,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>noOfTags</h4>
-<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.643">noOfTags</a></pre>
+<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.644">noOfTags</a></pre>
 </li>
 </ul>
 <a name="reportLatency">
@@ -833,7 +845,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>reportLatency</h4>
-<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.644">reportLatency</a></pre>
+<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.645">reportLatency</a></pre>
 </li>
 </ul>
 <a name="multiGet">
@@ -842,7 +854,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>multiGet</h4>
-<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.645">multiGet</a></pre>
+<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.646">multiGet</a></pre>
 </li>
 </ul>
 <a name="randomSleep">
@@ -851,7 +863,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>randomSleep</h4>
-<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.646">randomSleep</a></pre>
+<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.647">randomSleep</a></pre>
 </li>
 </ul>
 <a name="inMemoryCF">
@@ -860,7 +872,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>inMemoryCF</h4>
-<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.647">inMemoryCF</a></pre>
+<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.648">inMemoryCF</a></pre>
 </li>
 </ul>
 <a name="presplitRegions">
@@ -869,7 +881,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>presplitRegions</h4>
-<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.648">presplitRegions</a></pre>
+<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.649">presplitRegions</a></pre>
 </li>
 </ul>
 <a name="replicas">
@@ -878,7 +890,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>replicas</h4>
-<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.649">replicas</a></pre>
+<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.650">replicas</a></pre>
 </li>
 </ul>
 <a name="splitPolicy">
@@ -887,7 +899,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>splitPolicy</h4>
-<pre><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/PerformanceEvaluation.TestOptions.html#line.650">splitPolicy</a></pre>
+<pre><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/PerformanceEvaluation.TestOptions.html#line.651">splitPolicy</a></pre>
 </li>
 </ul>
 <a name="compression">
@@ -896,7 +908,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>compression</h4>
-<pre>org.apache.hadoop.hbase.io.compress.Compression.Algorithm <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.651">compression</a></pre>
+<pre>org.apache.hadoop.hbase.io.compress.Compression.Algorithm <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.652">compression</a></pre>
 </li>
 </ul>
 <a name="bloomType">
@@ -905,7 +917,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>bloomType</h4>
-<pre>org.apache.hadoop.hbase.regionserver.BloomType <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.652">bloomType</a></pre>
+<pre>org.apache.hadoop.hbase.regionserver.BloomType <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.653">bloomType</a></pre>
 </li>
 </ul>
 <a name="blockSize">
@@ -914,7 +926,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>blockSize</h4>
-<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.653">blockSize</a></pre>
+<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.654">blockSize</a></pre>
 </li>
 </ul>
 <a name="blockEncoding">
@@ -923,7 +935,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>blockEncoding</h4>
-<pre>org.apache.hadoop.hbase.io.encoding.DataBlockEncoding <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.654">blockEncoding</a></pre>
+<pre>org.apache.hadoop.hbase.io.encoding.DataBlockEncoding <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.655">blockEncoding</a></pre>
 </li>
 </ul>
 <a name="valueRandom">
@@ -932,7 +944,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>valueRandom</h4>
-<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.655">valueRandom</a></pre>
+<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.656">valueRandom</a></pre>
 </li>
 </ul>
 <a name="valueZipf">
@@ -941,7 +953,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>valueZipf</h4>
-<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.656">valueZipf</a></pre>
+<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.657">valueZipf</a></pre>
 </li>
 </ul>
 <a name="valueSize">
@@ -950,7 +962,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>valueSize</h4>
-<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.657">valueSize</a></pre>
+<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.658">valueSize</a></pre>
 </li>
 </ul>
 <a name="period">
@@ -959,7 +971,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>period</h4>
-<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.658">period</a></pre>
+<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.659">period</a></pre>
 </li>
 </ul>
 <a name="cycles">
@@ -968,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>cycles</h4>
-<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.659">cycles</a></pre>
+<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.660">cycles</a></pre>
 </li>
 </ul>
 <a name="columns">
@@ -977,7 +989,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>columns</h4>
-<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.660">columns</a></pre>
+<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.661">columns</a></pre>
 </li>
 </ul>
 <a name="caching">
@@ -986,7 +998,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>caching</h4>
-<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.661">caching</a></pre>
+<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.662">caching</a></pre>
 </li>
 </ul>
 <a name="addColumns">
@@ -995,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>addColumns</h4>
-<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.662">addColumns</a></pre>
+<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.663">addColumns</a></pre>
 </li>
 </ul>
 <a name="inMemoryCompaction">
@@ -1004,7 +1016,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>inMemoryCompaction</h4>
-<pre>org.apache.hadoop.hbase.MemoryCompactionPolicy <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.663">inMemoryCompaction</a></pre>
+<pre>org.apache.hadoop.hbase.MemoryCompactionPolicy <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.664">inMemoryCompaction</a></pre>
 </li>
 </ul>
 <a name="asyncPrefetch">
@@ -1013,7 +1025,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>asyncPrefetch</h4>
-<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.666">asyncPrefetch</a></pre>
+<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.667">asyncPrefetch</a></pre>
 </li>
 </ul>
 <a name="cacheBlocks">
@@ -1022,16 +1034,25 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>cacheBlocks</h4>
-<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.667">cacheBlocks</a></pre>
+<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.668">cacheBlocks</a></pre>
 </li>
 </ul>
 <a name="scanReadType">
 <!--   -->
 </a>
-<ul class="blockListLast">
+<ul class="blockList">
 <li class="blockList">
 <h4>scanReadType</h4>
-<pre>org.apache.hadoop.hbase.client.Scan.ReadType <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.668">scanReadType</a></pre>
+<pre>org.apache.hadoop.hbase.client.Scan.ReadType <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.669">scanReadType</a></pre>
+</li>
+</ul>
+<a name="bufferSize">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>bufferSize</h4>
+<pre>long <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.670">bufferSize</a></pre>
 </li>
 </ul>
 </li>
@@ -1048,7 +1069,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>TestOptions</h4>
-<pre>public&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.670">TestOptions</a>()</pre>
+<pre>public&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.672">TestOptions</a>()</pre>
 </li>
 </ul>
 <a name="TestOptions-org.apache.hadoop.hbase.PerformanceEvaluation.TestOptions-">
@@ -1057,7 +1078,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TestOptions</h4>
-<pre>public&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.676">TestOptions</a>(<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;that)</pre>
+<pre>public&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.678">TestOptions</a>(<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;that)</pre>
 <div class="block">Clone constructor.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -1079,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>getCaching</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.720">getCaching</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.723">getCaching</a>()</pre>
 </li>
 </ul>
 <a name="setCaching-int-">
@@ -1088,7 +1109,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setCaching</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.724">setCaching</a>(int&nbsp;caching)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.727">setCaching</a>(int&nbsp;caching)</pre>
 </li>
 </ul>
 <a name="getColumns--">
@@ -1097,7 +1118,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getColumns</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.728">getColumns</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.731">getColumns</a>()</pre>
 </li>
 </ul>
 <a name="setColumns-int-">
@@ -1106,7 +1127,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setColumns</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.732">setColumns</a>(int&nbsp;columns)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.735">setColumns</a>(int&nbsp;columns)</pre>
 </li>
 </ul>
 <a name="getCycles--">
@@ -1115,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>getCycles</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.736">getCycles</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.739">getCycles</a>()</pre>
 </li>
 </ul>
 <a name="setCycles-int-">
@@ -1124,7 +1145,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setCycles</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.740">setCycles</a>(int&nbsp;cycles)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.743">setCycles</a>(int&nbsp;cycles)</pre>
 </li>
 </ul>
 <a name="isValueZipf--">
@@ -1133,7 +1154,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isValueZipf</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.744">isValueZipf</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.747">isValueZipf</a>()</pre>
 </li>
 </ul>
 <a name="setValueZipf-boolean-">
@@ -1142,7 +1163,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setValueZipf</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.748">setValueZipf</a>(boolean&nbsp;valueZipf)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.751">setValueZipf</a>(boolean&nbsp;valueZipf)</pre>
 </li>
 </ul>
 <a name="getCmdName--">
@@ -1151,7 +1172,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getCmdName</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/PerformanceEvaluation.TestOptions.html#line.752">getCmdName</a>()</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/PerformanceEvaluation.TestOptions.html#line.755">getCmdName</a>()</pre>
 </li>
 </ul>
 <a name="setCmdName-java.lang.String-">
@@ -1160,7 +1181,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setCmdName</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.756">setCmdName</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;cmdName)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.759">setCmdName</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;cmdName)</pre>
 </li>
 </ul>
 <a name="getRandomSleep--">
@@ -1169,7 +1190,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getRandomSleep</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.760">getRandomSleep</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.763">getRandomSleep</a>()</pre>
 </li>
 </ul>
 <a name="setRandomSleep-int-">
@@ -1178,7 +1199,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setRandomSleep</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.764">setRandomSleep</a>(int&nbsp;randomSleep)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.767">setRandomSleep</a>(int&nbsp;randomSleep)</pre>
 </li>
 </ul>
 <a name="getReplicas--">
@@ -1187,7 +1208,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getReplicas</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.768">getReplicas</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.771">getReplicas</a>()</pre>
 </li>
 </ul>
 <a name="setReplicas-int-">
@@ -1196,7 +1217,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setReplicas</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.772">setReplicas</a>(int&nbsp;replicas)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.775">setReplicas</a>(int&nbsp;replicas)</pre>
 </li>
 </ul>
 <a name="getSplitPolicy--">
@@ -1205,7 +1226,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getSplitPolicy</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/PerformanceEvaluation.TestOptions.html#line.776">getSplitPolicy</a>()</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/PerformanceEvaluation.TestOptions.html#line.779">getSplitPolicy</a>()</pre>
 </li>
 </ul>
 <a name="setSplitPolicy-java.lang.String-">
@@ -1214,7 +1235,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setSplitPolicy</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.780">setSplitPolicy</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;splitPolicy)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.783">setSplitPolicy</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;splitPolicy)</pre>
 </li>
 </ul>
 <a name="setNomapred-boolean-">
@@ -1223,7 +1244,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setNomapred</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.784">setNomapred</a>(boolean&nbsp;nomapred)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.787">setNomapred</a>(boolean&nbsp;nomapred)</pre>
 </li>
 </ul>
 <a name="setFilterAll-boolean-">
@@ -1232,7 +1253,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setFilterAll</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.788">setFilterAll</a>(boolean&nbsp;filterAll)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.791">setFilterAll</a>(boolean&nbsp;filterAll)</pre>
 </li>
 </ul>
 <a name="setStartRow-int-">
@@ -1241,7 +1262,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setStartRow</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.792">setStartRow</a>(int&nbsp;startRow)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.795">setStartRow</a>(int&nbsp;startRow)</pre>
 </li>
 </ul>
 <a name="setSize-float-">
@@ -1250,7 +1271,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setSize</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.796">setSize</a>(float&nbsp;size)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.799">setSize</a>(float&nbsp;size)</pre>
 </li>
 </ul>
 <a name="setPerClientRunRows-int-">
@@ -1259,7 +1280,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setPerClientRunRows</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.800">setPerClientRunRows</a>(int&nbsp;perClientRunRows)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.803">setPerClientRunRows</a>(int&nbsp;perClientRunRows)</pre>
 </li>
 </ul>
 <a name="setNumClientThreads-int-">
@@ -1268,7 +1289,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setNumClientThreads</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.804">setNumClientThreads</a>(int&nbsp;numClientThreads)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.807">setNumClientThreads</a>(int&nbsp;numClientThreads)</pre>
 </li>
 </ul>
 <a name="setTotalRows-int-">
@@ -1277,7 +1298,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setTotalRows</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.808">setTotalRows</a>(int&nbsp;totalRows)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.811">setTotalRows</a>(int&nbsp;totalRows)</pre>
 </li>
 </ul>
 <a name="setSampleRate-float-">
@@ -1286,7 +1307,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setSampleRate</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.812">setSampleRate</a>(float&nbsp;sampleRate)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.815">setSampleRate</a>(float&nbsp;sampleRate)</pre>
 </li>
 </ul>
 <a name="setTraceRate-double-">
@@ -1295,7 +1316,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setTraceRate</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.816">setTraceRate</a>(double&nbsp;traceRate)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.819">setTraceRate</a>(double&nbsp;traceRate)</pre>
 </li>
 </ul>
 <a name="setTableName-java.lang.String-">
@@ -1304,7 +1325,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setTableName</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.820">setTableName</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;tableName)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.823">setTableName</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;tableName)</pre>
 </li>
 </ul>
 <a name="setFlushCommits-boolean-">
@@ -1313,7 +1334,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setFlushCommits</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.824">setFlushCommits</a>(boolean&nbsp;flushCommits)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.827">setFlushCommits</a>(boolean&nbsp;flushCommits)</pre>
 </li>
 </ul>
 <a name="setWriteToWAL-boolean-">
@@ -1322,7 +1343,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setWriteToWAL</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.828">setWriteToWAL</a>(boolean&nbsp;writeToWAL)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.831">setWriteToWAL</a>(boolean&nbsp;writeToWAL)</pre>
 </li>
 </ul>
 <a name="setAutoFlush-boolean-">
@@ -1331,7 +1352,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setAutoFlush</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.832">setAutoFlush</a>(boolean&nbsp;autoFlush)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.835">setAutoFlush</a>(boolean&nbsp;autoFlush)</pre>
 </li>
 </ul>
 <a name="setOneCon-boolean-">
@@ -1340,7 +1361,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setOneCon</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.836">setOneCon</a>(boolean&nbsp;oneCon)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.839">setOneCon</a>(boolean&nbsp;oneCon)</pre>
 </li>
 </ul>
 <a name="setUseTags-boolean-">
@@ -1349,7 +1370,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setUseTags</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.840">setUseTags</a>(boolean&nbsp;useTags)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.843">setUseTags</a>(boolean&nbsp;useTags)</pre>
 </li>
 </ul>
 <a name="setNoOfTags-int-">
@@ -1358,7 +1379,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setNoOfTags</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.844">setNoOfTags</a>(int&nbsp;noOfTags)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.847">setNoOfTags</a>(int&nbsp;noOfTags)</pre>
 </li>
 </ul>
 <a name="setReportLatency-boolean-">
@@ -1367,7 +1388,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setReportLatency</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.848">setReportLatency</a>(boolean&nbsp;reportLatency)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.851">setReportLatency</a>(boolean&nbsp;reportLatency)</pre>
 </li>
 </ul>
 <a name="setMultiGet-int-">
@@ -1376,7 +1397,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setMultiGet</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.852">setMultiGet</a>(int&nbsp;multiGet)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.855">setMultiGet</a>(int&nbsp;multiGet)</pre>
 </li>
 </ul>
 <a name="setInMemoryCF-boolean-">
@@ -1385,7 +1406,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setInMemoryCF</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.856">setInMemoryCF</a>(boolean&nbsp;inMemoryCF)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.859">setInMemoryCF</a>(boolean&nbsp;inMemoryCF)</pre>
 </li>
 </ul>
 <a name="setPresplitRegions-int-">
@@ -1394,7 +1415,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setPresplitRegions</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.860">setPresplitRegions</a>(int&nbsp;presplitRegions)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.863">setPresplitRegions</a>(int&nbsp;presplitRegions)</pre>
 </li>
 </ul>
 <a name="setCompression-org.apache.hadoop.hbase.io.compress.Compression.Algorithm-">
@@ -1403,7 +1424,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setCompression</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.864">setCompression</a>(org.apache.hadoop.hbase.io.compress.Compression.Algorithm&nbsp;compression)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.867">setCompression</a>(org.apache.hadoop.hbase.io.compress.Compression.Algorithm&nbsp;compression)</pre>
 </li>
 </ul>
 <a name="setBloomType-org.apache.hadoop.hbase.regionserver.BloomType-">
@@ -1412,7 +1433,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setBloomType</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.868">setBloomType</a>(org.apache.hadoop.hbase.regionserver.BloomType&nbsp;bloomType)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.871">setBloomType</a>(org.apache.hadoop.hbase.regionserver.BloomType&nbsp;bloomType)</pre>
 </li>
 </ul>
 <a name="setBlockSize-int-">
@@ -1421,7 +1442,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setBlockSize</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.872">setBlockSize</a>(int&nbsp;blockSize)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.875">setBlockSize</a>(int&nbsp;blockSize)</pre>
 </li>
 </ul>
 <a name="setBlockEncoding-org.apache.hadoop.hbase.io.encoding.DataBlockEncoding-">
@@ -1430,7 +1451,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setBlockEncoding</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.876">setBlockEncoding</a>(org.apache.hadoop.hbase.io.encoding.DataBlockEncoding&nbsp;blockEncoding)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.879">setBlockEncoding</a>(org.apache.hadoop.hbase.io.encoding.DataBlockEncoding&nbsp;blockEncoding)</pre>
 </li>
 </ul>
 <a name="setValueRandom-boolean-">
@@ -1439,7 +1460,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setValueRandom</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.880">setValueRandom</a>(boolean&nbsp;valueRandom)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.883">setValueRandom</a>(boolean&nbsp;valueRandom)</pre>
 </li>
 </ul>
 <a name="setValueSize-int-">
@@ -1448,7 +1469,16 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setValueSize</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.884">setValueSize</a>(int&nbsp;valueSize)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.887">setValueSize</a>(int&nbsp;valueSize)</pre>
+</li>
+</ul>
+<a name="setBufferSize-long-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>setBufferSize</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.891">setBufferSize</a>(long&nbsp;bufferSize)</pre>
 </li>
 </ul>
 <a name="setPeriod-int-">
@@ -1457,7 +1487,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setPeriod</h4>
-<pre>public&nbsp;void&nbsp;

<TRUNCATED>

[44/44] hbase-site git commit: Published site at 8e6ff689e806138e602a46730886d8c5f524fdcd.

Posted by gi...@apache.org.
Published site at 8e6ff689e806138e602a46730886d8c5f524fdcd.


Project: http://git-wip-us.apache.org/repos/asf/hbase-site/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase-site/commit/131f2a89
Tree: http://git-wip-us.apache.org/repos/asf/hbase-site/tree/131f2a89
Diff: http://git-wip-us.apache.org/repos/asf/hbase-site/diff/131f2a89

Branch: refs/heads/asf-site
Commit: 131f2a8976e49ec85038f52c85656521df8c5520
Parents: af92c4d
Author: jenkins <bu...@apache.org>
Authored: Mon May 7 14:47:28 2018 +0000
Committer: jenkins <bu...@apache.org>
Committed: Mon May 7 14:47:28 2018 +0000

----------------------------------------------------------------------
 acid-semantics.html                             |    4 +-
 apache_hbase_reference_guide.pdf                |    4 +-
 book.html                                       |    2 +-
 bulk-loads.html                                 |    4 +-
 checkstyle-aggregate.html                       |  950 ++--
 checkstyle.rss                                  |    6 +-
 coc.html                                        |    4 +-
 dependencies.html                               |    4 +-
 dependency-convergence.html                     |    4 +-
 dependency-info.html                            |    4 +-
 dependency-management.html                      |    4 +-
 devapidocs/constant-values.html                 |    4 +-
 .../org/apache/hadoop/hbase/Version.html        |    4 +-
 downloads.html                                  |    4 +-
 export_control.html                             |    4 +-
 index.html                                      |    4 +-
 integration.html                                |    4 +-
 issue-tracking.html                             |    4 +-
 license.html                                    |    4 +-
 mail-lists.html                                 |    4 +-
 metrics.html                                    |    4 +-
 old_news.html                                   |    4 +-
 plugin-management.html                          |    4 +-
 plugins.html                                    |    4 +-
 poweredbyhbase.html                             |    4 +-
 project-info.html                               |    4 +-
 project-reports.html                            |    4 +-
 project-summary.html                            |    4 +-
 pseudo-distributed.html                         |    4 +-
 replication.html                                |    4 +-
 resources.html                                  |    4 +-
 source-repository.html                          |    4 +-
 sponsors.html                                   |    4 +-
 supportingprojects.html                         |    4 +-
 team-list.html                                  |    4 +-
 testdevapidocs/index-all.html                   |   12 +-
 .../hbase/PerformanceEvaluation.AppendTest.html |    6 +-
 ...rformanceEvaluation.AsyncRandomReadTest.html |   20 +-
 ...formanceEvaluation.AsyncRandomWriteTest.html |    6 +-
 .../PerformanceEvaluation.AsyncScanTest.html    |   14 +-
 ...manceEvaluation.AsyncSequentialReadTest.html |    6 +-
 ...anceEvaluation.AsyncSequentialWriteTest.html |    6 +-
 .../PerformanceEvaluation.AsyncTableTest.html   |   10 +-
 .../hbase/PerformanceEvaluation.AsyncTest.html  |   10 +-
 ...rformanceEvaluation.BufferedMutatorTest.html |   12 +-
 .../PerformanceEvaluation.CASTableTest.html     |   12 +-
 ...erformanceEvaluation.CheckAndDeleteTest.html |    6 +-
 ...erformanceEvaluation.CheckAndMutateTest.html |    6 +-
 .../PerformanceEvaluation.CheckAndPutTest.html  |    6 +-
 .../PerformanceEvaluation.CmdDescriptor.html    |   16 +-
 .../hbase/PerformanceEvaluation.Counter.html    |   10 +-
 ...PerformanceEvaluation.EvaluationMapTask.html |   16 +-
 .../PerformanceEvaluation.FilteredScanTest.html |   10 +-
 .../PerformanceEvaluation.IncrementTest.html    |    6 +-
 .../PerformanceEvaluation.RandomReadTest.html   |   16 +-
 ...Evaluation.RandomScanWithRange10000Test.html |    6 +-
 ...eEvaluation.RandomScanWithRange1000Test.html |    6 +-
 ...ceEvaluation.RandomScanWithRange100Test.html |    6 +-
 ...nceEvaluation.RandomScanWithRange10Test.html |    6 +-
 ...manceEvaluation.RandomScanWithRangeTest.html |   12 +-
 ...erformanceEvaluation.RandomSeekScanTest.html |    8 +-
 .../PerformanceEvaluation.RandomWriteTest.html  |    6 +-
 .../hbase/PerformanceEvaluation.RunResult.html  |   12 +-
 .../hbase/PerformanceEvaluation.ScanTest.html   |   10 +-
 ...erformanceEvaluation.SequentialReadTest.html |    6 +-
 ...rformanceEvaluation.SequentialWriteTest.html |    6 +-
 .../hbase/PerformanceEvaluation.Status.html     |    4 +-
 .../hbase/PerformanceEvaluation.TableTest.html  |   10 +-
 .../hbase/PerformanceEvaluation.Test.html       |   10 +-
 .../hbase/PerformanceEvaluation.TestBase.html   |   86 +-
 .../PerformanceEvaluation.TestOptions.html      |  495 +-
 .../hadoop/hbase/PerformanceEvaluation.html     |   98 +-
 .../hadoop/hbase/TestPerformanceEvaluation.html |   25 +-
 .../TestIncrementalBackupWithBulkLoad.html      |   33 +-
 .../hadoop/hbase/backup/package-tree.html       |    2 +-
 .../org/apache/hadoop/hbase/package-tree.html   |   10 +-
 .../hadoop/hbase/regionserver/package-tree.html |    6 +-
 .../apache/hadoop/hbase/test/package-tree.html  |    4 +-
 .../apache/hadoop/hbase/wal/package-tree.html   |    2 +-
 .../hbase/PerformanceEvaluation.AppendTest.html | 5317 +++++++++---------
 ...rformanceEvaluation.AsyncRandomReadTest.html | 5317 +++++++++---------
 ...formanceEvaluation.AsyncRandomWriteTest.html | 5317 +++++++++---------
 .../PerformanceEvaluation.AsyncScanTest.html    | 5317 +++++++++---------
 ...manceEvaluation.AsyncSequentialReadTest.html | 5317 +++++++++---------
 ...anceEvaluation.AsyncSequentialWriteTest.html | 5317 +++++++++---------
 .../PerformanceEvaluation.AsyncTableTest.html   | 5317 +++++++++---------
 .../hbase/PerformanceEvaluation.AsyncTest.html  | 5317 +++++++++---------
 ...rformanceEvaluation.BufferedMutatorTest.html | 5317 +++++++++---------
 .../PerformanceEvaluation.CASTableTest.html     | 5317 +++++++++---------
 ...erformanceEvaluation.CheckAndDeleteTest.html | 5317 +++++++++---------
 ...erformanceEvaluation.CheckAndMutateTest.html | 5317 +++++++++---------
 .../PerformanceEvaluation.CheckAndPutTest.html  | 5317 +++++++++---------
 .../PerformanceEvaluation.CmdDescriptor.html    | 5317 +++++++++---------
 .../hbase/PerformanceEvaluation.Counter.html    | 5317 +++++++++---------
 ...PerformanceEvaluation.EvaluationMapTask.html | 5317 +++++++++---------
 .../PerformanceEvaluation.FilteredScanTest.html | 5317 +++++++++---------
 .../PerformanceEvaluation.IncrementTest.html    | 5317 +++++++++---------
 .../PerformanceEvaluation.RandomReadTest.html   | 5317 +++++++++---------
 ...Evaluation.RandomScanWithRange10000Test.html | 5317 +++++++++---------
 ...eEvaluation.RandomScanWithRange1000Test.html | 5317 +++++++++---------
 ...ceEvaluation.RandomScanWithRange100Test.html | 5317 +++++++++---------
 ...nceEvaluation.RandomScanWithRange10Test.html | 5317 +++++++++---------
 ...manceEvaluation.RandomScanWithRangeTest.html | 5317 +++++++++---------
 ...erformanceEvaluation.RandomSeekScanTest.html | 5317 +++++++++---------
 .../PerformanceEvaluation.RandomWriteTest.html  | 5317 +++++++++---------
 .../hbase/PerformanceEvaluation.RunResult.html  | 5317 +++++++++---------
 .../hbase/PerformanceEvaluation.ScanTest.html   | 5317 +++++++++---------
 ...erformanceEvaluation.SequentialReadTest.html | 5317 +++++++++---------
 ...rformanceEvaluation.SequentialWriteTest.html | 5317 +++++++++---------
 .../hbase/PerformanceEvaluation.Status.html     | 5317 +++++++++---------
 .../hbase/PerformanceEvaluation.TableTest.html  | 5317 +++++++++---------
 .../hbase/PerformanceEvaluation.Test.html       | 5317 +++++++++---------
 .../hbase/PerformanceEvaluation.TestBase.html   | 5317 +++++++++---------
 .../PerformanceEvaluation.TestOptions.html      | 5317 +++++++++---------
 .../hadoop/hbase/PerformanceEvaluation.html     | 5317 +++++++++---------
 .../hadoop/hbase/TestPerformanceEvaluation.html |   92 +-
 .../TestIncrementalBackupWithBulkLoad.html      |  266 +-
 117 files changed, 97393 insertions(+), 96538 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/acid-semantics.html
----------------------------------------------------------------------
diff --git a/acid-semantics.html b/acid-semantics.html
index 6116619..e2052fc 100644
--- a/acid-semantics.html
+++ b/acid-semantics.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180506" />
+    <meta name="Date-Revision-yyyymmdd" content="20180507" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Apache HBase (TM) ACID Properties
@@ -601,7 +601,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-06</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/apache_hbase_reference_guide.pdf
----------------------------------------------------------------------
diff --git a/apache_hbase_reference_guide.pdf b/apache_hbase_reference_guide.pdf
index 2092c90..5bf7146 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.0.alpha.15, based on Prawn 2.2.2)
 /Producer (Apache HBase Team)
-/ModDate (D:20180506142957+00'00')
-/CreationDate (D:20180506144459+00'00')
+/ModDate (D:20180507142956+00'00')
+/CreationDate (D:20180507144445+00'00')
 >>
 endobj
 2 0 obj

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/book.html
----------------------------------------------------------------------
diff --git a/book.html b/book.html
index 4d6ad9d..bf2f23c 100644
--- a/book.html
+++ b/book.html
@@ -37873,7 +37873,7 @@ The server will return cellblocks compressed using this same compressor as long
 <div id="footer">
 <div id="footer-text">
 Version 3.0.0-SNAPSHOT<br>
-Last updated 2018-05-06 14:29:57 UTC
+Last updated 2018-05-07 14:29:56 UTC
 </div>
 </div>
 </body>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/bulk-loads.html
----------------------------------------------------------------------
diff --git a/bulk-loads.html b/bulk-loads.html
index 04b6395..862a507 100644
--- a/bulk-loads.html
+++ b/bulk-loads.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180506" />
+    <meta name="Date-Revision-yyyymmdd" content="20180507" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Bulk Loads in Apache HBase (TM)
@@ -306,7 +306,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-06</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
             </p>
                 </div>
 


[36/44] hbase-site git commit: Published site at 8e6ff689e806138e602a46730886d8c5f524fdcd.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html
index 418c60c..7cf23c4 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html
@@ -64,2689 +64,2710 @@
 <span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.AsyncConnection;<a name="line.56"></a>
 <span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.AsyncTable;<a name="line.57"></a>
 <span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.BufferedMutator;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Get;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Put;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Result;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.111"></a>
-<span class="sourceLineNo">112</span><a name="line.112"></a>
-<span class="sourceLineNo">113</span>/**<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
-<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
-<span class="sourceLineNo">119</span> *<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
-<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
-<span class="sourceLineNo">124</span> *<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
-<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
-<span class="sourceLineNo">129</span> */<a name="line.129"></a>
-<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
-<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
-<span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // TODO : should we make this configurable<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private static final int TAG_LENGTH = 256;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  static {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        "Run async random read test");<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        "Run async random write test");<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.164"></a>
-<span class="sourceLineNo">165</span>        "Run async sequential read test");<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        "Run async sequential write test");<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        "Run async scan test (read every row)");<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      "Run random read test");<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      "Run random seek and scan 100 test");<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      "Run random write test");<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      "Run sequential read test");<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      "Run sequential write test");<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      "Run scan test (read every row)");<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "(make sure to use --rows=20)");<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  }<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * inner-class so we can find associated properties.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   */<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  protected static enum Counter {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    /** elapsed time */<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    ELAPSED_TIME,<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    /** number of rows */<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    public RunResult(long duration, Histogram hist) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      this.duration = duration;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.hist = hist;<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>    public final long duration;<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final Histogram hist;<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>    @Override<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    public String toString() {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      return Long.toString(duration);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>    @Override public int compareTo(RunResult o) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      return Long.compare(this.duration, o.duration);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
-<span class="sourceLineNo">234</span><a name="line.234"></a>
-<span class="sourceLineNo">235</span>  /**<a name="line.235"></a>
-<span class="sourceLineNo">236</span>   * Constructor<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * @param conf Configuration object<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   */<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    super(conf);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      String name, String description) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  /**<a name="line.249"></a>
-<span class="sourceLineNo">250</span>   * Implementations can have their status set.<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   */<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  interface Status {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    /**<a name="line.253"></a>
-<span class="sourceLineNo">254</span>     * Sets status<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * @param msg status message<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @throws IOException<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     */<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    void setStatus(final String msg) throws IOException;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  }<a name="line.259"></a>
-<span class="sourceLineNo">260</span><a name="line.260"></a>
-<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   */<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  public static class EvaluationMapTask<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>    /** configuration parameter name that contains the command */<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the PE impl */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>    @Override<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>      // this is required so that extensions of PE are instantiated within the<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // map reduce task...<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      try {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      } catch (Exception e) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      try {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        return Class.forName(className).asSubclass(type);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      } catch (ClassNotFoundException e) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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>    @Override<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.298"></a>
-<span class="sourceLineNo">299</span>           throws IOException, InterruptedException {<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>      Status status = new Status() {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        @Override<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        public void setStatus(String msg) {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>           context.setStatus(msg);<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><a name="line.307"></a>
-<span class="sourceLineNo">308</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      AsyncConnection asyncCon = null;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      try {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      } catch (ExecutionException e) {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>        throw new IOException(e);<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>      // Evaluation task<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      // Collect how much time the thing took. Report as map output and<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // to the ELAPSED_TIME counter.<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.progress();<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    }<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>  /*<a name="line.330"></a>
-<span class="sourceLineNo">331</span>   * If table does not already exist, create. Also create a table when<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   */<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      throw new IllegalStateException(<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    HTableDescriptor desc =<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    byte[][] splits = getSplits(opts);<a name="line.346"></a>
-<span class="sourceLineNo">347</span><a name="line.347"></a>
-<span class="sourceLineNo">348</span>    // recreate the table when user has requested presplit or when existing<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      needsDelete = true;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      // wait, why did it delete my table?!?<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        .add("needsDelete", needsDelete)<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("isReadCmd", isReadCmd)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("exists", exists)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("desc", desc)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("presplit", opts.presplitRegions)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("replicas", opts.replicas)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .toString());<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>    // remove an existing table<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    if (needsDelete) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      if (admin.isTableEnabled(tableName)) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        admin.disableTable(tableName);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      admin.deleteTable(tableName);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>    // table creation is necessary<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    if (!exists || needsDelete) {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      desc = getTableDescriptor(opts);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      if (splits != null) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        if (LOG.isDebugEnabled()) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<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>      admin.createTable(desc, splits);<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      LOG.info("Table " + desc + " created");<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    return admin.tableExists(tableName);<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>  /**<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setCompressionType(opts.compression);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setBloomFilterType(opts.bloomType);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBlocksize(opts.blockSize);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    if (opts.inMemoryCF) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      family.setInMemory(true);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    desc.addFamily(family);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      desc.setRegionReplication(opts.replicas);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    return desc;<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>  /**<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   * generates splits based on total number of rows and specified split regions<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   */<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      int rowkey = jump * (1 + i);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      splits[i] = format(rowkey);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return splits;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  }<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  /*<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * Run all clients in this vm each to its own thread.<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   */<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    assert cmd != null;<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    @SuppressWarnings("unchecked")<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      final int index = i;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        @Override<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        public RunResult call() throws Exception {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>            @Override<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            public void setStatus(final String msg) throws IOException {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>              LOG.info(msg);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>          });<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.459"></a>
-<span class="sourceLineNo">460</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          return run;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      });<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    }<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    pool.shutdown();<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      try {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        results[i] = threads[i].get();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      } catch (ExecutionException e) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>        throw new IOException(e.getCause());<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    final String test = cmd.getSimpleName();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.475"></a>
-<span class="sourceLineNo">476</span>             + Arrays.toString(results));<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    Arrays.sort(results);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    long total = 0;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    for (RunResult result : results) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      total += result.duration;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    LOG.info("[" + test + "]"<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      + "\tMin: " + results[0] + "ms"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.485"></a>
-<span class="sourceLineNo">486</span><a name="line.486"></a>
-<span class="sourceLineNo">487</span>    con.close();<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    asyncCon.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    return results;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  /*<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Before we start up the job, write out an input file with instruction<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * per client regards which row they are to start on.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * @param cmd Command to run.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @throws IOException<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   */<a name="line.499"></a>
-<span class="sourceLineNo">500</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    assert cmd != null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    Job job = Job.getInstance(conf);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.509"></a>
-<span class="sourceLineNo">510</span><a name="line.510"></a>
-<span class="sourceLineNo">511</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    // this is default, but be explicit about it just in case.<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.514"></a>
-<span class="sourceLineNo">515</span><a name="line.515"></a>
-<span class="sourceLineNo">516</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputValueClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setReducerClass(LongSumReducer.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>    job.setNumReduceTasks(1);<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      Histogram.class,     // yammer metrics<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      );<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>    TableMapReduceUtil.initCredentials(job);<a name="line.534"></a>
-<span class="sourceLineNo">535</span><a name="line.535"></a>
-<span class="sourceLineNo">536</span>    job.waitForCompletion(true);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    return job;<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>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<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>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>  /*<a name="line.546"></a>
-<span class="sourceLineNo">547</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * @param c Configuration<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<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>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    return writeInputFile(c, opts, new Path("."));<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.556"></a>
-<span class="sourceLineNo">557</span>  throws IOException {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>    FileSystem fs = FileSystem.get(c);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    fs.mkdirs(inputDir);<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    // Make input random.<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Hash h = MurmurHash.getInstance();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    try {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>        TestOptions next = new TestOptions(opts);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        next.startRow = j * perClientRows;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.perClientRunRows = perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        String s = MAPPER.writeValueAsString(next);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        byte[] b = Bytes.toBytes(s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        m.put(hash, s);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>        out.println(e.getValue());<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    } finally {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      out.close();<a name="line.586"></a>
-<span class="sourceLineNo">587</span>    }<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    return inputDir;<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>   * Describes a command.<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   */<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  static class CmdDescriptor {<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private String name;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String description;<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      this.cmdClass = cmdClass;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.name = name;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.description = description;<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>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>      return cmdClass;<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>    public String getName() {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>      return name;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    public String getDescription() {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>      return description;<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><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * This makes tracking all these arguments a little easier.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>  static class TestOptions {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    String cmdName = null;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    boolean nomapred = false;<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    boolean filterAll = false;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    int startRow = 0;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    float size = 1.0f;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    int perClientRunRows = DEFAULT_ROWS_PER_GB;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    int numClientThreads = 1;<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    int totalRows = DEFAULT_ROWS_PER_GB;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    int measureAfter = 0;<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    float sampleRate = 1.0f;<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    double traceRate = 0.0;<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    String tableName = TABLE_NAME;<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    boolean flushCommits = true;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    boolean writeToWAL = true;<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    boolean autoFlush = false;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    boolean oneCon = false;<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    boolean useTags = false;<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    int noOfTags = 1;<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    boolean reportLatency = false;<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    int multiGet = 0;<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    int randomSleep = 0;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    boolean inMemoryCF = false;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    int presplitRegions = 0;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    int replicas = HTableDescriptor.DEFAULT_REGION_REPLICATION;<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    String splitPolicy = null;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    Compression.Algorithm compression = Compression.Algorithm.NONE;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    BloomType bloomType = BloomType.ROW;<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    int blockSize = HConstants.DEFAULT_BLOCKSIZE;<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    DataBlockEncoding blockEncoding = DataBlockEncoding.NONE;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    boolean valueRandom = false;<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    boolean valueZipf = false;<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    int valueSize = DEFAULT_VALUE_LENGTH;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    int period = (this.perClientRunRows / 10) == 0? perClientRunRows: perClientRunRows / 10;<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    int cycles = 1;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    int columns = 1;<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    int caching = 30;<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    boolean addColumns = true;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    MemoryCompactionPolicy inMemoryCompaction =<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        MemoryCompactionPolicy.valueOf(<a name="line.664"></a>
-<span class="sourceLineNo">665</span>            CompactingMemStore.COMPACTING_MEMSTORE_TYPE_DEFAULT);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    boolean asyncPrefetch = false;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    boolean cacheBlocks = true;<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    Scan.ReadType scanReadType = Scan.ReadType.DEFAULT;<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>    public TestOptions() {}<a name="line.670"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.BufferedMutatorParams;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Get;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Put;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.Result;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.Table;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.LongWritable;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.io.Text;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Job;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.Tool;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.hadoop.util.ToolRunner;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.Sampler;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.htrace.core.TraceScope;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.Logger;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.slf4j.LoggerFactory;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * command-line which test to run and how many clients are participating in<a name="line.118"></a>
+<span class="sourceLineNo">119</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.119"></a>
+<span class="sourceLineNo">120</span> *<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.123"></a>
+<span class="sourceLineNo">124</span> * paper, pages 8-10.<a name="line.124"></a>
+<span class="sourceLineNo">125</span> *<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.128"></a>
+<span class="sourceLineNo">129</span> * specified otherwise.<a name="line.129"></a>
+<span class="sourceLineNo">130</span> */<a name="line.130"></a>
+<span class="sourceLineNo">131</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.131"></a>
+<span class="sourceLineNo">132</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  static final String RANDOM_READ = "randomRead";<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  static {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  }<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
+<span class="sourceLineNo">156</span><a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
+<span class="sourceLineNo">243</span><a name="line.243"></a>
+<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
+<span class="sourceLineNo">249</span><a name="line.249"></a>
+<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
+<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
+<span class="sourceLineNo">261</span><a name="line.261"></a>
+<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
+<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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><a name="line.297"></a>
+<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
+<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        }<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>      ObjectMapper mapper = new Obje

<TRUNCATED>

[16/44] hbase-site git commit: Published site at 8e6ff689e806138e602a46730886d8c5f524fdcd.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange100Test.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange100Test.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange100Test.html
index 418c60c..7cf23c4 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange100Test.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange100Test.html
@@ -64,2689 +64,2710 @@
 <span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.AsyncConnection;<a name="line.56"></a>
 <span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.AsyncTable;<a name="line.57"></a>
 <span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.BufferedMutator;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Get;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Put;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Result;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.111"></a>
-<span class="sourceLineNo">112</span><a name="line.112"></a>
-<span class="sourceLineNo">113</span>/**<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
-<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
-<span class="sourceLineNo">119</span> *<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
-<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
-<span class="sourceLineNo">124</span> *<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
-<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
-<span class="sourceLineNo">129</span> */<a name="line.129"></a>
-<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
-<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
-<span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // TODO : should we make this configurable<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private static final int TAG_LENGTH = 256;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  static {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        "Run async random read test");<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        "Run async random write test");<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.164"></a>
-<span class="sourceLineNo">165</span>        "Run async sequential read test");<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        "Run async sequential write test");<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        "Run async scan test (read every row)");<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      "Run random read test");<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      "Run random seek and scan 100 test");<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      "Run random write test");<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      "Run sequential read test");<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      "Run sequential write test");<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      "Run scan test (read every row)");<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "(make sure to use --rows=20)");<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  }<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * inner-class so we can find associated properties.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   */<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  protected static enum Counter {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    /** elapsed time */<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    ELAPSED_TIME,<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    /** number of rows */<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    public RunResult(long duration, Histogram hist) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      this.duration = duration;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.hist = hist;<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>    public final long duration;<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final Histogram hist;<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>    @Override<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    public String toString() {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      return Long.toString(duration);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>    @Override public int compareTo(RunResult o) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      return Long.compare(this.duration, o.duration);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
-<span class="sourceLineNo">234</span><a name="line.234"></a>
-<span class="sourceLineNo">235</span>  /**<a name="line.235"></a>
-<span class="sourceLineNo">236</span>   * Constructor<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * @param conf Configuration object<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   */<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    super(conf);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      String name, String description) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  /**<a name="line.249"></a>
-<span class="sourceLineNo">250</span>   * Implementations can have their status set.<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   */<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  interface Status {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    /**<a name="line.253"></a>
-<span class="sourceLineNo">254</span>     * Sets status<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * @param msg status message<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @throws IOException<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     */<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    void setStatus(final String msg) throws IOException;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  }<a name="line.259"></a>
-<span class="sourceLineNo">260</span><a name="line.260"></a>
-<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   */<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  public static class EvaluationMapTask<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>    /** configuration parameter name that contains the command */<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the PE impl */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>    @Override<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>      // this is required so that extensions of PE are instantiated within the<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // map reduce task...<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      try {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      } catch (Exception e) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      try {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        return Class.forName(className).asSubclass(type);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      } catch (ClassNotFoundException e) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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>    @Override<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.298"></a>
-<span class="sourceLineNo">299</span>           throws IOException, InterruptedException {<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>      Status status = new Status() {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        @Override<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        public void setStatus(String msg) {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>           context.setStatus(msg);<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><a name="line.307"></a>
-<span class="sourceLineNo">308</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      AsyncConnection asyncCon = null;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      try {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      } catch (ExecutionException e) {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>        throw new IOException(e);<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>      // Evaluation task<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      // Collect how much time the thing took. Report as map output and<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // to the ELAPSED_TIME counter.<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.progress();<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    }<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>  /*<a name="line.330"></a>
-<span class="sourceLineNo">331</span>   * If table does not already exist, create. Also create a table when<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   */<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      throw new IllegalStateException(<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    HTableDescriptor desc =<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    byte[][] splits = getSplits(opts);<a name="line.346"></a>
-<span class="sourceLineNo">347</span><a name="line.347"></a>
-<span class="sourceLineNo">348</span>    // recreate the table when user has requested presplit or when existing<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      needsDelete = true;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      // wait, why did it delete my table?!?<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        .add("needsDelete", needsDelete)<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("isReadCmd", isReadCmd)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("exists", exists)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("desc", desc)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("presplit", opts.presplitRegions)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("replicas", opts.replicas)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .toString());<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>    // remove an existing table<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    if (needsDelete) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      if (admin.isTableEnabled(tableName)) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        admin.disableTable(tableName);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      admin.deleteTable(tableName);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>    // table creation is necessary<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    if (!exists || needsDelete) {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      desc = getTableDescriptor(opts);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      if (splits != null) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        if (LOG.isDebugEnabled()) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<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>      admin.createTable(desc, splits);<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      LOG.info("Table " + desc + " created");<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    return admin.tableExists(tableName);<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>  /**<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setCompressionType(opts.compression);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setBloomFilterType(opts.bloomType);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBlocksize(opts.blockSize);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    if (opts.inMemoryCF) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      family.setInMemory(true);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    desc.addFamily(family);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      desc.setRegionReplication(opts.replicas);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    return desc;<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>  /**<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   * generates splits based on total number of rows and specified split regions<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   */<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      int rowkey = jump * (1 + i);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      splits[i] = format(rowkey);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return splits;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  }<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  /*<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * Run all clients in this vm each to its own thread.<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   */<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    assert cmd != null;<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    @SuppressWarnings("unchecked")<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      final int index = i;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        @Override<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        public RunResult call() throws Exception {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>            @Override<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            public void setStatus(final String msg) throws IOException {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>              LOG.info(msg);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>          });<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.459"></a>
-<span class="sourceLineNo">460</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          return run;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      });<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    }<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    pool.shutdown();<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      try {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        results[i] = threads[i].get();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      } catch (ExecutionException e) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>        throw new IOException(e.getCause());<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    final String test = cmd.getSimpleName();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.475"></a>
-<span class="sourceLineNo">476</span>             + Arrays.toString(results));<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    Arrays.sort(results);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    long total = 0;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    for (RunResult result : results) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      total += result.duration;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    LOG.info("[" + test + "]"<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      + "\tMin: " + results[0] + "ms"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.485"></a>
-<span class="sourceLineNo">486</span><a name="line.486"></a>
-<span class="sourceLineNo">487</span>    con.close();<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    asyncCon.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    return results;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  /*<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Before we start up the job, write out an input file with instruction<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * per client regards which row they are to start on.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * @param cmd Command to run.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @throws IOException<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   */<a name="line.499"></a>
-<span class="sourceLineNo">500</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    assert cmd != null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    Job job = Job.getInstance(conf);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.509"></a>
-<span class="sourceLineNo">510</span><a name="line.510"></a>
-<span class="sourceLineNo">511</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    // this is default, but be explicit about it just in case.<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.514"></a>
-<span class="sourceLineNo">515</span><a name="line.515"></a>
-<span class="sourceLineNo">516</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputValueClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setReducerClass(LongSumReducer.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>    job.setNumReduceTasks(1);<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      Histogram.class,     // yammer metrics<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      );<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>    TableMapReduceUtil.initCredentials(job);<a name="line.534"></a>
-<span class="sourceLineNo">535</span><a name="line.535"></a>
-<span class="sourceLineNo">536</span>    job.waitForCompletion(true);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    return job;<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>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<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>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>  /*<a name="line.546"></a>
-<span class="sourceLineNo">547</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * @param c Configuration<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<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>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    return writeInputFile(c, opts, new Path("."));<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.556"></a>
-<span class="sourceLineNo">557</span>  throws IOException {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>    FileSystem fs = FileSystem.get(c);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    fs.mkdirs(inputDir);<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    // Make input random.<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Hash h = MurmurHash.getInstance();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    try {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>        TestOptions next = new TestOptions(opts);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        next.startRow = j * perClientRows;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.perClientRunRows = perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        String s = MAPPER.writeValueAsString(next);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        byte[] b = Bytes.toBytes(s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        m.put(hash, s);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>        out.println(e.getValue());<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    } finally {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      out.close();<a name="line.586"></a>
-<span class="sourceLineNo">587</span>    }<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    return inputDir;<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>   * Describes a command.<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   */<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  static class CmdDescriptor {<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private String name;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String description;<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      this.cmdClass = cmdClass;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.name = name;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.description = description;<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>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>      return cmdClass;<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>    public String getName() {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>      return name;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    public String getDescription() {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>      return description;<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><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * This makes tracking all these arguments a little easier.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>  static class TestOptions {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    String cmdName = null;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    boolean nomapred = false;<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    boolean filterAll = false;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    int startRow = 0;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    float size = 1.0f;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    int perClientRunRows = DEFAULT_ROWS_PER_GB;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    int numClientThreads = 1;<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    int totalRows = DEFAULT_ROWS_PER_GB;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    int measureAfter = 0;<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    float sampleRate = 1.0f;<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    double traceRate = 0.0;<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    String tableName = TABLE_NAME;<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    boolean flushCommits = true;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    boolean writeToWAL = true;<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    boolean autoFlush = false;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    boolean oneCon = false;<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    boolean useTags = false;<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    int noOfTags = 1;<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    boolean reportLatency = false;<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    int multiGet = 0;<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    int randomSleep = 0;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    boolean inMemoryCF = false;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    int presplitRegions = 0;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    int replicas = HTableDescriptor.DEFAULT_REGION_REPLICATION;<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    String splitPolicy = null;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    Compression.Algorithm compression = Compression.Algorithm.NONE;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    BloomType bloomType = BloomType.ROW;<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    int blockSize = HConstants.DEFAULT_BLOCKSIZE;<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    DataBlockEncoding blockEncoding = DataBlockEncoding.NONE;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    boolean valueRandom = false;<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    boolean valueZipf = false;<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    int valueSize = DEFAULT_VALUE_LENGTH;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    int period = (this.perClientRunRows / 10) == 0? perClientRunRows: perClientRunRows / 10;<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    int cycles = 1;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    int columns = 1;<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    int caching = 30;<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    boolean addColumns = true;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    MemoryCompactionPolicy inMemoryCompaction =<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        MemoryCompactionPolicy.valueOf(<a name="line.664"></a>
-<span class="sourceLineNo">665</span>            CompactingMemStore.COMPACTING_MEMSTORE_TYPE_DEFAULT);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    boolean asyncPrefetch = false;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    boolean cacheBlocks = true;<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    Scan.ReadType scanReadType = Scan.ReadType.DEFAULT;<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>    public TestOptions() {}<a name="line.670"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.BufferedMutatorParams;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Get;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Put;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.Result;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.Table;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.LongWritable;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.io.Text;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Job;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.Tool;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.hadoop.util.ToolRunner;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.Sampler;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.htrace.core.TraceScope;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.Logger;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.slf4j.LoggerFactory;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * command-line which test to run and how many clients are participating in<a name="line.118"></a>
+<span class="sourceLineNo">119</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.119"></a>
+<span class="sourceLineNo">120</span> *<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.123"></a>
+<span class="sourceLineNo">124</span> * paper, pages 8-10.<a name="line.124"></a>
+<span class="sourceLineNo">125</span> *<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.128"></a>
+<span class="sourceLineNo">129</span> * specified otherwise.<a name="line.129"></a>
+<span class="sourceLineNo">130</span> */<a name="line.130"></a>
+<span class="sourceLineNo">131</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.131"></a>
+<span class="sourceLineNo">132</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  static final String RANDOM_READ = "randomRead";<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  static {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  }<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
+<span class="sourceLineNo">156</span><a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
+<span class="sourceLineNo">243</span><a name="line.243"></a>
+<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
+<span class="sourceLineNo">249</span><a name="line.249"></a>
+<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
+<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
+<span class="sourceLineNo">261</span><a name="line.261"></a>
+<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
+<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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><a name="line.297"></a>
+<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
+<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        }<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> 

<TRUNCATED>

[05/44] hbase-site git commit: Published site at 8e6ff689e806138e602a46730886d8c5f524fdcd.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Test.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Test.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Test.html
index 418c60c..7cf23c4 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Test.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Test.html
@@ -64,2689 +64,2710 @@
 <span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.AsyncConnection;<a name="line.56"></a>
 <span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.AsyncTable;<a name="line.57"></a>
 <span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.BufferedMutator;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Get;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Put;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Result;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.111"></a>
-<span class="sourceLineNo">112</span><a name="line.112"></a>
-<span class="sourceLineNo">113</span>/**<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
-<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
-<span class="sourceLineNo">119</span> *<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
-<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
-<span class="sourceLineNo">124</span> *<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
-<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
-<span class="sourceLineNo">129</span> */<a name="line.129"></a>
-<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
-<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
-<span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // TODO : should we make this configurable<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private static final int TAG_LENGTH = 256;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  static {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        "Run async random read test");<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        "Run async random write test");<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.164"></a>
-<span class="sourceLineNo">165</span>        "Run async sequential read test");<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        "Run async sequential write test");<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        "Run async scan test (read every row)");<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      "Run random read test");<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      "Run random seek and scan 100 test");<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      "Run random write test");<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      "Run sequential read test");<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      "Run sequential write test");<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      "Run scan test (read every row)");<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "(make sure to use --rows=20)");<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  }<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * inner-class so we can find associated properties.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   */<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  protected static enum Counter {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    /** elapsed time */<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    ELAPSED_TIME,<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    /** number of rows */<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    public RunResult(long duration, Histogram hist) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      this.duration = duration;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.hist = hist;<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>    public final long duration;<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final Histogram hist;<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>    @Override<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    public String toString() {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      return Long.toString(duration);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>    @Override public int compareTo(RunResult o) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      return Long.compare(this.duration, o.duration);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
-<span class="sourceLineNo">234</span><a name="line.234"></a>
-<span class="sourceLineNo">235</span>  /**<a name="line.235"></a>
-<span class="sourceLineNo">236</span>   * Constructor<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * @param conf Configuration object<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   */<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    super(conf);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      String name, String description) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  /**<a name="line.249"></a>
-<span class="sourceLineNo">250</span>   * Implementations can have their status set.<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   */<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  interface Status {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    /**<a name="line.253"></a>
-<span class="sourceLineNo">254</span>     * Sets status<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * @param msg status message<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @throws IOException<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     */<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    void setStatus(final String msg) throws IOException;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  }<a name="line.259"></a>
-<span class="sourceLineNo">260</span><a name="line.260"></a>
-<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   */<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  public static class EvaluationMapTask<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>    /** configuration parameter name that contains the command */<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the PE impl */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>    @Override<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>      // this is required so that extensions of PE are instantiated within the<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // map reduce task...<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      try {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      } catch (Exception e) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      try {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        return Class.forName(className).asSubclass(type);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      } catch (ClassNotFoundException e) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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>    @Override<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.298"></a>
-<span class="sourceLineNo">299</span>           throws IOException, InterruptedException {<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>      Status status = new Status() {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        @Override<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        public void setStatus(String msg) {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>           context.setStatus(msg);<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><a name="line.307"></a>
-<span class="sourceLineNo">308</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      AsyncConnection asyncCon = null;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      try {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      } catch (ExecutionException e) {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>        throw new IOException(e);<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>      // Evaluation task<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      // Collect how much time the thing took. Report as map output and<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // to the ELAPSED_TIME counter.<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.progress();<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    }<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>  /*<a name="line.330"></a>
-<span class="sourceLineNo">331</span>   * If table does not already exist, create. Also create a table when<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   */<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      throw new IllegalStateException(<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    HTableDescriptor desc =<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    byte[][] splits = getSplits(opts);<a name="line.346"></a>
-<span class="sourceLineNo">347</span><a name="line.347"></a>
-<span class="sourceLineNo">348</span>    // recreate the table when user has requested presplit or when existing<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      needsDelete = true;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      // wait, why did it delete my table?!?<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        .add("needsDelete", needsDelete)<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("isReadCmd", isReadCmd)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("exists", exists)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("desc", desc)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("presplit", opts.presplitRegions)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("replicas", opts.replicas)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .toString());<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>    // remove an existing table<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    if (needsDelete) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      if (admin.isTableEnabled(tableName)) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        admin.disableTable(tableName);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      admin.deleteTable(tableName);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>    // table creation is necessary<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    if (!exists || needsDelete) {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      desc = getTableDescriptor(opts);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      if (splits != null) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        if (LOG.isDebugEnabled()) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<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>      admin.createTable(desc, splits);<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      LOG.info("Table " + desc + " created");<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    return admin.tableExists(tableName);<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>  /**<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setCompressionType(opts.compression);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setBloomFilterType(opts.bloomType);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBlocksize(opts.blockSize);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    if (opts.inMemoryCF) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      family.setInMemory(true);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    desc.addFamily(family);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      desc.setRegionReplication(opts.replicas);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    return desc;<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>  /**<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   * generates splits based on total number of rows and specified split regions<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   */<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      int rowkey = jump * (1 + i);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      splits[i] = format(rowkey);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return splits;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  }<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  /*<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * Run all clients in this vm each to its own thread.<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   */<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    assert cmd != null;<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    @SuppressWarnings("unchecked")<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      final int index = i;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        @Override<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        public RunResult call() throws Exception {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>            @Override<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            public void setStatus(final String msg) throws IOException {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>              LOG.info(msg);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>          });<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.459"></a>
-<span class="sourceLineNo">460</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          return run;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      });<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    }<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    pool.shutdown();<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      try {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        results[i] = threads[i].get();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      } catch (ExecutionException e) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>        throw new IOException(e.getCause());<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    final String test = cmd.getSimpleName();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.475"></a>
-<span class="sourceLineNo">476</span>             + Arrays.toString(results));<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    Arrays.sort(results);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    long total = 0;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    for (RunResult result : results) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      total += result.duration;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    LOG.info("[" + test + "]"<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      + "\tMin: " + results[0] + "ms"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.485"></a>
-<span class="sourceLineNo">486</span><a name="line.486"></a>
-<span class="sourceLineNo">487</span>    con.close();<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    asyncCon.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    return results;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  /*<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Before we start up the job, write out an input file with instruction<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * per client regards which row they are to start on.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * @param cmd Command to run.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @throws IOException<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   */<a name="line.499"></a>
-<span class="sourceLineNo">500</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    assert cmd != null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    Job job = Job.getInstance(conf);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.509"></a>
-<span class="sourceLineNo">510</span><a name="line.510"></a>
-<span class="sourceLineNo">511</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    // this is default, but be explicit about it just in case.<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.514"></a>
-<span class="sourceLineNo">515</span><a name="line.515"></a>
-<span class="sourceLineNo">516</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputValueClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setReducerClass(LongSumReducer.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>    job.setNumReduceTasks(1);<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      Histogram.class,     // yammer metrics<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      );<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>    TableMapReduceUtil.initCredentials(job);<a name="line.534"></a>
-<span class="sourceLineNo">535</span><a name="line.535"></a>
-<span class="sourceLineNo">536</span>    job.waitForCompletion(true);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    return job;<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>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<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>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>  /*<a name="line.546"></a>
-<span class="sourceLineNo">547</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * @param c Configuration<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<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>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    return writeInputFile(c, opts, new Path("."));<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.556"></a>
-<span class="sourceLineNo">557</span>  throws IOException {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>    FileSystem fs = FileSystem.get(c);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    fs.mkdirs(inputDir);<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    // Make input random.<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Hash h = MurmurHash.getInstance();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    try {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>        TestOptions next = new TestOptions(opts);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        next.startRow = j * perClientRows;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.perClientRunRows = perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        String s = MAPPER.writeValueAsString(next);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        byte[] b = Bytes.toBytes(s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        m.put(hash, s);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>        out.println(e.getValue());<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    } finally {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      out.close();<a name="line.586"></a>
-<span class="sourceLineNo">587</span>    }<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    return inputDir;<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>   * Describes a command.<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   */<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  static class CmdDescriptor {<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private String name;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String description;<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      this.cmdClass = cmdClass;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.name = name;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.description = description;<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>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>      return cmdClass;<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>    public String getName() {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>      return name;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    public String getDescription() {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>      return description;<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><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * This makes tracking all these arguments a little easier.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>  static class TestOptions {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    String cmdName = null;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    boolean nomapred = false;<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    boolean filterAll = false;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    int startRow = 0;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    float size = 1.0f;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    int perClientRunRows = DEFAULT_ROWS_PER_GB;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    int numClientThreads = 1;<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    int totalRows = DEFAULT_ROWS_PER_GB;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    int measureAfter = 0;<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    float sampleRate = 1.0f;<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    double traceRate = 0.0;<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    String tableName = TABLE_NAME;<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    boolean flushCommits = true;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    boolean writeToWAL = true;<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    boolean autoFlush = false;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    boolean oneCon = false;<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    boolean useTags = false;<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    int noOfTags = 1;<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    boolean reportLatency = false;<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    int multiGet = 0;<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    int randomSleep = 0;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    boolean inMemoryCF = false;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    int presplitRegions = 0;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    int replicas = HTableDescriptor.DEFAULT_REGION_REPLICATION;<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    String splitPolicy = null;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    Compression.Algorithm compression = Compression.Algorithm.NONE;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    BloomType bloomType = BloomType.ROW;<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    int blockSize = HConstants.DEFAULT_BLOCKSIZE;<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    DataBlockEncoding blockEncoding = DataBlockEncoding.NONE;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    boolean valueRandom = false;<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    boolean valueZipf = false;<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    int valueSize = DEFAULT_VALUE_LENGTH;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    int period = (this.perClientRunRows / 10) == 0? perClientRunRows: perClientRunRows / 10;<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    int cycles = 1;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    int columns = 1;<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    int caching = 30;<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    boolean addColumns = true;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    MemoryCompactionPolicy inMemoryCompaction =<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        MemoryCompactionPolicy.valueOf(<a name="line.664"></a>
-<span class="sourceLineNo">665</span>            CompactingMemStore.COMPACTING_MEMSTORE_TYPE_DEFAULT);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    boolean asyncPrefetch = false;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    boolean cacheBlocks = true;<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    Scan.ReadType scanReadType = Scan.ReadType.DEFAULT;<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>    public TestOptions() {}<a name="line.670"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.BufferedMutatorParams;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Get;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Put;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.Result;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.Table;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.LongWritable;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.io.Text;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Job;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.Tool;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.hadoop.util.ToolRunner;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.Sampler;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.htrace.core.TraceScope;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.Logger;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.slf4j.LoggerFactory;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * command-line which test to run and how many clients are participating in<a name="line.118"></a>
+<span class="sourceLineNo">119</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.119"></a>
+<span class="sourceLineNo">120</span> *<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.123"></a>
+<span class="sourceLineNo">124</span> * paper, pages 8-10.<a name="line.124"></a>
+<span class="sourceLineNo">125</span> *<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.128"></a>
+<span class="sourceLineNo">129</span> * specified otherwise.<a name="line.129"></a>
+<span class="sourceLineNo">130</span> */<a name="line.130"></a>
+<span class="sourceLineNo">131</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.131"></a>
+<span class="sourceLineNo">132</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  static final String RANDOM_READ = "randomRead";<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  static {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  }<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
+<span class="sourceLineNo">156</span><a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
+<span class="sourceLineNo">243</span><a name="line.243"></a>
+<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
+<span class="sourceLineNo">249</span><a name="line.249"></a>
+<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
+<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
+<span class="sourceLineNo">261</span><a name="line.261"></a>
+<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
+<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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><a name="line.297"></a>
+<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
+<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        }<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>      ObjectMapper mapper = new ObjectMapper();<a name="line.309"></a>
+<span class="sourceLineNo">310</span>  

<TRUNCATED>

[06/44] hbase-site git commit: Published site at 8e6ff689e806138e602a46730886d8c5f524fdcd.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html
index 418c60c..7cf23c4 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html
@@ -64,2689 +64,2710 @@
 <span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.AsyncConnection;<a name="line.56"></a>
 <span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.AsyncTable;<a name="line.57"></a>
 <span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.BufferedMutator;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Get;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Put;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Result;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.111"></a>
-<span class="sourceLineNo">112</span><a name="line.112"></a>
-<span class="sourceLineNo">113</span>/**<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
-<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
-<span class="sourceLineNo">119</span> *<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
-<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
-<span class="sourceLineNo">124</span> *<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
-<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
-<span class="sourceLineNo">129</span> */<a name="line.129"></a>
-<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
-<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
-<span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // TODO : should we make this configurable<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private static final int TAG_LENGTH = 256;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  static {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        "Run async random read test");<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        "Run async random write test");<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.164"></a>
-<span class="sourceLineNo">165</span>        "Run async sequential read test");<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        "Run async sequential write test");<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        "Run async scan test (read every row)");<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      "Run random read test");<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      "Run random seek and scan 100 test");<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      "Run random write test");<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      "Run sequential read test");<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      "Run sequential write test");<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      "Run scan test (read every row)");<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "(make sure to use --rows=20)");<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  }<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * inner-class so we can find associated properties.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   */<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  protected static enum Counter {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    /** elapsed time */<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    ELAPSED_TIME,<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    /** number of rows */<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    public RunResult(long duration, Histogram hist) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      this.duration = duration;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.hist = hist;<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>    public final long duration;<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final Histogram hist;<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>    @Override<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    public String toString() {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      return Long.toString(duration);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>    @Override public int compareTo(RunResult o) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      return Long.compare(this.duration, o.duration);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
-<span class="sourceLineNo">234</span><a name="line.234"></a>
-<span class="sourceLineNo">235</span>  /**<a name="line.235"></a>
-<span class="sourceLineNo">236</span>   * Constructor<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * @param conf Configuration object<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   */<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    super(conf);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      String name, String description) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  /**<a name="line.249"></a>
-<span class="sourceLineNo">250</span>   * Implementations can have their status set.<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   */<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  interface Status {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    /**<a name="line.253"></a>
-<span class="sourceLineNo">254</span>     * Sets status<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * @param msg status message<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @throws IOException<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     */<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    void setStatus(final String msg) throws IOException;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  }<a name="line.259"></a>
-<span class="sourceLineNo">260</span><a name="line.260"></a>
-<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   */<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  public static class EvaluationMapTask<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>    /** configuration parameter name that contains the command */<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the PE impl */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>    @Override<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>      // this is required so that extensions of PE are instantiated within the<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // map reduce task...<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      try {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      } catch (Exception e) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      try {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        return Class.forName(className).asSubclass(type);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      } catch (ClassNotFoundException e) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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>    @Override<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.298"></a>
-<span class="sourceLineNo">299</span>           throws IOException, InterruptedException {<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>      Status status = new Status() {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        @Override<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        public void setStatus(String msg) {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>           context.setStatus(msg);<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><a name="line.307"></a>
-<span class="sourceLineNo">308</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      AsyncConnection asyncCon = null;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      try {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      } catch (ExecutionException e) {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>        throw new IOException(e);<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>      // Evaluation task<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      // Collect how much time the thing took. Report as map output and<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // to the ELAPSED_TIME counter.<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.progress();<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    }<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>  /*<a name="line.330"></a>
-<span class="sourceLineNo">331</span>   * If table does not already exist, create. Also create a table when<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   */<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      throw new IllegalStateException(<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    HTableDescriptor desc =<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    byte[][] splits = getSplits(opts);<a name="line.346"></a>
-<span class="sourceLineNo">347</span><a name="line.347"></a>
-<span class="sourceLineNo">348</span>    // recreate the table when user has requested presplit or when existing<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      needsDelete = true;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      // wait, why did it delete my table?!?<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        .add("needsDelete", needsDelete)<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("isReadCmd", isReadCmd)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("exists", exists)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("desc", desc)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("presplit", opts.presplitRegions)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("replicas", opts.replicas)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .toString());<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>    // remove an existing table<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    if (needsDelete) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      if (admin.isTableEnabled(tableName)) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        admin.disableTable(tableName);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      admin.deleteTable(tableName);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>    // table creation is necessary<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    if (!exists || needsDelete) {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      desc = getTableDescriptor(opts);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      if (splits != null) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        if (LOG.isDebugEnabled()) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<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>      admin.createTable(desc, splits);<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      LOG.info("Table " + desc + " created");<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    return admin.tableExists(tableName);<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>  /**<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setCompressionType(opts.compression);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setBloomFilterType(opts.bloomType);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBlocksize(opts.blockSize);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    if (opts.inMemoryCF) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      family.setInMemory(true);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    desc.addFamily(family);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      desc.setRegionReplication(opts.replicas);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    return desc;<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>  /**<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   * generates splits based on total number of rows and specified split regions<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   */<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      int rowkey = jump * (1 + i);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      splits[i] = format(rowkey);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return splits;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  }<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  /*<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * Run all clients in this vm each to its own thread.<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   */<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    assert cmd != null;<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    @SuppressWarnings("unchecked")<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      final int index = i;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        @Override<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        public RunResult call() throws Exception {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>            @Override<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            public void setStatus(final String msg) throws IOException {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>              LOG.info(msg);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>          });<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.459"></a>
-<span class="sourceLineNo">460</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          return run;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      });<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    }<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    pool.shutdown();<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      try {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        results[i] = threads[i].get();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      } catch (ExecutionException e) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>        throw new IOException(e.getCause());<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    final String test = cmd.getSimpleName();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.475"></a>
-<span class="sourceLineNo">476</span>             + Arrays.toString(results));<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    Arrays.sort(results);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    long total = 0;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    for (RunResult result : results) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      total += result.duration;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    LOG.info("[" + test + "]"<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      + "\tMin: " + results[0] + "ms"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.485"></a>
-<span class="sourceLineNo">486</span><a name="line.486"></a>
-<span class="sourceLineNo">487</span>    con.close();<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    asyncCon.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    return results;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  /*<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Before we start up the job, write out an input file with instruction<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * per client regards which row they are to start on.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * @param cmd Command to run.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @throws IOException<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   */<a name="line.499"></a>
-<span class="sourceLineNo">500</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    assert cmd != null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    Job job = Job.getInstance(conf);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.509"></a>
-<span class="sourceLineNo">510</span><a name="line.510"></a>
-<span class="sourceLineNo">511</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    // this is default, but be explicit about it just in case.<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.514"></a>
-<span class="sourceLineNo">515</span><a name="line.515"></a>
-<span class="sourceLineNo">516</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputValueClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setReducerClass(LongSumReducer.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>    job.setNumReduceTasks(1);<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      Histogram.class,     // yammer metrics<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      );<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>    TableMapReduceUtil.initCredentials(job);<a name="line.534"></a>
-<span class="sourceLineNo">535</span><a name="line.535"></a>
-<span class="sourceLineNo">536</span>    job.waitForCompletion(true);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    return job;<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>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<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>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>  /*<a name="line.546"></a>
-<span class="sourceLineNo">547</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * @param c Configuration<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<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>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    return writeInputFile(c, opts, new Path("."));<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.556"></a>
-<span class="sourceLineNo">557</span>  throws IOException {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>    FileSystem fs = FileSystem.get(c);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    fs.mkdirs(inputDir);<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    // Make input random.<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Hash h = MurmurHash.getInstance();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    try {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>        TestOptions next = new TestOptions(opts);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        next.startRow = j * perClientRows;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.perClientRunRows = perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        String s = MAPPER.writeValueAsString(next);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        byte[] b = Bytes.toBytes(s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        m.put(hash, s);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>        out.println(e.getValue());<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    } finally {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      out.close();<a name="line.586"></a>
-<span class="sourceLineNo">587</span>    }<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    return inputDir;<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>   * Describes a command.<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   */<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  static class CmdDescriptor {<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private String name;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String description;<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      this.cmdClass = cmdClass;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.name = name;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.description = description;<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>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>      return cmdClass;<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>    public String getName() {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>      return name;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    public String getDescription() {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>      return description;<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><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * This makes tracking all these arguments a little easier.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>  static class TestOptions {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    String cmdName = null;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    boolean nomapred = false;<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    boolean filterAll = false;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    int startRow = 0;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    float size = 1.0f;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    int perClientRunRows = DEFAULT_ROWS_PER_GB;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    int numClientThreads = 1;<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    int totalRows = DEFAULT_ROWS_PER_GB;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    int measureAfter = 0;<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    float sampleRate = 1.0f;<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    double traceRate = 0.0;<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    String tableName = TABLE_NAME;<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    boolean flushCommits = true;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    boolean writeToWAL = true;<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    boolean autoFlush = false;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    boolean oneCon = false;<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    boolean useTags = false;<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    int noOfTags = 1;<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    boolean reportLatency = false;<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    int multiGet = 0;<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    int randomSleep = 0;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    boolean inMemoryCF = false;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    int presplitRegions = 0;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    int replicas = HTableDescriptor.DEFAULT_REGION_REPLICATION;<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    String splitPolicy = null;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    Compression.Algorithm compression = Compression.Algorithm.NONE;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    BloomType bloomType = BloomType.ROW;<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    int blockSize = HConstants.DEFAULT_BLOCKSIZE;<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    DataBlockEncoding blockEncoding = DataBlockEncoding.NONE;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    boolean valueRandom = false;<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    boolean valueZipf = false;<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    int valueSize = DEFAULT_VALUE_LENGTH;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    int period = (this.perClientRunRows / 10) == 0? perClientRunRows: perClientRunRows / 10;<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    int cycles = 1;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    int columns = 1;<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    int caching = 30;<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    boolean addColumns = true;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    MemoryCompactionPolicy inMemoryCompaction =<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        MemoryCompactionPolicy.valueOf(<a name="line.664"></a>
-<span class="sourceLineNo">665</span>            CompactingMemStore.COMPACTING_MEMSTORE_TYPE_DEFAULT);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    boolean asyncPrefetch = false;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    boolean cacheBlocks = true;<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    Scan.ReadType scanReadType = Scan.ReadType.DEFAULT;<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>    public TestOptions() {}<a name="line.670"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.BufferedMutatorParams;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Get;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Put;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.Result;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.Table;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.LongWritable;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.io.Text;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Job;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.Tool;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.hadoop.util.ToolRunner;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.Sampler;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.htrace.core.TraceScope;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.Logger;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.slf4j.LoggerFactory;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * command-line which test to run and how many clients are participating in<a name="line.118"></a>
+<span class="sourceLineNo">119</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.119"></a>
+<span class="sourceLineNo">120</span> *<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.123"></a>
+<span class="sourceLineNo">124</span> * paper, pages 8-10.<a name="line.124"></a>
+<span class="sourceLineNo">125</span> *<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.128"></a>
+<span class="sourceLineNo">129</span> * specified otherwise.<a name="line.129"></a>
+<span class="sourceLineNo">130</span> */<a name="line.130"></a>
+<span class="sourceLineNo">131</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.131"></a>
+<span class="sourceLineNo">132</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  static final String RANDOM_READ = "randomRead";<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  static {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  }<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
+<span class="sourceLineNo">156</span><a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
+<span class="sourceLineNo">243</span><a name="line.243"></a>
+<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
+<span class="sourceLineNo">249</span><a name="line.249"></a>
+<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
+<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
+<span class="sourceLineNo">261</span><a name="line.261"></a>
+<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
+<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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><a name="line.297"></a>
+<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
+<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        }<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>      ObjectMapper mapper = new ObjectMapper();<a name="line.309"></a>
+<span class="s

<TRUNCATED>

[19/44] hbase-site git commit: Published site at 8e6ff689e806138e602a46730886d8c5f524fdcd.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html
index 418c60c..7cf23c4 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html
@@ -64,2689 +64,2710 @@
 <span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.AsyncConnection;<a name="line.56"></a>
 <span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.AsyncTable;<a name="line.57"></a>
 <span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.BufferedMutator;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Get;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Put;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Result;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.111"></a>
-<span class="sourceLineNo">112</span><a name="line.112"></a>
-<span class="sourceLineNo">113</span>/**<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
-<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
-<span class="sourceLineNo">119</span> *<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
-<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
-<span class="sourceLineNo">124</span> *<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
-<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
-<span class="sourceLineNo">129</span> */<a name="line.129"></a>
-<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
-<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
-<span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // TODO : should we make this configurable<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private static final int TAG_LENGTH = 256;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  static {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        "Run async random read test");<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        "Run async random write test");<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.164"></a>
-<span class="sourceLineNo">165</span>        "Run async sequential read test");<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        "Run async sequential write test");<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        "Run async scan test (read every row)");<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      "Run random read test");<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      "Run random seek and scan 100 test");<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      "Run random write test");<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      "Run sequential read test");<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      "Run sequential write test");<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      "Run scan test (read every row)");<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "(make sure to use --rows=20)");<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  }<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * inner-class so we can find associated properties.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   */<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  protected static enum Counter {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    /** elapsed time */<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    ELAPSED_TIME,<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    /** number of rows */<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    public RunResult(long duration, Histogram hist) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      this.duration = duration;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.hist = hist;<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>    public final long duration;<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final Histogram hist;<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>    @Override<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    public String toString() {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      return Long.toString(duration);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>    @Override public int compareTo(RunResult o) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      return Long.compare(this.duration, o.duration);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
-<span class="sourceLineNo">234</span><a name="line.234"></a>
-<span class="sourceLineNo">235</span>  /**<a name="line.235"></a>
-<span class="sourceLineNo">236</span>   * Constructor<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * @param conf Configuration object<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   */<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    super(conf);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      String name, String description) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  /**<a name="line.249"></a>
-<span class="sourceLineNo">250</span>   * Implementations can have their status set.<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   */<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  interface Status {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    /**<a name="line.253"></a>
-<span class="sourceLineNo">254</span>     * Sets status<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * @param msg status message<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @throws IOException<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     */<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    void setStatus(final String msg) throws IOException;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  }<a name="line.259"></a>
-<span class="sourceLineNo">260</span><a name="line.260"></a>
-<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   */<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  public static class EvaluationMapTask<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>    /** configuration parameter name that contains the command */<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the PE impl */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>    @Override<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>      // this is required so that extensions of PE are instantiated within the<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // map reduce task...<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      try {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      } catch (Exception e) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      try {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        return Class.forName(className).asSubclass(type);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      } catch (ClassNotFoundException e) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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>    @Override<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.298"></a>
-<span class="sourceLineNo">299</span>           throws IOException, InterruptedException {<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>      Status status = new Status() {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        @Override<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        public void setStatus(String msg) {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>           context.setStatus(msg);<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><a name="line.307"></a>
-<span class="sourceLineNo">308</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      AsyncConnection asyncCon = null;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      try {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      } catch (ExecutionException e) {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>        throw new IOException(e);<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>      // Evaluation task<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      // Collect how much time the thing took. Report as map output and<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // to the ELAPSED_TIME counter.<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.progress();<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    }<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>  /*<a name="line.330"></a>
-<span class="sourceLineNo">331</span>   * If table does not already exist, create. Also create a table when<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   */<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      throw new IllegalStateException(<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    HTableDescriptor desc =<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    byte[][] splits = getSplits(opts);<a name="line.346"></a>
-<span class="sourceLineNo">347</span><a name="line.347"></a>
-<span class="sourceLineNo">348</span>    // recreate the table when user has requested presplit or when existing<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      needsDelete = true;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      // wait, why did it delete my table?!?<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        .add("needsDelete", needsDelete)<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("isReadCmd", isReadCmd)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("exists", exists)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("desc", desc)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("presplit", opts.presplitRegions)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("replicas", opts.replicas)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .toString());<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>    // remove an existing table<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    if (needsDelete) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      if (admin.isTableEnabled(tableName)) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        admin.disableTable(tableName);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      admin.deleteTable(tableName);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>    // table creation is necessary<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    if (!exists || needsDelete) {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      desc = getTableDescriptor(opts);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      if (splits != null) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        if (LOG.isDebugEnabled()) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<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>      admin.createTable(desc, splits);<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      LOG.info("Table " + desc + " created");<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    return admin.tableExists(tableName);<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>  /**<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setCompressionType(opts.compression);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setBloomFilterType(opts.bloomType);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBlocksize(opts.blockSize);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    if (opts.inMemoryCF) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      family.setInMemory(true);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    desc.addFamily(family);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      desc.setRegionReplication(opts.replicas);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    return desc;<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>  /**<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   * generates splits based on total number of rows and specified split regions<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   */<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      int rowkey = jump * (1 + i);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      splits[i] = format(rowkey);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return splits;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  }<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  /*<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * Run all clients in this vm each to its own thread.<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   */<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    assert cmd != null;<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    @SuppressWarnings("unchecked")<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      final int index = i;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        @Override<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        public RunResult call() throws Exception {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>            @Override<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            public void setStatus(final String msg) throws IOException {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>              LOG.info(msg);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>          });<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.459"></a>
-<span class="sourceLineNo">460</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          return run;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      });<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    }<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    pool.shutdown();<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      try {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        results[i] = threads[i].get();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      } catch (ExecutionException e) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>        throw new IOException(e.getCause());<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    final String test = cmd.getSimpleName();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.475"></a>
-<span class="sourceLineNo">476</span>             + Arrays.toString(results));<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    Arrays.sort(results);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    long total = 0;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    for (RunResult result : results) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      total += result.duration;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    LOG.info("[" + test + "]"<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      + "\tMin: " + results[0] + "ms"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.485"></a>
-<span class="sourceLineNo">486</span><a name="line.486"></a>
-<span class="sourceLineNo">487</span>    con.close();<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    asyncCon.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    return results;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  /*<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Before we start up the job, write out an input file with instruction<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * per client regards which row they are to start on.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * @param cmd Command to run.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @throws IOException<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   */<a name="line.499"></a>
-<span class="sourceLineNo">500</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    assert cmd != null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    Job job = Job.getInstance(conf);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.509"></a>
-<span class="sourceLineNo">510</span><a name="line.510"></a>
-<span class="sourceLineNo">511</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    // this is default, but be explicit about it just in case.<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.514"></a>
-<span class="sourceLineNo">515</span><a name="line.515"></a>
-<span class="sourceLineNo">516</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputValueClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setReducerClass(LongSumReducer.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>    job.setNumReduceTasks(1);<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      Histogram.class,     // yammer metrics<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      );<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>    TableMapReduceUtil.initCredentials(job);<a name="line.534"></a>
-<span class="sourceLineNo">535</span><a name="line.535"></a>
-<span class="sourceLineNo">536</span>    job.waitForCompletion(true);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    return job;<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>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<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>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>  /*<a name="line.546"></a>
-<span class="sourceLineNo">547</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * @param c Configuration<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<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>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    return writeInputFile(c, opts, new Path("."));<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.556"></a>
-<span class="sourceLineNo">557</span>  throws IOException {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>    FileSystem fs = FileSystem.get(c);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    fs.mkdirs(inputDir);<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    // Make input random.<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Hash h = MurmurHash.getInstance();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    try {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>        TestOptions next = new TestOptions(opts);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        next.startRow = j * perClientRows;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.perClientRunRows = perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        String s = MAPPER.writeValueAsString(next);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        byte[] b = Bytes.toBytes(s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        m.put(hash, s);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>        out.println(e.getValue());<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    } finally {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      out.close();<a name="line.586"></a>
-<span class="sourceLineNo">587</span>    }<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    return inputDir;<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>   * Describes a command.<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   */<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  static class CmdDescriptor {<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private String name;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String description;<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      this.cmdClass = cmdClass;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.name = name;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.description = description;<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>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>      return cmdClass;<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>    public String getName() {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>      return name;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    public String getDescription() {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>      return description;<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><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * This makes tracking all these arguments a little easier.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>  static class TestOptions {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    String cmdName = null;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    boolean nomapred = false;<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    boolean filterAll = false;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    int startRow = 0;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    float size = 1.0f;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    int perClientRunRows = DEFAULT_ROWS_PER_GB;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    int numClientThreads = 1;<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    int totalRows = DEFAULT_ROWS_PER_GB;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    int measureAfter = 0;<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    float sampleRate = 1.0f;<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    double traceRate = 0.0;<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    String tableName = TABLE_NAME;<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    boolean flushCommits = true;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    boolean writeToWAL = true;<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    boolean autoFlush = false;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    boolean oneCon = false;<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    boolean useTags = false;<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    int noOfTags = 1;<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    boolean reportLatency = false;<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    int multiGet = 0;<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    int randomSleep = 0;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    boolean inMemoryCF = false;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    int presplitRegions = 0;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    int replicas = HTableDescriptor.DEFAULT_REGION_REPLICATION;<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    String splitPolicy = null;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    Compression.Algorithm compression = Compression.Algorithm.NONE;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    BloomType bloomType = BloomType.ROW;<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    int blockSize = HConstants.DEFAULT_BLOCKSIZE;<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    DataBlockEncoding blockEncoding = DataBlockEncoding.NONE;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    boolean valueRandom = false;<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    boolean valueZipf = false;<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    int valueSize = DEFAULT_VALUE_LENGTH;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    int period = (this.perClientRunRows / 10) == 0? perClientRunRows: perClientRunRows / 10;<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    int cycles = 1;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    int columns = 1;<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    int caching = 30;<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    boolean addColumns = true;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    MemoryCompactionPolicy inMemoryCompaction =<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        MemoryCompactionPolicy.valueOf(<a name="line.664"></a>
-<span class="sourceLineNo">665</span>            CompactingMemStore.COMPACTING_MEMSTORE_TYPE_DEFAULT);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    boolean asyncPrefetch = false;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    boolean cacheBlocks = true;<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    Scan.ReadType scanReadType = Scan.ReadType.DEFAULT;<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>    public TestOptions() {}<a name="line.670"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.BufferedMutatorParams;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Get;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Put;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.Result;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.Table;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.LongWritable;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.io.Text;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Job;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.Tool;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.hadoop.util.ToolRunner;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.Sampler;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.htrace.core.TraceScope;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.Logger;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.slf4j.LoggerFactory;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * command-line which test to run and how many clients are participating in<a name="line.118"></a>
+<span class="sourceLineNo">119</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.119"></a>
+<span class="sourceLineNo">120</span> *<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.123"></a>
+<span class="sourceLineNo">124</span> * paper, pages 8-10.<a name="line.124"></a>
+<span class="sourceLineNo">125</span> *<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.128"></a>
+<span class="sourceLineNo">129</span> * specified otherwise.<a name="line.129"></a>
+<span class="sourceLineNo">130</span> */<a name="line.130"></a>
+<span class="sourceLineNo">131</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.131"></a>
+<span class="sourceLineNo">132</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  static final String RANDOM_READ = "randomRead";<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  static {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  }<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
+<span class="sourceLineNo">156</span><a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
+<span class="sourceLineNo">243</span><a name="line.243"></a>
+<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
+<span class="sourceLineNo">249</span><a name="line.249"></a>
+<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
+<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
+<span class="sourceLineNo">261</span><a name="line.261"></a>
+<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
+<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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><a name="line.297"></a>
+<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
+<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        }<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>      ObjectMapper mapper = new ObjectMapper();<a name="line.

<TRUNCATED>

[33/44] hbase-site git commit: Published site at 8e6ff689e806138e602a46730886d8c5f524fdcd.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialReadTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialReadTest.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialReadTest.html
index 418c60c..7cf23c4 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialReadTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialReadTest.html
@@ -64,2689 +64,2710 @@
 <span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.AsyncConnection;<a name="line.56"></a>
 <span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.AsyncTable;<a name="line.57"></a>
 <span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.BufferedMutator;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Get;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Put;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Result;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.111"></a>
-<span class="sourceLineNo">112</span><a name="line.112"></a>
-<span class="sourceLineNo">113</span>/**<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
-<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
-<span class="sourceLineNo">119</span> *<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
-<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
-<span class="sourceLineNo">124</span> *<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
-<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
-<span class="sourceLineNo">129</span> */<a name="line.129"></a>
-<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
-<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
-<span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // TODO : should we make this configurable<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private static final int TAG_LENGTH = 256;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  static {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        "Run async random read test");<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        "Run async random write test");<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.164"></a>
-<span class="sourceLineNo">165</span>        "Run async sequential read test");<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        "Run async sequential write test");<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        "Run async scan test (read every row)");<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      "Run random read test");<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      "Run random seek and scan 100 test");<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      "Run random write test");<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      "Run sequential read test");<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      "Run sequential write test");<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      "Run scan test (read every row)");<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "(make sure to use --rows=20)");<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  }<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * inner-class so we can find associated properties.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   */<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  protected static enum Counter {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    /** elapsed time */<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    ELAPSED_TIME,<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    /** number of rows */<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    public RunResult(long duration, Histogram hist) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      this.duration = duration;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.hist = hist;<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>    public final long duration;<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final Histogram hist;<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>    @Override<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    public String toString() {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      return Long.toString(duration);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>    @Override public int compareTo(RunResult o) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      return Long.compare(this.duration, o.duration);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
-<span class="sourceLineNo">234</span><a name="line.234"></a>
-<span class="sourceLineNo">235</span>  /**<a name="line.235"></a>
-<span class="sourceLineNo">236</span>   * Constructor<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * @param conf Configuration object<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   */<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    super(conf);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      String name, String description) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  /**<a name="line.249"></a>
-<span class="sourceLineNo">250</span>   * Implementations can have their status set.<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   */<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  interface Status {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    /**<a name="line.253"></a>
-<span class="sourceLineNo">254</span>     * Sets status<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * @param msg status message<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @throws IOException<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     */<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    void setStatus(final String msg) throws IOException;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  }<a name="line.259"></a>
-<span class="sourceLineNo">260</span><a name="line.260"></a>
-<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   */<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  public static class EvaluationMapTask<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>    /** configuration parameter name that contains the command */<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the PE impl */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>    @Override<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>      // this is required so that extensions of PE are instantiated within the<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // map reduce task...<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      try {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      } catch (Exception e) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      try {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        return Class.forName(className).asSubclass(type);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      } catch (ClassNotFoundException e) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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>    @Override<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.298"></a>
-<span class="sourceLineNo">299</span>           throws IOException, InterruptedException {<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>      Status status = new Status() {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        @Override<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        public void setStatus(String msg) {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>           context.setStatus(msg);<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><a name="line.307"></a>
-<span class="sourceLineNo">308</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      AsyncConnection asyncCon = null;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      try {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      } catch (ExecutionException e) {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>        throw new IOException(e);<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>      // Evaluation task<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      // Collect how much time the thing took. Report as map output and<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // to the ELAPSED_TIME counter.<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.progress();<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    }<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>  /*<a name="line.330"></a>
-<span class="sourceLineNo">331</span>   * If table does not already exist, create. Also create a table when<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   */<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      throw new IllegalStateException(<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    HTableDescriptor desc =<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    byte[][] splits = getSplits(opts);<a name="line.346"></a>
-<span class="sourceLineNo">347</span><a name="line.347"></a>
-<span class="sourceLineNo">348</span>    // recreate the table when user has requested presplit or when existing<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      needsDelete = true;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      // wait, why did it delete my table?!?<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        .add("needsDelete", needsDelete)<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("isReadCmd", isReadCmd)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("exists", exists)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("desc", desc)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("presplit", opts.presplitRegions)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("replicas", opts.replicas)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .toString());<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>    // remove an existing table<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    if (needsDelete) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      if (admin.isTableEnabled(tableName)) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        admin.disableTable(tableName);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      admin.deleteTable(tableName);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>    // table creation is necessary<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    if (!exists || needsDelete) {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      desc = getTableDescriptor(opts);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      if (splits != null) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        if (LOG.isDebugEnabled()) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<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>      admin.createTable(desc, splits);<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      LOG.info("Table " + desc + " created");<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    return admin.tableExists(tableName);<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>  /**<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setCompressionType(opts.compression);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setBloomFilterType(opts.bloomType);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBlocksize(opts.blockSize);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    if (opts.inMemoryCF) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      family.setInMemory(true);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    desc.addFamily(family);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      desc.setRegionReplication(opts.replicas);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    return desc;<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>  /**<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   * generates splits based on total number of rows and specified split regions<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   */<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      int rowkey = jump * (1 + i);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      splits[i] = format(rowkey);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return splits;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  }<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  /*<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * Run all clients in this vm each to its own thread.<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   */<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    assert cmd != null;<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    @SuppressWarnings("unchecked")<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      final int index = i;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        @Override<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        public RunResult call() throws Exception {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>            @Override<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            public void setStatus(final String msg) throws IOException {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>              LOG.info(msg);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>          });<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.459"></a>
-<span class="sourceLineNo">460</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          return run;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      });<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    }<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    pool.shutdown();<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      try {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        results[i] = threads[i].get();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      } catch (ExecutionException e) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>        throw new IOException(e.getCause());<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    final String test = cmd.getSimpleName();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.475"></a>
-<span class="sourceLineNo">476</span>             + Arrays.toString(results));<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    Arrays.sort(results);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    long total = 0;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    for (RunResult result : results) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      total += result.duration;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    LOG.info("[" + test + "]"<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      + "\tMin: " + results[0] + "ms"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.485"></a>
-<span class="sourceLineNo">486</span><a name="line.486"></a>
-<span class="sourceLineNo">487</span>    con.close();<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    asyncCon.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    return results;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  /*<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Before we start up the job, write out an input file with instruction<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * per client regards which row they are to start on.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * @param cmd Command to run.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @throws IOException<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   */<a name="line.499"></a>
-<span class="sourceLineNo">500</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    assert cmd != null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    Job job = Job.getInstance(conf);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.509"></a>
-<span class="sourceLineNo">510</span><a name="line.510"></a>
-<span class="sourceLineNo">511</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    // this is default, but be explicit about it just in case.<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.514"></a>
-<span class="sourceLineNo">515</span><a name="line.515"></a>
-<span class="sourceLineNo">516</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputValueClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setReducerClass(LongSumReducer.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>    job.setNumReduceTasks(1);<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      Histogram.class,     // yammer metrics<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      );<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>    TableMapReduceUtil.initCredentials(job);<a name="line.534"></a>
-<span class="sourceLineNo">535</span><a name="line.535"></a>
-<span class="sourceLineNo">536</span>    job.waitForCompletion(true);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    return job;<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>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<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>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>  /*<a name="line.546"></a>
-<span class="sourceLineNo">547</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * @param c Configuration<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<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>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    return writeInputFile(c, opts, new Path("."));<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.556"></a>
-<span class="sourceLineNo">557</span>  throws IOException {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>    FileSystem fs = FileSystem.get(c);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    fs.mkdirs(inputDir);<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    // Make input random.<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Hash h = MurmurHash.getInstance();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    try {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>        TestOptions next = new TestOptions(opts);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        next.startRow = j * perClientRows;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.perClientRunRows = perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        String s = MAPPER.writeValueAsString(next);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        byte[] b = Bytes.toBytes(s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        m.put(hash, s);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>        out.println(e.getValue());<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    } finally {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      out.close();<a name="line.586"></a>
-<span class="sourceLineNo">587</span>    }<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    return inputDir;<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>   * Describes a command.<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   */<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  static class CmdDescriptor {<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private String name;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String description;<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      this.cmdClass = cmdClass;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.name = name;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.description = description;<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>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>      return cmdClass;<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>    public String getName() {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>      return name;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    public String getDescription() {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>      return description;<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><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * This makes tracking all these arguments a little easier.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>  static class TestOptions {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    String cmdName = null;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    boolean nomapred = false;<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    boolean filterAll = false;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    int startRow = 0;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    float size = 1.0f;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    int perClientRunRows = DEFAULT_ROWS_PER_GB;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    int numClientThreads = 1;<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    int totalRows = DEFAULT_ROWS_PER_GB;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    int measureAfter = 0;<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    float sampleRate = 1.0f;<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    double traceRate = 0.0;<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    String tableName = TABLE_NAME;<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    boolean flushCommits = true;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    boolean writeToWAL = true;<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    boolean autoFlush = false;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    boolean oneCon = false;<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    boolean useTags = false;<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    int noOfTags = 1;<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    boolean reportLatency = false;<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    int multiGet = 0;<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    int randomSleep = 0;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    boolean inMemoryCF = false;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    int presplitRegions = 0;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    int replicas = HTableDescriptor.DEFAULT_REGION_REPLICATION;<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    String splitPolicy = null;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    Compression.Algorithm compression = Compression.Algorithm.NONE;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    BloomType bloomType = BloomType.ROW;<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    int blockSize = HConstants.DEFAULT_BLOCKSIZE;<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    DataBlockEncoding blockEncoding = DataBlockEncoding.NONE;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    boolean valueRandom = false;<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    boolean valueZipf = false;<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    int valueSize = DEFAULT_VALUE_LENGTH;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    int period = (this.perClientRunRows / 10) == 0? perClientRunRows: perClientRunRows / 10;<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    int cycles = 1;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    int columns = 1;<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    int caching = 30;<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    boolean addColumns = true;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    MemoryCompactionPolicy inMemoryCompaction =<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        MemoryCompactionPolicy.valueOf(<a name="line.664"></a>
-<span class="sourceLineNo">665</span>            CompactingMemStore.COMPACTING_MEMSTORE_TYPE_DEFAULT);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    boolean asyncPrefetch = false;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    boolean cacheBlocks = true;<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    Scan.ReadType scanReadType = Scan.ReadType.DEFAULT;<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>    public TestOptions() {}<a name="line.670"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.BufferedMutatorParams;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Get;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Put;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.Result;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.Table;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.LongWritable;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.io.Text;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Job;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.Tool;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.hadoop.util.ToolRunner;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.Sampler;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.htrace.core.TraceScope;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.Logger;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.slf4j.LoggerFactory;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * command-line which test to run and how many clients are participating in<a name="line.118"></a>
+<span class="sourceLineNo">119</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.119"></a>
+<span class="sourceLineNo">120</span> *<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.123"></a>
+<span class="sourceLineNo">124</span> * paper, pages 8-10.<a name="line.124"></a>
+<span class="sourceLineNo">125</span> *<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.128"></a>
+<span class="sourceLineNo">129</span> * specified otherwise.<a name="line.129"></a>
+<span class="sourceLineNo">130</span> */<a name="line.130"></a>
+<span class="sourceLineNo">131</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.131"></a>
+<span class="sourceLineNo">132</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  static final String RANDOM_READ = "randomRead";<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  static {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  }<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
+<span class="sourceLineNo">156</span><a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
+<span class="sourceLineNo">243</span><a name="line.243"></a>
+<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
+<span class="sourceLineNo">249</span><a name="line.249"></a>
+<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
+<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
+<span class="sourceLineNo">261</span><a name="line.261"></a>
+<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
+<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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><a name="line.297"></a>
+<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
+<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        }<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>      ObjectMapp

<TRUNCATED>

[12/44] hbase-site git commit: Published site at 8e6ff689e806138e602a46730886d8c5f524fdcd.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomWriteTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomWriteTest.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomWriteTest.html
index 418c60c..7cf23c4 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomWriteTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomWriteTest.html
@@ -64,2689 +64,2710 @@
 <span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.AsyncConnection;<a name="line.56"></a>
 <span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.AsyncTable;<a name="line.57"></a>
 <span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.BufferedMutator;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Get;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Put;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Result;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.111"></a>
-<span class="sourceLineNo">112</span><a name="line.112"></a>
-<span class="sourceLineNo">113</span>/**<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
-<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
-<span class="sourceLineNo">119</span> *<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
-<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
-<span class="sourceLineNo">124</span> *<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
-<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
-<span class="sourceLineNo">129</span> */<a name="line.129"></a>
-<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
-<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
-<span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // TODO : should we make this configurable<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private static final int TAG_LENGTH = 256;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  static {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        "Run async random read test");<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        "Run async random write test");<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.164"></a>
-<span class="sourceLineNo">165</span>        "Run async sequential read test");<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        "Run async sequential write test");<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        "Run async scan test (read every row)");<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      "Run random read test");<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      "Run random seek and scan 100 test");<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      "Run random write test");<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      "Run sequential read test");<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      "Run sequential write test");<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      "Run scan test (read every row)");<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "(make sure to use --rows=20)");<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  }<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * inner-class so we can find associated properties.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   */<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  protected static enum Counter {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    /** elapsed time */<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    ELAPSED_TIME,<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    /** number of rows */<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    public RunResult(long duration, Histogram hist) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      this.duration = duration;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.hist = hist;<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>    public final long duration;<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final Histogram hist;<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>    @Override<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    public String toString() {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      return Long.toString(duration);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>    @Override public int compareTo(RunResult o) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      return Long.compare(this.duration, o.duration);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
-<span class="sourceLineNo">234</span><a name="line.234"></a>
-<span class="sourceLineNo">235</span>  /**<a name="line.235"></a>
-<span class="sourceLineNo">236</span>   * Constructor<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * @param conf Configuration object<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   */<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    super(conf);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      String name, String description) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  /**<a name="line.249"></a>
-<span class="sourceLineNo">250</span>   * Implementations can have their status set.<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   */<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  interface Status {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    /**<a name="line.253"></a>
-<span class="sourceLineNo">254</span>     * Sets status<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * @param msg status message<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @throws IOException<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     */<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    void setStatus(final String msg) throws IOException;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  }<a name="line.259"></a>
-<span class="sourceLineNo">260</span><a name="line.260"></a>
-<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   */<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  public static class EvaluationMapTask<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>    /** configuration parameter name that contains the command */<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the PE impl */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>    @Override<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>      // this is required so that extensions of PE are instantiated within the<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // map reduce task...<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      try {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      } catch (Exception e) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      try {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        return Class.forName(className).asSubclass(type);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      } catch (ClassNotFoundException e) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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>    @Override<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.298"></a>
-<span class="sourceLineNo">299</span>           throws IOException, InterruptedException {<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>      Status status = new Status() {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        @Override<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        public void setStatus(String msg) {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>           context.setStatus(msg);<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><a name="line.307"></a>
-<span class="sourceLineNo">308</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      AsyncConnection asyncCon = null;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      try {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      } catch (ExecutionException e) {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>        throw new IOException(e);<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>      // Evaluation task<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      // Collect how much time the thing took. Report as map output and<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // to the ELAPSED_TIME counter.<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.progress();<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    }<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>  /*<a name="line.330"></a>
-<span class="sourceLineNo">331</span>   * If table does not already exist, create. Also create a table when<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   */<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      throw new IllegalStateException(<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    HTableDescriptor desc =<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    byte[][] splits = getSplits(opts);<a name="line.346"></a>
-<span class="sourceLineNo">347</span><a name="line.347"></a>
-<span class="sourceLineNo">348</span>    // recreate the table when user has requested presplit or when existing<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      needsDelete = true;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      // wait, why did it delete my table?!?<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        .add("needsDelete", needsDelete)<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("isReadCmd", isReadCmd)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("exists", exists)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("desc", desc)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("presplit", opts.presplitRegions)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("replicas", opts.replicas)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .toString());<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>    // remove an existing table<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    if (needsDelete) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      if (admin.isTableEnabled(tableName)) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        admin.disableTable(tableName);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      admin.deleteTable(tableName);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>    // table creation is necessary<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    if (!exists || needsDelete) {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      desc = getTableDescriptor(opts);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      if (splits != null) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        if (LOG.isDebugEnabled()) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<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>      admin.createTable(desc, splits);<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      LOG.info("Table " + desc + " created");<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    return admin.tableExists(tableName);<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>  /**<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setCompressionType(opts.compression);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setBloomFilterType(opts.bloomType);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBlocksize(opts.blockSize);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    if (opts.inMemoryCF) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      family.setInMemory(true);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    desc.addFamily(family);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      desc.setRegionReplication(opts.replicas);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    return desc;<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>  /**<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   * generates splits based on total number of rows and specified split regions<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   */<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      int rowkey = jump * (1 + i);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      splits[i] = format(rowkey);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return splits;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  }<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  /*<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * Run all clients in this vm each to its own thread.<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   */<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    assert cmd != null;<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    @SuppressWarnings("unchecked")<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      final int index = i;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        @Override<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        public RunResult call() throws Exception {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>            @Override<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            public void setStatus(final String msg) throws IOException {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>              LOG.info(msg);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>          });<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.459"></a>
-<span class="sourceLineNo">460</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          return run;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      });<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    }<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    pool.shutdown();<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      try {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        results[i] = threads[i].get();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      } catch (ExecutionException e) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>        throw new IOException(e.getCause());<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    final String test = cmd.getSimpleName();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.475"></a>
-<span class="sourceLineNo">476</span>             + Arrays.toString(results));<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    Arrays.sort(results);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    long total = 0;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    for (RunResult result : results) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      total += result.duration;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    LOG.info("[" + test + "]"<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      + "\tMin: " + results[0] + "ms"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.485"></a>
-<span class="sourceLineNo">486</span><a name="line.486"></a>
-<span class="sourceLineNo">487</span>    con.close();<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    asyncCon.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    return results;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  /*<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Before we start up the job, write out an input file with instruction<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * per client regards which row they are to start on.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * @param cmd Command to run.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @throws IOException<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   */<a name="line.499"></a>
-<span class="sourceLineNo">500</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    assert cmd != null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    Job job = Job.getInstance(conf);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.509"></a>
-<span class="sourceLineNo">510</span><a name="line.510"></a>
-<span class="sourceLineNo">511</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    // this is default, but be explicit about it just in case.<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.514"></a>
-<span class="sourceLineNo">515</span><a name="line.515"></a>
-<span class="sourceLineNo">516</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputValueClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setReducerClass(LongSumReducer.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>    job.setNumReduceTasks(1);<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      Histogram.class,     // yammer metrics<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      );<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>    TableMapReduceUtil.initCredentials(job);<a name="line.534"></a>
-<span class="sourceLineNo">535</span><a name="line.535"></a>
-<span class="sourceLineNo">536</span>    job.waitForCompletion(true);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    return job;<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>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<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>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>  /*<a name="line.546"></a>
-<span class="sourceLineNo">547</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * @param c Configuration<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<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>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    return writeInputFile(c, opts, new Path("."));<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.556"></a>
-<span class="sourceLineNo">557</span>  throws IOException {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>    FileSystem fs = FileSystem.get(c);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    fs.mkdirs(inputDir);<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    // Make input random.<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Hash h = MurmurHash.getInstance();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    try {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>        TestOptions next = new TestOptions(opts);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        next.startRow = j * perClientRows;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.perClientRunRows = perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        String s = MAPPER.writeValueAsString(next);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        byte[] b = Bytes.toBytes(s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        m.put(hash, s);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>        out.println(e.getValue());<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    } finally {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      out.close();<a name="line.586"></a>
-<span class="sourceLineNo">587</span>    }<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    return inputDir;<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>   * Describes a command.<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   */<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  static class CmdDescriptor {<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private String name;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String description;<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      this.cmdClass = cmdClass;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.name = name;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.description = description;<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>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>      return cmdClass;<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>    public String getName() {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>      return name;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    public String getDescription() {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>      return description;<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><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * This makes tracking all these arguments a little easier.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>  static class TestOptions {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    String cmdName = null;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    boolean nomapred = false;<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    boolean filterAll = false;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    int startRow = 0;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    float size = 1.0f;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    int perClientRunRows = DEFAULT_ROWS_PER_GB;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    int numClientThreads = 1;<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    int totalRows = DEFAULT_ROWS_PER_GB;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    int measureAfter = 0;<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    float sampleRate = 1.0f;<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    double traceRate = 0.0;<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    String tableName = TABLE_NAME;<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    boolean flushCommits = true;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    boolean writeToWAL = true;<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    boolean autoFlush = false;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    boolean oneCon = false;<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    boolean useTags = false;<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    int noOfTags = 1;<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    boolean reportLatency = false;<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    int multiGet = 0;<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    int randomSleep = 0;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    boolean inMemoryCF = false;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    int presplitRegions = 0;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    int replicas = HTableDescriptor.DEFAULT_REGION_REPLICATION;<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    String splitPolicy = null;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    Compression.Algorithm compression = Compression.Algorithm.NONE;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    BloomType bloomType = BloomType.ROW;<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    int blockSize = HConstants.DEFAULT_BLOCKSIZE;<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    DataBlockEncoding blockEncoding = DataBlockEncoding.NONE;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    boolean valueRandom = false;<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    boolean valueZipf = false;<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    int valueSize = DEFAULT_VALUE_LENGTH;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    int period = (this.perClientRunRows / 10) == 0? perClientRunRows: perClientRunRows / 10;<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    int cycles = 1;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    int columns = 1;<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    int caching = 30;<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    boolean addColumns = true;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    MemoryCompactionPolicy inMemoryCompaction =<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        MemoryCompactionPolicy.valueOf(<a name="line.664"></a>
-<span class="sourceLineNo">665</span>            CompactingMemStore.COMPACTING_MEMSTORE_TYPE_DEFAULT);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    boolean asyncPrefetch = false;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    boolean cacheBlocks = true;<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    Scan.ReadType scanReadType = Scan.ReadType.DEFAULT;<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>    public TestOptions() {}<a name="line.670"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.BufferedMutatorParams;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Get;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Put;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.Result;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.Table;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.LongWritable;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.io.Text;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Job;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.Tool;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.hadoop.util.ToolRunner;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.Sampler;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.htrace.core.TraceScope;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.Logger;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.slf4j.LoggerFactory;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * command-line which test to run and how many clients are participating in<a name="line.118"></a>
+<span class="sourceLineNo">119</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.119"></a>
+<span class="sourceLineNo">120</span> *<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.123"></a>
+<span class="sourceLineNo">124</span> * paper, pages 8-10.<a name="line.124"></a>
+<span class="sourceLineNo">125</span> *<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.128"></a>
+<span class="sourceLineNo">129</span> * specified otherwise.<a name="line.129"></a>
+<span class="sourceLineNo">130</span> */<a name="line.130"></a>
+<span class="sourceLineNo">131</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.131"></a>
+<span class="sourceLineNo">132</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  static final String RANDOM_READ = "randomRead";<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  static {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  }<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
+<span class="sourceLineNo">156</span><a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
+<span class="sourceLineNo">243</span><a name="line.243"></a>
+<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
+<span class="sourceLineNo">249</span><a name="line.249"></a>
+<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
+<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
+<span class="sourceLineNo">261</span><a name="line.261"></a>
+<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
+<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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><a name="line.297"></a>
+<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
+<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        }<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>      ObjectMapper mapper = new ObjectMapper();<a name="

<TRUNCATED>

[10/44] hbase-site git commit: Published site at 8e6ff689e806138e602a46730886d8c5f524fdcd.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.ScanTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.ScanTest.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.ScanTest.html
index 418c60c..7cf23c4 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.ScanTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.ScanTest.html
@@ -64,2689 +64,2710 @@
 <span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.AsyncConnection;<a name="line.56"></a>
 <span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.AsyncTable;<a name="line.57"></a>
 <span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.BufferedMutator;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Get;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Put;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Result;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.111"></a>
-<span class="sourceLineNo">112</span><a name="line.112"></a>
-<span class="sourceLineNo">113</span>/**<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
-<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
-<span class="sourceLineNo">119</span> *<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
-<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
-<span class="sourceLineNo">124</span> *<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
-<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
-<span class="sourceLineNo">129</span> */<a name="line.129"></a>
-<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
-<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
-<span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // TODO : should we make this configurable<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private static final int TAG_LENGTH = 256;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  static {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        "Run async random read test");<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        "Run async random write test");<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.164"></a>
-<span class="sourceLineNo">165</span>        "Run async sequential read test");<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        "Run async sequential write test");<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        "Run async scan test (read every row)");<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      "Run random read test");<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      "Run random seek and scan 100 test");<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      "Run random write test");<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      "Run sequential read test");<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      "Run sequential write test");<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      "Run scan test (read every row)");<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "(make sure to use --rows=20)");<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  }<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * inner-class so we can find associated properties.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   */<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  protected static enum Counter {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    /** elapsed time */<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    ELAPSED_TIME,<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    /** number of rows */<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    public RunResult(long duration, Histogram hist) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      this.duration = duration;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.hist = hist;<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>    public final long duration;<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final Histogram hist;<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>    @Override<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    public String toString() {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      return Long.toString(duration);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>    @Override public int compareTo(RunResult o) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      return Long.compare(this.duration, o.duration);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
-<span class="sourceLineNo">234</span><a name="line.234"></a>
-<span class="sourceLineNo">235</span>  /**<a name="line.235"></a>
-<span class="sourceLineNo">236</span>   * Constructor<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * @param conf Configuration object<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   */<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    super(conf);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      String name, String description) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  /**<a name="line.249"></a>
-<span class="sourceLineNo">250</span>   * Implementations can have their status set.<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   */<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  interface Status {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    /**<a name="line.253"></a>
-<span class="sourceLineNo">254</span>     * Sets status<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * @param msg status message<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @throws IOException<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     */<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    void setStatus(final String msg) throws IOException;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  }<a name="line.259"></a>
-<span class="sourceLineNo">260</span><a name="line.260"></a>
-<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   */<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  public static class EvaluationMapTask<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>    /** configuration parameter name that contains the command */<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the PE impl */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>    @Override<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>      // this is required so that extensions of PE are instantiated within the<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // map reduce task...<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      try {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      } catch (Exception e) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      try {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        return Class.forName(className).asSubclass(type);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      } catch (ClassNotFoundException e) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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>    @Override<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.298"></a>
-<span class="sourceLineNo">299</span>           throws IOException, InterruptedException {<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>      Status status = new Status() {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        @Override<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        public void setStatus(String msg) {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>           context.setStatus(msg);<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><a name="line.307"></a>
-<span class="sourceLineNo">308</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      AsyncConnection asyncCon = null;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      try {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      } catch (ExecutionException e) {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>        throw new IOException(e);<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>      // Evaluation task<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      // Collect how much time the thing took. Report as map output and<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // to the ELAPSED_TIME counter.<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.progress();<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    }<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>  /*<a name="line.330"></a>
-<span class="sourceLineNo">331</span>   * If table does not already exist, create. Also create a table when<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   */<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      throw new IllegalStateException(<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    HTableDescriptor desc =<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    byte[][] splits = getSplits(opts);<a name="line.346"></a>
-<span class="sourceLineNo">347</span><a name="line.347"></a>
-<span class="sourceLineNo">348</span>    // recreate the table when user has requested presplit or when existing<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      needsDelete = true;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      // wait, why did it delete my table?!?<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        .add("needsDelete", needsDelete)<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("isReadCmd", isReadCmd)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("exists", exists)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("desc", desc)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("presplit", opts.presplitRegions)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("replicas", opts.replicas)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .toString());<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>    // remove an existing table<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    if (needsDelete) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      if (admin.isTableEnabled(tableName)) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        admin.disableTable(tableName);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      admin.deleteTable(tableName);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>    // table creation is necessary<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    if (!exists || needsDelete) {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      desc = getTableDescriptor(opts);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      if (splits != null) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        if (LOG.isDebugEnabled()) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<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>      admin.createTable(desc, splits);<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      LOG.info("Table " + desc + " created");<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    return admin.tableExists(tableName);<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>  /**<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setCompressionType(opts.compression);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setBloomFilterType(opts.bloomType);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBlocksize(opts.blockSize);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    if (opts.inMemoryCF) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      family.setInMemory(true);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    desc.addFamily(family);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      desc.setRegionReplication(opts.replicas);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    return desc;<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>  /**<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   * generates splits based on total number of rows and specified split regions<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   */<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      int rowkey = jump * (1 + i);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      splits[i] = format(rowkey);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return splits;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  }<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  /*<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * Run all clients in this vm each to its own thread.<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   */<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    assert cmd != null;<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    @SuppressWarnings("unchecked")<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      final int index = i;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        @Override<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        public RunResult call() throws Exception {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>            @Override<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            public void setStatus(final String msg) throws IOException {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>              LOG.info(msg);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>          });<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.459"></a>
-<span class="sourceLineNo">460</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          return run;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      });<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    }<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    pool.shutdown();<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      try {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        results[i] = threads[i].get();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      } catch (ExecutionException e) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>        throw new IOException(e.getCause());<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    final String test = cmd.getSimpleName();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.475"></a>
-<span class="sourceLineNo">476</span>             + Arrays.toString(results));<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    Arrays.sort(results);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    long total = 0;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    for (RunResult result : results) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      total += result.duration;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    LOG.info("[" + test + "]"<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      + "\tMin: " + results[0] + "ms"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.485"></a>
-<span class="sourceLineNo">486</span><a name="line.486"></a>
-<span class="sourceLineNo">487</span>    con.close();<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    asyncCon.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    return results;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  /*<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Before we start up the job, write out an input file with instruction<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * per client regards which row they are to start on.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * @param cmd Command to run.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @throws IOException<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   */<a name="line.499"></a>
-<span class="sourceLineNo">500</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    assert cmd != null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    Job job = Job.getInstance(conf);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.509"></a>
-<span class="sourceLineNo">510</span><a name="line.510"></a>
-<span class="sourceLineNo">511</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    // this is default, but be explicit about it just in case.<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.514"></a>
-<span class="sourceLineNo">515</span><a name="line.515"></a>
-<span class="sourceLineNo">516</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputValueClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setReducerClass(LongSumReducer.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>    job.setNumReduceTasks(1);<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      Histogram.class,     // yammer metrics<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      );<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>    TableMapReduceUtil.initCredentials(job);<a name="line.534"></a>
-<span class="sourceLineNo">535</span><a name="line.535"></a>
-<span class="sourceLineNo">536</span>    job.waitForCompletion(true);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    return job;<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>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<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>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>  /*<a name="line.546"></a>
-<span class="sourceLineNo">547</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * @param c Configuration<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<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>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    return writeInputFile(c, opts, new Path("."));<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.556"></a>
-<span class="sourceLineNo">557</span>  throws IOException {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>    FileSystem fs = FileSystem.get(c);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    fs.mkdirs(inputDir);<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    // Make input random.<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Hash h = MurmurHash.getInstance();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    try {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>        TestOptions next = new TestOptions(opts);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        next.startRow = j * perClientRows;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.perClientRunRows = perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        String s = MAPPER.writeValueAsString(next);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        byte[] b = Bytes.toBytes(s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        m.put(hash, s);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>        out.println(e.getValue());<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    } finally {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      out.close();<a name="line.586"></a>
-<span class="sourceLineNo">587</span>    }<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    return inputDir;<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>   * Describes a command.<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   */<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  static class CmdDescriptor {<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private String name;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String description;<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      this.cmdClass = cmdClass;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.name = name;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.description = description;<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>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>      return cmdClass;<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>    public String getName() {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>      return name;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    public String getDescription() {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>      return description;<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><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * This makes tracking all these arguments a little easier.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>  static class TestOptions {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    String cmdName = null;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    boolean nomapred = false;<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    boolean filterAll = false;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    int startRow = 0;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    float size = 1.0f;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    int perClientRunRows = DEFAULT_ROWS_PER_GB;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    int numClientThreads = 1;<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    int totalRows = DEFAULT_ROWS_PER_GB;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    int measureAfter = 0;<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    float sampleRate = 1.0f;<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    double traceRate = 0.0;<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    String tableName = TABLE_NAME;<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    boolean flushCommits = true;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    boolean writeToWAL = true;<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    boolean autoFlush = false;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    boolean oneCon = false;<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    boolean useTags = false;<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    int noOfTags = 1;<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    boolean reportLatency = false;<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    int multiGet = 0;<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    int randomSleep = 0;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    boolean inMemoryCF = false;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    int presplitRegions = 0;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    int replicas = HTableDescriptor.DEFAULT_REGION_REPLICATION;<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    String splitPolicy = null;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    Compression.Algorithm compression = Compression.Algorithm.NONE;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    BloomType bloomType = BloomType.ROW;<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    int blockSize = HConstants.DEFAULT_BLOCKSIZE;<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    DataBlockEncoding blockEncoding = DataBlockEncoding.NONE;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    boolean valueRandom = false;<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    boolean valueZipf = false;<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    int valueSize = DEFAULT_VALUE_LENGTH;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    int period = (this.perClientRunRows / 10) == 0? perClientRunRows: perClientRunRows / 10;<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    int cycles = 1;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    int columns = 1;<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    int caching = 30;<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    boolean addColumns = true;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    MemoryCompactionPolicy inMemoryCompaction =<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        MemoryCompactionPolicy.valueOf(<a name="line.664"></a>
-<span class="sourceLineNo">665</span>            CompactingMemStore.COMPACTING_MEMSTORE_TYPE_DEFAULT);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    boolean asyncPrefetch = false;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    boolean cacheBlocks = true;<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    Scan.ReadType scanReadType = Scan.ReadType.DEFAULT;<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>    public TestOptions() {}<a name="line.670"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.BufferedMutatorParams;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Get;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Put;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.Result;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.Table;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.LongWritable;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.io.Text;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Job;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.Tool;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.hadoop.util.ToolRunner;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.Sampler;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.htrace.core.TraceScope;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.Logger;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.slf4j.LoggerFactory;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * command-line which test to run and how many clients are participating in<a name="line.118"></a>
+<span class="sourceLineNo">119</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.119"></a>
+<span class="sourceLineNo">120</span> *<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.123"></a>
+<span class="sourceLineNo">124</span> * paper, pages 8-10.<a name="line.124"></a>
+<span class="sourceLineNo">125</span> *<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.128"></a>
+<span class="sourceLineNo">129</span> * specified otherwise.<a name="line.129"></a>
+<span class="sourceLineNo">130</span> */<a name="line.130"></a>
+<span class="sourceLineNo">131</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.131"></a>
+<span class="sourceLineNo">132</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  static final String RANDOM_READ = "randomRead";<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  static {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  }<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
+<span class="sourceLineNo">156</span><a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
+<span class="sourceLineNo">243</span><a name="line.243"></a>
+<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
+<span class="sourceLineNo">249</span><a name="line.249"></a>
+<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
+<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
+<span class="sourceLineNo">261</span><a name="line.261"></a>
+<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
+<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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><a name="line.297"></a>
+<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
+<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        }<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>      ObjectMapper mapper = new ObjectMapper();<a name="line.309"></a>
+<span class="source

<TRUNCATED>

[40/44] hbase-site git commit: Published site at 8e6ff689e806138e602a46730886d8c5f524fdcd.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html
index 5a0a45c..13d490f 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html
@@ -127,7 +127,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>abstract static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1355">PerformanceEvaluation.TableTest</a>
+<pre>abstract static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1366">PerformanceEvaluation.TableTest</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Test.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.Test</a></pre>
 </li>
 </ul>
@@ -249,7 +249,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Test.
 <ul class="blockListLast">
 <li class="blockList">
 <h4>table</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.client.Table <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html#line.1356">table</a></pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.client.Table <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html#line.1367">table</a></pre>
 </li>
 </ul>
 </li>
@@ -266,7 +266,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Test.
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TableTest</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html#line.1358">TableTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html#line.1369">TableTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
           <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
           <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -285,7 +285,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Test.
 <ul class="blockList">
 <li class="blockList">
 <h4>onStartup</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html#line.1363">onStartup</a>()
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html#line.1374">onStartup</a>()
         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="overrideSpecifyLabel">Specified by:</span></dt>
@@ -301,7 +301,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Test.
 <ul class="blockListLast">
 <li class="blockList">
 <h4>onTakedown</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html#line.1368">onTakedown</a>()
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html#line.1379">onTakedown</a>()
          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="overrideSpecifyLabel">Specified by:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.Test.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.Test.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.Test.html
index 8d630a4..3320f91 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.Test.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.Test.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>abstract static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1305">PerformanceEvaluation.Test</a>
+<pre>abstract static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1316">PerformanceEvaluation.Test</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></pre>
 </li>
 </ul>
@@ -230,7 +230,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestB
 <ul class="blockListLast">
 <li class="blockList">
 <h4>connection</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.client.Connection <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Test.html#line.1306">connection</a></pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.client.Connection <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Test.html#line.1317">connection</a></pre>
 </li>
 </ul>
 </li>
@@ -247,7 +247,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestB
 <ul class="blockListLast">
 <li class="blockList">
 <h4>Test</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Test.html#line.1308">Test</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Test.html#line.1319">Test</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
      <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
      <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -266,7 +266,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestB
 <ul class="blockList">
 <li class="blockList">
 <h4>createConnection</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Test.html#line.1314">createConnection</a>()
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Test.html#line.1325">createConnection</a>()
                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="overrideSpecifyLabel">Specified by:</span></dt>
@@ -282,7 +282,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestB
 <ul class="blockListLast">
 <li class="blockList">
 <h4>closeConnection</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Test.html#line.1321">closeConnection</a>()
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Test.html#line.1332">closeConnection</a>()
               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="overrideSpecifyLabel">Specified by:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html
index b2dfe84..d10e033 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>abstract static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1029">PerformanceEvaluation.TestBase</a>
+<pre>abstract static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1040">PerformanceEvaluation.TestBase</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>
 </li>
 </ul>
@@ -372,7 +372,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>randomSeed</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1032">randomSeed</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1043">randomSeed</a></pre>
 </li>
 </ul>
 <a name="everyN">
@@ -381,7 +381,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>everyN</h4>
-<pre>private final&nbsp;int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1037">everyN</a></pre>
+<pre>private final&nbsp;int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1048">everyN</a></pre>
 </li>
 </ul>
 <a name="rand">
@@ -390,7 +390,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>rand</h4>
-<pre>protected final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1039">rand</a></pre>
+<pre>protected final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1050">rand</a></pre>
 </li>
 </ul>
 <a name="conf">
@@ -399,7 +399,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>conf</h4>
-<pre>protected final&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1040">conf</a></pre>
+<pre>protected final&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1051">conf</a></pre>
 </li>
 </ul>
 <a name="opts">
@@ -408,7 +408,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>opts</h4>
-<pre>protected final&nbsp;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1041">opts</a></pre>
+<pre>protected final&nbsp;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1052">opts</a></pre>
 </li>
 </ul>
 <a name="status">
@@ -417,7 +417,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>status</h4>
-<pre>private final&nbsp;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1043">status</a></pre>
+<pre>private final&nbsp;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1054">status</a></pre>
 </li>
 </ul>
 <a name="traceSampler">
@@ -426,7 +426,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>traceSampler</h4>
-<pre>private final&nbsp;org.apache.htrace.core.Sampler <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1044">traceSampler</a></pre>
+<pre>private final&nbsp;org.apache.htrace.core.Sampler <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1055">traceSampler</a></pre>
 </li>
 </ul>
 <a name="receiverHost">
@@ -435,7 +435,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>receiverHost</h4>
-<pre>private final&nbsp;org.apache.hadoop.hbase.trace.SpanReceiverHost <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1045">receiverHost</a></pre>
+<pre>private final&nbsp;org.apache.hadoop.hbase.trace.SpanReceiverHost <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1056">receiverHost</a></pre>
 </li>
 </ul>
 <a name="testName">
@@ -444,7 +444,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testName</h4>
-<pre>private&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/PerformanceEvaluation.TestBase.html#line.1047">testName</a></pre>
+<pre>private&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/PerformanceEvaluation.TestBase.html#line.1058">testName</a></pre>
 </li>
 </ul>
 <a name="latencyHistogram">
@@ -453,7 +453,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>latencyHistogram</h4>
-<pre>private&nbsp;com.codahale.metrics.Histogram <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1048">latencyHistogram</a></pre>
+<pre>private&nbsp;com.codahale.metrics.Histogram <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1059">latencyHistogram</a></pre>
 </li>
 </ul>
 <a name="valueSizeHistogram">
@@ -462,7 +462,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>valueSizeHistogram</h4>
-<pre>private&nbsp;com.codahale.metrics.Histogram <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1049">valueSizeHistogram</a></pre>
+<pre>private&nbsp;com.codahale.metrics.Histogram <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1060">valueSizeHistogram</a></pre>
 </li>
 </ul>
 <a name="rpcCallsHistogram">
@@ -471,7 +471,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>rpcCallsHistogram</h4>
-<pre>private&nbsp;com.codahale.metrics.Histogram <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1050">rpcCallsHistogram</a></pre>
+<pre>private&nbsp;com.codahale.metrics.Histogram <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1061">rpcCallsHistogram</a></pre>
 </li>
 </ul>
 <a name="remoteRpcCallsHistogram">
@@ -480,7 +480,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>remoteRpcCallsHistogram</h4>
-<pre>private&nbsp;com.codahale.metrics.Histogram <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1051">remoteRpcCallsHistogram</a></pre>
+<pre>private&nbsp;com.codahale.metrics.Histogram <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1062">remoteRpcCallsHistogram</a></pre>
 </li>
 </ul>
 <a name="millisBetweenNextHistogram">
@@ -489,7 +489,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>millisBetweenNextHistogram</h4>
-<pre>private&nbsp;com.codahale.metrics.Histogram <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1052">millisBetweenNextHistogram</a></pre>
+<pre>private&nbsp;com.codahale.metrics.Histogram <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1063">millisBetweenNextHistogram</a></pre>
 </li>
 </ul>
 <a name="regionsScannedHistogram">
@@ -498,7 +498,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>regionsScannedHistogram</h4>
-<pre>private&nbsp;com.codahale.metrics.Histogram <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1053">regionsScannedHistogram</a></pre>
+<pre>private&nbsp;com.codahale.metrics.Histogram <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1064">regionsScannedHistogram</a></pre>
 </li>
 </ul>
 <a name="bytesInResultsHistogram">
@@ -507,7 +507,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>bytesInResultsHistogram</h4>
-<pre>private&nbsp;com.codahale.metrics.Histogram <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1054">bytesInResultsHistogram</a></pre>
+<pre>private&nbsp;com.codahale.metrics.Histogram <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1065">bytesInResultsHistogram</a></pre>
 </li>
 </ul>
 <a name="bytesInRemoteResultsHistogram">
@@ -516,7 +516,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>bytesInRemoteResultsHistogram</h4>
-<pre>private&nbsp;com.codahale.metrics.Histogram <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1055">bytesInRemoteResultsHistogram</a></pre>
+<pre>private&nbsp;com.codahale.metrics.Histogram <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1066">bytesInRemoteResultsHistogram</a></pre>
 </li>
 </ul>
 <a name="zipf">
@@ -525,7 +525,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>zipf</h4>
-<pre>private&nbsp;<a href="../../../../org/apache/hadoop/hbase/io/hfile/RandomDistribution.Zipf.html" title="class in org.apache.hadoop.hbase.io.hfile">RandomDistribution.Zipf</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1056">zipf</a></pre>
+<pre>private&nbsp;<a href="../../../../org/apache/hadoop/hbase/io/hfile/RandomDistribution.Zipf.html" title="class in org.apache.hadoop.hbase.io.hfile">RandomDistribution.Zipf</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1067">zipf</a></pre>
 </li>
 </ul>
 </li>
@@ -542,7 +542,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TestBase</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1062">TestBase</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1073">TestBase</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
          <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
          <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 <div class="block">Note that all subclasses of this class must provide a public constructor
@@ -563,7 +563,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>nextRandomSeed</h4>
-<pre>private static&nbsp;long&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1034">nextRandomSeed</a>()</pre>
+<pre>private static&nbsp;long&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1045">nextRandomSeed</a>()</pre>
 </li>
 </ul>
 <a name="getValueLength-java.util.Random-">
@@ -572,7 +572,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getValueLength</h4>
-<pre>int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1083">getValueLength</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a>&nbsp;r)</pre>
+<pre>int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1094">getValueLength</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a>&nbsp;r)</pre>
 </li>
 </ul>
 <a name="updateValueSize-org.apache.hadoop.hbase.client.Result:A-">
@@ -581,7 +581,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>updateValueSize</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1093">updateValueSize</a>(org.apache.hadoop.hbase.client.Result[]&nbsp;rs)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1104">updateValueSize</a>(org.apache.hadoop.hbase.client.Result[]&nbsp;rs)
               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>
@@ -595,7 +595,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>updateValueSize</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1098">updateValueSize</a>(org.apache.hadoop.hbase.client.Result&nbsp;r)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1109">updateValueSize</a>(org.apache.hadoop.hbase.client.Result&nbsp;r)
               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>
@@ -609,7 +609,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>updateValueSize</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1107">updateValueSize</a>(int&nbsp;valueSize)</pre>
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1118">updateValueSize</a>(int&nbsp;valueSize)</pre>
 </li>
 </ul>
 <a name="updateScanMetrics-org.apache.hadoop.hbase.client.metrics.ScanMetrics-">
@@ -618,7 +618,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>updateScanMetrics</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1112">updateScanMetrics</a>(org.apache.hadoop.hbase.client.metrics.ScanMetrics&nbsp;metrics)</pre>
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1123">updateScanMetrics</a>(org.apache.hadoop.hbase.client.metrics.ScanMetrics&nbsp;metrics)</pre>
 </li>
 </ul>
 <a name="generateStatus-int-int-int-">
@@ -627,7 +627,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>generateStatus</h4>
-<pre><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/PerformanceEvaluation.TestBase.html#line.1140">generateStatus</a>(int&nbsp;sr,
+<pre><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/PerformanceEvaluation.TestBase.html#line.1151">generateStatus</a>(int&nbsp;sr,
                       int&nbsp;i,
                       int&nbsp;lr)</pre>
 </li>
@@ -638,7 +638,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isRandomValueSize</h4>
-<pre>boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1145">isRandomValueSize</a>()</pre>
+<pre>boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1156">isRandomValueSize</a>()</pre>
 </li>
 </ul>
 <a name="getReportingPeriod--">
@@ -647,7 +647,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getReportingPeriod</h4>
-<pre>protected&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1149">getReportingPeriod</a>()</pre>
+<pre>protected&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1160">getReportingPeriod</a>()</pre>
 </li>
 </ul>
 <a name="getLatencyHistogram--">
@@ -656,7 +656,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getLatencyHistogram</h4>
-<pre>public&nbsp;com.codahale.metrics.Histogram&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1156">getLatencyHistogram</a>()</pre>
+<pre>public&nbsp;com.codahale.metrics.Histogram&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1167">getLatencyHistogram</a>()</pre>
 <div class="block">Populated by testTakedown. Only implemented by RandomReadTest at the moment.</div>
 </li>
 </ul>
@@ -666,7 +666,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testSetup</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1160">testSetup</a>()
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1171">testSetup</a>()
         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>
@@ -680,7 +680,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createConnection</h4>
-<pre>abstract&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1176">createConnection</a>()
+<pre>abstract&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1187">createConnection</a>()
                         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>
@@ -694,7 +694,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>onStartup</h4>
-<pre>abstract&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1178">onStartup</a>()
+<pre>abstract&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1189">onStartup</a>()
                  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>
@@ -708,7 +708,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testTakedown</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1180">testTakedown</a>()
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1191">testTakedown</a>()
            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>
@@ -722,7 +722,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>onTakedown</h4>
-<pre>abstract&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1224">onTakedown</a>()
+<pre>abstract&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1235">onTakedown</a>()
                   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>
@@ -736,7 +736,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>closeConnection</h4>
-<pre>abstract&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1226">closeConnection</a>()
+<pre>abstract&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1237">closeConnection</a>()
                        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>
@@ -750,7 +750,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>test</h4>
-<pre>long&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1233">test</a>()
+<pre>long&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1244">test</a>()
    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>,
           <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <dl>
@@ -766,7 +766,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getStartRow</h4>
-<pre>int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1245">getStartRow</a>()</pre>
+<pre>int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1256">getStartRow</a>()</pre>
 </li>
 </ul>
 <a name="getLastRow--">
@@ -775,7 +775,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getLastRow</h4>
-<pre>int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1249">getLastRow</a>()</pre>
+<pre>int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1260">getLastRow</a>()</pre>
 </li>
 </ul>
 <a name="testTimed--">
@@ -784,7 +784,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testTimed</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1256">testTimed</a>()
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1267">testTimed</a>()
         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>,
                <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <div class="block">Provides an extension point for tests that don't want a per row invocation.</div>
@@ -801,7 +801,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getShortLatencyReport</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/PerformanceEvaluation.TestBase.html#line.1287">getShortLatencyReport</a>()</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/PerformanceEvaluation.TestBase.html#line.1298">getShortLatencyReport</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>Subset of the histograms' calculation.</dd>
@@ -814,7 +814,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getShortValueSizeReport</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/PerformanceEvaluation.TestBase.html#line.1294">getShortValueSizeReport</a>()</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/PerformanceEvaluation.TestBase.html#line.1305">getShortValueSizeReport</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>Subset of the histograms' calculation.</dd>
@@ -827,7 +827,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testRow</h4>
-<pre>abstract&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1302">testRow</a>(int&nbsp;i)
+<pre>abstract&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1313">testRow</a>(int&nbsp;i)
                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>,
                       <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <dl>


[41/44] hbase-site git commit: Published site at 8e6ff689e806138e602a46730886d8c5f524fdcd.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndDeleteTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndDeleteTest.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndDeleteTest.html
index 38617d1..a384484 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndDeleteTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndDeleteTest.html
@@ -133,7 +133,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2016">PerformanceEvaluation.CheckAndDeleteTest</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2029">PerformanceEvaluation.CheckAndDeleteTest</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.CASTableTest</a></pre>
 </li>
 </ul>
@@ -261,7 +261,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.CASTa
 <ul class="blockListLast">
 <li class="blockList">
 <h4>CheckAndDeleteTest</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndDeleteTest.html#line.2017">CheckAndDeleteTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndDeleteTest.html#line.2030">CheckAndDeleteTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
                    <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
                    <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -280,7 +280,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.CASTa
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testRow</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndDeleteTest.html#line.2022">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndDeleteTest.html#line.2035">testRow</a>(int&nbsp;i)
       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="overrideSpecifyLabel">Specified by:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndMutateTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndMutateTest.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndMutateTest.html
index 504b463..3ea16e6 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndMutateTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndMutateTest.html
@@ -133,7 +133,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1980">PerformanceEvaluation.CheckAndMutateTest</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1993">PerformanceEvaluation.CheckAndMutateTest</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.CASTableTest</a></pre>
 </li>
 </ul>
@@ -261,7 +261,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.CASTa
 <ul class="blockListLast">
 <li class="blockList">
 <h4>CheckAndMutateTest</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndMutateTest.html#line.1981">CheckAndMutateTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndMutateTest.html#line.1994">CheckAndMutateTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
                    <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
                    <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -280,7 +280,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.CASTa
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testRow</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndMutateTest.html#line.1986">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndMutateTest.html#line.1999">testRow</a>(int&nbsp;i)
       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="overrideSpecifyLabel">Specified by:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndPutTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndPutTest.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndPutTest.html
index da72b36..04aefab 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndPutTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndPutTest.html
@@ -133,7 +133,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1999">PerformanceEvaluation.CheckAndPutTest</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2012">PerformanceEvaluation.CheckAndPutTest</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.CASTableTest</a></pre>
 </li>
 </ul>
@@ -261,7 +261,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.CASTa
 <ul class="blockListLast">
 <li class="blockList">
 <h4>CheckAndPutTest</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndPutTest.html#line.2000">CheckAndPutTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndPutTest.html#line.2013">CheckAndPutTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
                 <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
                 <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -280,7 +280,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.CASTa
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testRow</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndPutTest.html#line.2005">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndPutTest.html#line.2018">testRow</a>(int&nbsp;i)
       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="overrideSpecifyLabel">Specified by:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.CmdDescriptor.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.CmdDescriptor.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.CmdDescriptor.html
index e32e55d..178b6ea 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.CmdDescriptor.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.CmdDescriptor.html
@@ -113,7 +113,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.594">PerformanceEvaluation.CmdDescriptor</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.595">PerformanceEvaluation.CmdDescriptor</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">Describes a command.</div>
 </li>
@@ -220,7 +220,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>cmdClass</h4>
-<pre>private&nbsp;<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/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a>&gt; <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CmdDescriptor.html#line.595">cmdClass</a></pre>
+<pre>private&nbsp;<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/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a>&gt; <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CmdDescriptor.html#line.596">cmdClass</a></pre>
 </li>
 </ul>
 <a name="name">
@@ -229,7 +229,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>name</h4>
-<pre>private&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/PerformanceEvaluation.CmdDescriptor.html#line.596">name</a></pre>
+<pre>private&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/PerformanceEvaluation.CmdDescriptor.html#line.597">name</a></pre>
 </li>
 </ul>
 <a name="description">
@@ -238,7 +238,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>description</h4>
-<pre>private&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/PerformanceEvaluation.CmdDescriptor.html#line.597">description</a></pre>
+<pre>private&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/PerformanceEvaluation.CmdDescriptor.html#line.598">description</a></pre>
 </li>
 </ul>
 </li>
@@ -255,7 +255,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>CmdDescriptor</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CmdDescriptor.html#line.599">CmdDescriptor</a>(<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/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a>&gt;&nbsp;cmdClass,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CmdDescriptor.html#line.600">CmdDescriptor</a>(<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/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a>&gt;&nbsp;cmdClass,
               <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;description)</pre>
 </li>
@@ -274,7 +274,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getCmdClass</h4>
-<pre>public&nbsp;<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/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a>&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CmdDescriptor.html#line.605">getCmdClass</a>()</pre>
+<pre>public&nbsp;<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/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a>&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CmdDescriptor.html#line.606">getCmdClass</a>()</pre>
 </li>
 </ul>
 <a name="getName--">
@@ -283,7 +283,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getName</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/PerformanceEvaluation.CmdDescriptor.html#line.609">getName</a>()</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/PerformanceEvaluation.CmdDescriptor.html#line.610">getName</a>()</pre>
 </li>
 </ul>
 <a name="getDescription--">
@@ -292,7 +292,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getDescription</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/PerformanceEvaluation.CmdDescriptor.html#line.613">getDescription</a>()</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/PerformanceEvaluation.CmdDescriptor.html#line.614">getDescription</a>()</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html
index e03773e..074c441 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>protected static enum <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.209">PerformanceEvaluation.Counter</a>
+<pre>protected static enum <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.210">PerformanceEvaluation.Counter</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang">Enum</a>&lt;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html" title="enum in org.apache.hadoop.hbase">PerformanceEvaluation.Counter</a>&gt;</pre>
 <div class="block">Enum for map metrics.  Keep it out here rather than inside in the Map
  inner-class so we can find associated properties.</div>
@@ -216,7 +216,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>ELAPSED_TIME</h4>
-<pre>public static final&nbsp;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html" title="enum in org.apache.hadoop.hbase">PerformanceEvaluation.Counter</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html#line.211">ELAPSED_TIME</a></pre>
+<pre>public static final&nbsp;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html" title="enum in org.apache.hadoop.hbase">PerformanceEvaluation.Counter</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html#line.212">ELAPSED_TIME</a></pre>
 <div class="block">elapsed time</div>
 </li>
 </ul>
@@ -226,7 +226,7 @@ the order they are declared.</div>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>ROWS</h4>
-<pre>public static final&nbsp;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html" title="enum in org.apache.hadoop.hbase">PerformanceEvaluation.Counter</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html#line.213">ROWS</a></pre>
+<pre>public static final&nbsp;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html" title="enum in org.apache.hadoop.hbase">PerformanceEvaluation.Counter</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html#line.214">ROWS</a></pre>
 <div class="block">number of rows</div>
 </li>
 </ul>
@@ -244,7 +244,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>values</h4>
-<pre>public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html" title="enum in org.apache.hadoop.hbase">PerformanceEvaluation.Counter</a>[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html#line.209">values</a>()</pre>
+<pre>public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html" title="enum in org.apache.hadoop.hbase">PerformanceEvaluation.Counter</a>[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html#line.210">values</a>()</pre>
 <div class="block">Returns an array containing the constants of this enum type, in
 the order they are declared.  This method may be used to iterate
 over the constants as follows:
@@ -264,7 +264,7 @@ for (PerformanceEvaluation.Counter c : PerformanceEvaluation.Counter.values())
 <ul class="blockListLast">
 <li class="blockList">
 <h4>valueOf</h4>
-<pre>public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html" title="enum in org.apache.hadoop.hbase">PerformanceEvaluation.Counter</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html#line.209">valueOf</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 static&nbsp;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html" title="enum in org.apache.hadoop.hbase">PerformanceEvaluation.Counter</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html#line.210">valueOf</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">Returns the enum constant of this type with the specified name.
 The string must match <i>exactly</i> an identifier used to declare an
 enum constant in this type.  (Extraneous whitespace characters are 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.EvaluationMapTask.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.EvaluationMapTask.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.EvaluationMapTask.html
index 9dcc814..9029f66 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.EvaluationMapTask.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.EvaluationMapTask.html
@@ -118,7 +118,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.264">PerformanceEvaluation.EvaluationMapTask</a>
+<pre>public static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.265">PerformanceEvaluation.EvaluationMapTask</a>
 extends org.apache.hadoop.mapreduce.Mapper&lt;org.apache.hadoop.io.LongWritable,org.apache.hadoop.io.Text,org.apache.hadoop.io.LongWritable,org.apache.hadoop.io.LongWritable&gt;</pre>
 <div class="block">MapReduce job that runs a performance evaluation client in each map task.</div>
 </li>
@@ -252,7 +252,7 @@ extends org.apache.hadoop.mapreduce.Mapper&lt;org.apache.hadoop.io.LongWritable,
 <ul class="blockList">
 <li class="blockList">
 <h4>CMD_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/PerformanceEvaluation.EvaluationMapTask.html#line.268">CMD_KEY</a></pre>
+<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/PerformanceEvaluation.EvaluationMapTask.html#line.269">CMD_KEY</a></pre>
 <div class="block">configuration parameter name that contains the command</div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
@@ -266,7 +266,7 @@ extends org.apache.hadoop.mapreduce.Mapper&lt;org.apache.hadoop.io.LongWritable,
 <ul class="blockList">
 <li class="blockList">
 <h4>PE_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/PerformanceEvaluation.EvaluationMapTask.html#line.270">PE_KEY</a></pre>
+<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/PerformanceEvaluation.EvaluationMapTask.html#line.271">PE_KEY</a></pre>
 <div class="block">configuration parameter name that contains the PE impl</div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
@@ -280,7 +280,7 @@ extends org.apache.hadoop.mapreduce.Mapper&lt;org.apache.hadoop.io.LongWritable,
 <ul class="blockListLast">
 <li class="blockList">
 <h4>cmd</h4>
-<pre>private&nbsp;<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/PerformanceEvaluation.Test.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.Test</a>&gt; <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.EvaluationMapTask.html#line.272">cmd</a></pre>
+<pre>private&nbsp;<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/PerformanceEvaluation.Test.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.Test</a>&gt; <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.EvaluationMapTask.html#line.273">cmd</a></pre>
 </li>
 </ul>
 </li>
@@ -297,7 +297,7 @@ extends org.apache.hadoop.mapreduce.Mapper&lt;org.apache.hadoop.io.LongWritable,
 <ul class="blockListLast">
 <li class="blockList">
 <h4>EvaluationMapTask</h4>
-<pre>public&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.EvaluationMapTask.html#line.264">EvaluationMapTask</a>()</pre>
+<pre>public&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.EvaluationMapTask.html#line.265">EvaluationMapTask</a>()</pre>
 </li>
 </ul>
 </li>
@@ -314,7 +314,7 @@ extends org.apache.hadoop.mapreduce.Mapper&lt;org.apache.hadoop.io.LongWritable,
 <ul class="blockList">
 <li class="blockList">
 <h4>setup</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.EvaluationMapTask.html#line.275">setup</a>(org.apache.hadoop.mapreduce.Mapper.Context&nbsp;context)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.EvaluationMapTask.html#line.276">setup</a>(org.apache.hadoop.mapreduce.Mapper.Context&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>,
                      <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <dl>
@@ -332,7 +332,7 @@ extends org.apache.hadoop.mapreduce.Mapper&lt;org.apache.hadoop.io.LongWritable,
 <ul class="blockList">
 <li class="blockList">
 <h4>forName</h4>
-<pre>private&nbsp;&lt;Type&gt;&nbsp;<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 Type&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.EvaluationMapTask.html#line.289">forName</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;className,
+<pre>private&nbsp;&lt;Type&gt;&nbsp;<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 Type&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.EvaluationMapTask.html#line.290">forName</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;className,
                                              <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;Type&gt;&nbsp;type)</pre>
 </li>
 </ul>
@@ -342,7 +342,7 @@ extends org.apache.hadoop.mapreduce.Mapper&lt;org.apache.hadoop.io.LongWritable,
 <ul class="blockListLast">
 <li class="blockList">
 <h4>map</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.EvaluationMapTask.html#line.298">map</a>(org.apache.hadoop.io.LongWritable&nbsp;key,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.EvaluationMapTask.html#line.299">map</a>(org.apache.hadoop.io.LongWritable&nbsp;key,
                    org.apache.hadoop.io.Text&nbsp;value,
                    org.apache.hadoop.mapreduce.Mapper.Context&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>,

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.FilteredScanTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.FilteredScanTest.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.FilteredScanTest.html
index d458b39..54a6284 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.FilteredScanTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.FilteredScanTest.html
@@ -128,7 +128,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2093">PerformanceEvaluation.FilteredScanTest</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2106">PerformanceEvaluation.FilteredScanTest</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TableTest</a></pre>
 </li>
 </ul>
@@ -264,7 +264,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockListLast">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>protected static final&nbsp;org.slf4j.Logger <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.FilteredScanTest.html#line.2094">LOG</a></pre>
+<pre>protected static final&nbsp;org.slf4j.Logger <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.FilteredScanTest.html#line.2107">LOG</a></pre>
 </li>
 </ul>
 </li>
@@ -281,7 +281,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockListLast">
 <li class="blockList">
 <h4>FilteredScanTest</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.FilteredScanTest.html#line.2096">FilteredScanTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.FilteredScanTest.html#line.2109">FilteredScanTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
                  <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
                  <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -300,7 +300,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockList">
 <li class="blockList">
 <h4>testRow</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.FilteredScanTest.html#line.2101">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.FilteredScanTest.html#line.2114">testRow</a>(int&nbsp;i)
       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="overrideSpecifyLabel">Specified by:</span></dt>
@@ -316,7 +316,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockListLast">
 <li class="blockList">
 <h4>constructScan</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.client.Scan&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.FilteredScanTest.html#line.2118">constructScan</a>(byte[]&nbsp;valuePrefix)
+<pre>protected&nbsp;org.apache.hadoop.hbase.client.Scan&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.FilteredScanTest.html#line.2131">constructScan</a>(byte[]&nbsp;valuePrefix)
                                                      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>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.IncrementTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.IncrementTest.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.IncrementTest.html
index f7431f3..585fb01 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.IncrementTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.IncrementTest.html
@@ -133,7 +133,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1953">PerformanceEvaluation.IncrementTest</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1966">PerformanceEvaluation.IncrementTest</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.CASTableTest</a></pre>
 </li>
 </ul>
@@ -261,7 +261,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.CASTa
 <ul class="blockListLast">
 <li class="blockList">
 <h4>IncrementTest</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.IncrementTest.html#line.1954">IncrementTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.IncrementTest.html#line.1967">IncrementTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
               <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
               <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -280,7 +280,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.CASTa
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testRow</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.IncrementTest.html#line.1959">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.IncrementTest.html#line.1972">testRow</a>(int&nbsp;i)
       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="overrideSpecifyLabel">Specified by:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html
index ccc5090..424c970 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html
@@ -128,7 +128,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1785">PerformanceEvaluation.RandomReadTest</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1798">PerformanceEvaluation.RandomReadTest</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TableTest</a></pre>
 </li>
 </ul>
@@ -276,7 +276,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockList">
 <li class="blockList">
 <h4>consistency</h4>
-<pre>private final&nbsp;org.apache.hadoop.hbase.client.Consistency <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html#line.1786">consistency</a></pre>
+<pre>private final&nbsp;org.apache.hadoop.hbase.client.Consistency <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html#line.1799">consistency</a></pre>
 </li>
 </ul>
 <a name="gets">
@@ -285,7 +285,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockList">
 <li class="blockList">
 <h4>gets</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html?is-external=true" title="class or interface in java.util">ArrayList</a>&lt;org.apache.hadoop.hbase.client.Get&gt; <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html#line.1787">gets</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html?is-external=true" title="class or interface in java.util">ArrayList</a>&lt;org.apache.hadoop.hbase.client.Get&gt; <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html#line.1800">gets</a></pre>
 </li>
 </ul>
 <a name="rd">
@@ -294,7 +294,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockListLast">
 <li class="blockList">
 <h4>rd</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html#line.1788">rd</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html#line.1801">rd</a></pre>
 </li>
 </ul>
 </li>
@@ -311,7 +311,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RandomReadTest</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html#line.1790">RandomReadTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html#line.1803">RandomReadTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
                <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
                <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -330,7 +330,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockList">
 <li class="blockList">
 <h4>testRow</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html#line.1800">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html#line.1813">testRow</a>(int&nbsp;i)
       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>,
              <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <dl>
@@ -348,7 +348,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockList">
 <li class="blockList">
 <h4>getReportingPeriod</h4>
-<pre>protected&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html#line.1831">getReportingPeriod</a>()</pre>
+<pre>protected&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html#line.1844">getReportingPeriod</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getReportingPeriod--">getReportingPeriod</a></code>&nbsp;in class&nbsp;<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></code></dd>
@@ -361,7 +361,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testTakedown</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html#line.1837">testTakedown</a>()
+<pre>protected&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html#line.1850">testTakedown</a>()
                      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="overrideSpecifyLabel">Overrides:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10000Test.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10000Test.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10000Test.html
index c96d41e..00cf600 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10000Test.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10000Test.html
@@ -133,7 +133,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1774">PerformanceEvaluation.RandomScanWithRange10000Test</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1787">PerformanceEvaluation.RandomScanWithRange10000Test</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.RandomScanWithRangeTest</a></pre>
 </li>
 </ul>
@@ -261,7 +261,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Rando
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RandomScanWithRange10000Test</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10000Test.html#line.1775">RandomScanWithRange10000Test</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10000Test.html#line.1788">RandomScanWithRange10000Test</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
                              <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
                              <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -280,7 +280,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Rando
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getStartAndStopRow</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.util.Pair&lt;byte[],byte[]&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10000Test.html#line.1780">getStartAndStopRow</a>()</pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.util.Pair&lt;byte[],byte[]&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10000Test.html#line.1793">getStartAndStopRow</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html#getStartAndStopRow--">getStartAndStopRow</a></code>&nbsp;in class&nbsp;<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.RandomScanWithRangeTest</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange1000Test.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange1000Test.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange1000Test.html
index c921c32..25fdc97 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange1000Test.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange1000Test.html
@@ -133,7 +133,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1763">PerformanceEvaluation.RandomScanWithRange1000Test</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1776">PerformanceEvaluation.RandomScanWithRange1000Test</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.RandomScanWithRangeTest</a></pre>
 </li>
 </ul>
@@ -261,7 +261,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Rando
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RandomScanWithRange1000Test</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange1000Test.html#line.1764">RandomScanWithRange1000Test</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange1000Test.html#line.1777">RandomScanWithRange1000Test</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
                             <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
                             <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -280,7 +280,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Rando
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getStartAndStopRow</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.util.Pair&lt;byte[],byte[]&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange1000Test.html#line.1769">getStartAndStopRow</a>()</pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.util.Pair&lt;byte[],byte[]&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange1000Test.html#line.1782">getStartAndStopRow</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html#getStartAndStopRow--">getStartAndStopRow</a></code>&nbsp;in class&nbsp;<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.RandomScanWithRangeTest</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange100Test.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange100Test.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange100Test.html
index a04458c..249d530 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange100Test.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange100Test.html
@@ -133,7 +133,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1752">PerformanceEvaluation.RandomScanWithRange100Test</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1765">PerformanceEvaluation.RandomScanWithRange100Test</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.RandomScanWithRangeTest</a></pre>
 </li>
 </ul>
@@ -261,7 +261,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Rando
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RandomScanWithRange100Test</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange100Test.html#line.1753">RandomScanWithRange100Test</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange100Test.html#line.1766">RandomScanWithRange100Test</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
                            <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
                            <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -280,7 +280,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Rando
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getStartAndStopRow</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.util.Pair&lt;byte[],byte[]&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange100Test.html#line.1758">getStartAndStopRow</a>()</pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.util.Pair&lt;byte[],byte[]&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange100Test.html#line.1771">getStartAndStopRow</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html#getStartAndStopRow--">getStartAndStopRow</a></code>&nbsp;in class&nbsp;<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.RandomScanWithRangeTest</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10Test.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10Test.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10Test.html
index f6093a9..4b37c6e 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10Test.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10Test.html
@@ -133,7 +133,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1741">PerformanceEvaluation.RandomScanWithRange10Test</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1754">PerformanceEvaluation.RandomScanWithRange10Test</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.RandomScanWithRangeTest</a></pre>
 </li>
 </ul>
@@ -261,7 +261,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Rando
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RandomScanWithRange10Test</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10Test.html#line.1742">RandomScanWithRange10Test</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10Test.html#line.1755">RandomScanWithRange10Test</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
                           <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
                           <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -280,7 +280,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Rando
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getStartAndStopRow</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.util.Pair&lt;byte[],byte[]&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10Test.html#line.1747">getStartAndStopRow</a>()</pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.util.Pair&lt;byte[],byte[]&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10Test.html#line.1760">getStartAndStopRow</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html#getStartAndStopRow--">getStartAndStopRow</a></code>&nbsp;in class&nbsp;<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.RandomScanWithRangeTest</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html
index 15efda4..878fa44 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html
@@ -132,7 +132,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>abstract static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1684">PerformanceEvaluation.RandomScanWithRangeTest</a>
+<pre>abstract static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1697">PerformanceEvaluation.RandomScanWithRangeTest</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TableTest</a></pre>
 </li>
 </ul>
@@ -265,7 +265,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RandomScanWithRangeTest</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html#line.1685">RandomScanWithRangeTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html#line.1698">RandomScanWithRangeTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
                         <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
                         <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -284,7 +284,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockList">
 <li class="blockList">
 <h4>testRow</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html#line.1690">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html#line.1703">testRow</a>(int&nbsp;i)
       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="overrideSpecifyLabel">Specified by:</span></dt>
@@ -300,7 +300,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockList">
 <li class="blockList">
 <h4>getStartAndStopRow</h4>
-<pre>protected abstract&nbsp;org.apache.hadoop.hbase.util.Pair&lt;byte[],byte[]&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html#line.1726">getStartAndStopRow</a>()</pre>
+<pre>protected abstract&nbsp;org.apache.hadoop.hbase.util.Pair&lt;byte[],byte[]&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html#line.1739">getStartAndStopRow</a>()</pre>
 </li>
 </ul>
 <a name="generateStartAndStopRows-int-">
@@ -309,7 +309,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockList">
 <li class="blockList">
 <h4>generateStartAndStopRows</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.util.Pair&lt;byte[],byte[]&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html#line.1728">generateStartAndStopRows</a>(int&nbsp;maxRange)</pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.util.Pair&lt;byte[],byte[]&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html#line.1741">generateStartAndStopRows</a>(int&nbsp;maxRange)</pre>
 </li>
 </ul>
 <a name="getReportingPeriod--">
@@ -318,7 +318,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getReportingPeriod</h4>
-<pre>protected&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html#line.1735">getReportingPeriod</a>()</pre>
+<pre>protected&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html#line.1748">getReportingPeriod</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getReportingPeriod--">getReportingPeriod</a></code>&nbsp;in class&nbsp;<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomSeekScanTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomSeekScanTest.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomSeekScanTest.html
index 904e594..200c764 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomSeekScanTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomSeekScanTest.html
@@ -128,7 +128,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1640">PerformanceEvaluation.RandomSeekScanTest</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1653">PerformanceEvaluation.RandomSeekScanTest</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TableTest</a></pre>
 </li>
 </ul>
@@ -253,7 +253,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RandomSeekScanTest</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomSeekScanTest.html#line.1641">RandomSeekScanTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomSeekScanTest.html#line.1654">RandomSeekScanTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
                    <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
                    <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -272,7 +272,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockList">
 <li class="blockList">
 <h4>testRow</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomSeekScanTest.html#line.1646">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomSeekScanTest.html#line.1659">testRow</a>(int&nbsp;i)
       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="overrideSpecifyLabel">Specified by:</span></dt>
@@ -288,7 +288,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getReportingPeriod</h4>
-<pre>protected&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomSeekScanTest.html#line.1677">getReportingPeriod</a>()</pre>
+<pre>protected&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomSeekScanTest.html#line.1690">getReportingPeriod</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getReportingPeriod--">getReportingPeriod</a></code>&nbsp;in class&nbsp;<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomWriteTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomWriteTest.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomWriteTest.html
index 83551e7..5ae928e 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomWriteTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomWriteTest.html
@@ -128,7 +128,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1846">PerformanceEvaluation.RandomWriteTest</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1859">PerformanceEvaluation.RandomWriteTest</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.BufferedMutatorTest</a></pre>
 </li>
 </ul>
@@ -249,7 +249,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Buffe
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RandomWriteTest</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomWriteTest.html#line.1847">RandomWriteTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomWriteTest.html#line.1860">RandomWriteTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
                 <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
                 <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -268,7 +268,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Buffe
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testRow</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomWriteTest.html#line.1852">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomWriteTest.html#line.1865">testRow</a>(int&nbsp;i)
       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="overrideSpecifyLabel">Specified by:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html
index d210411..2c40f78 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>protected static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.216">PerformanceEvaluation.RunResult</a>
+<pre>protected static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.217">PerformanceEvaluation.RunResult</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>
 implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.RunResult</a>&gt;</pre>
 </li>
@@ -215,7 +215,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>duration</h4>
-<pre>public final&nbsp;long <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html#line.222">duration</a></pre>
+<pre>public final&nbsp;long <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html#line.223">duration</a></pre>
 </li>
 </ul>
 <a name="hist">
@@ -224,7 +224,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockListLast">
 <li class="blockList">
 <h4>hist</h4>
-<pre>public final&nbsp;com.codahale.metrics.Histogram <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html#line.223">hist</a></pre>
+<pre>public final&nbsp;com.codahale.metrics.Histogram <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html#line.224">hist</a></pre>
 </li>
 </ul>
 </li>
@@ -241,7 +241,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RunResult</h4>
-<pre>public&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html#line.217">RunResult</a>(long&nbsp;duration,
+<pre>public&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html#line.218">RunResult</a>(long&nbsp;duration,
                  com.codahale.metrics.Histogram&nbsp;hist)</pre>
 </li>
 </ul>
@@ -259,7 +259,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>toString</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/PerformanceEvaluation.RunResult.html#line.226">toString</a>()</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/PerformanceEvaluation.RunResult.html#line.227">toString</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#toString--" title="class or interface in java.lang">toString</a></code>&nbsp;in class&nbsp;<code><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></code></dd>
@@ -272,7 +272,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockListLast">
 <li class="blockList">
 <h4>compareTo</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html#line.230">compareTo</a>(<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.RunResult</a>&nbsp;o)</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html#line.231">compareTo</a>(<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.RunResult</a>&nbsp;o)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true#compareTo-T-" title="class or interface in java.lang">compareTo</a></code>&nbsp;in interface&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.RunResult</a>&gt;</code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.ScanTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.ScanTest.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.ScanTest.html
index aaf40e1..52d05d8 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.ScanTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.ScanTest.html
@@ -128,7 +128,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1883">PerformanceEvaluation.ScanTest</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1896">PerformanceEvaluation.ScanTest</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TableTest</a></pre>
 </li>
 </ul>
@@ -264,7 +264,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testScanner</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.client.ResultScanner <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.ScanTest.html#line.1884">testScanner</a></pre>
+<pre>private&nbsp;org.apache.hadoop.hbase.client.ResultScanner <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.ScanTest.html#line.1897">testScanner</a></pre>
 </li>
 </ul>
 </li>
@@ -281,7 +281,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockListLast">
 <li class="blockList">
 <h4>ScanTest</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.ScanTest.html#line.1886">ScanTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.ScanTest.html#line.1899">ScanTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
          <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
          <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -300,7 +300,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockList">
 <li class="blockList">
 <h4>testTakedown</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.ScanTest.html#line.1891">testTakedown</a>()
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.ScanTest.html#line.1904">testTakedown</a>()
            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="overrideSpecifyLabel">Overrides:</span></dt>
@@ -316,7 +316,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testRow</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.ScanTest.html#line.1900">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.ScanTest.html#line.1913">testRow</a>(int&nbsp;i)
       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="overrideSpecifyLabel">Specified by:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialReadTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialReadTest.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialReadTest.html
index 704a3c4..daa53a1 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialReadTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialReadTest.html
@@ -128,7 +128,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2035">PerformanceEvaluation.SequentialReadTest</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2048">PerformanceEvaluation.SequentialReadTest</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TableTest</a></pre>
 </li>
 </ul>
@@ -249,7 +249,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockListLast">
 <li class="blockList">
 <h4>SequentialReadTest</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialReadTest.html#line.2036">SequentialReadTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialReadTest.html#line.2049">SequentialReadTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
                    <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
                    <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -268,7 +268,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testRow</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialReadTest.html#line.2041">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialReadTest.html#line.2054">testRow</a>(int&nbsp;i)
       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="overrideSpecifyLabel">Specified by:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialWriteTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialWriteTest.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialWriteTest.html
index c2b39f0..4c8f51d 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialWriteTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialWriteTest.html
@@ -128,7 +128,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2056">PerformanceEvaluation.SequentialWriteTest</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2069">PerformanceEvaluation.SequentialWriteTest</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.BufferedMutatorTest</a></pre>
 </li>
 </ul>
@@ -249,7 +249,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Buffe
 <ul class="blockListLast">
 <li class="blockList">
 <h4>SequentialWriteTest</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialWriteTest.html#line.2057">SequentialWriteTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialWriteTest.html#line.2070">SequentialWriteTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
                     <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
                     <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -268,7 +268,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Buffe
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testRow</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialWriteTest.html#line.2062">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialWriteTest.html#line.2075">testRow</a>(int&nbsp;i)
       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="overrideSpecifyLabel">Specified by:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.Status.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.Status.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.Status.html
index 2335e6b..532dda5 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.Status.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.Status.html
@@ -105,7 +105,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static interface <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.252">PerformanceEvaluation.Status</a></pre>
+<pre>static interface <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.253">PerformanceEvaluation.Status</a></pre>
 <div class="block">Implementations can have their status set.</div>
 </li>
 </ul>
@@ -152,7 +152,7 @@ var activeTableTab = "activeTableTab";
 <ul class="blockListLast">
 <li class="blockList">
 <h4>setStatus</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Status.html#line.258">setStatus</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;msg)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Status.html#line.259">setStatus</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;msg)
         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 status</div>
 <dl>


[23/44] hbase-site git commit: Published site at 8e6ff689e806138e602a46730886d8c5f524fdcd.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html
index 418c60c..7cf23c4 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html
@@ -64,2689 +64,2710 @@
 <span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.AsyncConnection;<a name="line.56"></a>
 <span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.AsyncTable;<a name="line.57"></a>
 <span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.BufferedMutator;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Get;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Put;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Result;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.111"></a>
-<span class="sourceLineNo">112</span><a name="line.112"></a>
-<span class="sourceLineNo">113</span>/**<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
-<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
-<span class="sourceLineNo">119</span> *<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
-<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
-<span class="sourceLineNo">124</span> *<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
-<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
-<span class="sourceLineNo">129</span> */<a name="line.129"></a>
-<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
-<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
-<span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // TODO : should we make this configurable<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private static final int TAG_LENGTH = 256;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  static {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        "Run async random read test");<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        "Run async random write test");<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.164"></a>
-<span class="sourceLineNo">165</span>        "Run async sequential read test");<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        "Run async sequential write test");<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        "Run async scan test (read every row)");<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      "Run random read test");<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      "Run random seek and scan 100 test");<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      "Run random write test");<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      "Run sequential read test");<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      "Run sequential write test");<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      "Run scan test (read every row)");<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "(make sure to use --rows=20)");<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  }<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * inner-class so we can find associated properties.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   */<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  protected static enum Counter {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    /** elapsed time */<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    ELAPSED_TIME,<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    /** number of rows */<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    public RunResult(long duration, Histogram hist) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      this.duration = duration;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.hist = hist;<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>    public final long duration;<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final Histogram hist;<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>    @Override<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    public String toString() {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      return Long.toString(duration);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>    @Override public int compareTo(RunResult o) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      return Long.compare(this.duration, o.duration);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
-<span class="sourceLineNo">234</span><a name="line.234"></a>
-<span class="sourceLineNo">235</span>  /**<a name="line.235"></a>
-<span class="sourceLineNo">236</span>   * Constructor<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * @param conf Configuration object<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   */<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    super(conf);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      String name, String description) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  /**<a name="line.249"></a>
-<span class="sourceLineNo">250</span>   * Implementations can have their status set.<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   */<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  interface Status {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    /**<a name="line.253"></a>
-<span class="sourceLineNo">254</span>     * Sets status<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * @param msg status message<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @throws IOException<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     */<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    void setStatus(final String msg) throws IOException;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  }<a name="line.259"></a>
-<span class="sourceLineNo">260</span><a name="line.260"></a>
-<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   */<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  public static class EvaluationMapTask<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>    /** configuration parameter name that contains the command */<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the PE impl */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>    @Override<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>      // this is required so that extensions of PE are instantiated within the<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // map reduce task...<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      try {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      } catch (Exception e) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      try {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        return Class.forName(className).asSubclass(type);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      } catch (ClassNotFoundException e) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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>    @Override<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.298"></a>
-<span class="sourceLineNo">299</span>           throws IOException, InterruptedException {<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>      Status status = new Status() {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        @Override<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        public void setStatus(String msg) {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>           context.setStatus(msg);<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><a name="line.307"></a>
-<span class="sourceLineNo">308</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      AsyncConnection asyncCon = null;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      try {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      } catch (ExecutionException e) {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>        throw new IOException(e);<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>      // Evaluation task<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      // Collect how much time the thing took. Report as map output and<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // to the ELAPSED_TIME counter.<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.progress();<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    }<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>  /*<a name="line.330"></a>
-<span class="sourceLineNo">331</span>   * If table does not already exist, create. Also create a table when<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   */<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      throw new IllegalStateException(<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    HTableDescriptor desc =<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    byte[][] splits = getSplits(opts);<a name="line.346"></a>
-<span class="sourceLineNo">347</span><a name="line.347"></a>
-<span class="sourceLineNo">348</span>    // recreate the table when user has requested presplit or when existing<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      needsDelete = true;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      // wait, why did it delete my table?!?<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        .add("needsDelete", needsDelete)<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("isReadCmd", isReadCmd)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("exists", exists)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("desc", desc)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("presplit", opts.presplitRegions)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("replicas", opts.replicas)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .toString());<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>    // remove an existing table<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    if (needsDelete) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      if (admin.isTableEnabled(tableName)) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        admin.disableTable(tableName);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      admin.deleteTable(tableName);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>    // table creation is necessary<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    if (!exists || needsDelete) {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      desc = getTableDescriptor(opts);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      if (splits != null) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        if (LOG.isDebugEnabled()) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<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>      admin.createTable(desc, splits);<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      LOG.info("Table " + desc + " created");<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    return admin.tableExists(tableName);<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>  /**<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setCompressionType(opts.compression);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setBloomFilterType(opts.bloomType);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBlocksize(opts.blockSize);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    if (opts.inMemoryCF) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      family.setInMemory(true);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    desc.addFamily(family);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      desc.setRegionReplication(opts.replicas);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    return desc;<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>  /**<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   * generates splits based on total number of rows and specified split regions<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   */<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      int rowkey = jump * (1 + i);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      splits[i] = format(rowkey);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return splits;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  }<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  /*<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * Run all clients in this vm each to its own thread.<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   */<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    assert cmd != null;<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    @SuppressWarnings("unchecked")<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      final int index = i;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        @Override<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        public RunResult call() throws Exception {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>            @Override<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            public void setStatus(final String msg) throws IOException {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>              LOG.info(msg);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>          });<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.459"></a>
-<span class="sourceLineNo">460</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          return run;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      });<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    }<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    pool.shutdown();<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      try {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        results[i] = threads[i].get();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      } catch (ExecutionException e) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>        throw new IOException(e.getCause());<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    final String test = cmd.getSimpleName();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.475"></a>
-<span class="sourceLineNo">476</span>             + Arrays.toString(results));<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    Arrays.sort(results);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    long total = 0;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    for (RunResult result : results) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      total += result.duration;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    LOG.info("[" + test + "]"<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      + "\tMin: " + results[0] + "ms"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.485"></a>
-<span class="sourceLineNo">486</span><a name="line.486"></a>
-<span class="sourceLineNo">487</span>    con.close();<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    asyncCon.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    return results;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  /*<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Before we start up the job, write out an input file with instruction<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * per client regards which row they are to start on.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * @param cmd Command to run.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @throws IOException<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   */<a name="line.499"></a>
-<span class="sourceLineNo">500</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    assert cmd != null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    Job job = Job.getInstance(conf);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.509"></a>
-<span class="sourceLineNo">510</span><a name="line.510"></a>
-<span class="sourceLineNo">511</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    // this is default, but be explicit about it just in case.<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.514"></a>
-<span class="sourceLineNo">515</span><a name="line.515"></a>
-<span class="sourceLineNo">516</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputValueClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setReducerClass(LongSumReducer.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>    job.setNumReduceTasks(1);<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      Histogram.class,     // yammer metrics<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      );<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>    TableMapReduceUtil.initCredentials(job);<a name="line.534"></a>
-<span class="sourceLineNo">535</span><a name="line.535"></a>
-<span class="sourceLineNo">536</span>    job.waitForCompletion(true);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    return job;<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>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<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>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>  /*<a name="line.546"></a>
-<span class="sourceLineNo">547</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * @param c Configuration<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<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>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    return writeInputFile(c, opts, new Path("."));<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.556"></a>
-<span class="sourceLineNo">557</span>  throws IOException {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>    FileSystem fs = FileSystem.get(c);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    fs.mkdirs(inputDir);<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    // Make input random.<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Hash h = MurmurHash.getInstance();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    try {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>        TestOptions next = new TestOptions(opts);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        next.startRow = j * perClientRows;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.perClientRunRows = perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        String s = MAPPER.writeValueAsString(next);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        byte[] b = Bytes.toBytes(s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        m.put(hash, s);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>        out.println(e.getValue());<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    } finally {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      out.close();<a name="line.586"></a>
-<span class="sourceLineNo">587</span>    }<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    return inputDir;<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>   * Describes a command.<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   */<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  static class CmdDescriptor {<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private String name;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String description;<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      this.cmdClass = cmdClass;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.name = name;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.description = description;<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>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>      return cmdClass;<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>    public String getName() {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>      return name;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    public String getDescription() {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>      return description;<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><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * This makes tracking all these arguments a little easier.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>  static class TestOptions {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    String cmdName = null;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    boolean nomapred = false;<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    boolean filterAll = false;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    int startRow = 0;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    float size = 1.0f;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    int perClientRunRows = DEFAULT_ROWS_PER_GB;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    int numClientThreads = 1;<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    int totalRows = DEFAULT_ROWS_PER_GB;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    int measureAfter = 0;<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    float sampleRate = 1.0f;<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    double traceRate = 0.0;<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    String tableName = TABLE_NAME;<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    boolean flushCommits = true;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    boolean writeToWAL = true;<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    boolean autoFlush = false;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    boolean oneCon = false;<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    boolean useTags = false;<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    int noOfTags = 1;<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    boolean reportLatency = false;<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    int multiGet = 0;<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    int randomSleep = 0;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    boolean inMemoryCF = false;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    int presplitRegions = 0;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    int replicas = HTableDescriptor.DEFAULT_REGION_REPLICATION;<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    String splitPolicy = null;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    Compression.Algorithm compression = Compression.Algorithm.NONE;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    BloomType bloomType = BloomType.ROW;<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    int blockSize = HConstants.DEFAULT_BLOCKSIZE;<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    DataBlockEncoding blockEncoding = DataBlockEncoding.NONE;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    boolean valueRandom = false;<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    boolean valueZipf = false;<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    int valueSize = DEFAULT_VALUE_LENGTH;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    int period = (this.perClientRunRows / 10) == 0? perClientRunRows: perClientRunRows / 10;<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    int cycles = 1;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    int columns = 1;<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    int caching = 30;<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    boolean addColumns = true;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    MemoryCompactionPolicy inMemoryCompaction =<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        MemoryCompactionPolicy.valueOf(<a name="line.664"></a>
-<span class="sourceLineNo">665</span>            CompactingMemStore.COMPACTING_MEMSTORE_TYPE_DEFAULT);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    boolean asyncPrefetch = false;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    boolean cacheBlocks = true;<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    Scan.ReadType scanReadType = Scan.ReadType.DEFAULT;<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>    public TestOptions() {}<a name="line.670"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.BufferedMutatorParams;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Get;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Put;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.Result;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.Table;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.LongWritable;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.io.Text;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Job;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.Tool;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.hadoop.util.ToolRunner;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.Sampler;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.htrace.core.TraceScope;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.Logger;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.slf4j.LoggerFactory;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * command-line which test to run and how many clients are participating in<a name="line.118"></a>
+<span class="sourceLineNo">119</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.119"></a>
+<span class="sourceLineNo">120</span> *<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.123"></a>
+<span class="sourceLineNo">124</span> * paper, pages 8-10.<a name="line.124"></a>
+<span class="sourceLineNo">125</span> *<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.128"></a>
+<span class="sourceLineNo">129</span> * specified otherwise.<a name="line.129"></a>
+<span class="sourceLineNo">130</span> */<a name="line.130"></a>
+<span class="sourceLineNo">131</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.131"></a>
+<span class="sourceLineNo">132</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  static final String RANDOM_READ = "randomRead";<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  static {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  }<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
+<span class="sourceLineNo">156</span><a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
+<span class="sourceLineNo">243</span><a name="line.243"></a>
+<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
+<span class="sourceLineNo">249</span><a name="line.249"></a>
+<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
+<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
+<span class="sourceLineNo">261</span><a name="line.261"></a>
+<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
+<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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><a name="line.297"></a>
+<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
+<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        }<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>      ObjectMapper mapper = new ObjectMapper();<a name="line.309"></a>
+<span class="sourceLineN

<TRUNCATED>

[17/44] hbase-site git commit: Published site at 8e6ff689e806138e602a46730886d8c5f524fdcd.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/131f2a89/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange1000Test.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange1000Test.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange1000Test.html
index 418c60c..7cf23c4 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange1000Test.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange1000Test.html
@@ -64,2689 +64,2710 @@
 <span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.AsyncConnection;<a name="line.56"></a>
 <span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.AsyncTable;<a name="line.57"></a>
 <span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.BufferedMutator;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Get;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Put;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Result;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.111"></a>
-<span class="sourceLineNo">112</span><a name="line.112"></a>
-<span class="sourceLineNo">113</span>/**<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
-<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
-<span class="sourceLineNo">119</span> *<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
-<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
-<span class="sourceLineNo">124</span> *<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
-<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
-<span class="sourceLineNo">129</span> */<a name="line.129"></a>
-<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
-<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
-<span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  // TODO : should we make this configurable<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private static final int TAG_LENGTH = 256;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  static {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        "Run async random read test");<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        "Run async random write test");<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.164"></a>
-<span class="sourceLineNo">165</span>        "Run async sequential read test");<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        "Run async sequential write test");<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        "Run async scan test (read every row)");<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      "Run random read test");<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      "Run random seek and scan 100 test");<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      "Run random write test");<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      "Run sequential read test");<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      "Run sequential write test");<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      "Run scan test (read every row)");<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "(make sure to use --rows=20)");<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  }<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * inner-class so we can find associated properties.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   */<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  protected static enum Counter {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    /** elapsed time */<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    ELAPSED_TIME,<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    /** number of rows */<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    public RunResult(long duration, Histogram hist) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      this.duration = duration;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.hist = hist;<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>    public final long duration;<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final Histogram hist;<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>    @Override<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    public String toString() {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      return Long.toString(duration);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    }<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>    @Override public int compareTo(RunResult o) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      return Long.compare(this.duration, o.duration);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
-<span class="sourceLineNo">234</span><a name="line.234"></a>
-<span class="sourceLineNo">235</span>  /**<a name="line.235"></a>
-<span class="sourceLineNo">236</span>   * Constructor<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * @param conf Configuration object<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   */<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    super(conf);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      String name, String description) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  /**<a name="line.249"></a>
-<span class="sourceLineNo">250</span>   * Implementations can have their status set.<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   */<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  interface Status {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    /**<a name="line.253"></a>
-<span class="sourceLineNo">254</span>     * Sets status<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * @param msg status message<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @throws IOException<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     */<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    void setStatus(final String msg) throws IOException;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  }<a name="line.259"></a>
-<span class="sourceLineNo">260</span><a name="line.260"></a>
-<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   */<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  public static class EvaluationMapTask<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>    /** configuration parameter name that contains the command */<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the PE impl */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>    @Override<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>      // this is required so that extensions of PE are instantiated within the<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // map reduce task...<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      try {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      } catch (Exception e) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      try {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        return Class.forName(className).asSubclass(type);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      } catch (ClassNotFoundException e) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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>    @Override<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.298"></a>
-<span class="sourceLineNo">299</span>           throws IOException, InterruptedException {<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>      Status status = new Status() {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        @Override<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        public void setStatus(String msg) {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>           context.setStatus(msg);<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><a name="line.307"></a>
-<span class="sourceLineNo">308</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      AsyncConnection asyncCon = null;<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      try {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      } catch (ExecutionException e) {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>        throw new IOException(e);<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>      // Evaluation task<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      // Collect how much time the thing took. Report as map output and<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // to the ELAPSED_TIME counter.<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.progress();<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    }<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>  /*<a name="line.330"></a>
-<span class="sourceLineNo">331</span>   * If table does not already exist, create. Also create a table when<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   */<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      throw new IllegalStateException(<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    HTableDescriptor desc =<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    byte[][] splits = getSplits(opts);<a name="line.346"></a>
-<span class="sourceLineNo">347</span><a name="line.347"></a>
-<span class="sourceLineNo">348</span>    // recreate the table when user has requested presplit or when existing<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      needsDelete = true;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      // wait, why did it delete my table?!?<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        .add("needsDelete", needsDelete)<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("isReadCmd", isReadCmd)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("exists", exists)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("desc", desc)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("presplit", opts.presplitRegions)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("replicas", opts.replicas)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .toString());<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>    // remove an existing table<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    if (needsDelete) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      if (admin.isTableEnabled(tableName)) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        admin.disableTable(tableName);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      admin.deleteTable(tableName);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>    // table creation is necessary<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    if (!exists || needsDelete) {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      desc = getTableDescriptor(opts);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      if (splits != null) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        if (LOG.isDebugEnabled()) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<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>      admin.createTable(desc, splits);<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      LOG.info("Table " + desc + " created");<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    return admin.tableExists(tableName);<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>  /**<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setCompressionType(opts.compression);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setBloomFilterType(opts.bloomType);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBlocksize(opts.blockSize);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    if (opts.inMemoryCF) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      family.setInMemory(true);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    desc.addFamily(family);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      desc.setRegionReplication(opts.replicas);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    return desc;<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>  /**<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   * generates splits based on total number of rows and specified split regions<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   */<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      return null;<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      int rowkey = jump * (1 + i);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      splits[i] = format(rowkey);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    return splits;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  }<a name="line.430"></a>
-<span class="sourceLineNo">431</span><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  /*<a name="line.432"></a>
-<span class="sourceLineNo">433</span>   * Run all clients in this vm each to its own thread.<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   */<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    assert cmd != null;<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    @SuppressWarnings("unchecked")<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      final int index = i;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        @Override<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        public RunResult call() throws Exception {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>            @Override<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            public void setStatus(final String msg) throws IOException {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>              LOG.info(msg);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>            }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>          });<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.459"></a>
-<span class="sourceLineNo">460</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.460"></a>
-<span class="sourceLineNo">461</span>          return run;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      });<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    }<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    pool.shutdown();<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      try {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        results[i] = threads[i].get();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      } catch (ExecutionException e) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>        throw new IOException(e.getCause());<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    final String test = cmd.getSimpleName();<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.475"></a>
-<span class="sourceLineNo">476</span>             + Arrays.toString(results));<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    Arrays.sort(results);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    long total = 0;<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    for (RunResult result : results) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      total += result.duration;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    LOG.info("[" + test + "]"<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      + "\tMin: " + results[0] + "ms"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.485"></a>
-<span class="sourceLineNo">486</span><a name="line.486"></a>
-<span class="sourceLineNo">487</span>    con.close();<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    asyncCon.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    return results;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  }<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  /*<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Before we start up the job, write out an input file with instruction<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * per client regards which row they are to start on.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * @param cmd Command to run.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @throws IOException<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   */<a name="line.499"></a>
-<span class="sourceLineNo">500</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    assert cmd != null;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    Job job = Job.getInstance(conf);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.509"></a>
-<span class="sourceLineNo">510</span><a name="line.510"></a>
-<span class="sourceLineNo">511</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    // this is default, but be explicit about it just in case.<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.514"></a>
-<span class="sourceLineNo">515</span><a name="line.515"></a>
-<span class="sourceLineNo">516</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputValueClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span><a name="line.518"></a>
-<span class="sourceLineNo">519</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setReducerClass(LongSumReducer.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>    job.setNumReduceTasks(1);<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      Histogram.class,     // yammer metrics<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      );<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>    TableMapReduceUtil.initCredentials(job);<a name="line.534"></a>
-<span class="sourceLineNo">535</span><a name="line.535"></a>
-<span class="sourceLineNo">536</span>    job.waitForCompletion(true);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    return job;<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>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<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>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>  /*<a name="line.546"></a>
-<span class="sourceLineNo">547</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * @param c Configuration<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<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>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    return writeInputFile(c, opts, new Path("."));<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
-<span class="sourceLineNo">555</span><a name="line.555"></a>
-<span class="sourceLineNo">556</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.556"></a>
-<span class="sourceLineNo">557</span>  throws IOException {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.560"></a>
-<span class="sourceLineNo">561</span><a name="line.561"></a>
-<span class="sourceLineNo">562</span>    FileSystem fs = FileSystem.get(c);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    fs.mkdirs(inputDir);<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    // Make input random.<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Hash h = MurmurHash.getInstance();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    try {<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>        TestOptions next = new TestOptions(opts);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        next.startRow = j * perClientRows;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.perClientRunRows = perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        String s = MAPPER.writeValueAsString(next);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        byte[] b = Bytes.toBytes(s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        m.put(hash, s);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      }<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>        out.println(e.getValue());<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    } finally {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      out.close();<a name="line.586"></a>
-<span class="sourceLineNo">587</span>    }<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    return inputDir;<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>   * Describes a command.<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   */<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  static class CmdDescriptor {<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private String name;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String description;<a name="line.597"></a>
-<span class="sourceLineNo">598</span><a name="line.598"></a>
-<span class="sourceLineNo">599</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      this.cmdClass = cmdClass;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.name = name;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.description = description;<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>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>      return cmdClass;<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>    public String getName() {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>      return name;<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    }<a name="line.611"></a>
-<span class="sourceLineNo">612</span><a name="line.612"></a>
-<span class="sourceLineNo">613</span>    public String getDescription() {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>      return description;<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><a name="line.617"></a>
-<span class="sourceLineNo">618</span>  /**<a name="line.618"></a>
-<span class="sourceLineNo">619</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * This makes tracking all these arguments a little easier.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>  static class TestOptions {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    String cmdName = null;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    boolean nomapred = false;<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    boolean filterAll = false;<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    int startRow = 0;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    float size = 1.0f;<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    int perClientRunRows = DEFAULT_ROWS_PER_GB;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    int numClientThreads = 1;<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    int totalRows = DEFAULT_ROWS_PER_GB;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    int measureAfter = 0;<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    float sampleRate = 1.0f;<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    double traceRate = 0.0;<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    String tableName = TABLE_NAME;<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    boolean flushCommits = true;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    boolean writeToWAL = true;<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    boolean autoFlush = false;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    boolean oneCon = false;<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    boolean useTags = false;<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    int noOfTags = 1;<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    boolean reportLatency = false;<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    int multiGet = 0;<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    int randomSleep = 0;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    boolean inMemoryCF = false;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    int presplitRegions = 0;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    int replicas = HTableDescriptor.DEFAULT_REGION_REPLICATION;<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    String splitPolicy = null;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    Compression.Algorithm compression = Compression.Algorithm.NONE;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    BloomType bloomType = BloomType.ROW;<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    int blockSize = HConstants.DEFAULT_BLOCKSIZE;<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    DataBlockEncoding blockEncoding = DataBlockEncoding.NONE;<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    boolean valueRandom = false;<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    boolean valueZipf = false;<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    int valueSize = DEFAULT_VALUE_LENGTH;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    int period = (this.perClientRunRows / 10) == 0? perClientRunRows: perClientRunRows / 10;<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    int cycles = 1;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    int columns = 1;<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    int caching = 30;<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    boolean addColumns = true;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    MemoryCompactionPolicy inMemoryCompaction =<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        MemoryCompactionPolicy.valueOf(<a name="line.664"></a>
-<span class="sourceLineNo">665</span>            CompactingMemStore.COMPACTING_MEMSTORE_TYPE_DEFAULT);<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    boolean asyncPrefetch = false;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    boolean cacheBlocks = true;<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    Scan.ReadType scanReadType = Scan.ReadType.DEFAULT;<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>    public TestOptions() {}<a name="line.670"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.BufferedMutatorParams;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.Connection;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.ConnectionFactory;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.client.Consistency;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.Get;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.client.Put;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.client.Result;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.Table;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.LongWritable;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.io.Text;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Job;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.Tool;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.hadoop.util.ToolRunner;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.Sampler;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.htrace.core.TraceScope;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.Logger;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.slf4j.LoggerFactory;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * command-line which test to run and how many clients are participating in<a name="line.118"></a>
+<span class="sourceLineNo">119</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.119"></a>
+<span class="sourceLineNo">120</span> *<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.123"></a>
+<span class="sourceLineNo">124</span> * paper, pages 8-10.<a name="line.124"></a>
+<span class="sourceLineNo">125</span> *<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.128"></a>
+<span class="sourceLineNo">129</span> * specified otherwise.<a name="line.129"></a>
+<span class="sourceLineNo">130</span> */<a name="line.130"></a>
+<span class="sourceLineNo">131</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.131"></a>
+<span class="sourceLineNo">132</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  static final String RANDOM_READ = "randomRead";<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  static {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  }<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
+<span class="sourceLineNo">156</span><a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<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>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    ROWS<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>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
+<span class="sourceLineNo">225</span><a name="line.225"></a>
+<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
+<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
+<span class="sourceLineNo">243</span><a name="line.243"></a>
+<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
+<span class="sourceLineNo">249</span><a name="line.249"></a>
+<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
+<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
+<span class="sourceLineNo">261</span><a name="line.261"></a>
+<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
+<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<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><a name="line.297"></a>
+<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
+<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        }<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</s

<TRUNCATED>