http://git-wip-us.apache.org/repos/asf/hbase/blob/61d70604/src/main/asciidoc/_chapters/architecture.adoc
----------------------------------------------------------------------
diff --git a/src/main/asciidoc/_chapters/architecture.adoc 
b/src/main/asciidoc/_chapters/architecture.adoc
index 6d362c7..19a700a 100644
--- a/src/main/asciidoc/_chapters/architecture.adoc
+++ b/src/main/asciidoc/_chapters/architecture.adoc
@@ -643,44 +643,34 @@ Documentation will eventually move to this reference 
guide, but the blog is the
 [[block.cache]]
 === Block Cache
 
-HBase provides two different BlockCache implementations: the default on-heap 
`LruBlockCache` and the `BucketCache`, which is (usually) off-heap.
-This section discusses benefits and drawbacks of each implementation, how to 
choose the appropriate option, and configuration options for each.
+HBase provides two different BlockCache implementations to cache data read 
from HDFS:
+the default on-heap `LruBlockCache` and the `BucketCache`, which is (usually) 
off-heap.
+This section discusses benefits and drawbacks of each implementation, how to 
choose the
+appropriate option, and configuration options for each.
 
 .Block Cache Reporting: UI
 [NOTE]
 ====
 See the RegionServer UI for detail on caching deploy.
-Since HBase 0.98.4, the Block Cache detail has been significantly extended 
showing configurations, sizings, current usage, time-in-the-cache, and even 
detail on block counts and types.
+See configurations, sizings, current usage, time-in-the-cache, and even detail 
on block counts and types.
 ====
 
 ==== Cache Choices
 
-`LruBlockCache` is the original implementation, and is entirely within the 
Java heap. `BucketCache` is mainly intended for keeping block cache data 
off-heap, although `BucketCache` can also keep data on-heap and serve from a 
file-backed cache.
+`LruBlockCache` is the original implementation, and is entirely within the 
Java heap.
+`BucketCache` is optional and mainly intended for keeping block cache data 
off-heap, although `BucketCache` can also be a file-backed cache.
 
-.BucketCache is production ready as of HBase 0.98.6
-[NOTE]
-====
-To run with BucketCache, you need HBASE-11678.
-This was included in 0.98.6.
-====
-
-Fetching will always be slower when fetching from BucketCache, as compared to 
the native on-heap LruBlockCache.
-However, latencies tend to be less erratic across time, because there is less 
garbage collection when you use BucketCache since it is managing BlockCache 
allocations, not the GC.
-If the BucketCache is deployed in off-heap mode, this memory is not managed by 
the GC at all.
-This is why you'd use BucketCache, so your latencies are less erratic and to 
mitigate GCs and heap fragmentation.
-See Nick Dimiduk's link:http://www.n10k.com/blog/blockcache-101/[BlockCache 
101] for comparisons running on-heap vs off-heap tests.
-Also see link:https://people.apache.org/~stack/bc/[Comparing BlockCache 
Deploys] which finds that if your dataset fits inside your LruBlockCache 
deploy, use it otherwise if you are experiencing cache churn (or you want your 
cache to exist beyond the vagaries of java GC), use BucketCache.
-
-When you enable BucketCache, you are enabling a two tier caching system, an L1 
cache which is implemented by an instance of LruBlockCache and an off-heap L2 
cache which is implemented by BucketCache.
+When you enable BucketCache, you are enabling a two tier caching system. We 
used to describe the
+tiers as "L1" and "L2" but have deprecated this terminology as of hbase-2.0.0. 
The "L1" cache referred to an
+instance of LruBlockCache and "L2" to an off-heap BucketCache. Instead, when 
BucketCache is enabled,
+all DATA blocks are kept in the BucketCache tier and meta blocks -- INDEX and 
BLOOM blocks -- are on-heap in the `LruBlockCache`.
 Management of these two tiers and the policy that dictates how blocks move 
between them is done by `CombinedBlockCache`.
-It keeps all DATA blocks in the L2 BucketCache and meta blocks -- INDEX and 
BLOOM blocks -- on-heap in the L1 `LruBlockCache`.
-See <<offheap.blockcache>> for more detail on going off-heap.
 
 [[cache.configurations]]
 ==== General Cache Configurations
 
 Apart from the cache implementation itself, you can set some general 
configuration options to control how the cache performs.
-See 
https://hbase.apache.org/devapidocs/org/apache/hadoop/hbase/io/hfile/CacheConfig.html.
+See 
link:https://hbase.apache.org/devapidocs/org/apache/hadoop/hbase/io/hfile/CacheConfig.html[CacheConfig].
 After setting any of these options, restart or rolling restart your cluster 
for the configuration to take effect.
 Check logs for errors or unexpected behavior.
 
@@ -729,13 +719,13 @@ The way to calculate how much memory is available in 
HBase for caching is:
 number of region servers * heap size * hfile.block.cache.size * 0.99
 ----
 
-The default value for the block cache is 0.25 which represents 25% of the 
available heap.
+The default value for the block cache is 0.4 which represents 40% of the 
available heap.
 The last value (99%) is the default acceptable loading factor in the LRU cache 
after which eviction is started.
 The reason it is included in this equation is that it would be unrealistic to 
say that it is possible to use 100% of the available memory since this would 
make the process blocking from the point where it loads new blocks.
 Here are some examples:
 
-* One region server with the heap size set to 1 GB and the default block cache 
size will have 253 MB of block cache available.
-* 20 region servers with the heap size set to 8 GB and a default block cache 
size will have 39.6 of block cache.
+* One region server with the heap size set to 1 GB and the default block cache 
size will have 405 MB of block cache available.
+* 20 region servers with the heap size set to 8 GB and a default block cache 
size will have 63.3 of block cache.
 * 100 region servers with the heap size set to 24 GB and a block cache size of 
0.5 will have about 1.16 TB of block cache.
 
 Your data is not the only resident of the block cache.
@@ -789,32 +779,59 @@ Since 
link:https://issues.apache.org/jira/browse/HBASE-4683[HBASE-4683 Always ca
 [[enable.bucketcache]]
 ===== How to Enable BucketCache
 
-The usual deploy of BucketCache is via a managing class that sets up two 
caching tiers: an L1 on-heap cache implemented by LruBlockCache and a second L2 
cache implemented with BucketCache.
+The usual deploy of BucketCache is via a managing class that sets up two 
caching tiers:
+an on-heap cache implemented by LruBlockCache and a second  cache implemented 
with BucketCache.
 The managing class is 
link:https://hbase.apache.org/devapidocs/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.html[CombinedBlockCache]
 by default.
 The previous link describes the caching 'policy' implemented by 
CombinedBlockCache.
-In short, it works by keeping meta blocks -- INDEX and BLOOM in the L1, 
on-heap LruBlockCache tier -- and DATA blocks are kept in the L2, BucketCache 
tier.
-It is possible to amend this behavior in HBase since version 1.0 and ask that 
a column family have both its meta and DATA blocks hosted on-heap in the L1 
tier by setting `cacheDataInL1` via `(HColumnDescriptor.setCacheDataInL1(true)` 
or in the shell, creating or amending column families setting 
`CACHE_DATA_IN_L1` to true: e.g.
+In short, it works by keeping meta blocks -- INDEX and BLOOM in the on-heap 
LruBlockCache tier -- and DATA blocks are kept in the BucketCache tier.
+
+====
+Pre-hbase-2.0.0 versions::
+Fetching will always be slower when fetching from BucketCache in 
pre-hbase-2.0.0,
+as compared to the native on-heap LruBlockCache. However, latencies tend to be 
less
+erratic across time, because there is less garbage collection when you use 
BucketCache since it is managing BlockCache allocations, not the GC.
+If the BucketCache is deployed in off-heap mode, this memory is not managed by 
the GC at all.
+This is why you'd use BucketCache in pre-2.0.0, so your latencies are less 
erratic,
+to mitigate GCs and heap fragmentation, and so you can safely use more memory.
+See Nick Dimiduk's link:http://www.n10k.com/blog/blockcache-101/[BlockCache 
101] for comparisons running on-heap vs off-heap tests.
+Also see link:https://people.apache.org/~stack/bc/[Comparing BlockCache 
Deploys] which finds that if your dataset fits inside your LruBlockCache 
deploy, use it otherwise if you are experiencing cache churn (or you want your 
cache to exist beyond the vagaries of java GC), use BucketCache.
++
+In pre-2.0.0,
+one can configure the BucketCache so it receives the `victim` of an 
LruBlockCache eviction.
+All Data and index blocks are cached in L1 first. When eviction happens from 
L1, the blocks (or `victims`) will get moved to L2.
+Set `cacheDataInL1` via `(HColumnDescriptor.setCacheDataInL1(true)` or in the 
shell, creating or amending column families setting `CACHE_DATA_IN_L1` to true: 
e.g.
 [source]
 ----
 hbase(main):003:0> create 't', {NAME => 't', CONFIGURATION => 
{CACHE_DATA_IN_L1 => 'true'}}
 ----
 
-The BucketCache Block Cache can be deployed on-heap, off-heap, or file based.
+hbase-2.0.0+ versions::
+HBASE-11425 changed the HBase read path so it could hold the read-data 
off-heap avoiding copying of cached data on to the java heap.
+See <<regionserver.offheap.readpath>>. In hbase-2.0.0, off-heap latencies 
approach those of on-heap cache latencies with the added
+benefit of NOT provoking GC.
++
+From HBase 2.0.0 onwards, the notions of L1 and L2 have been deprecated. When 
BucketCache is turned on, the DATA blocks will always go to BucketCache and 
INDEX/BLOOM blocks go to on heap LRUBlockCache. `cacheDataInL1` support hase 
been removed.
+====
+
+The BucketCache Block Cache can be deployed _off-heap_, _file_ or _mmaped_ 
file mode.
+
+
 You set which via the `hbase.bucketcache.ioengine` setting.
-Setting it to `heap` will have BucketCache deployed inside the allocated Java 
heap.
-Setting it to `offheap` will have BucketCache make its allocations off-heap, 
and an ioengine setting of `file:PATH_TO_FILE` will direct BucketCache to use a 
file caching (Useful in particular if you have some fast I/O attached to the 
box such as SSDs).
+Setting it to `offheap` will have BucketCache make its allocations off-heap, 
and an ioengine setting of `file:PATH_TO_FILE` will direct BucketCache to use 
file caching (Useful in particular if you have some fast I/O attached to the 
box such as SSDs). From 2.0.0, it is possible to have more than one file 
backing the BucketCache. This is very useful specially when the Cache size 
requirement is high. For multiple backing files, configure ioengine as 
`files:PATH_TO_FILE1,PATH_TO_FILE2,PATH_TO_FILE3`. BucketCache can be 
configured to use an mmapped file also. Configure ioengine as 
`mmap:PATH_TO_FILE` for this.
 
-It is possible to deploy an L1+L2 setup where we bypass the CombinedBlockCache 
policy and have BucketCache working as a strict L2 cache to the L1 
LruBlockCache.
-For such a setup, set `CacheConfig.BUCKET_CACHE_COMBINED_KEY` to `false`.
+It is possible to deploy a tiered setup where we bypass the CombinedBlockCache 
policy and have BucketCache working as a strict L2 cache to the L1 
LruBlockCache.
+For such a setup, set `hbase.bucketcache.combinedcache.enabled` to `false`.
 In this mode, on eviction from L1, blocks go to L2.
 When a block is cached, it is cached first in L1.
 When we go to look for a cached block, we look first in L1 and if none found, 
then search L2.
 Let us call this deploy format, _Raw L1+L2_.
+NOTE: This L1+L2 mode is removed from 2.0.0. When BucketCache is used, it will 
be strictly the DATA cache and the LruBlockCache will cache INDEX/META blocks.
 
 Other BucketCache configs include: specifying a location to persist cache to 
across restarts, how many threads to use writing the cache, etc.
 See the 
link:https://hbase.apache.org/devapidocs/org/apache/hadoop/hbase/io/hfile/CacheConfig.html[CacheConfig.html]
 class for configuration options and descriptions.
 
-
+To check it enabled, look for the log line describing cache setup; it will 
detail how BucketCache has been deployed.
+Also see the UI. It will detail the cache tiering and their configuration.
 
 ====== BucketCache Example Configuration
 This sample provides a configuration for a 4 GB off-heap BucketCache with a 1 
GB on-heap cache.
@@ -876,9 +893,10 @@ The following example configures buckets of size 4096 and 
8192.
 [NOTE]
 ====
 The default maximum direct memory varies by JVM.
-Traditionally it is 64M or some relation to allocated heap size (-Xmx) or no 
limit at all (JDK7 apparently). HBase servers use direct memory, in particular 
short-circuit reading, the hosted DFSClient will allocate direct memory buffers.
+Traditionally it is 64M or some relation to allocated heap size (-Xmx) or no 
limit at all (JDK7 apparently). HBase servers use direct memory, in particular 
short-circuit reading (See <<perf.hdfs.configs.localread>>), the hosted 
DFSClient will allocate direct memory buffers. How much the DFSClient uses is 
not easy to quantify; it is the number of open HFiles * 
`hbase.dfs.client.read.shortcircuit.buffer.size` where 
`hbase.dfs.client.read.shortcircuit.buffer.size` is set to 128k in HBase -- see 
_hbase-default.xml_ default configurations.
 If you do off-heap block caching, you'll be making use of direct memory.
-Starting your JVM, make sure the `-XX:MaxDirectMemorySize` setting in 
_conf/hbase-env.sh_ is set to some value that is higher than what you have 
allocated to your off-heap BlockCache (`hbase.bucketcache.size`). It should be 
larger than your off-heap block cache and then some for DFSClient usage (How 
much the DFSClient uses is not easy to quantify; it is the number of open 
HFiles * `hbase.dfs.client.read.shortcircuit.buffer.size` where 
`hbase.dfs.client.read.shortcircuit.buffer.size` is set to 128k in HBase -- see 
_hbase-default.xml_ default configurations). Direct memory, which is part of 
the Java process heap, is separate from the object heap allocated by -Xmx.
+The RPCServer uses a ByteBuffer pool. From 2.0.0, these buffers are off-heap 
ByteBuffers.
+Starting your JVM, make sure the `-XX:MaxDirectMemorySize` setting in 
_conf/hbase-env.sh_ considers off-heap BlockCache (`hbase.bucketcache.size`), 
DFSClient usage, RPC side ByteBufferPool max size. This has to be bit higher 
than sum of off heap BlockCache size and max ByteBufferPool size. Allocating an 
extra of 1-2 GB for the max direct memory size has worked in tests. Direct 
memory, which is part of the Java process heap, is separate from the object 
heap allocated by -Xmx.
 The value allocated by `MaxDirectMemorySize` must not exceed physical RAM, and 
is likely to be less than the total available RAM due to other memory 
requirements and system constraints.
 
 You can see how much memory -- on-heap and off-heap/direct -- a RegionServer 
is configured to use and how much it is using at any one time by looking at the 
_Server Metrics: Memory_ tab in the UI.
@@ -898,7 +916,7 @@ If the deploy was using CombinedBlockCache, then the 
LruBlockCache L1 size was c
 where size-of-bucket-cache itself is EITHER the value of the configuration 
`hbase.bucketcache.size` IF it was specified as Megabytes OR 
`hbase.bucketcache.size` * `-XX:MaxDirectMemorySize` if 
`hbase.bucketcache.size` is between 0 and 1.0.
 
 In 1.0, it should be more straight-forward.
-L1 LruBlockCache size is set as a fraction of java heap using 
`hfile.block.cache.size setting` (not the best name) and L2 is set as above 
either in absolute Megabytes or as a fraction of allocated maximum direct 
memory.
+Onheap LruBlockCache size is set as a fraction of java heap using 
`hfile.block.cache.size setting` (not the best name) and BucketCache is set as 
above in absolute Megabytes.
 ====
 
 ==== Compressed BlockCache
@@ -911,6 +929,54 @@ For a RegionServer hosting data that can comfortably fit 
into cache, or if your
 
 The compressed BlockCache is disabled by default. To enable it, set 
`hbase.block.data.cachecompressed` to `true` in _hbase-site.xml_ on all 
RegionServers.
 
+[[regionserver.offheap]]
+=== RegionServer Offheap Read/Write Path
+
+[[regionserver.offheap.readpath]]
+==== Offheap read-path
+In hbase-2.0.0, 
link:https://issues.apache.org/jira/browse/HBASE-11425[HBASE-11425] changed the 
HBase read path so it
+could hold the read-data off-heap avoiding copying of cached data on to the 
java heap.
+This reduces GC pauses given there is less garbage made and so less to clear. 
The off-heap read path has a performance
+that is similar/better to that of the on-heap LRU cache.  This feature is 
available since HBase 2.0.0.
+If the BucketCache is in `file` mode, fetching will always be slower compared 
to the native on-heap LruBlockCache.
+Refer to below blogs for more details and test results on off heaped read path
+link:https://blogs.apache.org/hbase/entry/offheaping_the_read_path_in[Offheaping
 the Read Path in Apache HBase: Part 1 of 2]
+and 
link:https://blogs.apache.org/hbase/entry/offheap-read-path-in-production[Offheap
 Read-Path in Production - The Alibaba story]
+
+For an end-to-end off-heaped read-path, first of all there should be an 
off-heap backed <<offheap.blockcache>>(BC). Configure 
'hbase.bucketcache.ioengine' to off-heap in
+_hbase-site.xml_. Also specify the total capacity of the BC using 
`hbase.bucketcache.size` config. Please remember to adjust value of 
'HBASE_OFFHEAPSIZE' in
+_hbase-env.sh_. This is how we specify the max possible off-heap memory 
allocation for the
+RegionServer java process. This should be bigger than the off-heap BC size. 
Please keep in mind that there is no default for `hbase.bucketcache.ioengine`
+which means the BC is turned OFF by default (See <<direct.memory>>).
+
+Next thing to tune is the ByteBuffer pool on the RPC server side.
+The buffers from this pool will be used to accumulate the cell bytes and 
create a result cell block to send back to the client side.
+`hbase.ipc.server.reservoir.enabled` can be used to turn this pool ON or OFF. 
By default this pool is ON and available. HBase will create off heap ByteBuffers
+and pool them. Please make sure not to turn this OFF if you want end-to-end 
off-heaping in read path.
+If this pool is turned off, the server will create temp buffers on heap to 
accumulate the cell bytes and make a result cell block. This can impact the GC 
on a highly read loaded server.
+The user can tune this pool with respect to how many buffers are in the pool 
and what should be the size of each ByteBuffer.
+Use the config `hbase.ipc.server.reservoir.initial.buffer.size` to tune each 
of the buffer sizes. Default is 64 KB.
+
+When the read pattern is a random row read load and each of the rows are 
smaller in size compared to this 64 KB, try reducing this.
+When the result size is larger than one ByteBuffer size, the server will try 
to grab more than one buffer and make a result cell block out of these. When 
the pool is running out of buffers, the server will end up creating temporary 
on-heap buffers.
+
+The maximum number of ByteBuffers in the pool can be tuned using the config 
'hbase.ipc.server.reservoir.initial.max'. Its value defaults to 64 * region 
server handlers configured (See the config 'hbase.regionserver.handler.count'). 
The math is such that by default we consider 2 MB as the result cell block size 
per read result and each handler will be handling a read. For 2 MB size, we 
need 32 buffers each of size 64 KB (See default buffer size in pool). So per 
handler 32 ByteBuffers(BB). We allocate twice this size as the max BBs count 
such that one handler can be creating the response and handing it to the RPC 
Responder thread and then handling a new request creating a new response cell 
block (using pooled buffers). Even if the responder could not send back the 
first TCP reply immediately, our count should allow that we should still have 
enough buffers in our pool without having to make temporary buffers on the 
heap. Again for smaller sized random row reads, tune this max count. Th
 ere are lazily created buffers and the count is the max count to be pooled.
+
+If you still see GC issues even after making end-to-end read path off-heap, 
look for issues in the appropriate buffer pool. Check the below RegionServer 
log with INFO level:
+[source]
+----
+Pool already reached its max capacity : XXX and no free buffers now. Consider 
increasing the value for 'hbase.ipc.server.reservoir.initial.max' ?
+----
+
+The setting for _HBASE_OFFHEAPSIZE_ in _hbase-env.sh_ should consider this off 
heap buffer pool at the RPC side also. We need to config this max off heap size 
for the RegionServer as a bit higher than the sum of this max pool size and the 
off heap cache size. The TCP layer will also need to create direct bytebuffers 
for TCP communication. Also the DFS client will need some off-heap to do its 
workings especially if short-circuit reads are configured. Allocating an extra 
of 1 - 2 GB for the max direct memory size has worked in tests.
+
+If you are using co processors and refer the Cells in the read results, DO NOT 
store reference to these Cells out of the scope of the CP hook methods. Some 
times the CPs need store info about the cell (Like its row key) for considering 
in the next CP hook call etc. For such cases, pls clone the required fields of 
the entire Cell as per the use cases. [ See CellUtil#cloneXXX(Cell) APIs ]
+
+[[regionserver.offheap.writepath]]
+==== Offheap write-path
+
+TODO
+
 [[regionserver_splitting_implementation]]
 === RegionServer Splitting Implementation
 
@@ -951,8 +1017,11 @@ However, if a RegionServer crashes or becomes unavailable 
before the MemStore is
 If writing to the WAL fails, the entire operation to modify the data fails.
 
 HBase uses an implementation of the 
link:https://hbase.apache.org/devapidocs/org/apache/hadoop/hbase/wal/WAL.html[WAL]
 interface.
-Usually, there is only one instance of a WAL per RegionServer.
-The RegionServer records Puts and Deletes to it, before recording them to the 
<<store.memstore>> for the affected <<store>>.
+Usually, there is only one instance of a WAL per RegionServer. An exception
+is the RegionServer that is carrying _hbase:meta_; the _meta_ table gets its
+own dedicated WAL.
+The RegionServer records Puts and Deletes to its WAL, before recording them
+these Mutations <<store.memstore>> for the affected <<store>>.
 
 .The HLog
 [NOTE]
@@ -962,9 +1031,33 @@ In 0.94, HLog was the name of the implementation of the 
WAL.
 You will likely find references to the HLog in documentation tailored to these 
older versions.
 ====
 
-The WAL resides in HDFS in the _/hbase/WALs/_ directory (prior to HBase 0.94, 
they were stored in _/hbase/.logs/_), with subdirectories per region.
+The WAL resides in HDFS in the _/hbase/WALs/_ directory, with subdirectories 
per region.
+
+For more general information about the concept of write ahead logs, see the 
Wikipedia
+link:http://en.wikipedia.org/wiki/Write-ahead_logging[Write-Ahead Log] article.
+
 
-For more general information about the concept of write ahead logs, see the 
Wikipedia link:http://en.wikipedia.org/wiki/Write-ahead_logging[Write-Ahead 
Log] article.
+[[wal.providers]]
+==== WAL Providers
+In HBase, there are a number of WAL imlementations (or 'Providers'). Each is 
known
+by a short name label (that unfortunately is not always descriptive). You set 
the provider in
+_hbase-site.xml_ passing the WAL provder short-name as the value on the
+_hbase.wal.provider_ property (Set the provider for _hbase:meta_ using the
+_hbase.wal.meta_provider_ property).
+
+ * _asyncfs_: The *default*. New since hbase-2.0.0 (HBASE-15536, HBASE-14790). 
This _AsyncFSWAL_ provider, as it identifies itself in RegionServer logs, is 
built on a new non-blocking dfsclient implementation. It is currently resident 
in the hbase codebase but intent is to move it back up into HDFS itself. WALs 
edits are written concurrently ("fan-out") style to each of the WAL-block 
replicas on each DataNode rather than in a chained pipeline as the default 
client does. Latencies should be better. See 
link:https://www.slideshare.net/HBaseCon/apache-hbase-improvements-and-practices-at-xiaomi[Apache
 HBase Improements and Practices at Xiaomi] at slide 14 onward for more detail 
on implementation.
+ * _filesystem_: This was the default in hbase-1.x releases. It is built on 
the blocking _DFSClient_ and writes to replicas in classic _DFSCLient_ pipeline 
mode. In logs it identifies as _FSHLog_ or _FSHLogProvider_.
+ * _multiwal_: This provider is made of multiple instances of _asyncfs_ or  
_filesystem_. See the next section for more on _multiwal_.
+
+Look for the lines like the below in the RegionServer log to see which 
provider is in place (The below shows the default AsyncFSWALProvider):
+
+----
+2018-04-02 13:22:37,983 INFO  [regionserver/ve0528:16020] wal.WALFactory: 
Instantiating WALProvider of type class 
org.apache.hadoop.hbase.wal.AsyncFSWALProvider
+----
+
+NOTE: As the _AsyncFSWAL_ hacks into the internal of DFSClient implementation, 
it will be easily broken by upgrading the hadoop dependencies, even for a 
simple patch release. So if you do not specify the wal provider explicitly, we 
will first try to use the _asyncfs_, if failed, we will fall back to use 
_filesystem_. And notice that this may not always work, so if you still have 
problem starting HBase due to the problem of starting _AsyncFSWAL_, please 
specify _filesystem_ explicitly in the config file.
+
+NOTE: EC support has been added to hadoop-3.x, and it is incompatible with WAL 
as the EC output stream does not support hflush/hsync. In order to create a 
non-EC file in an EC directory, we need to use the new builder-based create API 
for _FileSystem_, but it is only introduced in hadoop-2.9+ and for HBase we 
still need to support hadoop-2.7.x. So please do not enable EC for the WAL 
directory until we find a way to deal with it.
 
 ==== MultiWAL
 With a single WAL per RegionServer, the RegionServer must write to the WAL 
serially, because HDFS files must be sequential. This causes the WAL to be a 
performance bottleneck.
@@ -1090,28 +1183,28 @@ The general process for log splitting, as described in 
<<log.splitting.step.by.s
 
 . If distributed log processing is enabled, the HMaster creates a _split log 
manager_ instance when the cluster is started.
   .. The split log manager manages all log files which need to be scanned and 
split.
-  .. The split log manager places all the logs into the ZooKeeper splitlog 
node (_/hbase/splitlog_) as tasks.
-  .. You can view the contents of the splitlog by issuing the following 
`zkCli` command. Example output is shown.
+  .. The split log manager places all the logs into the ZooKeeper splitWAL 
node (_/hbase/splitWAL_) as tasks.
+  .. You can view the contents of the splitWAL by issuing the following 
`zkCli` command. Example output is shown.
 +
 [source,bash]
 ----
-ls /hbase/splitlog
-[hdfs%3A%2F%2Fhost2.sample.com%3A56020%2Fhbase%2F.logs%2Fhost8.sample.com%2C57020%2C1340474893275-splitting%2Fhost8.sample.com%253A57020.1340474893900,
-hdfs%3A%2F%2Fhost2.sample.com%3A56020%2Fhbase%2F.logs%2Fhost3.sample.com%2C57020%2C1340474893299-splitting%2Fhost3.sample.com%253A57020.1340474893931,
-hdfs%3A%2F%2Fhost2.sample.com%3A56020%2Fhbase%2F.logs%2Fhost4.sample.com%2C57020%2C1340474893287-splitting%2Fhost4.sample.com%253A57020.1340474893946]
+ls /hbase/splitWAL
+[hdfs%3A%2F%2Fhost2.sample.com%3A56020%2Fhbase%2FWALs%2Fhost8.sample.com%2C57020%2C1340474893275-splitting%2Fhost8.sample.com%253A57020.1340474893900,
+hdfs%3A%2F%2Fhost2.sample.com%3A56020%2Fhbase%2FWALs%2Fhost3.sample.com%2C57020%2C1340474893299-splitting%2Fhost3.sample.com%253A57020.1340474893931,
+hdfs%3A%2F%2Fhost2.sample.com%3A56020%2Fhbase%2FWALs%2Fhost4.sample.com%2C57020%2C1340474893287-splitting%2Fhost4.sample.com%253A57020.1340474893946]
 ----
 +
 The output contains some non-ASCII characters.
 When decoded, it looks much more simple:
 +
 ----
-[hdfs://host2.sample.com:56020/hbase/.logs
+[hdfs://host2.sample.com:56020/hbase/WALs
 /host8.sample.com,57020,1340474893275-splitting
 /host8.sample.com%3A57020.1340474893900,
-hdfs://host2.sample.com:56020/hbase/.logs
+hdfs://host2.sample.com:56020/hbase/WALs
 /host3.sample.com,57020,1340474893299-splitting
 /host3.sample.com%3A57020.1340474893931,
-hdfs://host2.sample.com:56020/hbase/.logs
+hdfs://host2.sample.com:56020/hbase/WALs
 /host4.sample.com,57020,1340474893287-splitting
 /host4.sample.com%3A57020.1340474893946]
 ----
@@ -1122,7 +1215,7 @@ The listing represents WAL file names to be scanned and 
split, which is a list o
 +
 The split log manager is responsible for the following ongoing tasks:
 +
-* Once the split log manager publishes all the tasks to the splitlog znode, it 
monitors these task nodes and waits for them to be processed.
+* Once the split log manager publishes all the tasks to the splitWAL znode, it 
monitors these task nodes and waits for them to be processed.
 * Checks to see if there are any dead split log workers queued up.
   If it finds tasks claimed by unresponsive workers, it will resubmit those 
tasks.
   If the resubmit fails due to some ZooKeeper exception, the dead worker is 
queued up again for retry.
@@ -1140,7 +1233,7 @@ The split log manager is responsible for the following 
ongoing tasks:
   In the example output below, the first line of the output shows that the 
task is currently unassigned.
 +
 ----
-get 
/hbase/splitlog/hdfs%3A%2F%2Fhost2.sample.com%3A56020%2Fhbase%2F.logs%2Fhost6.sample.com%2C57020%2C1340474893287-splitting%2Fhost6.sample.com%253A57020.1340474893945
+get 
/hbase/splitWAL/hdfs%3A%2F%2Fhost2.sample.com%3A56020%2Fhbase%2FWALs%2Fhost6.sample.com%2C57020%2C1340474893287-splitting%2Fhost6.sample.com%253A57020.1340474893945
 
 unassigned host2.sample.com:57000
 cZxid = 0×7115
@@ -1171,12 +1264,12 @@ Based on the state of the task whose data is changed, 
the split log manager does
 +
 Each RegionServer runs a daemon thread called the _split log worker_, which 
does the work to split the logs.
 The daemon thread starts when the RegionServer starts, and registers itself to 
watch HBase znodes.
-If any splitlog znode children change, it notifies a sleeping worker thread to 
wake up and grab more tasks.
+If any splitWAL znode children change, it notifies a sleeping worker thread to 
wake up and grab more tasks.
 If a worker's current task's node data is changed,
 the worker checks to see if the task has been taken by another worker.
 If so, the worker thread stops work on the current task.
 +
-The worker monitors the splitlog znode constantly.
+The worker monitors the splitWAL znode constantly.
 When a new task appears, the split log worker retrieves the task paths and 
checks each one until it finds an unclaimed task, which it attempts to claim.
 If the claim was successful, it attempts to perform the task and updates the 
task's `state` property based on the splitting outcome.
 At this point, the split log worker scans for another unclaimed task.
@@ -1219,21 +1312,17 @@ A possible downside to WAL compression is that we lose 
more data from the last b
 mid-write. If entries in this last block were added with new dictionary 
entries but we failed persist the amended
 dictionary because of an abrupt termination, a read of this last block may not 
be able to resolve last-written entries.
 
-[[wal.compression]]
-==== WAL Compression ====
+[[wal.durability]]
+==== Durability
+It is possible to set _durability_ on each Mutation or on a Table basis. 
Options include:
 
-The content of the WAL can be compressed using LRU Dictionary compression.
-This can be used to speed up WAL replication to different datanodes.
-The dictionary can store up to 2^15^ elements; eviction starts after this 
number is exceeded.
-
-To enable WAL compression, set the `hbase.regionserver.wal.enablecompression` 
property to `true`.
-The default value for this property is `false`.
-By default, WAL tag compression is turned on when WAL compression is enabled.
-You can turn off WAL tag compression by setting the 
`hbase.regionserver.wal.tags.enablecompression` property to 'false'.
+ * _SKIP_WAL_: Do not write Mutations to the WAL (See the next section, 
<<wal.disable>>).
+ * _ASYNC_WAL_: Write the WAL asynchronously; do not hold-up clients waiting 
on the sync of their write to the filesystem but return immediately. The edit 
becomes visible. Meanwhile, in the background, the Mutation will be flushed to 
the WAL at some time later. This option currently may lose data. See 
HBASE-16689.
+ * _SYNC_WAL_: The *default*. Each edit is sync'd to HDFS before we return 
success to the client.
+ * _FSYNC_WAL_: Each edit is fsync'd to HDFS and the filesystem before we 
return success to the client.
 
-A possible downside to WAL compression is that we lose more data from the last 
block in the WAL if it ill-terminated
-mid-write. If entries in this last block were added with new dictionary 
entries but we failed persist the amended
-dictionary because of an abrupt termination, a read of this last block may not 
be able to resolve last-written entries. 
+Do not confuse the _ASYNC_WAL_ option on a Mutation or Table with the 
_AsyncFSWAL_ writer; they are distinct
+options unfortunately closely named
 
 [[wal.disable]]
 ==== Disabling the WAL
@@ -1249,6 +1338,7 @@ There is no way to disable the WAL for only a specific 
table.
 
 WARNING: If you disable the WAL for anything other than bulk loads, your data 
is at risk.
 
+
 [[regions.arch]]
 == Regions
 
@@ -1605,20 +1695,20 @@ Also see <<hfilev2>> for information about the HFile v2 
format that was included
 [[hfile_tool]]
 ===== HFile Tool
 
-To view a textualized version of HFile content, you can use the 
`org.apache.hadoop.hbase.io.hfile.HFile` tool.
+To view a textualized version of HFile content, you can use the `hbase hfile` 
tool.
 Type the following to see usage:
 
 [source,bash]
 ----
-$ ${HBASE_HOME}/bin/hbase org.apache.hadoop.hbase.io.hfile.HFile
+$ ${HBASE_HOME}/bin/hbase hfile
 ----
-For example, to view the content of the file 
_hdfs://10.81.47.41:8020/hbase/TEST/1418428042/DSMP/4759508618286845475_, type 
the following:
+For example, to view the content of the file 
_hdfs://10.81.47.41:8020/hbase/default/TEST/1418428042/DSMP/4759508618286845475_,
 type the following:
 [source,bash]
 ----
- $ ${HBASE_HOME}/bin/hbase org.apache.hadoop.hbase.io.hfile.HFile -v -f 
hdfs://10.81.47.41:8020/hbase/TEST/1418428042/DSMP/4759508618286845475
+ $ ${HBASE_HOME}/bin/hbase hfile -v -f 
hdfs://10.81.47.41:8020/hbase/default/TEST/1418428042/DSMP/4759508618286845475
 ----
 If you leave off the option -v to see just a summary on the HFile.
-See usage for other things to do with the `HFile` tool.
+See usage for other things to do with the `hfile` tool.
 
 [[store.file.dir]]
 ===== StoreFile Directory Structure on HDFS
@@ -1773,9 +1863,20 @@ These parameters will be explained in context, and then 
will be given in a table
 ====== Being Stuck
 
 When the MemStore gets too large, it needs to flush its contents to a 
StoreFile.
-However, a Store can only have `hbase.hstore.blockingStoreFiles` files, so the 
MemStore needs to wait for the number of StoreFiles to be reduced by one or 
more compactions.
-However, if the MemStore grows larger than 
`hbase.hregion.memstore.flush.size`, it is not able to flush its contents to a 
StoreFile.
-If the MemStore is too large and the number of StoreFiles is also too high, 
the algorithm is said to be "stuck". The compaction algorithm checks for this 
"stuck" situation and provides mechanisms to alleviate it.
+However, Stores are configured with a bound on the number StoreFiles,
+`hbase.hstore.blockingStoreFiles`, and if in excess, the MemStore flush must 
wait
+until the StoreFile count is reduced by one or more compactions. If the 
MemStore
+is too large and the number of StoreFiles is also too high, the algorithm is 
said
+to be "stuck". By default we'll wait on compactions up to
+`hbase.hstore.blockingWaitTime` milliseconds. If this period expires, we'll 
flush
+anyways even though we are in excess of the
+`hbase.hstore.blockingStoreFiles` count.
+
+Upping the `hbase.hstore.blockingStoreFiles` count will allow flushes to happen
+but a Store with many StoreFiles in will likely have higher read latencies. 
Try to
+figure why Compactions are not keeping up. Is it a write spurt that is bringing
+about this situation or is a regular occurance and the cluster is 
under-provisioned
+for the volume of writes?
 
 [[exploringcompaction.policy]]
 ====== The ExploringCompactionPolicy Algorithm
@@ -2439,6 +2540,8 @@ See the above HDFS Architecture link for more information.
 [[arch.timelineconsistent.reads]]
 == Timeline-consistent High Available Reads
 
+NOTE: The current <<amv2, Assignment Manager V2>> does not work well with 
region replica, so this feature maybe broken. Use it with caution.
+
 [[casestudies.timelineconsistent.intro]]
 === Introduction
 

http://git-wip-us.apache.org/repos/asf/hbase/blob/61d70604/src/main/asciidoc/_chapters/backup_restore.adoc
----------------------------------------------------------------------
diff --git a/src/main/asciidoc/_chapters/backup_restore.adoc 
b/src/main/asciidoc/_chapters/backup_restore.adoc
deleted file mode 100644
index c6dac85..0000000
--- a/src/main/asciidoc/_chapters/backup_restore.adoc
+++ /dev/null
@@ -1,912 +0,0 @@
-////
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-////
-
-[[backuprestore]]
-= Backup and Restore
-:doctype: book
-:numbered:
-:toc: left
-:icons: font
-:experimental:
-
-[[br.overview]]
-== Overview
-
-Backup and restore is a standard operation provided by many databases. An 
effective backup and restore
-strategy helps ensure that users can recover data in case of unexpected 
failures. The HBase backup and restore
-feature helps ensure that enterprises using HBase as a canonical data 
repository can recover from catastrophic
-failures. Another important feature is the ability to restore the database to 
a particular
-point-in-time, commonly referred to as a snapshot.
-
-The HBase backup and restore feature provides the ability to create full 
backups and incremental backups on
-tables in an HBase cluster. The full backup is the foundation on which 
incremental backups are applied
-to build iterative snapshots. Incremental backups can be run on a schedule to 
capture changes over time,
-for example by using a Cron task. Incremental backups are more cost-effective 
than full backups because they only capture
-the changes since the last backup and they also enable administrators to 
restore the database to any prior incremental backup. Furthermore, the
-utilities also enable table-level data backup-and-recovery if you do not want 
to restore the entire dataset
-of the backup.
-
-The backup and restore feature supplements the HBase Replication feature. 
While HBase replication is ideal for
-creating "hot" copies of the data (where the replicated data is immediately 
available for query), the backup and
-restore feature is ideal for creating "cold" copies of data (where a manual 
step must be taken to restore the system).
-Previously, users only had the ability to create full backups via the 
ExportSnapshot functionality. The incremental
-backup implementation is the novel improvement over the previous "art" 
provided by ExportSnapshot.
-
-[[br.terminology]]
-== Terminology
-
-The backup and restore feature introduces new terminology which can be used to 
understand how control flows through the
-system.
-
-* _A backup_: A logical unit of data and metadata which can restore a table to 
its state at a specific point in time.
-* _Full backup_: a type of backup which wholly encapsulates the contents of 
the table at a point in time.
-* _Incremental backup_: a type of backup which contains the changes in a table 
since a full backup.
-* _Backup set_: A user-defined name which references one or more tables over 
which a backup can be executed.
-* _Backup ID_: A unique names which identifies one backup from the rest, e.g. 
`backupId_1467823988425`
-
-[[br.planning]]
-== Planning
-
-There are some common strategies which can be used to implement backup and 
restore in your environment. The following section
-shows how these strategies are implemented and identifies potential tradeoffs 
with each.
-
-WARNING: This backup and restore tools has not been tested on Transparent Data 
Encryption (TDE) enabled HDFS clusters.
-This is related to the open issue 
link:https://issues.apache.org/jira/browse/HBASE-16178[HBASE-16178].
-
-[[br.intracluster.backup]]
-=== Backup within a cluster
-
-This strategy stores the backups on the same cluster as where the backup was 
taken. This approach is only appropriate for testing
-as it does not provide any additional safety on top of what the software 
itself already provides.
-
-.Intra-Cluster Backup
-image::backup-intra-cluster.png[]
-
-[[br.dedicated.cluster.backup]]
-=== Backup using a dedicated cluster
-
-This strategy provides greater fault tolerance and provides a path towards 
disaster recovery. In this setting, you will
-store the backup on a separate HDFS cluster by supplying the backup 
destination cluster’s HDFS URL to the backup utility.
-You should consider backing up to a different physical location, such as a 
different data center.
-
-Typically, a backup-dedicated HDFS cluster uses a more economical hardware 
profile to save money.
-
-.Dedicated HDFS Cluster Backup
-image::backup-dedicated-cluster.png[]
-
-[[br.cloud.or.vendor.backup]]
-=== Backup to the Cloud or a storage vendor appliance
-
-Another approach to safeguarding HBase incremental backups is to store the 
data on provisioned, secure servers that belong
-to third-party vendors and that are located off-site. The vendor can be a 
public cloud provider or a storage vendor who uses
-a Hadoop-compatible file system, such as S3 and other HDFS-compatible 
destinations.
-
-.Backup to Cloud or Vendor Storage Solutions
-image::backup-cloud-appliance.png[]
-
-NOTE: The HBase backup utility does not support backup to multiple 
destinations. A workaround is to manually create copies
-of the backup files from HDFS or S3.
-
-[[br.initial.setup]]
-== First-time configuration steps
-
-This section contains the necessary configuration changes that must be made in 
order to use the backup and restore feature.
-As this feature makes significant use of YARN's MapReduce framework to 
parallelize these I/O heavy operations, configuration
-changes extend outside of just `hbase-site.xml`.
-
-=== Allow the "hbase" system user in YARN
-
-The YARN *container-executor.cfg* configuration file must have the following 
property setting: _allowed.system.users=hbase_. No spaces
-are allowed in entries of this configuration file.
-
-WARNING: Skipping this step will result in runtime errors when executing the 
first backup tasks.
-
-*Example of a valid container-executor.cfg file for backup and restore:*
-
-[source]
-----
-yarn.nodemanager.log-dirs=/var/log/hadoop/mapred
-yarn.nodemanager.linux-container-executor.group=yarn
-banned.users=hdfs,yarn,mapred,bin
-allowed.system.users=hbase
-min.user.id=500
-----
-
-=== HBase specific changes
-
-Add the following properties to hbase-site.xml and restart HBase if it is 
already running.
-
-NOTE: The ",..." is an ellipsis meant to imply that this is a comma-separated 
list of values, not literal text which should be added to hbase-site.xml.
-
-[source]
-----
-<property>
-  <name>hbase.backup.enable</name>
-  <value>true</value>
-</property>
-<property>
-  <name>hbase.master.logcleaner.plugins</name>
-  <value>org.apache.hadoop.hbase.backup.master.BackupLogCleaner,...</value>
-</property>
-<property>
-  <name>hbase.procedure.master.classes</name>
-  
<value>org.apache.hadoop.hbase.backup.master.LogRollMasterProcedureManager,...</value>
-</property>
-<property>
-  <name>hbase.procedure.regionserver.classes</name>
-  
<value>org.apache.hadoop.hbase.backup.regionserver.LogRollRegionServerProcedureManager,...</value>
-</property>
-<property>
-  <name>hbase.coprocessor.region.classes</name>
-  <value>org.apache.hadoop.hbase.backup.BackupObserver,...</value>
-</property>
-<property>
-  <name>hbase.master.hfilecleaner.plugins</name>
-  <value>org.apache.hadoop.hbase.backup.BackupHFileCleaner,...</value>
-</property>
-----
-
-== Backup and Restore commands
-
-This covers the command-line utilities that administrators would run to 
create, restore, and merge backups. Tools to
-inspect details on specific backup sessions is covered in the next section, 
<<br.administration,Administration of Backup Images>>.
-
-Run the command `hbase backup help <command>` to access the online help that 
provides basic information about a command
-and its options. The below information is captured in this help message for 
each command.
-
-// hbase backup create
-
-[[br.creating.complete.backup]]
-### Creating a Backup Image
-
-[NOTE]
-====
-For HBase clusters also using Apache Phoenix: include the SQL system catalog 
tables in the backup. In the event that you
-need to restore the HBase backup, access to the system catalog tables enable 
you to resume Phoenix interoperability with the
-restored data.
-====
-
-The first step in running the backup and restore utilities is to perform a 
full backup and to store the data in a separate image
-from the source. At a minimum, you must do this to get a baseline before you 
can rely on incremental backups.
-
-Run the following command as HBase superuser:
-
-[source]
-----
-hbase backup create <type> <backup_path>
-----
-
-After the command finishes running, the console prints a SUCCESS or FAILURE 
status message. The SUCCESS message includes a _backup_ ID.
-The backup ID is the Unix time (also known as Epoch time) that the HBase 
master received the backup request from the client.
-
-[TIP]
-====
-Record the backup ID that appears at the end of a successful backup. In case 
the source cluster fails and you need to recover the
-dataset with a restore operation, having the backup ID readily available can 
save time.
-====
-
-[[br.create.positional.cli.arguments]]
-#### Positional Command-Line Arguments
-
-_type_::
-  The type of backup to execute: _full_ or _incremental_. As a reminder, an 
_incremental_ backup requires a _full_ backup to
-  already exist.
-
-_backup_path_::
-  The _backup_path_ argument specifies the full filesystem URI of where to 
store the backup image. Valid prefixes are
-  are _hdfs:_, _webhdfs:_, _gpfs:_, and _s3fs:_.
-
-[[br.create.named.cli.arguments]]
-#### Named Command-Line Arguments
-
-_-t <table_name[,table_name]>_::
-  A comma-separated list of tables to back up. If no tables are specified, all 
tables are backed up. No regular-expression or
-  wildcard support is present; all table names must be explicitly listed. See 
<<br.using.backup.sets,Backup Sets>> for more
-  information about peforming operations on collections of tables. Mutually 
exclusive with the _-s_ option; one of these
-  named options are required.
-
-_-s <backup_set_name>_::
-  Identify tables to backup based on a backup set. See 
<<br.using.backup.sets,Using Backup Sets>> for the purpose and usage
-  of backup sets. Mutually exclusive with the _-t_ option.
-
-_-w <number_workers>_::
-  (Optional) Specifies the number of parallel workers to copy data to backup 
destination. Backups are currently executed by MapReduce jobs
-  so this value corresponds to the number of Mappers that will be spawned by 
the job.
-
-_-b <bandwidth_per_worker>_::
-  (Optional) Specifies the bandwidth of each worker in MB per second.
-
-_-d_::
-  (Optional) Enables "DEBUG" mode which prints additional logging about the 
backup creation.
-
-_-q <name>_::
-  (Optional) Allows specification of the name of a YARN queue which the 
MapReduce job to create the backup should be executed in. This option
-  is useful to prevent backup tasks from stealing resources away from other 
MapReduce jobs of high importance.
-
-[[br.usage.examples]]
-#### Example usage
-
-[source]
-----
-$ hbase backup create full hdfs://host5:8020/data/backup -t SALES2,SALES3 -w 3
-----
-
-This command creates a full backup image of two tables, SALES2 and SALES3, in 
the HDFS instance who NameNode is host5:8020
-in the path _/data/backup_. The _-w_ option specifies that no more than three 
parallel works complete the operation.
-
-// hbase backup restore
-
-[[br.restoring.backup]]
-### Restoring a Backup Image
-
-Run the following command as an HBase superuser. You can only restore a backup 
on a running HBase cluster because the data must be
-redistributed the RegionServers for the operation to complete successfully.
-
-[source]
-----
-hbase restore <backup_path> <backup_id>
-----
-
-[[br.restore.positional.args]]
-#### Positional Command-Line Arguments
-
-_backup_path_::
-  The _backup_path_ argument specifies the full filesystem URI of where to 
store the backup image. Valid prefixes are
-  are _hdfs:_, _webhdfs:_, _gpfs:_, and _s3fs:_.
-
-_backup_id_::
-  The backup ID that uniquely identifies the backup image to be restored.
-
-
-[[br.restore.named.args]]
-#### Named Command-Line Arguments
-
-_-t <table_name[,table_name]>_::
-  A comma-separated list of tables to restore. See 
<<br.using.backup.sets,Backup Sets>> for more
-  information about peforming operations on collections of tables. Mutually 
exclusive with the _-s_ option; one of these
-  named options are required.
-
-_-s <backup_set_name>_::
-  Identify tables to backup based on a backup set. See 
<<br.using.backup.sets,Using Backup Sets>> for the purpose and usage
-  of backup sets. Mutually exclusive with the _-t_ option.
-
-_-q <name>_::
-  (Optional) Allows specification of the name of a YARN queue which the 
MapReduce job to create the backup should be executed in. This option
-  is useful to prevent backup tasks from stealing resources away from other 
MapReduce jobs of high importance.
-
-_-c_::
-  (Optional) Perform a dry-run of the restore. The actions are checked, but 
not executed.
-
-_-m <target_tables>_::
-  (Optional) A comma-separated list of tables to restore into. If this option 
is not provided, the original table name is used. When
-  this option is provided, there must be an equal number of entries provided 
in the `-t` option.
-
-_-o_::
-  (Optional) Overwrites the target table for the restore if the table already 
exists.
-
-
-[[br.restore.usage]]
-#### Example of Usage
-
-[source]
-----
-hbase backup restore /tmp/backup_incremental backupId_1467823988425 -t 
mytable1,mytable2
-----
-
-This command restores two tables of an incremental backup image. In this 
example:
-• `/tmp/backup_incremental` is the path to the directory containing the 
backup image.
-• `backupId_1467823988425` is the backup ID.
-• `mytable1` and `mytable2` are the names of tables in the backup image to 
be restored.
-
-// hbase backup merge
-
-[[br.merge.backup]]
-### Merging Incremental Backup Images
-
-This command can be used to merge two or more incremental backup images into a 
single incremental
-backup image. This can be used to consolidate multiple, small incremental 
backup images into a single
-larger incremental backup image. This command could be used to merge hourly 
incremental backups
-into a daily incremental backup image, or daily incremental backups into a 
weekly incremental backup.
-
-[source]
-----
-$ hbase backup merge <backup_ids>
-----
-
-[[br.merge.backup.positional.cli.arguments]]
-#### Positional Command-Line Arguments
-
-_backup_ids_::
-  A comma-separated list of incremental backup image IDs that are to be 
combined into a single image.
-
-[[br.merge.backup.named.cli.arguments]]
-#### Named Command-Line Arguments
-
-None.
-
-[[br.merge.backup.example]]
-#### Example usage
-
-[source]
-----
-$ hbase backup merge backupId_1467823988425,backupId_1467827588425
-----
-
-// hbase backup set
-
-[[br.using.backup.sets]]
-### Using Backup Sets
-
-Backup sets can ease the administration of HBase data backups and restores by 
reducing the amount of repetitive input
-of table names. You can group tables into a named backup set with the `hbase 
backup set add` command. You can then use
-the -set option to invoke the name of a backup set in the `hbase backup 
create` or `hbase backup restore` rather than list
-individually every table in the group. You can have multiple backup sets.
-
-NOTE: Note the differentiation between the `hbase backup set add` command and 
the _-set_ option. The `hbase backup set add`
-command must be run before using the `-set` option in a different command 
because backup sets must be named and defined
-before using backup sets as a shortcut.
-
-If you run the `hbase backup set add` command and specify a backup set name 
that does not yet exist on your system, a new set
-is created. If you run the command with the name of an existing backup set 
name, then the tables that you specify are added
-to the set.
-
-In this command, the backup set name is case-sensitive.
-
-NOTE: The metadata of backup sets are stored within HBase. If you do not have 
access to the original HBase cluster with the
-backup set metadata, then you must specify individual table names to restore 
the data.
-
-To create a backup set, run the following command as the HBase superuser:
-
-[source]
-----
-$ hbase backup set <subcommand> <backup_set_name> <tables>
-----
-
-[[br.set.subcommands]]
-#### Backup Set Subcommands
-
-The following list details subcommands of the hbase backup set command.
-
-NOTE: You must enter one (and no more than one) of the following subcommands 
after hbase backup set to complete an operation.
-Also, the backup set name is case-sensitive in the command-line utility.
-
-_add_::
-  Adds table[s] to a backup set. Specify a _backup_set_name_ value after this 
argument to create a backup set.
-
-_remove_::
-  Removes tables from the set. Specify the tables to remove in the tables 
argument.
-
-_list_::
-  Lists all backup sets.
-
-_describe_::
-  Displays a description of a backup set. The information includes whether the 
set has full
-  or incremental backups, start and end times of the backups, and a list of 
the tables in the set. This subcommand must precede
-  a valid value for the _backup_set_name_ value.
-
-_delete_::
-  Deletes a backup set. Enter the value for the _backup_set_name_ option 
directly after the `hbase backup set delete` command.
-
-[[br.set.positional.cli.arguments]]
-#### Positional Command-Line Arguments
-
-_backup_set_name_::
-  Use to assign or invoke a backup set name. The backup set name must contain 
only printable characters and cannot have any spaces.
-
-_tables_::
-  List of tables (or a single table) to include in the backup set. Enter the 
table names as a comma-separated list. If no tables
-  are specified, all tables are included in the set.
-
-TIP: Maintain a log or other record of the case-sensitive backup set names and 
the corresponding tables in each set on a separate
-or remote cluster, backup strategy. This information can help you in case of 
failure on the primary cluster.
-
-[[br.set.usage]]
-#### Example of Usage
-
-[source]
-----
-$ hbase backup set add Q1Data TEAM3,TEAM_4
-----
-
-Depending on the environment, this command results in _one_ of the following 
actions:
-
-* If the `Q1Data` backup set does not exist, a backup set containing tables 
`TEAM_3` and `TEAM_4` is created.
-* If the `Q1Data` backup set exists already, the tables `TEAM_3` and `TEAM_4` 
are added to the `Q1Data` backup set.
-
-[[br.administration]]
-## Administration of Backup Images
-
-The `hbase backup` command has several subcommands that help with 
administering backup images as they accumulate. Most production
-environments require recurring backups, so it is necessary to have utilities 
to help manage the data of the backup repository.
-Some subcommands enable you to find information that can help identify backups 
that are relevant in a search for particular data.
-You can also delete backup images.
-
-The following list details each `hbase backup subcommand` that can help 
administer backups. Run the full command-subcommand line as
-the HBase superuser.
-
-// hbase backup progress
-
-[[br.managing.backup.progress]]
-### Managing Backup Progress
-
-You can monitor a running backup in another terminal session by running the 
_hbase backup progress_ command and specifying the backup ID as an argument.
-
-For example, run the following command as hbase superuser to view the progress 
of a backup
-
-[source]
-----
-$ hbase backup progress <backup_id>
-----
-
-[[br.progress.positional.cli.arguments]]
-#### Positional Command-Line Arguments
-
-_backup_id_::
-  Specifies the backup that you want to monitor by seeing the progress 
information. The backupId is case-sensitive.
-
-[[br.progress.named.cli.arguments]]
-#### Named Command-Line Arguments
-
-None.
-
-[[br.progress.example]]
-#### Example usage
-
-[source]
-----
-hbase backup progress backupId_1467823988425
-----
-
-// hbase backup history
-
-[[br.managing.backup.history]]
-### Managing Backup History
-
-This command displays a log of backup sessions. The information for each 
session includes backup ID, type (full or incremental), the tables
-in the backup, status, and start and end time. Specify the number of backup 
sessions to display with the optional -n argument.
-
-[source]
-----
-$ hbase backup history <backup_id>
-----
-
-[[br.history.positional.cli.arguments]]
-#### Positional Command-Line Arguments
-
-_backup_id_::
-  Specifies the backup that you want to monitor by seeing the progress 
information. The backupId is case-sensitive.
-
-[[br.history.named.cli.arguments]]
-#### Named Command-Line Arguments
-
-_-n <num_records>_::
-  (Optional) The maximum number of backup records (Default: 10).
-
-_-p <backup_root_path>_::
-  The full filesystem URI of where backup images are stored.
-
-_-s <backup_set_name>_::
-  The name of the backup set to obtain history for. Mutually exclusive with 
the _-t_ option.
-
-_-t_ <table_name>::
-  The name of table to obtain history for. Mutually exclusive with the _-s_ 
option.
-
-[[br.history.backup.example]]
-#### Example usage
-
-[source]
-----
-$ hbase backup history
-$ hbase backup history -n 20
-$ hbase backup history -t WebIndexRecords
-----
-
-// hbase backup describe
-
-[[br.describe.backup]]
-### Describing a Backup Image
-
-This command can be used to obtain information about a specific backup image.
-
-[source]
-----
-$ hbase backup describe <backup_id>
-----
-
-[[br.describe.backup.positional.cli.arguments]]
-#### Positional Command-Line Arguments
-
-_backup_id_::
-  The ID of the backup image to describe.
-
-[[br.describe.backup.named.cli.arguments]]
-#### Named Command-Line Arguments
-
-None.
-
-[[br.describe.backup.example]]
-#### Example usage
-
-[source]
-----
-$ hbase backup describe backupId_1467823988425
-----
-
-// hbase backup delete
-
-[[br.delete.backup]]
-### Deleting a Backup Image
-
-This command can be used to delete a backup image which is no longer needed.
-
-[source]
-----
-$ hbase backup delete <backup_id>
-----
-
-[[br.delete.backup.positional.cli.arguments]]
-#### Positional Command-Line Arguments
-
-_backup_id_::
-  The ID to the backup image which should be deleted.
-
-[[br.delete.backup.named.cli.arguments]]
-#### Named Command-Line Arguments
-
-None.
-
-[[br.delete.backup.example]]
-#### Example usage
-
-[source]
-----
-$ hbase backup delete backupId_1467823988425
-----
-
-// hbase backup repair
-
-[[br.repair.backup]]
-### Backup Repair Command
-
-This command attempts to correct any inconsistencies in persisted backup 
metadata which exists as
-the result of software errors or unhandled failure scenarios. While the backup 
implementation tries
-to correct all errors on its own, this tool may be necessary in the cases 
where the system cannot
-automatically recover on its own.
-
-[source]
-----
-$ hbase backup repair
-----
-
-[[br.repair.backup.positional.cli.arguments]]
-#### Positional Command-Line Arguments
-
-None.
-
-[[br.repair.backup.named.cli.arguments]]
-### Named Command-Line Arguments
-
-None.
-
-[[br.repair.backup.example]]
-#### Example usage
-
-[source]
-----
-$ hbase backup repair
-----
-
-[[br.backup.configuration]]
-## Configuration keys
-
-The backup and restore feature includes both required and optional 
configuration keys.
-
-### Required properties
-
-_hbase.backup.enable_: Controls whether or not the feature is enabled 
(Default: `false`). Set this value to `true`.
-
-_hbase.master.logcleaner.plugins_: A comma-separated list of classes invoked 
when cleaning logs in the HBase Master. Set
-this value to `org.apache.hadoop.hbase.backup.master.BackupLogCleaner` or 
append it to the current value.
-
-_hbase.procedure.master.classes_: A comma-separated list of classes invoked 
with the Procedure framework in the Master. Set
-this value to 
`org.apache.hadoop.hbase.backup.master.LogRollMasterProcedureManager` or append 
it to the current value.
-
-_hbase.procedure.regionserver.classes_: A comma-separated list of classes 
invoked with the Procedure framework in the RegionServer.
-Set this value to 
`org.apache.hadoop.hbase.backup.regionserver.LogRollRegionServerProcedureManager`
 or append it to the current value.
-
-_hbase.coprocessor.region.classes_: A comma-separated list of RegionObservers 
deployed on tables. Set this value to
-`org.apache.hadoop.hbase.backup.BackupObserver` or append it to the current 
value.
-
-_hbase.master.hfilecleaner.plugins_: A comma-separated list of HFileCleaners 
deployed on the Master. Set this value
-to `org.apache.hadoop.hbase.backup.BackupHFileCleaner` or append it to the 
current value.
-
-### Optional properties
-
-_hbase.backup.system.ttl_: The time-to-live in seconds of data in the 
`hbase:backup` tables (default: forever). This property
-is only relevant prior to the creation of the `hbase:backup` table. Use the 
`alter` command in the HBase shell to modify the TTL
-when this table already exists. See the <<br.filesystem.growth.warning,below 
section>> for more details on the impact of this
-configuration property.
-
-_hbase.backup.attempts.max_: The number of attempts to perform when taking 
hbase table snapshots (default: 10).
-
-_hbase.backup.attempts.pause.ms_: The amount of time to wait between failed 
snapshot attempts in milliseconds (default: 10000).
-
-_hbase.backup.logroll.timeout.millis_: The amount of time (in milliseconds) to 
wait for RegionServers to execute a WAL rolling
-in the Master's procedure framework (default: 30000).
-
-[[br.best.practices]]
-## Best Practices
-
-### Formulate a restore strategy and test it.
-
-Before you rely on a backup and restore strategy for your production 
environment, identify how backups must be performed,
-and more importantly, how restores must be performed. Test the plan to ensure 
that it is workable.
-At a minimum, store backup data from a production cluster on a different 
cluster or server. To further safeguard the data,
-use a backup location that is at a different physical location.
-
-If you have a unrecoverable loss of data on your primary production cluster as 
a result of computer system issues, you may
-be able to restore the data from a different cluster or server at the same 
site. However, a disaster that destroys the whole
-site renders locally stored backups useless. Consider storing the backup data 
and necessary resources (both computing capacity
-and operator expertise) to restore the data at a site sufficiently remote from 
the production site. In the case of a catastrophe
-at the whole primary site (fire, earthquake, etc.), the remote backup site can 
be very valuable.
-
-### Secure a full backup image first.
-
-As a baseline, you must complete a full backup of HBase data at least once 
before you can rely on incremental backups. The full
-backup should be stored outside of the source cluster. To ensure complete 
dataset recovery, you must run the restore utility
-with the option to restore baseline full backup. The full backup is the 
foundation of your dataset. Incremental backup data
-is applied on top of the full backup during the restore operation to return 
you to the point in time when backup was last taken.
-
-### Define and use backup sets for groups of tables that are logical subsets 
of the entire dataset.
-
-You can group tables into an object called a backup set. A backup set can save 
time when you have a particular group of tables
-that you expect to repeatedly back up or restore.
-
-When you create a backup set, you type table names to include in the group. 
The backup set includes not only groups of related
-tables, but also retains the HBase backup metadata. Afterwards, you can invoke 
the backup set name to indicate what tables apply
-to the command execution instead of entering all the table names individually.
-
-### Document the backup and restore strategy, and ideally log information 
about each backup.
-
-Document the whole process so that the knowledge base can transfer to new 
administrators after employee turnover. As an extra
-safety precaution, also log the calendar date, time, and other relevant 
details about the data of each backup. This metadata
-can potentially help locate a particular dataset in case of source cluster 
failure or primary site disaster. Maintain duplicate
-copies of all documentation: one copy at the production cluster site and 
another at the backup location or wherever it can be
-accessed by an administrator remotely from the production cluster.
-
-[[br.s3.backup.scenario]]
-## Scenario: Safeguarding Application Datasets on Amazon S3
-
-This scenario describes how a hypothetical retail business uses backups to 
safeguard application data and then restore the dataset
-after failure.
-
-The HBase administration team uses backup sets to store data from a group of 
tables that have interrelated information for an
-application called green. In this example, one table contains transaction 
records and the other contains customer details. The
-two tables need to be backed up and be recoverable as a group.
-
-The admin team also wants to ensure daily backups occur automatically.
-
-.Tables Composing The Backup Set
-image::backup-app-components.png[]
-
-The following is an outline of the steps and examples of commands that are 
used to backup the data for the _green_ application and
-to recover the data later. All commands are run when logged in as HBase 
superuser.
-
-1. A backup set called _green_set_ is created as an alias for both the 
transactions table and the customer table. The backup set can
-be used for all operations to avoid typing each table name. The backup set 
name is case-sensitive and should be formed with only
-printable characters and without spaces.
-
-[source]
-----
-$ hbase backup set add green_set transactions
-$ hbase backup set add green_set customer
-----
-
-2. The first backup of green_set data must be a full backup. The following 
command example shows how credentials are passed to Amazon
-S3 and specifies the file system with the s3a: prefix.
-
-[source]
-----
-$ ACCESS_KEY=ABCDEFGHIJKLMNOPQRST
-$ SECRET_KEY=123456789abcdefghijklmnopqrstuvwxyzABCD
-$ sudo -u hbase hbase backup create full\
-  s3a://$ACCESS_KEY:SECRET_KEY@prodhbasebackups/backups -s green_set
-----
-
-3. Incremental backups should be run according to a schedule that ensures 
essential data recovery in the event of a catastrophe. At
-this retail company, the HBase admin team decides that automated daily backups 
secures the data sufficiently. The team decides that
-they can implement this by modifying an existing Cron job that is defined in 
`/etc/crontab`. Consequently, IT modifies the Cron job
-by adding the following line:
-
-[source]
-----
-@daily hbase hbase backup create incremental 
s3a://$ACCESS_KEY:$SECRET_KEY@prodhbasebackups/backups -s green_set
-----
-
-4. A catastrophic IT incident disables the production cluster that the green 
application uses. An HBase system administrator of the
-backup cluster must restore the _green_set_ dataset to the point in time 
closest to the recovery objective.
-
-NOTE: If the administrator of the backup HBase cluster has the backup ID with 
relevant details in accessible records, the following
-search with the `hdfs dfs -ls` command and manually scanning the backup ID 
list can be bypassed. Consider continuously maintaining
-and protecting a detailed log of backup IDs outside the production cluster in 
your environment.
-
-The HBase administrator runs the following command on the directory where 
backups are stored to print the list of successful backup
-IDs on the console:
-
-`hdfs dfs -ls -t /prodhbasebackups/backups`
-
-5. The admin scans the list to see which backup was created at a date and time 
closest to the recovery objective. To do this, the
-admin converts the calendar timestamp of the recovery point in time to Unix 
time because backup IDs are uniquely identified with
-Unix time. The backup IDs are listed in reverse chronological order, meaning 
the most recent successful backup appears first.
-
-The admin notices that the following line in the command output corresponds 
with the _green_set_ backup that needs to be restored:
-
-`/prodhbasebackups/backups/backup_1467823988425`
-
-6. The admin restores green_set invoking the backup ID and the -overwrite 
option. The -overwrite option truncates all existing data
-in the destination and populates the tables with data from the backup dataset. 
Without this flag, the backup data is appended to the
-existing data in the destination. In this case, the admin decides to overwrite 
the data because it is corrupted.
-
-[source]
-----
-$ sudo -u hbase hbase restore -s green_set \
-  s3a://$ACCESS_KEY:$SECRET_KEY@prodhbasebackups/backups backup_1467823988425 
\ -overwrite
-----
-
-[[br.data.security]]
-## Security of Backup Data
-
-With this feature which makes copying data to remote locations, it's important 
to take a moment to clearly state the procedural
-concerns that exist around data security. Like the HBase replication feature, 
backup and restore provides the constructs to automatically
-copy data from within a corporate boundary to some system outside of that 
boundary. It is imperative when storing sensitive data that with backup and 
restore, much
-less any feature which extracts data from HBase, the locations to which data 
is being sent has undergone a security audit to ensure
-that only authenticated users are allowed to access that data.
-
-For example, with the above example of backing up data to S3, it is of the 
utmost importance that the proper permissions are assigned
-to the S3 bucket to ensure that only a minimum set of authorized users are 
allowed to access this data. Because the data is no longer
-being accessed via HBase, and its authentication and authorization controls, 
we must ensure that the filesystem storing that data is
-providing a comparable level of security. This is a manual step which users 
*must* implement on their own.
-
-[[br.technical.details]]
-## Technical Details of Incremental Backup and Restore
-
-HBase incremental backups enable more efficient capture of HBase table images 
than previous attempts at serial backup and restore
-solutions, such as those that only used HBase Export and Import APIs. 
Incremental backups use Write Ahead Logs (WALs) to capture
-the data changes since the previous backup was created. A WAL roll (create new 
WALs) is executed across all RegionServers to track
-the WALs that need to be in the backup.
-
-After the incremental backup image is created, the source backup files usually 
are on same node as the data source. A process similar
-to the DistCp (distributed copy) tool is used to move the source backup files 
to the target file systems. When a table restore operation
-starts, a two-step process is initiated. First, the full backup is restored 
from the full backup image. Second, all WAL files from
-incremental backups between the last full backup and the incremental backup 
being restored are converted to HFiles, which the HBase
-Bulk Load utility automatically imports as restored data in the table.
-
-You can only restore on a live HBase cluster because the data must be 
redistributed to complete the restore operation successfully.
-
-[[br.filesystem.growth.warning]]
-## A Warning on File System Growth
-
-As a reminder, incremental backups are implemented via retaining the 
write-ahead logs which HBase primarily uses for data durability.
-Thus, to ensure that all data needing to be included in a backup is still 
available in the system, the HBase backup and restore feature
-retains all write-ahead logs since the last backup until the next incremental 
backup is executed.
-
-Like HBase Snapshots, this can have an expectedly large impact on the HDFS 
usage of HBase for high volume tables. Take care in enabling
-and using the backup and restore feature, specifically with a mind to removing 
backup sessions when they are not actively being used.
-
-The only automated, upper-bound on retained write-ahead logs for backup and 
restore is based on the TTL of the `hbase:backup` system table which,
-as of the time this document is written, is infinite (backup table entries are 
never automatically deleted). This requires that administrators
-perform backups on a schedule whose frequency is relative to the amount of 
available space on HDFS (e.g. less available HDFS space requires
-more aggressive backup merges and deletions). As a reminder, the TTL can be 
altered on the `hbase:backup` table using the `alter` command
-in the HBase shell. Modifying the configuration property 
`hbase.backup.system.ttl` in hbase-site.xml after the system table exists has 
no effect.
-
-[[br.backup.capacity.planning]]
-## Capacity Planning
-
-When designing a distributed system deployment, it is critical that some basic 
mathmatical rigor is executed to ensure sufficient computational
-capacity is available given the data and software requirements of the system. 
For this feature, the availability of network capacity is the largest
-bottleneck when estimating the performance of some implementation of backup 
and restore. The second most costly function is the speed at which
-data can be read/written.
-
-### Full Backups
-
-To estimate the duration of a full backup, we have to understand the general 
actions which are invoked:
-
-* Write-ahead log roll on each RegionServer: ones to tens of seconds per 
RegionServer in parallel. Relative to the load on each RegionServer.
-* Take an HBase snapshot of the table(s): tens of seconds. Relative to the 
number of regions and files that comprise the table.
-* Export the snapshot to the destination: see below. Relative to the size of 
the data and the network bandwidth to the destination.
-
-[[br.export.snapshot.cost]]
-To approximate how long the final step will take, we have to make some 
assumptions on hardware. Be aware that these will *not* be accurate for your
-system -- these are numbers that your or your administrator know for your 
system. Let's say the speed of reading data from HDFS on a single node is
-capped at 80MB/s (across all Mappers that run on that host), a modern network 
interface controller (NIC) supports 10Gb/s, the top-of-rack switch can
-handle 40Gb/s, and the WAN between your clusters is 10Gb/s. This means that 
you can only ship data to your remote at a speed of 1.25GB/s -- meaning
-that 16 nodes (`1.25 * 1024 / 80 = 16`) participating in the ExportSnapshot 
should be able to fully saturate the link between clusters. With more
-nodes in the cluster, we can still saturate the network but at a lesser impact 
on any one node which helps ensure local SLAs are made. If the size
-of the snapshot is 10TB, this would full backup would take in the ballpark of 
2.5 hours (`10 * 1024 / 1.25 / (60 * 60) = 2.23hrs`)
-
-As a general statement, it is very likely that the WAN bandwidth between your 
local cluster and the remote storage is the largest
-bottleneck to the speed of a full backup.
-
-When the concern is restricting the computational impact of backups to a 
"production system", the above formulas can be reused with the optional
-command-line arguments to `hbase backup create`: `-b`, `-w`, `-q`. The `-b` 
option defines the bandwidth at which each worker (Mapper) would
-write data. The `-w` argument limits the number of workers that would be 
spawned in the DistCp job. The `-q` allows the user to specify a YARN
-queue which can limit the specific nodes where the workers will be spawned -- 
this can quarantine the backup workers performing the copy to
-a set of non-critical nodes. Relating the `-b` and `-w` options to our earlier 
equations: `-b` would be used to restrict each node from reading
-data at the full 80MB/s and `-w` is used to limit the job from spawning 16 
worker tasks.
-
-### Incremental Backup
-
-Like we did for full backups, we have to understand the incremental backup 
process to approximate its runtime and cost.
-
-* Identify new write-ahead logs since last full or incremental backup: 
negligible. Apriori knowledge from the backup system table(s).
-* Read, filter, and write "minimized" HFiles equivalent to the WALs: dominated 
by the speed of writing data. Relative to write speed of HDFS.
-* DistCp the HFiles to the destination: <<br.export.snapshot.cost,see above>>.
-
-For the second step, the dominating cost of this operation would be the 
re-writing the data (under the assumption that a majority of the
-data in the WAL is preserved). In this case, we can assume an aggregate write 
speed of 30MB/s per node. Continuing our 16-node cluster example,
-this would require approximately 15 minutes to perform this step for 50GB of 
data (50 * 1024 / 60 / 60 = 14.2). The amount of time to start the
-DistCp MapReduce job would likely dominate the actual time taken to copy the 
data (50 / 1.25 = 40 seconds) and can be ignored.
-
-[[br.limitations]]
-## Limitations of the Backup and Restore Utility
-
-*Serial backup operations*
-
-Backup operations cannot be run concurrently. An operation includes actions 
like create, delete, restore, and merge. Only one active backup session is 
supported. link:https://issues.apache.org/jira/browse/HBASE-16391[HBASE-16391]
-will introduce multiple-backup sessions support.
-
-*No means to cancel backups*
-
-Both backup and restore operations cannot be canceled. 
(link:https://issues.apache.org/jira/browse/HBASE-15997[HBASE-15997], 
link:https://issues.apache.org/jira/browse/HBASE-15998[HBASE-15998]).
-The workaround to cancel a backup would be to kill the client-side backup 
command (`control-C`), ensure all relevant MapReduce jobs have exited, and then
-run the `hbase backup repair` command to ensure the system backup metadata is 
consistent.
-
-*Backups can only be saved to a single location*
-
-Copying backup information to multiple locations is an exercise left to the 
user. link:https://issues.apache.org/jira/browse/HBASE-15476[HBASE-15476] will
-introduce the ability to specify multiple-backup destinations intrinsically.
-
-*HBase superuser access is required*
-
-Only an HBase superuser (e.g. hbase) is allowed to perform backup/restore, can 
pose a problem for shared HBase installations. Current mitigations would require
-coordination with system administrators to build and deploy a backup and 
restore strategy 
(link:https://issues.apache.org/jira/browse/HBASE-14138[HBASE-14138]).
-
-*Backup restoration is an online operation*
-
-To perform a restore from a backup, it requires that the HBase cluster is 
online as a caveat of the current implementation 
(link:https://issues.apache.org/jira/browse/HBASE-16573[HBASE-16573]).
-
-*Some operations may fail and require re-run*
-
-The HBase backup feature is primarily client driven. While there is the 
standard HBase retry logic built into the HBase Connection, persistent errors 
in executing operations
-may propagate back to the client (e.g. snapshot failure due to region splits). 
The backup implementation should be moved from client-side into the ProcedureV2 
framework
-in the future which would provide additional robustness around 
transient/retryable failures. The `hbase backup repair` command is meant to 
correct states which the system
-cannot automatically detect and recover from.
-
-*Avoidance of declaration of public API*
-
-While the Java API to interact with this feature exists and its implementation 
is separated from an interface, insufficient rigor has been applied to 
determine if
-it is exactly what we intend to ship to users. As such, it is marked as for a 
`Private` audience with the expectation that, as users begin to try the 
feature, there
-will be modifications that would necessitate breaking compatibility 
(link:https://issues.apache.org/jira/browse/HBASE-17517[HBASE-17517]).
-
-*Lack of global metrics for backup and restore*
-
-Individual backup and restore operations contain metrics about the amount of 
work the operation included, but there is no centralized location (e.g. the 
Master UI)
-which present information for consumption 
(link:https://issues.apache.org/jira/browse/HBASE-16565[HBASE-16565]).

http://git-wip-us.apache.org/repos/asf/hbase/blob/61d70604/src/main/asciidoc/_chapters/community.adoc
----------------------------------------------------------------------
diff --git a/src/main/asciidoc/_chapters/community.adoc 
b/src/main/asciidoc/_chapters/community.adoc
index d141dbf..3a896cf 100644
--- a/src/main/asciidoc/_chapters/community.adoc
+++ b/src/main/asciidoc/_chapters/community.adoc
@@ -40,24 +40,6 @@ When the feature is ready for commit, 3 +1s from committers 
will get your featur
 See link:http://search-hadoop.com/m/asM982C5FkS1[HBase, mail # dev - Thoughts
               about large feature dev branches]
 
-[[patchplusonepolicy]]
-.Patch +1 Policy
-
-The below policy is something we put in place 09/2012.
-It is a suggested policy rather than a hard requirement.
-We want to try it first to see if it works before we cast it in stone.
-
-Apache HBase is made of 
link:https://issues.apache.org/jira/projects/HBASE?selectedItem=com.atlassian.jira.jira-projects-plugin:components-page[components].
-Components have one or more <<owner,OWNER>>s.
-See the 'Description' field on the 
link:https://issues.apache.org/jira/projects/HBASE?selectedItem=com.atlassian.jira.jira-projects-plugin:components-page[components]
 JIRA page for who the current owners are by component.
-
-Patches that fit within the scope of a single Apache HBase component require, 
at least, a +1 by one of the component's owners before commit.
-If owners are absent -- busy or otherwise -- two +1s by non-owners will 
suffice.
-
-Patches that span components need at least two +1s before they can be 
committed, preferably +1s by owners of components touched by the x-component 
patch (TODO: This needs tightening up but I think fine for first pass).
-
-Any -1 on a patch by anyone vetoes a patch; it cannot be committed until the 
justification for the -1 is addressed.
-
 [[hbase.fix.version.in.jira]]
 .How to set fix version in JIRA on issue resolve
 
@@ -85,19 +67,37 @@ We also are currently in violation of this basic tenet -- 
replication at least k
 [[community.roles]]
 == Community Roles
 
-[[owner]]
-.Component Owner/Lieutenant
+=== Release Managers
+
+Each maintained release branch has a release manager, who volunteers to 
coordinate new features and bug fixes are backported to that release.
+The release managers are 
link:https://hbase.apache.org/team-list.html[committers].
+If you would like your feature or bug fix to be included in a given release, 
communicate with that release manager.
+If this list goes out of date or you can't reach the listed person, reach out 
to someone else on the list.
+
+NOTE: End-of-life releases are not included in this list.
+
+.Release Managers
+[cols="1,1", options="header"]
+|===
+| Release
+| Release Manager
+
+| 1.2
+| Sean Busbey
+
+| 1.3
+| Mikhail Antonov
 
-Component owners are listed in the description field on this Apache HBase JIRA 
link:https://issues.apache.org/jira/projects/HBASE?selectedItem=com.atlassian.jira.jira-projects-plugin:components-page[components]
 page.
-The owners are listed in the 'Description' field rather than in the 'Component 
Lead' field because the latter only allows us list one individual whereas it is 
encouraged that components have multiple owners.
+| 1.4
+| Andrew Purtell
 
-Owners or component lieutenants are volunteers who are (usually, but not 
necessarily) expert in their component domain and may have an agenda on how 
they think their Apache HBase component should evolve.
+| 2.0
+| Michael Stack
 
-. Owners will try and review patches that land within their component's scope.
-. If applicable, if an owner has an agenda, they will publish their goals or 
the design toward which they are driving their component
+| 2.1
+| Duo Zhang
 
-If you would like to be volunteer as a component owner, just write the dev 
list and we'll sign you up.
-Owners do not need to be committers.
+|===
 
 [[hbase.commit.msg.format]]
 == Commit Message format

http://git-wip-us.apache.org/repos/asf/hbase/blob/61d70604/src/main/asciidoc/_chapters/compression.adoc
----------------------------------------------------------------------
diff --git a/src/main/asciidoc/_chapters/compression.adoc 
b/src/main/asciidoc/_chapters/compression.adoc
index 6fe0d76..b2ff5ce 100644
--- a/src/main/asciidoc/_chapters/compression.adoc
+++ b/src/main/asciidoc/_chapters/compression.adoc
@@ -335,25 +335,18 @@ You do not need to re-create the table or copy data.
 If you are changing codecs, be sure the old codec is still available until all 
the old StoreFiles have been compacted.
 
 .Enabling Compression on a ColumnFamily of an Existing Table using HBaseShell
-====
 ----
-
 hbase> disable 'test'
 hbase> alter 'test', {NAME => 'cf', COMPRESSION => 'GZ'}
 hbase> enable 'test'
 ----
-====
 
 .Creating a New Table with Compression On a ColumnFamily
-====
 ----
-
 hbase> create 'test2', { NAME => 'cf2', COMPRESSION => 'SNAPPY' }
 ----
-====
 
 .Verifying a ColumnFamily's Compression Settings
-====
 ----
 
 hbase> describe 'test'
@@ -366,7 +359,6 @@ DESCRIPTION                                          ENABLED
  LOCKCACHE => 'true'}
 1 row(s) in 0.1070 seconds
 ----
-====
 
 ==== Testing Compression Performance
 
@@ -374,9 +366,7 @@ HBase includes a tool called LoadTestTool which provides 
mechanisms to test your
 You must specify either `-write` or `-update-read` as your first parameter, 
and if you do not specify another parameter, usage advice is printed for each 
option.
 
 .+LoadTestTool+ Usage
-====
 ----
-
 $ bin/hbase org.apache.hadoop.hbase.util.LoadTestTool -h
 usage: bin/hbase org.apache.hadoop.hbase.util.LoadTestTool <options>
 Options:
@@ -387,7 +377,7 @@ Options:
                               LZ4]
  -data_block_encoding <arg>   Encoding algorithm (e.g. prefix compression) to
                               use for data blocks in the test column family, 
one
-                              of [NONE, PREFIX, DIFF, FAST_DIFF, PREFIX_TREE].
+                              of [NONE, PREFIX, DIFF, FAST_DIFF, ROW_INDEX_V1].
  -encryption <arg>            Enables transparent encryption on the test table,
                               one of [AES]
  -generator <arg>             The class which generates load for the tool. Any
@@ -429,16 +419,12 @@ Options:
                               port numbers
  -zk_root <arg>               name of parent znode in zookeeper
 ----
-====
 
 .Example Usage of LoadTestTool
-====
 ----
-
 $ hbase org.apache.hadoop.hbase.util.LoadTestTool -write 1:10:100 -num_keys 
1000000
           -read 100:30 -num_tables 1 -data_block_encoding NONE -tn 
load_test_tool_NONE
 ----
-====
 
 [[data.block.encoding.enable]]
 === Enable Data Block Encoding
@@ -449,9 +435,7 @@ Disable the table before altering its DATA_BLOCK_ENCODING 
setting.
 Following is an example using HBase Shell:
 
 .Enable Data Block Encoding On a Table
-====
 ----
-
 hbase>  disable 'test'
 hbase> alter 'test', { NAME => 'cf', DATA_BLOCK_ENCODING => 'FAST_DIFF' }
 Updating all regions with the new schema...
@@ -462,12 +446,9 @@ Done.
 hbase> enable 'test'
 0 row(s) in 0.1580 seconds
 ----
-====
 
 .Verifying a ColumnFamily's Data Block Encoding
-====
 ----
-
 hbase> describe 'test'
 DESCRIPTION                                          ENABLED
  'test', {NAME => 'cf', DATA_BLOCK_ENCODING => 'FAST true
@@ -478,7 +459,6 @@ DESCRIPTION                                          ENABLED
  e', BLOCKCACHE => 'true'}
 1 row(s) in 0.0650 seconds
 ----
-====
 
 :numbered:
 

Reply via email to