# Devs 的 AMv2 描述
HBase Master 中的 AssignmentManager(AM)管理 RegionServers 集群上的區域分配。
AMv2 項目是 Assignment 的重做,旨在解決生產中許多操作問題的根本原因,即緩慢分配和有問題的會計,使得地區錯位在臭名昭著的 _ 轉型區域( RIT)_ 肢體狀態。
以下是關于 AMv2 關鍵方面的開發人員的注釋,沒有特別的順序。
## 188.背景
HBase 1.x 中的分配在操作中存在問題。不難看出原因。區域狀態保存在 ZooKeeper 中 RPC 的另一端(終端狀態 - 即 OPEN 或 CLOSED - 發布到 _hbase:meta_ 表)。在 HBase-1.x.x 中,state 有多個編寫器,Master 和 RegionServers 都能同時進行狀態編輯(在 _hbase:meta_ 表中并在 ZooKeeper 上輸出)。如果時鐘錯誤或觀察者錯過,則可以跳過或覆蓋狀態更改。鎖定 HBase 實體 - 表,區域 - 并不全面,因此表操作 - 禁用/啟用 - 可能與區域級操作發生沖突;拆分或合并。區域狀態是分布式的,難以推理和測試。分配操作很慢,因為每個分配都涉及通過轉換移動遠程 znode。群集大小往往超過幾十萬個區域;除此之外,集群啟動/停止需要數小時,并且容易出現損壞。
AMv2(AssignmentManager 版本 2)是 hbase-1.x AssignmentManager 的重構( [HBASE-14350](https://issues.apache.org/jira/browse/HBASE-14350) ),它基于 [ProcedureV2(HBASE-12439)](https://issues.apache.org/jira/browse/HBASE-12439)。 ProcedureV2(Pv2)_,_ 是一個笨拙命名的系統,允許描述和運行多步狀態機。它具有高效性并且可以將所有狀態保存到可以在崩潰后恢復的商店。有關 ProcedureV2 系統的更多信息,請參見[程序框架(Pv2):](#pv2) [HBASE-12439](https://issues.apache.org/jira/browse/HBASE-12439) 的配套章節。
在 AMv2 中,所有賦值,崩潰處理,拆分和合并都重新編寫為過程(v2)。 ZooKeeper 從混合中清除。和以前一樣,最終的賦值狀態被發布到 _hbase:meta_ ,非主參與者讀取(所有客戶端)中間狀態保存在本地 Pv2 基于 WAL 的“商店”但只有活躍的主人一個單一的作家,演變國家。 Master 的內存中集群映像是權限,如果不一致,RegionServers 將被強制遵守。 Pv2 添加了所有核心 HBase 實體的共享/獨占鎖定 - 名稱空間,表和區域 - 以確保一個進程一次訪問并防止操作爭用資源(移動/拆分,禁用/分配等)。
在一個有目的的高性能狀態機的 AM 上面的重做,所有操作都采用具有單個狀態寫入器的通用過程表單,僅將我們的 AM 移動到新的彈性和規模級別。
## 189.新制度
區域的每個區域分配或取消分配現在都是一個過程。移動(區域)程序是程序的復合;它是運行 Unassign Procedure 然后是 Assign Procedure。移動過程產生系列中的分配和取消分配,然后等待它們的完成。
等等。 ServerCrashProcedure 生成 WAL 拆分任務,然后將作為子過程托管在崩潰服務器上的所有區域重新分配。
AMv2 過程由 Master 在 ProcedureExecutor 實例中運行。所有程序都使用 Pv2 框架提供的實用程序。
例如,Procedures 將每個狀態轉換持久保存到框架的 Procedure Store。默認實現是在 HDFS 上保留的 WAL。在崩潰時,我們重新打開 Store 并重新運行 Procedure 過程的所有 WAL,以使 Assignment State Machine 恢復到崩潰前的狀態。然后我們繼續執行程序。
在新系統中,Master 是所有事物分配的權威。以前我們很曖昧;例如 RegionServer 負責拆分業務。 Master 保留 Region 狀態和服務器的內存映像。如果分歧,師父總是占上風;在極端情況下,它會殺死存在分歧的 RegionServer。
新的 RegionStateStore 類負責將終端 Region 狀態(無論是 OPEN 還是 CLOSED)發布到 _hbase:meta _ 表 _ ._
RegionServers 現在在 Connection 上報告其運行版本。此版本在 AM 中可用,用于運行遷移滾動重新啟動。
## 190.程序細節
### 190.1。指定/取消指定
分配和取消分配公共 RegionTransitionProcedure 的子類。由于 RTP 實例對區域進行鎖定,因此每個區域一次只能運行一個 RegionTransitionProcedure。 RTP 基礎程序有三個步驟;存儲過程步驟(REGION_TRANSITION_QUEUE);調度程序打開或關閉,然后暫停等待遠程區域服務器報告成功打開或失敗(REGION_TRANSITION_DISPATCH)或通知服務器發出請求崩潰;最后在 hbase:meta(REGION_TRANSITION_FINISH)中注冊成功的打開/關閉。
以下是區域 56f985a727afe80a184dac75fbf6860c 在日志中的分配方式。分配是由服務器崩潰引起的(進程 ID 1176 或 pid = 1176,當它是過程的父級時,它被標識為 ppid = 1176)。 assign 是 pid = 1179,兩者的第二個區域由此服務器崩潰分配。
```
2017-05-23 12:04:24,175 INFO [ProcExecWrkr-30] procedure2.ProcedureExecutor: Initialized subprocedures=[{pid=1178, ppid=1176, state=RUNNABLE:REGION_TRANSITION_QUEUE; AssignProcedure table=IntegrationTestBigLinkedList, region=bfd57f0b72fd3ca77e9d3c5e3ae48d76, target=ve0540.halxg.example.org,16020,1495525111232}, {pid=1179, ppid=1176, state=RUNNABLE:REGION_TRANSITION_QUEUE; AssignProcedure table=IntegrationTestBigLinkedList, region=56f985a727afe80a184dac75fbf6860c, target=ve0540.halxg.example.org,16020,1495525111232}]
```
接下來,我們通過使用框架排隊('注冊')過程來開始賦值。
```
2017-05-23 12:04:24,241 INFO [ProcExecWrkr-30] assignment.AssignProcedure: Start pid=1179, ppid=1176, state=RUNNABLE:REGION_TRANSITION_QUEUE; AssignProcedure table=IntegrationTestBigLinkedList, region=56f985a727afe80a184dac75fbf6860c, target=ve0540.halxg.example.org,16020,1495525111232; rit=OFFLINE, location=ve0540.halxg.example.org,16020,1495525111232; forceNewPlan=false, retain=false
```
通過跟蹤其進程 ID 來跟蹤日志中的過程運行 - 此處為 pid = 1179。
接下來,我們轉到調度階段,我們更新 hbase:meta 表,將區域狀態設置為服務器 ve540 上的 OPENING。然后我們向 ve540 發送一個 rpc,要求它打開該區域。此后我們暫停分配,直到我們從 ve540 收到一條消息,告知它是否已成功打開該區域(或不成功)。
```
2017-05-23 12:04:24,494 INFO [ProcExecWrkr-38] assignment.RegionStateStore: pid=1179 updating hbase:meta row=IntegrationTestBigLinkedList,H\xE3@\x8D\x964\x9D\xDF\x8F@9\x0F\xC8\xCC\xC2,1495566261066.56f985a727afe80a184dac75fbf6860c., regionState=OPENING, regionLocation=ve0540.halxg.example.org,16020,1495525111232
2017-05-23 12:04:24,498 INFO [ProcExecWrkr-38] assignment.RegionTransitionProcedure: Dispatch pid=1179, ppid=1176, state=RUNNABLE:REGION_TRANSITION_DISPATCH; AssignProcedure table=IntegrationTestBigLinkedList, region=56f985a727afe80a184dac75fbf6860c, target=ve0540.halxg.example.org,16020,1495525111232; rit=OPENING, location=ve0540.halxg.example.org,16020,1495525111232
```
下面我們記錄該區域在 ve540 上成功打開的傳入報告。程序被喚醒(您可以通過線程的名稱,它的 ProcedureExecutor 線程,ProcExecWrkr-9 告訴它程序正在運行)。喚醒過程更新 hbase:meta 中的狀態以表示該區域在 ve0540 上打開。然后報告完成和退出。
```
2017-05-23 12:04:26,643 DEBUG [RpcServer.default.FPBQ.Fifo.handler=46,queue=1,port=16000] assignment.RegionTransitionProcedure: Received report OPENED seqId=11984985, pid=1179, ppid=1176, state=RUNNABLE:REGION_TRANSITION_DISPATCH; AssignProcedure table=IntegrationTestBigLinkedList, region=56f985a727afe80a184dac75fbf6860c, target=ve0540.halxg.example.org,16020,1495525111232; rit=OPENING, location=ve0540.halxg.example.org,16020,1495525111232 2017-05-23 12:04:26,643 INFO [ProcExecWrkr-9] assignment.RegionStateStore: pid=1179 updating hbase:meta row=IntegrationTestBigLinkedList,H\xE3@\x8D\x964\x9D\xDF\x8F@9\x0F\xC8\xCC\xC2,1495566261066.56f985a727afe80a184dac75fbf6860c., regionState=OPEN, openSeqNum=11984985, regionLocation=ve0540.halxg.example.org,16020,1495525111232
2017-05-23 12:04:26,836 INFO [ProcExecWrkr-9] procedure2.ProcedureExecutor: Finish suprocedure pid=1179, ppid=1176, state=SUCCESS; AssignProcedure table=IntegrationTestBigLinkedList, region=56f985a727afe80a184dac75fbf6860c, target=ve0540.halxg.example.org,16020,1495525111232
```
取消分配看起來類似,因為它基于 RegionTransitionProcedure。它具有相同的狀態轉換,并且基本上執行相同的步驟,但具有不同的狀態名稱(CLOSING,CLOSED)。
大多數其他過程是 Pv2 StateMachine 實現的子類。我們有 Table 和 Region 聚焦的 StateMachines 類型。
## 191.用戶界面
沿著 Master 上的頂欄,您現在可以找到一個'Procedures& Locks'選項卡,它會將您帶到一個丑陋但有用的頁面。它轉儲當前正在運行的過程和框架鎖。當你無法確定卡住的東西時,請看這個;它至少會識別有問題的程序(拿起 pid 并 grep 日志......)。尋找已經長時間運行的 ROLLEDBACK 或 pids。
## 192.記錄
程序將他們的進程 id 記錄為 pid =和他們的父 ID(ppid =)無處不在。工作已經完成,因此您可以 grep pid 并查看過程操作的歷史記錄。
## 193.實施說明
在本節中,我們注意到一些操作的特性,試圖為您節省一些麻煩。
### 193.1。區域轉換 RPC 和 RS 心跳可以在 Master 上同時到達
報告 RegionServer 上的區域轉換現在是一個不同于 RS 心跳的 RPC('RegionServerServices'服務)。心跳和狀態更新可以在大約同一時間到達主服務器。 Master 將更新其 Region 的內部狀態,但在心跳處理時會檢查相同的狀態。我們可能會發現意外;即一個剛剛報告為關閉的地區,因此心跳驚訝地發現 RS 報告背面的區域為 OPEN。在新系統中,所有奴隸都必須了解大師對群集狀態的理解;主人將殺死/關閉任何未對齊的實體。
為了解決上述問題,我們為內存中的主狀態添加了 lastUpdate。在我們采取行動之前,讓一個地區的國家有一些年份(目前是一秒)。
### 193.2。 Master 作為 RegionServer 或 RegionServer 只執行系統表
AMv2 僅強制執行 HMaster 承載系統表的當前主分支默認值;即,HBase 集群中的 Master 也作為 RegionServer,它只是 _hbase:meta_ , _hbase:namespace_ 等表的獨占主機,核心系統表。這導致了一些測試失敗,因為 AMv1,雖然它不應該,允許移動 hbase:meta 關閉 Master 而 AMv2 沒有。
## 194.新配置
當你改變它們時,這些配置都需要 doc。
### 194.1。 hbase.procedure.remote.dispatcher.threadpool.size
默認值為 128
### 194.2。 hbase.procedure.remote.dispatcher.delay.msec
默認 150 毫秒
### 194.3。 hbase.procedure.remote.dispatcher.max.queue.size
默認 32
### 194.4。 hbase.regionserver.rpc.startup.waittime
默認為 60 秒。
## 195.工具
HBASE-15592 打印程序 WAL 內容
[HBASE-18152](https://issues.apache.org/jira/browse/HBASE-18152) [AMv2]損壞程序 WAL 文件中的補丁;無序存儲的程序數據 [https://issues.apache.org/jira/secure/attachment/12871066/reading_bad_wal.patch](https://issues.apache.org/jira/secure/attachment/12871066/reading_bad_wal.patch)
### 195.1。 MasterProcedureSchedulerPerformanceEvaluation
用于在過程調度程序中獨立于其他框架組件測試鎖和隊列的性能的工具。在 proc 系統進行任何實質性更改后運行此命令。打印好的輸出:
```
******************************************
Time - addBack : 5.0600sec
Ops/sec - addBack : 1.9M
Time - poll : 19.4590sec
Ops/sec - poll : 501.9K
Num Operations : 10000000
Completed : 10000006
Yield : 22025876
Num Tables : 5
Regions per table : 10
Operations type : both
Threads : 10
******************************************
Raw format for scripts
RESULT [num_ops=10000000, ops_type=both, num_table=5, regions_per_table=10, threads=10, num_yield=22025876, time_addback_ms=5060, time_poll_ms=19459]
```
- HBase? 中文參考指南 3.0
- Preface
- Getting Started
- Apache HBase Configuration
- Upgrading
- The Apache HBase Shell
- Data Model
- HBase and Schema Design
- RegionServer Sizing Rules of Thumb
- HBase and MapReduce
- Securing Apache HBase
- Architecture
- In-memory Compaction
- Backup and Restore
- Synchronous Replication
- Apache HBase APIs
- Apache HBase External APIs
- Thrift API and Filter Language
- HBase and Spark
- Apache HBase Coprocessors
- Apache HBase Performance Tuning
- Troubleshooting and Debugging Apache HBase
- Apache HBase Case Studies
- Apache HBase Operational Management
- Building and Developing Apache HBase
- Unit Testing HBase Applications
- Protobuf in HBase
- Procedure Framework (Pv2): HBASE-12439
- AMv2 Description for Devs
- ZooKeeper
- Community
- Appendix