HRegionServer
is the RegionServer implementation. It is responsible for serving and managing regions.
In a distributed cluster, a RegionServer runs on a Section 8.7.2, “DataNode”.
The methods exposed by HRegionRegionInterface
contain both data-oriented and region-maintenance methods:
For example, when the HBaseAdmin
method majorCompact
is invoked on a table, the client is actually iterating through
all regions for the specified table and requesting a major compaction directly to each region.
The RegionServer runs a variety of background threads:
The Block Cache contains three levels of block priority to allow for scan-resistance and in-memory ColumnFamilies. A block is added with an in-memory flag if the containing ColumnFamily is defined in-memory, otherwise a block becomes a single access priority. Once a block is accessed again, it changes to multiple access. This is used to prevent scans from thrashing the cache, adding a least-frequently-used element to the eviction algorithm. Blocks from in-memory ColumnFamilies are the last to be evicted.
For more information, see the LruBlockCache source
Each RegionServer adds updates (Puts, Deletes) to its write-ahead log (WAL) first, and then to the Section 8.6.4.1, “MemStore” for the affected Section 8.6.4, “Store”. This ensures that HBase has durable writes. Without WAL, there is the possibility of data loss in the case of a RegionServer failure before each MemStore is flushed and new StoreFiles are written. HLog is the HBase WAL implementation, and there is one HLog instance per RegionServer.
The WAL is in HDFS in/hbase/.logs/
with subdirectories per region.
For more general information about the concept of write ahead logs, see the Wikipedia Write-Ahead Log article.
When a RegionServer crashes, it will lose its ephemeral lease in ZooKeeper...TODO
When set to true
, the default, any error
encountered splitting will be logged, the problematic WAL will be
moved into the .corrupt
directory under the hbase
rootdir
, and processing will continue. If set to
false
, the exception will be propagated and the
split logged as failed.[20]
If we get an EOF while splitting logs, we proceed with the split
even when hbase.hlog.split.skip.errors
==
false
. An EOF while reading the last log in the
set of files to split is near-guaranteed since the RegionServer likely
crashed mid-write of a record. But we'll continue even if we got an
EOF reading other than the last file in the set.[21]
[20] See HBASE-2958 When hbase.hlog.split.skip.errors is set to false, we fail the split but thats it. We need to do more than just fail split if this flag is set.
[21] For background, see HBASE-2643 Figure how to deal with eof splitting logs