# HBase 中的 Protobuf
## 179\. Protobuf
HBase 使用 Google 的 [protobufs](https://developers.google.com/protocol-buffers/) ,無論它在哪里持久存儲元數據 - 在 hfiles 或 HBase 寫入系統 hbase:meta 表格中,或者當 HBase 將 znodes 寫入 zookeeper 等時 - 以及當它將對象傳遞給制絲 [RPCs](#hbase.rpc) 。 HBase 使用 protobufs 來描述我們向客戶端公開的 RPC 接口(服務),例如 RegionServer 字段的`Admin`和`Client`接口,或指定開發人員通過我們的[協處理器端點](#cp)添加的任意擴展機制。
在本章中,我們將詳細介紹那些希望更好地了解它的工作原理的開發人員。本章特別適用于那些修改或擴展 HBase 功能的人。
使用 protobuf,您可以在`.protos`文件中描述序列化和服務。然后,您將這些描述符提供給 protobuf 工具(`protoc`二進制文件),以生成可以編組和解組所描述的序列化并對指定的服務進行字段處理的類。
有關如何基于每個模塊運行類生成的詳細信息,請參閱 HBase 子模塊中的`README.txt`;例如請參閱`hbase-protocol/README.txt`了解如何在 hbase 協議模塊中生成 protobuf 類。
在 HBase 中,`.proto`文件位于`hbase-protocol`模塊中;一個專用于托管公共 proto 文件的模塊和 HBase 使用內部序列化元數據的 protoc 生成的類。對于 hbase 的擴展,例如需要自己的描述符的 REST 或協處理器端點;他們的 protos 位于函數的托管模塊內:例如`hbase-rest`是 REST 原型文件的主頁,`hbase-rsgroup`表分組協處理器端點具有與表分組有關的所有原型。
Protos 由使用它們的模塊托管。雖然這使得 protobuf 類的生成分布式,按模塊完成,我們這樣做,因此模塊封裝了它們帶給 hbase 的功能。
擴展是否 REST 或協處理器端點將使用在 hbase 協議模塊中找到的核心 HBase 原型。當他們想要序列化 Cell 或 Put 時,或者通過 ServerName 等引用特定節點時,他們將使用這些核心 protos,作為提供 CPEP 服務的一部分。展望未來,在 hbase-2.0.0 發布之后,這種做法需要向前推進。我們將在后面的 [hbase-2.0.0](#shaded.protobuf) 部分解釋原因。
### 179.1。 hbase-2.0.0 和 protobufs 的陰影(HBASE-15638)
從 hbase-2.0.0 開始,我們的 protobuf 使用情況變得更加復雜。 HBase 核心 protobuf 引用被抵消,以便引用私有的捆綁 protobuf。核心在 com.google.protobuf 中停止引用 protobuf 類。 _ 而是在 HBase 特定的偏移量 org.apache.hadoop.hbase.shaded.com.google.protobuf 上引用 protobuf。_ 。我們這樣做是間接的,因此 hbase 核心可以獨立于我們的依賴關系所依賴的方式發展其 protobuf 版本。例如,HDFS 使用 protobuf 序列化。 HDFS 在我們的 CLASSPATH 上。如果沒有上述間接,我們的 protobuf 版本必須對齊。在 HDFS 決定升級之前,HBase 將停留在 HDFS protobuf 版本上。 HBase 和 HDFS 版本將捆綁在一起。
我們不得不繼續使用 protobuf-2.5.0,因為我們需要在 protobuf-3.1.0 中添加設施;特別是能夠保存副本并避免在序列化/反序列化時使用 protobufs。
在 hbase-2.0.0 中,我們引入了一個新模塊`hbase-protocol-shaded`,其中包含了與 protobuf 及其后續重定位/著色相關的所有內容。這個模塊本質上是許多舊`hbase-protocol`的副本,但有一個額外的著色/重定位步驟。核心被轉移到依賴這個新模塊。
也就是說,協處理器端點(CPEP)出現了復雜問題。 CPEP 依賴于明確引用`com.google.protobuf.*`的 protobuf 類的公共 HBase API。例如,在我們的表格接口中,我們使用以下內容作為獲取 CPEP 服務以對其進行調用的方式:
```
...
<T extends com.google.protobuf.Service,R> Map<byte[],R> coprocessorService(
Class<T> service, byte[] startKey, byte[] endKey,
org.apache.hadoop.hbase.client.coprocessor.Batch.Call<T,R> callable)
throws com.google.protobuf.ServiceException, Throwable
```
現有的 CPEP 將參考指定 ServerNames 或攜帶 Mutations 的核心 HBase protobufs。為了能夠在升級到 hbase-2.0.0 及更高版本的過程中繼續為 CPEP 及其對`com.google.protobuf.` **的引用提供服務,HBase 需要能夠處理`com.google.protobuf.`** 引用及其內部偏移`org.apache.hadoop.hbase.shaded.com.google.protobuf.*` protobufs。
`hbase-protocol-shaded`模塊托管 HBase 核心使用的所有 protobufs。
但是對于退化的 CPEP 參考`hbase-protocol`的(非陰影)內容,我們保留了這個模塊的大部分內容,因此它可供 CPEP 使用。保留`hbase-protocol`的大部分會產生重疊的“重復”原型實例,其中一些存在于其舊模塊位置中的非陰影/非重定位,但也存在于新位置,在`hbase-protocol-shaded`下陰影。換句話說,在 hbase 協議中有一個生成的 protobuf 類`org.apache.hadoop.hbase.protobuf.generated.ServerName`的實例,并且在所有方面都有相同的生成實例,除了它的 protobuf 引用是`org.apache.hadoop.hbase.shaded.protobuf.generated.ServerName`的內部著色版本(注意'陰影' '在包名稱中間添加)。
如果在`hbase-protocol-shaded`中擴展原型供內部使用,請考慮在`hbase-protocol`中擴展它(并重新生成)。
展望未來,我們將提供 CPEP 使用的常見類型的新模塊,它們將像我們的公共 API 一樣具有相同的變更保證。去做。
- 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