From 9227bbebb6e9e88bdf50c5b5ed7cfe7abeee1798 Mon Sep 17 00:00:00 2001 From: Jingyun Tian Date: Fri, 22 Feb 2019 11:42:36 +0800 Subject: [PATCH] HBASE-21730 Update HBase-book with the procedure based WAL splitting --- src/main/asciidoc/_chapters/architecture.adoc | 155 ++++-------------- src/site/resources/images/WAL_splitting.png | Bin 0 -> 38049 bytes 2 files changed, 34 insertions(+), 121 deletions(-) create mode 100644 src/site/resources/images/WAL_splitting.png diff --git a/src/main/asciidoc/_chapters/architecture.adoc b/src/main/asciidoc/_chapters/architecture.adoc index 3ed4fb3ac7..c250aa82d5 100644 --- a/src/main/asciidoc/_chapters/architecture.adoc +++ b/src/main/asciidoc/_chapters/architecture.adoc @@ -1249,127 +1249,40 @@ WAL log splitting and recovery can be resource intensive and take a long time, d Distributed log processing is enabled by default since HBase 0.92. The setting is controlled by the `hbase.master.distributed.log.splitting` property, which can be set to `true` or `false`, but defaults to `true`. -[[log.splitting.step.by.step]] -.Distributed Log Splitting, Step by Step - -After configuring distributed log splitting, the HMaster controls the process. -The HMaster enrolls each RegionServer in the log splitting process, and the actual work of splitting the logs is done by the RegionServers. -The general process for log splitting, as described in <> still applies here. - -. 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 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/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/WALs -/host8.sample.com,57020,1340474893275-splitting -/host8.sample.com%3A57020.1340474893900, -hdfs://host2.sample.com:56020/hbase/WALs -/host3.sample.com,57020,1340474893299-splitting -/host3.sample.com%3A57020.1340474893931, -hdfs://host2.sample.com:56020/hbase/WALs -/host4.sample.com,57020,1340474893287-splitting -/host4.sample.com%3A57020.1340474893946] ----- -+ -The listing represents WAL file names to be scanned and split, which is a list of log splitting tasks. - -. The split log manager monitors the log-splitting tasks and workers. -+ -The split log manager is responsible for the following ongoing tasks: -+ -* 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. -* Checks to see if there are any unassigned tasks. - If it finds any, it create an ephemeral rescan node so that each split log worker is notified to re-scan unassigned tasks via the `nodeChildrenChanged` ZooKeeper event. -* Checks for tasks which are assigned but expired. - If any are found, they are moved back to `TASK_UNASSIGNED` state again so that they can be retried. - It is possible that these tasks are assigned to slow workers, or they may already be finished. - This is not a problem, because log splitting tasks have the property of idempotence. - In other words, the same log splitting task can be processed many times without causing any problem. -* The split log manager watches the HBase split log znodes constantly. - If any split log task node data is changed, the split log manager retrieves the node data. - The node data contains the current state of the task. - You can use the `zkCli` `get` command to retrieve the current state of a task. - In the example output below, the first line of the output shows that the task is currently unassigned. -+ ----- -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 -ctime = Sat Jun 23 11:13:40 PDT 2012 -... ----- -+ -Based on the state of the task whose data is changed, the split log manager does one of the following: -+ -* Resubmit the task if it is unassigned -* Heartbeat the task if it is assigned -* Resubmit or fail the task if it is resigned (see <>) -* Resubmit or fail the task if it is completed with errors (see <>) -* Resubmit or fail the task if it could not complete due to errors (see <>) -* Delete the task if it is successfully completed or failed -+ -[[distributed.log.replay.failure.reasons]] -[NOTE] -.Reasons a Task Will Fail -==== -* The task has been deleted. -* The node no longer exists. -* The log status manager failed to move the state of the task to `TASK_UNASSIGNED`. -* The number of resubmits is over the resubmit threshold. -==== - -. Each RegionServer's split log worker performs the log-splitting tasks. -+ -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 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 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. -+ -.How the Split Log Worker Approaches a Task -* It queries the task state and only takes action if the task is in `TASK_UNASSIGNED `state. -* If the task is in `TASK_UNASSIGNED` state, the worker attempts to set the state to `TASK_OWNED` by itself. - If it fails to set the state, another worker will try to grab it. - The split log manager will also ask all workers to rescan later if the task remains unassigned. -* If the worker succeeds in taking ownership of the task, it tries to get the task state again to make sure it really gets it asynchronously. - In the meantime, it starts a split task executor to do the actual work: -** Get the HBase root folder, create a temp folder under the root, and split the log file to the temp folder. -** If the split was successful, the task executor sets the task to state `TASK_DONE`. -** If the worker catches an unexpected IOException, the task is set to state `TASK_ERR`. -** If the worker is shutting down, set the task to state `TASK_RESIGNED`. -** If the task is taken by another worker, just log it. - - -. The split log manager monitors for uncompleted tasks. -+ -The split log manager returns when all tasks are completed successfully. -If all tasks are completed with some failures, the split log manager throws an exception so that the log splitting can be retried. -Due to an asynchronous implementation, in very rare cases, the split log manager loses track of some completed tasks. -For that reason, it periodically checks for remaining uncompleted task in its task map or ZooKeeper. -If none are found, it throws an exception so that the log splitting can be retried right away instead of hanging there waiting for something that won't happen. +==== WAL splitting based on procedureV2 +After HBASE-20610, we introduce a new way to do WAL splitting coordination by procedureV2 framework. This can simplify the process of WAL splitting and no need to connect zookeeper any more. + +[[background]] +.Background +Currently, splitting WAL processes are coordinated by zookeeper. Each region server are trying to grab tasks from zookeeper. And the burden becomes heavier when the number of region server increase. + +[[implementation.on.master.side]] +.Implementation on Master side +During ServerCrashProcedure, SplitWALManager will create one SplitWALProcedure for each WAL file which should be split. Then each SplitWALProcedure will spawn a SplitWalRemoteProcedure to send the request to region server. +SplitWALProcedure is a StateMachineProcedure and here is the state transfer diagram. + +.WAL_splitting_coordination +image::WAL_splitting.png[] + +[[implementation.on.region.server.side]] +.Implementation on Region Server side +Region Server will receive a SplitWALCallable and execute it, which is much more straightforward than before. It will return null if success and return exception if there is any error. + +[[preformance]] +.Performance +According to tests on a cluster which has 5 regionserver and 1 master. +procedureV2 coordinated WAL splitting has a better performance than ZK coordinated WAL splitting no master when restarting the whole cluster or one region server crashing. + +[[enable.this.feature]] +.Enable this feature +To enable this feature, first we should ensure our package of HBase already contains these code. If not, please upgrade the package of HBase cluster without any configuration change first. +Then change configuration 'hbase.split.wal.zk.coordinated' to false. Rolling upgrade the master with new configuration. Now WAL splitting are handled by our new implementation. +But region server are still trying to grab tasks from zookeeper, we can rolling upgrade the region servers with the new configuration to stop that. + +* steps as follows: +** Upgrade whole cluster to get the new Implementation. +** Upgrade Master with new configuration 'hbase.split.wal.zk.coordinated'=false. +** Upgrade region server to stop grab tasks from zookeeper. [[wal.compression]] ==== WAL Compression ==== diff --git a/src/site/resources/images/WAL_splitting.png b/src/site/resources/images/WAL_splitting.png new file mode 100644 index 0000000000000000000000000000000000000000..004f4738387baf4f4babf2d34adaeb07bdb62f06 GIT binary patch literal 38049 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≦@0zM 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