# 附錄
## 附錄 A:貢獻文檔
Apache HBase 項目歡迎對項目的所有方面做出貢獻,包括文檔。
在 HBase 中,文檔包括以下幾個方面,可能還包括其他方面:
* [HBase 參考指南](https://hbase.apache.org/book.html)(本書)
* [HBase 網站](https://hbase.apache.org/)
* API 文檔
* 命令行實用程序輸出和幫助文本
* Web UI 字符串,顯式幫助文本,上下文相關字符串等
* 記錄消息
* 源文件,配置文件和其他內容中的注釋
* 將上述任何一種語言本地化為英語以外的目標語言
無論您想要幫助哪個區域,第一步幾乎總是下載(通常通過克隆 Git 存儲庫)并熟悉 HBase 源代碼。有關下載和構建源的信息,請參閱[開發人員](#developer)。
### A.1。有助于文檔或其他字符串
如果您在 UI,實用程序,腳本,日志消息或其他地方的字符串中發現錯誤,或者您認為某些內容可以更清晰,或者您認為文本需要添加到當前不存在的位置,那么第一個步驟是提交 JIRA。除了任何其他相關組件外,務必將組件設置為`Documentation`。大多數組件都有一個或多個默認所有者,他們監視進入這些隊列的新問題。無論您是否能夠修復該錯誤,您仍應該在看到錯誤的地方提交錯誤。
如果您想嘗試修復新提交的錯誤,請將其分配給自己。您需要將 HBase Git 存儲庫克隆到本地系統并在那里解決問題。當您開發出潛在的修復程序時,請將其提交以供審核。如果它解決了這個問題并被視為一種改進,那么其中一個 HBase 提交者將根據需要將其提交給一個或多個分支。
過程:提交補丁的建議工作流程
這個程序比 Git 專業人員需要的更詳細,但是包含在本附錄中,以便不熟悉 Git 的人在學習時能夠對 HBase 有信心。
1. 如果您還沒有這樣做,請在本地克隆 Git 存儲庫。你只需要這樣做一次。
2. 通常,在檢出跟蹤分支時,使用`git pull`命令將遠程更改拉入本地存儲庫。
3. 對于您處理的每個問題,請創建一個新分支。一個適用于命名分支的約定是將給定分支命名為與其相關的 JIRA:
```
$ git checkout -b HBASE-123456
```
4. 在您的分支上進行建議的更改,經常將更改提交到本地存儲庫。如果您需要切換到處理其他問題,請記得檢查相應的分支。
5. 當您準備好提交補丁時,首先要確保 HBase 構建干凈,并在修改的分支中按預期運行。
6. 如果您更改了文檔,請確保通過運行`mvn clean site`來構建文檔和網站。
7. 如果您需要幾天或幾周的時間來實施修復,或者您知道您正在使用的代碼區域最近有很多更改,請確保將分支重新綁定到遠程主服務器并處理任何沖突在提交補丁之前。
```
$ git checkout HBASE-123456
$ git rebase origin/master
```
8. 針對遠程主服務器生成補丁。從 git 存儲庫的頂層運行以下命令(通常稱為`hbase`):
```
$ git format-patch --stdout origin/master > HBASE-123456.patch
```
補丁的名稱應包含 JIRA ID。
9. 查看補丁文件,確保您沒有意外更改任何其他文件,并且沒有其他意外。
10. 如果您滿意,請將補丁附加到 JIRA 并單擊 **Patch Available** 按鈕。審核人員將審核您的補丁。
11. 如果您需要提交新版本的補丁,請將舊版本保留在 JIRA 上,并在新補丁的名稱中添加版本號。
12. 提交更改后,無需保留本地分支。
### A2。編輯 HBase 網站
HBase 網站的源代碼位于 HBase 源代碼的 _src / site /_ 目錄中。在此目錄中,各個頁面的源位于 _xdocs /_ 目錄中,這些頁面中引用的圖像位于 _resources / [https://hbase.apache.org/images 中/](https://hbase.apache.org/images/)_ 目錄。此目錄還存儲 HBase 參考指南中使用的圖像。
該網站的頁面是用類似 HTML 的 XML 方言編寫的,名為 xdoc,在 [https://maven.apache.org/archives/maven-1.x/plugins/xdoc/reference/xdocs 上有參考指南。 html](https://maven.apache.org/archives/maven-1.x/plugins/xdoc/reference/xdocs.html) 。您可以在純文本編輯器,IDE 或 XML 編輯器(如 XML Mind XML Editor(XXE)或 Oxygen XML Author)中編輯這些文件。
要預覽更改,請使用`mvn clean site -DskipTests`命令構建網站。 HTML 輸出位于 _ 目標/站點/_ 目錄中。如果對更改感到滿意,請按照[提交文檔修補程序](#submit_doc_patch_procedure)中的步驟提交補丁。
### A.3。發布 HBase 網站和文檔
HBase 使用 ASF 的`gitpubsub`機制。 Jenkins 作業運行`dev-support/jenkins-scripts/generate-hbase-website.sh`腳本,該腳本針對`hbase`存儲庫的`master`分支運行`mvn clean site site:stage`,并將構建的工件提交到`hbase-site`存儲庫的`asf-site`分支。按下提交后,將自動重新部署網站。如果腳本遇到錯誤,則會向開發人員郵件列表發送一封電子郵件。您可以手動運行腳本或檢查腳本以查看所涉及的步驟。
### A.4。檢查 HBase 網站的斷開鏈接
Jenkins 作業定期運行,使用`dev-support/jenkins-scripts/check-website-links.sh`腳本檢查 HBase 網站是否有損壞的鏈接。此腳本使用名為`linklint`的工具檢查錯誤鏈接并創建報告。如果找到損壞的鏈接,則會向開發人員郵件列表發送一封電子郵件。您可以手動運行腳本或檢查腳本以查看所涉及的步驟。
### A.5。 HBase 參考指南樣式指南和備忘單
HBase 參考指南用 Asciidoc 編寫,使用 [AsciiDoctor](http://asciidoctor.org) 構建。以下備忘單供您參考。更多細微而全面的文檔可在 [http://asciidoctor.org/docs/user-manual/](http://asciidoctor.org/docs/user-manual/) 上找到。
| 元素類型 | 期望的渲染 | 怎么做 |
| --- | --- | --- |
| 一個段落 | 一個段落 |
只需鍵入一些頂部和底部帶有空行的文本。
| |在段落中添加換行符而不添加空行|手動換行|
這將在加號處打破+。或者在整個段落前面加上包含'[%hardbreaks]'的行
| |給任何東西一個標題彩色斜體粗體不同大小的文字| | |內聯代碼或命令| monospace |
`text`
| |內聯文字內容(完全按照所示輸入的內容)|大膽的單聲道|
_`typethis`_
| |內聯可替換內容(用您自己的值替換的東西)|粗斜體單聲道|
__ 類型的東西 __
| |突出顯示的代碼塊|等寬,突出,保留空間|
```
[source,java]
----
myAwesomeCode() {
}
----
```
| |代碼塊包含在單獨的文件中包括就好像它是主文件的一部分|
```
[source,ruby]
----
include\::path/to/app.rb[]
----
```
| |僅包含單獨文件的一部分|與 Javadoc 相似|
見 [http://asciidoctor.org/docs/user-manual/#by-tagged-regions](http://asciidoctor.org/docs/user-manual/#by-tagged-regions)
| |文件名,目錄名,新術語|斜體|
_hbase-default.xml_
| |外部裸 URL |鏈接 URL 作為鏈接文本|
```
link:http://www.google.com
```
| |帶文字的外部網址|帶有任意鏈接文本的鏈接|
```
link:http://www.google.com[Google]
```
| |創建內部錨點以交叉引用|沒有呈現|
```
[[anchor_name]]
```
| |使用其默認標題|交叉引用現有錨點使用元素標題的內部超鏈接(如果可用),否則使用錨名稱|
```
<<anchor_name>>
```
| |使用自定義文本交叉引用現有錨點使用任意文本的內部超鏈接
```
<<anchor_name,Anchor Text>>
```
| |塊圖像|替代文字的圖像|
```
image::sunset.jpg[Alt Text]
```
(將圖像放在 src / site / resources / images 目錄中)
| |內嵌圖像|帶有 alt 文本的圖像,作為文本流程的一部分
```
image:sunset.jpg [Alt Text]
```
(只有一個冒號)
| |鏈接到遠程圖像|顯示在別處托管的圖像|
```
image::http://inkscape.org/doc/examples/tux.svg[Tux,250,350]
```
(或`image:`)
| |向圖像添加尺寸或 URL |取決于|
在 alt 文本后的括號內,指定 width,height 和/或 link =“ [http://my_link.com](http://my_link.com) ”
| |腳注|下標鏈接帶你到腳注|
```
Some text.footnote:[The footnote text.]
```
| |沒有標題的注釋或警告|告誡圖像后面跟著警告|
```
NOTE:My note here
```
```
WARNING:My warning here
```
| |復雜的筆記|該筆記有一個標題和/或多個段落和/或代碼塊或列表等
```
.The Title
[NOTE]
====
Here is the note text. Everything until the second set of four equals signs is part of the note.
----
some source code
----
====
```
| |子彈列表|子彈列表|
```
* list item 1
```
(見 [http://asciidoctor.org/docs/user-manual/#unordered-lists](http://asciidoctor.org/docs/user-manual/#unordered-lists) )
| |編號列表|編號列表|
```
. list item 2
```
(見 [http://asciidoctor.org/docs/user-manual/#ordered-lists](http://asciidoctor.org/docs/user-manual/#ordered-lists) )
| |清單|選中或未選中的復選框|
經過:
```
- [*]
```
未選中:
```
- [ ]
```
| |多級列表|項目符號或編號或組合|
```
. Numbered (1), at top level
* Bullet (2), nested under 1
* Bullet (3), nested under 1
. Numbered (4), at top level
* Bullet (5), nested under 4
** Bullet (6), nested under 5
- [x] Checked (7), at top level
```
| |標記列表/變量列表|列表項標題或摘要后跟內容|
```
Title:: content
Title::
content
```
| |側欄,引號或其他文本塊|一個文本塊,格式與默認值不同
使用不同的分隔符分隔,請參閱 [http://asciidoctor.org/docs/user-manual/#built-in-blocks-summary](http://asciidoctor.org/docs/user-manual/#built-in-blocks-summary) 。上面的一些例子使用分隔符,如....,----,====。
```
[example]
====
This is an example block.
====
[source]
----
This is a source block.
----
[note]
====
This is a note block.
====
[quote]
____
This is a quote block.
____
```
如果要插入一直保持被解釋的文字 Asciidoc 內容,如果有疑問,請在頂部和底部使用八個點作為分隔符。
| |嵌套部分|章節,節,小節等|
```
= Book (or chapter if the chapter can be built alone, see the leveloffset info below)
== Chapter (or section if the chapter is standalone)
=== Section (or subsection, etc)
==== Subsection
```
等等多達 6 個級別(仔細考慮深入 4 級以上,也許你可以選擇標題段落或列表)。請注意,您可以通過在 include 之前直接添加`:leveloffset:+1`宏指令將一本書包含在另一本書中,然后將其重置為 0。有關示例,請參閱 _book.adoc_ 源代碼,因為這是本指南處理章節的方式。 **不要為前言,術語表,附錄或其他特殊類型的章節做這些。**
| |包含另一個文件|內容包含在內,就像它是內聯的一樣
```
include::[/path/to/file.adoc]
```
有很多例子。見 _book.adoc_ 。
| |一張桌子|一張桌子|
見 [http://asciidoctor.org/docs/user-manual/#tables](http://asciidoctor.org/docs/user-manual/#tables) 。通常,行由換行符和換行符按管道分隔
| |注釋掉一行|渲染時跳過一行|
`// This line won’t show up`
| |注釋掉一個塊|在渲染過程中會跳過文件的一部分
```
////
Nothing between the slashes will show up.
////
```
| |突出顯示要審閱的文本|文本顯示黃色背景|
```
Test between #hash marks# is highlighted yellow.
```
|
### A.6。自動生成的內容
HBase 參考指南的某些部分,特別是 [config.files](#config.files) ,是自動生成的,因此文檔的這個區域與代碼保持同步。這是通過 XSLT 轉換完成的,您可以在 _src / main / xslt / configuration_to_asciidoc _chapter.xsl_ 的源代碼中查看。這會將 _hbase-common / src / main / resources / hbase-default.xml_ 文件轉換為 Asciidoc 輸出,該輸出可以包含在參考指南中。
有時,需要添加配置參數或修改其描述。對源文件進行修改,重建后它們將包含在“參考指南”中。
將來可能并且將從 HBase 源文件自動生成其他類型的內容。
### A.7。 HBase 參考指南中的圖像
您可以在 HBase 參考指南中包含圖像。如果可能,重要的是包括圖像標題,并始終包括替代文本。這允許屏幕閱讀器導航到圖像并且還為圖像提供替代文本。以下是帶有標題和替代文本的圖像示例。注意雙冒號。
```
.My Image Title
image::sunset.jpg[Alt Text]
```
以下是帶有替換文本的內嵌圖像的示例。注意單個冒號。內嵌圖像不能有標題。它們通常是像 GUI 按鈕這樣的小圖像。
```
image:sunset.jpg[Alt Text]
```
進行本地構建時,將圖像保存到 _src / site / resources / [https://hbase.apache.org/images/](https://hbase.apache.org/images/)_ 目錄。鏈接到圖像時,請不要包含路徑的目錄部分。在構建輸出期間,圖像將被復制到適當的目標位置。
當您提交包含將圖像添加到 HBase 參考指南的修補程序時,請將圖像附加到 JIRA。如果提交者詢問應該提交映像的位置,它應該進入上面的目錄。
### A.8。在 HBase 參考指南中添加新章節
如果要在 HBase 參考指南中添加新章節,最簡單的方法是復制現有的章節文件,重命名它,并更改 ID(在雙括號中)和標題。章節位于 _src / main / asciidoc / _ 章節/_ 目錄中。
刪除現有內容并創建新內容。然后打開 _src / main / asciidoc / book.adoc_ 文件,該文件是 HBase 參考指南的主文件,并復制現有的`include`元素以將新章節包含在適當的位置。在創建補丁之前,請務必將新文件添加到 Git 存儲庫。
如有疑問,請檢查其他文件是如何包含的。
### A.9。常見文檔問題
經常出現以下文檔問題。其中一些是偏好,但其他人可能會產生神秘的構建錯誤或其他問題。
1. _ 隔離更改以便進行簡易差異檢查。_
小心漂亮打印或重新格式化整個 XML 文件,即使格式隨著時間的推移而降級。如果您需要重新格式化文件,請在不更改任何內容的單獨 JIRA 中執行此操作。請注意,因為某些 XML 編輯器在您打開新文件時會進行批量重新格式化,尤其是在編輯器中使用 GUI 模式時。
2. _ 語法突出顯示 _
HBase 參考指南使用`coderay`進行語法高亮顯示。要為給定代碼清單啟用語法突出顯示,請使用以下類型的語法:
```
[source,xml]
----
<name>My Name</name>
----
```
支持幾種語法類型。 HBase 參考指南中最有趣的是`java`,`xml`,`sql`和`bash`。
## 附錄 B:常見問題
### B.1。一般
我什么時候應該使用 HBase?
請參閱架構章節中的[概述](#arch.overview)。
還有其他 HBase 常見問題嗎?
請參閱維基上的常見問題解答, [HBase Wiki 常見問題解答](https://wiki.apache.org/hadoop/Hbase/FAQ)。
HBase 是否支持 SQL?
并不是的。通過 [Hive](https://hive.apache.org/) 對 HBase 的 SQL-ish 支持正在開發中,但是 Hive 基于 MapReduce,它通常不適用于低延遲請求。有關 HBase 客戶端的示例,請參見[數據模型](#datamodel)部分。
如何找到 NoSQL / HBase 的示例?
請參閱[關于 HBase](#other.info) 的其他信息以及其他文章中 BigTable 論文的鏈接。
HBase 的歷史是什么?
見 [hbase.history](#hbase.history) 。
為什么 HBase 不建議使用 10MB 以上的電池?
大細胞不適合 HBase 緩沖數據的方法。首先,大單元在寫入時繞過 MemStoreLAB。然后,在讀取操作期間,它們不能緩存在 L2 塊緩存中。相反,HBase 每次都必須為它們分配堆內存。這可能會對 RegionServer 進程中的垃圾收集器產生重大影響。
### B.2。升級
如何將 Maven 管理的項目從 HBase 0.94 升級到 HBase 0.96+?
在 HBase 0.96 中,項目轉移到模塊化結構。調整項目的依賴關系以依賴`hbase-client`模塊或其他模塊,而不是單個 JAR。您可以根據您的目標 HBase 版本,在以下之一之后為 Maven 依賴建模。有關更多信息,請參見第 3.5 節“從 0.94.x 升級到 0.96.x”或第 3.3 節“從 0.96.x 升級到 0.98.x”。
Maven 對 HBase 的依賴性為 0.98
```
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>0.98.5-hadoop2</version>
</dependency>
```
Maven 對 HBase 的依賴性為 0.96
```
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>0.96.2-hadoop2</version>
</dependency>
```
Maven 對 HBase 的依賴性為 0.94
```
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase</artifactId>
<version>0.94.3</version>
</dependency>
```
### B.3。建筑
HBase 如何處理 Region-RegionServer 分配和位置?
見[區域](#regions.arch)。
### B.4。組態
我怎樣才能開始使用我的第一個集群?
參見[快速入門 - 獨立 HBase](#quickstart) 。
我在哪里可以了解其他配置選項?
請參見 [Apache HBase 配置](#configuration)。
### B.5。架構設計/數據訪問
我應該如何在 HBase 中設計我的架構?
參見[數據模型](#datamodel)和 [HBase 和模式設計](#schema)。
如何在 HBase 中存儲(填空)?
請參見[支持的數據類型](#supported.datatypes)。
如何處理 HBase 中的二級索引?
請參見[輔助索引和備用查詢路徑](#secondary.indexes)。
我可以更改表的 rowkeys 嗎?
這是一個非常常見的問題。你不能。參見 [Rowkeys](#changing.rowkeys) 的不變性。
HBase 支持哪些 API?
參見[數據模型](#datamodel),[客戶端](#architecture.client)和 [Apache HBase 外部 API](#external_apis) 。
### B.6。 MapReduce 的
如何將 MapReduce 與 HBase 一起使用?
參見 [HBase 和 MapReduce](#mapreduce) 。
### B.7。性能和故障排除
如何提高 HBase 集群性能?
參見 [Apache HBase 性能調優](#performance)。
如何解決 HBase 群集問題?
請參閱[疑難解答和調試 Apache HBase](#trouble) 。
### B.8。亞馬遜 EC2
我在 Amazon EC2 上運行 HBase 并且......
EC2 問題是一個特例。參見 [Amazon EC2](#trouble.ec2) 和 [Amazon EC2](#perf.ec2) 。
### B.9。操作
如何管理 HBase 群集?
參見 [Apache HBase 運營管理](#ops_mgt)。
如何備份 HBase 群集?
參見 [HBase Backup](#ops.backup) 。
### B.10。 HBase 在行動
我在哪里可以找到有關 HBase 的有趣視頻和演示文稿?
參見[關于 HBase](#other.info) 的其他信息。
## 附錄 C:訪問控制矩陣
以下矩陣顯示了在 HBase 中執行操作所需的權限集。在使用該表之前,請閱讀有關如何解釋它的信息。
解釋 ACL 矩陣表
ACL Matrix 表中使用以下約定:
### C.1。領域
從最廣泛的范圍開始評估權限,并在最窄的范圍內進行評估。
范圍對應于數據模型的級別。從最廣泛到最窄,范圍如下:
領域
* 全球
* 命名空間(NS)
* 表
* 柱族(CF)
* 列限定符(CQ)
* 細胞
例如,在表級別授予的權限支配在列族,列限定符或單元級別完成的任何授權。用戶可以在表中的任何位置執行授權所暗示的內容。在全局范圍內授予的權限支配所有權限:始終允許用戶在任何地方執行該操作。
### C.2。權限
可能的權限包括以下內容:
權限
* 超級用戶 - 屬于“超級組”組的特殊用戶,具有無限制訪問權限
* 管理員(A)
* 創建(C)
* 寫(W)
* 閱讀(R)
* 執行(X)
在大多數情況下,權限以預期的方式工作,具有以下警告:
擁有寫入權限并不意味著具有讀取權限。
用戶能夠并且有時希望能夠寫入相同用戶無法讀取的數據。一個這樣的例子是日志寫入過程。
無論用戶的其他授權或限制如何,每個用戶都可以讀取 hbase:meta 表。
這是 HBase 正常運行的要求。
如果用戶沒有寫入和讀取權限,則`CheckAndPut`和`CheckAndDelete`操作將失敗。
`Increment`和`Append`操作不需要讀訪問權限。
顧名思義,`superuser`具有執行所有可能操作的權限。
對于標有*的操作,檢查在后掛鉤中完成,只有滿足訪問檢查的結果子集才會返回給用戶。
下表按提供每個操作的接口排序。如果表格過時,可以在 _hbase-server / src / test / java / org / apache / hadoop / hbase / security / access / TestAccessController.java 中找到檢查權限準確性的單元。_ ,訪問控制本身可以在 _hbase-server / src / main / java / org / apache / hadoop / hbase / security / access / AccessController.java_ 中查看。
| 接口 | 手術 | 權限 |
| --- | --- | --- |
| 主 | CREATETABLE | 超級用戶|全球(C)| NS(C) |
| | modifyTable | 超級用戶|全球(A)|全球(C)| NS(A)| NS(C)|表所有者|表(A)|表(C) |
| | deleteTable | superuser|global(A)|global(C)|NS(A)|NS(C)|TableOwner|table(A)|table(C) |
| | truncateTable | superuser|global(A)|global(C)|NS(A)|NS(C)|TableOwner|table(A)|table(C) |
| | addColumn | superuser|global(A)|global(C)|NS(A)|NS(C)|TableOwner|table(A)|table(C) |
| | modifyColumn | 超級用戶|全球(A)|全球(C)| NS(A)| NS(C)|表所有者|表(A)|表(C)|柱(A)|柱(C) |
| | deleteColumn | superuser|global(A)|global(C)|NS(A)|NS(C)|TableOwner|table(A)|table(C)|column(A)|column(C) |
| | enableTable | superuser|global(A)|global(C)|NS(A)|NS(C)|TableOwner|table(A)|table(C) |
| | disableTable | superuser|global(A)|global(C)|NS(A)|NS(C)|TableOwner|table(A)|table(C) |
| | disableAclTable | 不允許 |
| | 移動 | 超級用戶|全球(A)| NS(A)|表所有者|表(A) |
| | 分配 | superuser|global(A)|NS(A)|TableOwner|table(A) |
| | 取消分配 | superuser|global(A)|NS(A)|TableOwner|table(A) |
| | regionOffline | superuser|global(A)|NS(A)|TableOwner|table(A) |
| | 平衡 | 超級用戶|全球(A) |
| | balanceSwitch | superuser|global(A) |
| | 關掉 | superuser|global(A) |
| | stopMaster | superuser|global(A) |
| | 快照 | superuser|global(A)|NS(A)|TableOwner|table(A) |
| | listSnapshot | 超級用戶|全球(A)| SnapshotOwner |
| | cloneSnapshot | 超級用戶|全局(A)|(SnapshotOwner&amp; TableName 匹配) |
| | restoreSnapshot | 超級用戶|全球(A)| SnapshotOwner&amp; (NS(A)|表所有者|表(A)) |
| | deleteSnapshot | superuser|global(A)|SnapshotOwner |
| | createNamespace | superuser|global(A) |
| | deleteNamespace | superuser|global(A) |
| | modifyNamespace | superuser|global(A) |
| | getNamespaceDescriptor | 超級用戶|全球(A)| NS(A) |
| | listNamespaceDescriptors * | superuser|global(A)|NS(A) |
| | flushTable | superuser|global(A)|global(C)|NS(A)|NS(C)|TableOwner|table(A)|table(C) |
| | getTableDescriptors * | superuser|global(A)|global(C)|NS(A)|NS(C)|TableOwner|table(A)|table(C) |
| | getTableNames * | 超級用戶| TableOwner |任何全局或表 perm |
| | setUserQuota(全局級別) | superuser|global(A) |
| | setUserQuota(名稱空間級別) | superuser|global(A) |
| | setUserQuota(表級) | superuser|global(A)|NS(A)|TableOwner|table(A) |
| | setTableQuota | superuser|global(A)|NS(A)|TableOwner|table(A) |
| | setNamespaceQuota | superuser|global(A) |
| | addReplicationPeer | superuser|global(A) |
| | removeReplicationPeer | superuser|global(A) |
| | enableReplicationPeer | superuser|global(A) |
| | disableReplicationPeer | superuser|global(A) |
| | getReplicationPeerConfig | superuser|global(A) |
| | updateReplicationPeerConfig | superuser|global(A) |
| | listReplicationPeers | superuser|global(A) |
| | getClusterStatus | 任何用戶 |
| 區域 | openRegion | superuser|global(A) |
| | closeRegion | superuser|global(A) |
| | 紅暈 | 超級用戶|全球(A)|全球(C)|表所有者|表(A)|表(C) |
| | 分裂 | 超級用戶|全球(A)|表所有者|表所有者|表(A) |
| | 緊湊 | superuser|global(A)|global(C)|TableOwner|table(A)|table(C) |
| | getClosestRowBefore | 超級用戶|全球(R)| NS(R)|表所有者|表(R)| CF(R)| CQ(R) |
| | getOp | superuser|global(R)|NS(R)|TableOwner|table(R)|CF(R)|CQ(R) |
| | 存在 | superuser|global(R)|NS(R)|TableOwner|table(R)|CF(R)|CQ(R) |
| | 放 | 超級用戶|全球(W)| NS(W)|表(W)|表所有者| CF(W)| CQ(W) |
| | 刪除 | superuser|global(W)|NS(W)|table(W)|TableOwner|CF(W)|CQ(W) |
| | batchMutate | 超級用戶|全球(W)| NS(W)|表所有者|表(W)| CF(W)| CQ(W) |
| | checkAndPut | 超級用戶|全球(RW)| NS(RW)|表所有者|表(RW)| CF(RW)| CQ(RW) |
| | checkAndPutAfterRowLock | 超級用戶|全球(R)| NS(R)|表所有者|表(R)| CF(R)| CQ(R) |
| | checkAndDelete | superuser|global(RW)|NS(RW)|TableOwner|table(RW)|CF(RW)|CQ(RW) |
| | checkAndDeleteAfterRowLock | superuser|global(R)|NS(R)|TableOwner|table(R)|CF(R)|CQ(R) |
| | incrementColumnValue | superuser|global(W)|NS(W)|TableOwner|table(W)|CF(W)|CQ(W) |
| | 附加 | superuser|global(W)|NS(W)|TableOwner|table(W)|CF(W)|CQ(W) |
| | appendAfterRowLock | superuser|global(W)|NS(W)|TableOwner|table(W)|CF(W)|CQ(W) |
| | 增量 | superuser|global(W)|NS(W)|TableOwner|table(W)|CF(W)|CQ(W) |
| | incrementAfterRowLock | superuser|global(W)|NS(W)|TableOwner|table(W)|CF(W)|CQ(W) |
| | scannerOpen | superuser|global(R)|NS(R)|TableOwner|table(R)|CF(R)|CQ(R) |
| | scannerNext | superuser|global(R)|NS(R)|TableOwner|table(R)|CF(R)|CQ(R) |
| | scannerClose | superuser|global(R)|NS(R)|TableOwner|table(R)|CF(R)|CQ(R) |
| | bulkLoadHFile | 超級用戶|全球(C)|表所有者|表(C)| CF(C) |
| | prepareBulkLoad | superuser|global(C)|TableOwner|table(C)|CF(C) |
| | cleanupBulkLoad | superuser|global(C)|TableOwner|table(C)|CF(C) |
| 端點 | 調用 | 超級用戶|全球(X)| NS(X)|表所有者|表(X) |
| AccessController 的 | 補助金(全球一級) | 全球(A) |
| | grant(名稱空間級別) | 全球(A)| NS(A) |
| | 授權(表級) | 全球(A)| NS(A)|表所有者|表(A)| CF(A)| CQ(A) |
| | 撤銷(全球一級) | global(A) |
| | revoke(名稱空間級別) | global(A)|NS(A) |
| | 撤銷(表級) | global(A)|NS(A)|TableOwner|table(A)|CF(A)|CQ(A) |
| | getUserPermissions(全局級別) | global(A) |
| | getUserPermissions(名稱空間級別) | global(A)|NS(A) |
| | getUserPermissions(表級) | global(A)|NS(A)|TableOwner|table(A)|CF(A)|CQ(A) |
| | hasPermission(表級) | 全球(A)| SelfUserCheck |
| RegionServer 的 | stopRegionServer | superuser|global(A) |
| | mergeRegions | superuser|global(A) |
| | rollWALWriterRequest | superuser|global(A) |
| | replicateLogEntries | 超級用戶|全球(W) |
| RSGroup | addRSGroup | superuser|global(A) |
| | balanceRSGroup | superuser|global(A) |
| | getRSGroupInfo | superuser|global(A) |
| | getRSGroupInfoOfTable | superuser|global(A) |
| | getRSGroupOfServer | superuser|global(A) |
| | listRSGroups | superuser|global(A) |
| | moveServers | superuser|global(A) |
| | moveServersAndTables | superuser|global(A) |
| | moveTables | superuser|global(A) |
| | removeRSGroup | superuser|global(A) |
> removeServers |超級用戶|全球(A)
## 附錄 D:HBase 中的壓縮和數據塊編碼
> 本節中提到的編解碼器用于編碼和解碼數據塊或行鍵。有關復制編解碼器的信息,請參見 [cluster.replication.preserving.tags](#cluster.replication.preserving.tags) 。
本節中的一些信息來自 HBase Development 郵件列表中的[討論](http://search-hadoop.com/m/lL12B1PFVhp1/v=threaded)。
HBase 支持幾種不同的壓縮算法,可以在 ColumnFamily 上啟用。數據塊編碼試圖限制密鑰中信息的重復,利用 HBase 的一些基本設計和模式,例如排序的行鍵和給定表的模式。壓縮器減少了單元中大型不透明字節數組的大小,并且可以顯著減少存儲未壓縮數據所需的存儲空間。
壓縮器和數據塊編碼可以在同一 ColumnFamily 上一起使用。
壓縮后的變化生效
如果更改 ColumnFamily 的壓縮或編碼,則更改將在壓縮期間生效。
一些編解碼器利用 Java 內置的功能,例如 GZip 壓縮。其他人依賴本地圖書館。本機庫可以作為 Hadoop 的一部分提供,例如 LZ4。在這種情況下,HBase 只需要訪問適當的共享庫。
其他編解碼器,例如 Google Snappy,需要先安裝。某些編解碼器的許可方式與 HBase 的許可證相沖突,不能作為 HBase 的一部分提供。
本節討論使用 HBase 進行測試的常用編解碼器。無論您使用何種編解碼器,請確保測試它是否已正確安裝并且可在群集中的所有節點上使用。可能需要額外的操作步驟以確保編解碼器在新部署的節點上可用。您可以使用 [compression.test](#compression.test) 實用程序檢查給定的編解碼器是否已正確安裝。
要將 HBase 配置為使用壓縮器,請參見 [compressor.install](#compressor.install) 。要為 ColumnFamily 啟用壓縮器,請參閱 [changing.compression](#changing.compression) 。要為 ColumnFamily 啟用數據塊編碼,請參見 [data.block.encoding.enable](#data.block.encoding.enable) 。
塊壓縮機
* 沒有
* 瞬間
* LZO
* LZ4
* GZ
數據塊編碼類型
字首
通常,鍵非常相似。具體來說,密鑰通常共享一個共同的前綴,并且只在末尾附近不同。例如,一個鍵可能是`RowKey:Family:Qualifier0`,下一個鍵可能是`RowKey:Family:Qualifier1`。在前綴編碼中,添加了一個額外的列,其中包含當前鍵和前一個鍵之間共享的前綴長度。假設此處的第一個密鑰與之前的密鑰完全不同,則其前綴長度為 0。
第二個密鑰的前綴長度為`23`,因為它們共有前 23 個字符。
顯然,如果密鑰往往沒有任何共同點,Prefix 將不會提供太多好處。
下圖顯示了一個沒有數據塊編碼的假設 ColumnFamily。
圖 18.沒有編碼的 ColumnFamily
這是與前綴數據編碼相同的數據。
圖 19.帶有前綴編碼的 ColumnFamily
DIFF
差異編碼擴展了前綴編碼。不是將密鑰順序地視為單個字節序列,而是分割每個密鑰字段,以便可以更有效地壓縮密鑰的每個部分。
添加了兩個新字段:時間戳和類型。
如果 ColumnFamily 與上一行相同,則從當前行中省略它。
如果密鑰長度,值長度或類型與前一行相同,則省略該字段。
此外,為了增加壓縮,時間戳存儲為前一行時間戳的 Diff,而不是完整存儲。給定前綴示例中的兩個行鍵,并給出時間戳和相同類型的精確匹配,第二行的值長度或類型都不需要存儲,第二行的時間戳值只有 0,而不是一個完整的時間戳。
默認情況下禁用 Diff 編碼,因為寫入和掃描速度較慢但緩存了更多數據。
此圖像顯示與之前圖像相同的 ColumnFamily,具有 Diff 編碼。
圖 20.帶有 Diff 編碼的 ColumnFamily
快速差異
Fast Diff 與 Diff 類似,但使用更快的實現。它還添加了另一個字段,用于存儲單個位以跟蹤數據本身是否與前一行相同。如果是,則不再存儲數據。
如果您有長鍵或多列,建議使用快速差異。
數據格式幾乎與 Diff 編碼相同,因此沒有圖像來說明它。
前綴樹
在 HBase 0.96 中引入了前綴樹編碼作為實驗特征。它為 Prefix,Diff 和 Fast Diff 編碼器提供了類似的內存節省,但以較慢的編碼速度為代價提供了更快的隨機訪問。它已在 hbase-2.0.0 中刪除。這是一個好主意,但很少采用。如果有興趣重振這項工作,請編寫 hbase 開發列表。
### D.1。使用哪種壓縮器或數據塊編碼器
要使用的壓縮或編解碼器類型取決于數據的特征。選擇錯誤的類型可能會導致數據占用更多空間而不是更少,并且可能會影響性能。
通常,您需要在較小尺寸和較快壓縮/解壓縮之間權衡您的選擇。以下是一些一般性指南,從[關于壓縮和編解碼器的文檔指南](http://search-hadoop.com/m/lL12B1PFVhp1)的討論中進行了擴展。
* 如果您有長鍵(與值相比)或許多列,請使用前綴編碼器。建議使用 FAST_DIFF。
* 如果值很大(而不是預壓縮,例如圖像),請使用數據塊壓縮器。
* 將 GZIP 用于 _ 冷數據 _,不經常訪問。 GZIP 壓縮比 Snappy 或 LZO 使用更多的 CPU 資源,但提供更高的壓縮比。
* 對于經常訪問的 _ 熱數據 _ 使用 Snappy 或 LZO。 Snappy 和 LZO 比 GZIP 使用更少的 CPU 資源,但不提供高壓縮比。
* 在大多數情況下,默認情況下啟用 Snappy 或 LZO 是一個不錯的選擇,因為它們具有較低的性能開銷并節省空間。
* 在 2011 年 Snappy 成為谷歌之前,LZO 是默認的。 Snappy 具有與 LZO 相似的品質,但已被證明表現更好。
### D.2。在 HBase 中使用 Hadoop 本機庫
Hadoop 共享庫有許多功能,包括壓縮庫和快速 crc'ing - 硬件 crc'ing,如果您的芯片組支持它。要使此工具可用于 HBase,請執行以下操作。如果找不到本機庫版本,HBase / Hadoop 將回退使用替代品 - 或者如果你要求顯式壓縮器并且沒有替代可用,則徹底失敗。
首先確保你的 Hadoop。如果您看到它啟動 Hadoop 進程,請修復此消息:
```
16/02/09 22:40:24 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
```
這意味著沒有正確指向其本機庫,或者本地庫是為另一個平臺編譯的。先解決這個問題。
然后,如果您在 HBase 日志中看到以下內容,則表示 HBase 無法找到 Hadoop 本機庫:
```
2014-08-07 09:26:20,139 WARN [main] util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
```
如果庫已成功加載,則不會顯示 WARN 消息。通常這意味著你很高興去閱讀。
讓我們假設您的 Hadoop 附帶了一個適合您正在運行 HBase 的平臺的本機庫。要檢查 Hadoop 本機庫是否可用于 HBase,請運行以下工具(可在 Hadoop 2.1 及更高版本中使用):
```
$ ./bin/hbase --config ~/conf_hbase org.apache.hadoop.util.NativeLibraryChecker
2014-08-26 13:15:38,717 WARN [main] util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Native library checking:
hadoop: false
zlib: false
snappy: false
lz4: false
bzip2: false
2014-08-26 13:15:38,863 INFO [main] util.ExitUtil: Exiting with status 1
```
上圖顯示本地 hadoop 庫在 HBase 上下文中不可用。
上面的 NativeLibraryChecker 工具可能會回來說所有的文件都是 hunky-dory - 即所有的庫都顯示'true',它們是可用的 - 但是無論如何都要按照下面的說明來確保本機庫在 HBase 上下文中可用,當它們使用它們時。
要解決上述問題,如果 Hadoop 和 HBase 停頓在文件系統中相鄰,則將 Hadoop 本機庫本地或符號鏈接復制到它們。您還可以通過在 hbase-env.sh 中設置`LD_LIBRARY_PATH`環境變量來指向其位置。
JVM 尋找本機庫的位置是“系統相關的”(參見`java.lang.System#loadLibrary(name)`)。在 linux 上,默認情況下,將查看 _lib / native / PLATFORM_ ,其中`PLATFORM`是安裝 HBase 的平臺的標簽。在本地 linux 機器上,它似乎是 java 屬性`os.name`和`os.arch`的串聯,后跟是 32 位還是 64 位。啟動時 HBase 打印出所有 java 系統屬性,因此在日志中找到 os.name 和 os.arch。例如:
```
...
2014-08-06 15:27:22,853 INFO [main] zookeeper.ZooKeeper: Client environment:os.name=Linux
2014-08-06 15:27:22,853 INFO [main] zookeeper.ZooKeeper: Client environment:os.arch=amd64
...
```
所以在這種情況下,PLATFORM 字符串是`Linux-amd64-64`。在 _lib / native / Linux-amd64-64_ 復制 Hadoop 本機庫或符號鏈接將確保找到它們。完成此更改后滾動重新啟動。
以下是如何設置符號鏈接的示例。讓 hadoop 和 hbase 安裝在您的主目錄中。假設您的 hadoop 本機庫位于?/ hadoop / lib / native。假設您使用的是 Linux-amd64-64 平臺。在這種情況下,您將執行以下操作來鏈接 hadoop 本機庫,以便 hbase 可以找到它們。
```
...
$ mkdir -p ~/hbaseLinux-amd64-64 -> /home/stack/hadoop/lib/native/lib/native/
$ cd ~/hbase/lib/native/
$ ln -s ~/hadoop/lib/native Linux-amd64-64
$ ls -la
# Linux-amd64-64 -> /home/USER/hadoop/lib/native
...
```
如果您在堆棧軌道中看到 PureJavaCrc32C,或者如果在 perf 跟蹤中看到類似下面的內容,則本機不起作用;您使用的是 java CRC 函數而不是 native 函數:
```
5.02% perf-53601.map [.] Lorg/apache/hadoop/util/PureJavaCrc32C;.update
```
請參閱 [HBASE-11927 使用 Native Hadoop Library 進行 HFile 校驗和(并將默認值從 CRC32 轉換為 CRC32C)](https://issues.apache.org/jira/browse/HBASE-11927),有關本機校驗和支持的更多信息。請特別參閱發行說明,了解如何檢查硬件是否支持處理器是否支持硬件 CRC。或者查看 HBase 博客文章中的 Apache [Checksums。](https://blogs.apache.org/hbase/entry/saving_cpu_using_native_hadoop)
以下是如何使用`LD_LIBRARY_PATH`環境變量指向 Hadoop 庫的示例:
```
$ LD_LIBRARY_PATH=~/hadoop-2.5.0-SNAPSHOT/lib/native ./bin/hbase --config ~/conf_hbase org.apache.hadoop.util.NativeLibraryChecker
2014-08-26 13:42:49,332 INFO [main] bzip2.Bzip2Factory: Successfully loaded & initialized native-bzip2 library system-native
2014-08-26 13:42:49,337 INFO [main] zlib.ZlibFactory: Successfully loaded & initialized native-zlib library
Native library checking:
hadoop: true /home/stack/hadoop-2.5.0-SNAPSHOT/lib/native/libhadoop.so.1.0.0
zlib: true /lib64/libz.so.1
snappy: true /usr/lib64/libsnappy.so.1
lz4: true revision:99
bzip2: true /lib64/libbz2.so.1
```
在啟動 HBase 時在 _hbase-env.sh_ 中設置 LD_LIBRARY_PATH 環境變量。
### D.3。壓縮器配置,安裝和使用
#### D.3.1。為壓縮器配置 HBase
在 HBase 可以使用給定的壓縮器之前,它的庫需要可用。由于許可問題,默認安裝中只有 Gase 壓縮可用于 HBase(通過本機 Java 庫)。其他壓縮庫可通過與 hadoop 捆綁在一起的共享庫提供。當 HBase 啟動時,需要找到 hadoop 本機庫。看到
主機上的壓縮器支持
在 HBase 0.95 中引入了新的配置設置,以檢查主服務器以確定在其上安裝和配置了哪些數據塊編碼器,并假設整個群集配置相同。此選項`hbase.master.check.compression`默認為`true`。這可以防止 [HBASE-6370](https://issues.apache.org/jira/browse/HBASE-6370) 中描述的情況,其中創建或修改表以支持區域服務器不支持的編解碼器,從而導致需要很長時間才能發生的故障并且難以調試。
如果啟用了`hbase.master.check.compression`,則需要在主服務器上安裝和配置所有所需壓縮程序的庫,即使主服務器未運行區域服務器也是如此。
通過本機庫安裝 GZ 支持
HBase 使用 Java 的內置 GZip 支持,除非 CLASSPATH 上有本機 Hadoop 庫。將庫添加到 CLASSPATH 的推薦方法是為運行 HBase 的用戶設置環境變量`HBASE_LIBRARY_PATH`。如果本機庫不可用且使用 Java 的 GZIP,則`Got brand-new compressor`報告將出現在日志中。見 [brand.new.compressor](#brand.new.compressor) )。
安裝 LZO 支持
由于 HBase 使用 Apache 軟件許可證(ASL)和使用 GPL 許可證的 LZO 之間不兼容,因此 HBase 無法附帶 LZO。有關配置 HBase 的 LZO 支持的信息,請參閱 Twitter 上的 [Hadoop-LZO。](https://github.com/twitter/hadoop-lzo/blob/master/README.md)
如果您依賴于 LZO 壓縮,請考慮在 LZO 不可用時將 RegionServers 配置為無法啟動。參見 [hbase.regionserver.codecs](#hbase.regionserver.codecs) 。
配置 LZ4 支持
LZ4 支持與 Hadoop 捆綁在一起。啟動 HBase 時,確保可以訪問 hadoop 共享庫(libhadoop.so)。配置完平臺后(參見 [hadoop.native.lib](#hadoop.native.lib) ),您可以建立從 HBase 到本機 Hadoop 庫的符號鏈接。這假定兩個軟件安裝是共同的。例如,如果我的'平臺'是 Linux-amd64-64:
```
$ cd $HBASE_HOME
$ mkdir lib/native
$ ln -s $HADOOP_HOME/lib/native lib/native/Linux-amd64-64
```
使用壓縮工具檢查所有節點上是否安裝了 LZ4。啟動(或重啟)HBase。之后,您可以創建和更改表以使 LZ4 成為壓縮編解碼器:
```
hbase(main):003:0> alter 'TestTable', {NAME => 'info', COMPRESSION => 'LZ4'}
```
安裝 Snappy 支持
由于許可問題,HBase 不附帶 Snappy 支持。您可以安裝 Snappy 二進制文件(例如,在 CentOS 上使用 yum install snappy)或從源代碼構建 Snappy。安裝 Snappy 后,搜索共享庫,它將被稱為 _libsnappy.so.X_ ,其中 X 是一個數字。如果您是從源構建的,請將共享庫復制到系統上的已知位置,例如 _/ opt / snappy / lib /_ 。
除了 Snappy 庫之外,HBase 還需要訪問 Hadoop 共享庫,它將被稱為 _libhadoop.so.X.Y_ ,其中 X 和 Y 都是數字。記下 Hadoop 庫的位置,或將其復制到與 Snappy 庫相同的位置。
| |
需要在群集的每個節點上提供 Snappy 和 Hadoop 庫。請參閱 [compression.test](#compression.test) 以了解如何測試這種情況。
如果給定的壓縮器不可用,請參見 [hbase.regionserver.codecs](#hbase.regionserver.codecs) 以配置 RegionServers 無法啟動。
|
需要將每個庫位置添加到運行 HBase 的操作系統用戶的環境變量`HBASE_LIBRARY_PATH`中。您需要重新啟動 RegionServer 才能使更改生效。
壓縮測試
您可以使用 CompressionTest 工具驗證您的壓縮器是否可用于 HBase:
```
$ hbase org.apache.hadoop.hbase.util.CompressionTest hdfs://host/path/to/hbase snappy
```
在 RegionServer 上強制執行壓縮設置
您可以通過將選項 hbase.regionserver.codecs 添加到 _hbase-site.xml_ 并將其值設置為逗號分隔來配置 RegionServer,以便在壓縮配置不正確時無法重新啟動需要可用的編解碼器列表。例如,如果將此屬性設置為`lzo,gz`,則如果兩個壓縮程序都不可用,則 RegionServer 將無法啟動。這樣可以防止在沒有正確配置編解碼器的情況下將新服務器添加到群集中。
#### D.3.2。在 ColumnFamily 上啟用壓縮
要為 ColumnFamily 啟用壓縮,請使用`alter`命令。您無需重新創建表或復制數據。如果要更改編解碼器,請確保舊的編解碼器仍然可用,直到所有舊的 StoreFiles 都已壓縮為止。
使用 HBase Shell 在現有表的列族上啟用壓縮
```
hbase> disable 'test'
hbase> alter 'test', {NAME => 'cf', COMPRESSION => 'GZ'}
hbase> enable 'test'
```
在 ColumnFamily 上使用壓縮創建新表
```
hbase> create 'test2', { NAME => 'cf2', COMPRESSION => 'SNAPPY' }
```
驗證 ColumnFamily 的壓縮設置
```
hbase> describe 'test'
DESCRIPTION ENABLED
'test', {NAME => 'cf', DATA_BLOCK_ENCODING => 'NONE false
', BLOOMFILTER => 'ROW', REPLICATION_SCOPE => '0',
VERSIONS => '1', COMPRESSION => 'GZ', MIN_VERSIONS
=> '0', TTL => 'FOREVER', KEEP_DELETED_CELLS => 'fa
lse', BLOCKSIZE => '65536', IN_MEMORY => 'false', B
LOCKCACHE => 'true'}
1 row(s) in 0.1070 seconds
```
#### D.3.3。測試壓縮性能
HBase 包含一個名為 LoadTestTool 的工具,它提供了測試壓縮性能的機制。必須指定`-write`或`-update-read`作為第一個參數,如果未指定其他參數,則為每個選項打印使用建議。
LoadTestTool 用法
```
$ bin/hbase org.apache.hadoop.hbase.util.LoadTestTool -h
usage: bin/hbase org.apache.hadoop.hbase.util.LoadTestTool <options>
Options:
-batchupdate Whether to use batch as opposed to separate
updates for every column in a row
-bloom <arg> Bloom filter type, one of [NONE, ROW, ROWCOL]
-compression <arg> Compression type, one of [LZO, GZ, NONE, SNAPPY,
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, 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
args for this class can be passed as colon
separated after class name
-h,--help Show usage
-in_memory Tries to keep the HFiles of the CF inmemory as far
as possible. Not guaranteed that reads are always
served from inmemory
-init_only Initialize the test table only, don't do any
loading
-key_window <arg> The 'key window' to maintain between reads and
writes for concurrent write/read workload. The
default is 0.
-max_read_errors <arg> The maximum number of read errors to tolerate
before terminating all reader threads. The default
is 10.
-multiput Whether to use multi-puts as opposed to separate
puts for every column in a row
-num_keys <arg> The number of keys to read/write
-num_tables <arg> A positive integer number. When a number n is
speicfied, load test tool will load n table
parallely. -tn parameter value becomes table name
prefix. Each table name is in format
<tn>_1...<tn>_n
-read <arg> <verify_percent>[:<#threads=20>]
-regions_per_server <arg> A positive integer number. When a number n is
specified, load test tool will create the test
table with n regions per server
-skip_init Skip the initialization; assume test table already
exists
-start_key <arg> The first key to read/write (a 0-based index). The
default value is 0.
-tn <arg> The name of the table to read or write
-update <arg> <update_percent>[:<#threads=20>][:<#whether to
ignore nonce collisions=0>]
-write <arg> <avg_cols_per_key>:<avg_data_size>[:<#threads=20>]
-zk <arg> ZK quorum as comma-separated host names without
port numbers
-zk_root <arg> name of parent znode in zookeeper
```
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
```
### D.4。啟用數據塊編碼
編解碼器內置于 HBase 中,因此無需額外配置。通過設置`DATA_BLOCK_ENCODING`屬性在表上啟用編解碼器。在更改其 DATA_BLOCK_ENCODING 設置之前禁用該表。以下是使用 HBase Shell 的示例:
在表上啟用數據塊編碼
```
hbase> disable 'test'
hbase> alter 'test', { NAME => 'cf', DATA_BLOCK_ENCODING => 'FAST_DIFF' }
Updating all regions with the new schema...
0/1 regions updated.
1/1 regions updated.
Done.
0 row(s) in 2.2820 seconds
hbase> enable 'test'
0 row(s) in 0.1580 seconds
```
驗證 ColumnFamily 的數據塊編碼
```
hbase> describe 'test'
DESCRIPTION ENABLED
'test', {NAME => 'cf', DATA_BLOCK_ENCODING => 'FAST true
_DIFF', BLOOMFILTER => 'ROW', REPLICATION_SCOPE =>
'0', VERSIONS => '1', COMPRESSION => 'GZ', MIN_VERS
IONS => '0', TTL => 'FOREVER', KEEP_DELETED_CELLS =
> 'false', BLOCKSIZE => '65536', IN_MEMORY => 'fals
e', BLOCKCACHE => 'true'}
1 row(s) in 0.0650 seconds
```
## 附錄 E:SQL over HBase
以下項目為 SQL over HBase 提供了一些支持。
### E.1。 Apache Phoenix
[Apache Phoenix](https://phoenix.apache.org)
### E.2。 Trafodion
[Trafodion:事務性 SQL-on-HBase](https://trafodion.incubator.apache.org/)
## 附錄 F:YCSB
[YCSB:雅虎!云服務基準測試](https://github.com/brianfrankcooper/YCSB/)和 HBase
TODO:描述 YCSB 如何通過提供合適的集群負載而變窮。
TODO:描述 YCSB for HBase 的設置。特別是,在開始運行之前預先對你的表進行預分解。請參閱 [HBASE-4163 為 YCSB 基準創建拆分策略](https://issues.apache.org/jira/browse/HBASE-4163)了解為什么以及如何執行此操作的一些 shell 命令。
Ted Dunning 重新編寫了 YCSB,因此它已經進行了專業化,并添加了用于驗證工作負載的工具。見 [Ted Dunning 的 YCSB](https://github.com/tdunning/YCSB) 。
## 附錄 G:HFile 格式
本附錄描述了 HFile 格式的演變。
### G.1。 HBase 文件格式(版本 1)
由于我們將討論對 HFile 格式的更改,因此簡要概述原始(HFile 版本 1)格式。
#### G.1.1。版本 1 概述
版本 1 格式的 HFile 結構如下:
圖 21\. HFile V1 格式
#### G.1.2。版本 1 中的塊索引格式
版本 1 中的塊索引非常簡單。對于每個條目,它包含:
1. 偏移(長)
2. 未壓縮的大小(int)
3. 鍵(使用 Bytes.writeByteArray 編寫的序列化字節數組)
1. 密鑰長度為可變長度整數(VInt)
2. 關鍵字節
塊索引中的條目數存儲在固定文件尾部中,并且必須傳遞給讀取塊索引的方法。版本 1 中塊索引的一個限制是它不提供塊的壓縮大小,這對于解壓縮來說是必要的。因此,HFile 讀取器必須從塊之間的偏移差異推斷出該壓縮大小。我們在版本 2 中修復了這個限制,我們存儲了磁盤塊大小而不是未壓縮的大小,并從塊頭獲得未壓縮的大小。
### G.2。帶內聯塊的 HBase 文件格式(版本 2)
注意:此功能是在 HBase 0.92 中引入的
#### G.2.1。動機
我們發現有必要在遇到高內存使用率和由區域服務器中的大 Bloom 過濾器和塊索引引起的慢啟動時間后修改 HFile 格式。 Bloom 過濾器每個 HFile 可以達到 100 MB,在 20 個區域聚合時可以增加 2 GB。在同一組區域中,塊索引的總大小可以增加到 6 GB。在加載所有塊索引數據之前,不會將區域視為已打開。 Large Bloom 過濾器會產生不同的性能問題:第一個需要 Bloom 過濾器查找的 get 請求將導致加載整個 Bloom 過濾器位陣列的延遲。
為了加速區域服務器啟動,我們打破 Bloom 過濾器并將索引阻塞到多個塊中,并在它們填滿時寫出這些塊,這也減少了 HFile writer 的內存占用。在 Bloom 過濾器的情況下,“填充塊”意味著累積足夠的密鑰以有效地利用固定大小的位陣列,并且在塊索引的情況下,我們累積所需大小的“索引塊”。布隆過濾器塊和索引塊(我們稱之為“內聯塊”)散布在數據塊中,作為副作用,我們不再依賴塊偏移之間的差異來確定數據塊長度,就像在版本 1 中完成的那樣。
HFile 是一種低級文件格式,它不應該處理特定于應用程序的細節,例如在 StoreFile 級別處理的 Bloom 過濾器。因此,我們在 HFile“內聯”塊中調用 Bloom 過濾器塊。我們還為 HFile 提供了一個用于編寫這些內聯塊的接口。
旨在減少區域服務器啟動時間的另一種格式修改是使用連續的“加載打開”部分,該部分必須在打開 HFile 時加載到存儲器中。目前,當 HFile 打開時,會有單獨的搜索操作來讀取預告片,數據/元索引和文件信息。要讀取布隆過濾器,對其“數據”和“元”部分還有兩個搜索操作。在版本 2 中,我們尋求一次閱讀預告片并再次尋找從連續塊中打開文件所需的其他內容。
#### G.2.2。版本 2 概述
引入上述功能的 HBase 版本同時讀取版本 1 和 2 HFiles,但僅寫入版本 2 HFiles。版本 2 HFile 的結構如下:
圖 22\. HFile 版本 2 結構
#### G.2.3。統一版本 2 塊格式
在版本 2 中,數據部分中的每個塊都包含以下字段:
1. 8 字節:塊類型,相當于版本 1 的“魔術記錄”的字節序列。支持的塊類型是:
1. 數據 - 數據塊
2. LEAF_INDEX - 多級塊索引中的葉級索引塊
3. BLOOM_CHUNK - Bloom 過濾器塊
4. META - 元塊(不再用于版本 2 中的 Bloom 過濾器)
5. INTERMEDIATE_INDEX - 多級塊索引中的中間級索引塊
6. ROOT_INDEX - 多級塊索引中的根級索引塊
7. FILE_INFO - “文件信息”塊,元數據的小鍵值映射
8. BLOOM_META - 加載時打開部分中??的 Bloom 過濾器元數據塊
9. TRAILER - 固定大小的文件預告片。與上述相反,這不是 HFile v2 塊,而是固定大小(對于每個 HFile 版本)數據結構
10. INDEX_V1 - 此塊類型僅用于傳統的 HFile v1 塊
2. 塊數據的壓縮大小,不包括頭(int)。
掃描 HFile 數據時可用于跳過當前數據塊。
3. 塊的數據未壓縮大小,不包括頭(int)
如果壓縮算法為 NONE,則等于壓縮大小
4. 相同類型的前一個塊的文件偏移量(長)
可用于尋找以前的數據/索引塊
5. 壓縮數據(如果壓縮算法為 NONE,則為未壓縮數據)。
以上格式的塊用于以下 HFile 部分:
掃描塊部分
該部分之所以如此命名是因為它包含了順序掃描 HFile 時需要讀取的所有數據塊。還包含 Leaf 索引塊和 Bloom 塊塊。
非掃描塊部分
此部分仍包含統一格式的 v2 塊,但在執行順序掃描時不必讀取它。本節包含“元”塊和中級索引塊。
我們在版本 2 中支持“meta”塊的方式與版本 1 中支持的方式相同,即使我們不再將 Bloom 過濾器數據存儲在這些塊中。
#### G.2.4。阻止版本 2 中的索引
HFile 版本 2 中有三種類型的塊索引,以兩種不同的格式(root 和 non-root)存儲:
1. 數據索引 - 版本 2 多級塊索引,包括:
1. 版本 2 根索引,存儲在文件的數據塊索引部分
2. (可選)版本 2 中間級別,以非根格式存儲在文件的數據索引部分中。如果存在葉級塊,則只能存在中間級別
3. (可選)版本 2 葉級別,以非根格式存儲,與數據塊內聯
2. 元索引 - 僅版本 2 根索引格式,存儲在文件的元索引部分中
3. Bloom 索引 - 僅版本 2 根索引格式,作為 Bloom 過濾器元數據的一部分存儲在''load-on-open'部分中。
#### G.2.5。版本 2 中的根塊索引格式
此格式適用于:
1. 版本 2 數據索引的根級別
2. 版本 2 中的整個 meta 和 Bloom 索引始終是單級的。
版本 2 根索引塊是以下格式的條目序列,類似于版本 1 塊索引的條目,但存儲磁盤大小而不是未壓縮大小。
1. Offset (long)
該偏移可以指向數據塊或更深層索引塊。
2. 磁盤大小(int)
3. 鍵(使用 Bytes.writeByteArray 存儲的序列化字節數組)
4. 鑰匙(VInt)
5. Key bytes
單級版本 2 塊索引僅包含單個根索引塊。要讀取版本 2 的根索引塊,需要知道條目數。對于數據索引和元索引,條目數存儲在預告片中,對于 Bloom 索引,它存儲在復合布隆過濾器元數據中。
對于多級塊索引,除了上面描述的數據結構之外,我們還將以下字段存儲在 HFile 的 load-on-open 部分的根索引塊中:
1. 中葉索引塊偏移
2. 中間葉塊磁盤大小(表示包含對文件“中間”數據塊的引用的葉索引塊)
3. 中間葉級塊中的中間鍵(在下面定義)的索引。
這些附加字段用于有效地檢索 HFile 分裂中使用的 HFile 的中間密鑰,我們將其定義為具有零基索引(n-1)/ 2 的塊的第一個密鑰,如果總數為 HFile 中的塊是 n。此定義與 HFile 版本 1 中確定中間密鑰的方式一致,并且通常是合理的,因為塊的平均大小可能相同,但我們沒有對單個鍵/值對大小的任何估計。
在編寫版本 2 HFile 時,每個葉級索引塊指向的數據塊總數將被跟蹤。當我們完成寫入并確定葉級塊的總數時,很清楚哪個葉級塊包含中鍵,并且計算上面列出的字段。當讀取 HFile 并請求中鍵時,我們檢索中間葉索引塊(可能來自塊緩存)并從該葉塊內的適當位置獲取中鍵值。
#### G.2.6。版本 2 中的非 root 塊索引格式
此格式適用于版本 2 多級數據塊索引的中間級別和葉索引塊。每個非根索引塊的結構如下。
1. numEntries:條目數(int)。
2. entryOffsets:塊中條目偏移的“二級索引”,便于快速二進制搜索鍵(`numEntries + 1` int 值)。最后一個值是此索引塊中所有條目的總長度。例如,在條目大小為 60,80,50 的非根索引塊中,“二級索引”將包含以下 int 數組:`{0, 60, 140, 190}`。
3. 參賽作品。每個條目包含:
1. 文件中此條目引用的塊的偏移量(長整數)
2. 引用塊的磁盤大小(int)
3. 鍵。長度可以從 entryOffsets 計算。
#### G.2.7。版本 2 中的 Bloom 過濾器
與版本 1 相比,在版本 2 中,HFile Bloom 過濾器元數據存儲在 HFile 的 open-on-open 部分中,以便快速啟動。
1. 復合布隆過濾器。
2. Bloom 過濾器版本= 3(int)。曾經有一個 DynamicByteBloomFilter 類,其 Bloom 過濾器版本號為 2
3. 所有復合 Bloom 過濾器塊的總字節大小(長)
4. 散列函數數(int)
5. 哈希函數的類型(int)
6. 插入 Bloom 過濾器的總密鑰數(長)
7. 布隆過濾器中的最大鍵數(長)
8. 塊數(int)
9. 用于 Bloom 過濾器鍵的比較器類,使用 Bytes.writeByteArray 存儲的 UTF&gt; 8 編碼字符串
10. 版本 2 根塊索引格式中的 Bloom 塊索引
#### G.2.8。版本 1 和 2 中的文件信息格式
文件信息塊是從字節數組到字節數組的序列化映射,包括以下鍵。 StoreFile 級邏輯為此添加了更多密鑰。
| hfile.LASTKEY |文件的最后一個鍵(字節數組)| | hfile.AVG_KEY_LEN |文件中的平均密鑰長度(int)| | hfile.AVG_VALUE_LEN |文件(int)|中的平均值長度
在版本 2 中,我們沒有更改文件格式,但是我們將文件信息移動到文件的最后一部分,可以在打開 HFile 時將其作為一個塊加載。
此外,我們不再將比較器存儲在版本 2 文件信息中。相反,我們將其存儲在固定文件預告片中。這是因為我們需要在解析 HFile 的 open-on-open 部分時知道比較器。
#### G.2.9。修復了版本 1 和版本 2 之間的文件尾部格式差異
下表顯示了版本 1 和版本 2 中固定文件預告片之間的常見字段和不同字段。請注意,預告片的大小因版本而異,因此僅在一個版本中“固定”。但是,版本始終存儲為文件中的最后四個字節整數。
| 版本 1 | 版本 2 |
| --- | --- |
| | 文件信息偏移(長) |
| 數據索引偏移量(長) | loadOnOpenOffset(long)/打開文件時需要加載的部分的偏移量./ |
| | 數據索引條目數(int) |
| metaIndexOffset(long)/版本 1 讀者不使用此字段,因此我們將其從版本 2 中刪除。 | uncompressedDataIndexSize(long)/整個數據塊索引的未壓縮總大小,包括根級別,中級別和葉級別塊./ |
| | 元索引條目數(int) |
| | 未壓縮字節總數(長) |
| numEntries(int) | numEntries(長) |
| 壓縮編解碼器:0 = LZO,1 = GZ,2 = NONE(int) | Compression codec: 0 = LZO, 1 = GZ, 2 = NONE (int) |
| | 數據塊索引中的級別數(int) |
| | firstDataBlockOffset(long)/第一個數據塊的偏移量。掃描時使用./ |
| | lastDataBlockEnd(long)/最后一個鍵/值數據塊之后的第一個字節的偏移量。掃描時我們不需要超出此偏移量./ |
| 版本:1(int) | 版本:2(int) |
#### G.2.10。 getShortMidpointKey(數據索引塊的優化)
注意:此優化是在 HBase 0.95+中引入的
HFiles 包含許多包含一系列已排序單元格的塊。每個單元都有一個鍵。為了在讀取 Cells 時保存 IO,HFile 還有一個索引,它將 Cell 的開始鍵映射到特定塊開頭的偏移量。在此優化之前,HBase 將使用每個數據塊中第一個單元的鍵作為索引鍵。
在 HBASE-7845 中,我們生成一個新的鍵,其按字典順序大于前一個塊的最后一個鍵,并按字典順序等于或小于當前塊的起始鍵。雖然實際的密鑰可能很長,但這個“假密鑰”或“虛擬密鑰”可以短得多。例如,如果前一個塊的停止鍵是“快速棕色狐貍”,則當前塊的開始鍵是“誰”,我們可以在我們的 hfile 索引中使用“r”作為我們的虛擬鍵。
這有兩個好處:
* 擁有較短的密鑰會減少 hfile 索引的大小,(允許我們在內存中保留更多的索引),以及
* 當目標密鑰位于“虛擬密鑰”和目標塊中第一個元素的密鑰之間時,使用更靠近前一個塊的結束鍵的東西允許我們避免可能的額外 IO。
此優化(由 getShortMidpointKey 方法實現)的靈感來自 LevelDB 的 ByteWiseComparatorImpl :: FindShortestSeparator()和 FindShortSuccessor()。
### G.3。具有安全增強功能的 HBase 文件格式(版本 3)
注意:此功能是在 HBase 0.98 中引入的
#### G.3.1。動機
HFile 的第 3 版進行了更改,以簡化靜態加密和單元級元數據的加密管理(這又是單元級 ACL 和單元級可見性標簽所必需的)。有關更多信息,請參閱 [hbase.encryption.server](#hbase.encryption.server) , [hbase.tags](#hbase.tags) , [hbase.accesscontrol.configuration](#hbase.accesscontrol.configuration) 和 [hbase.visibility.labels](#hbase.visibility.labels) 。
#### G.3.2。概觀
引入上述功能的 HBase 版本在版本 1,2 和 3 中讀取 HFile,但僅寫入版本 3 HFile。版本 3 HFile 的結構與版本 2 HFile 相同。有關更多信息,請參閱 [hfilev2.overview](#hfilev2.overview) 。
#### G.3.3。版本 3 中的文件信息塊
版本 3 將另外兩條信息添加到文件信息塊中的保留鍵。
| hfile.MAX_TAGS_LEN |存儲此 hfile(int)中任何單個單元格的序列化標記所需的最大字節數| hfile.TAGS_COMPRESSED |該 hfile 的塊編碼器是否壓縮標簽? (布爾)。僅當 hfile.MAX_TAGS_LEN 也存在時才應存在。 |
在讀取版本 3 HFile 時,`MAX_TAGS_LEN`的存在用于確定如何對數據塊內的單元進行反序列化。因此,消費者必須在讀取任何數據塊之前讀取文件的信息塊。
在編寫版本 3 HFile 時,HBase 在將 memstore 刷新到底層文件系統時將始終包含[??COD0]。
壓縮現有文件時,如果所選的所有文件本身不包含任何帶標記的單元格,則默認編寫器將省略`MAX_TAGS_LEN`。
有關壓縮文件選擇算法的詳細信息,請參見[壓縮](#compaction)。
#### G.3.4。版本 3 中的數據塊
內的 HFILE,HBase 的細胞被存儲在數據塊作為鍵值來的序列(見 [hfilev1.overview](#hfilev1.overview) 或[拉斯喬治的很好的介紹 HBase 的寄存](http://www.larsgeorge.com/2009/10/hbase-architecture-101-storage.html))。在版本 3 中,這些 KeyValue 可選地包含一組 0 個或更多標記:
| 版本 1&amp; 2,版本 3 沒有 MAX_TAGS_LEN | 版本 3,MAX_TAGS_LEN |
| --- | --- |
| 密鑰長度(4 個字節) |
| 值長度(4 個字節) |
| 關鍵字節(變量) |
| 值字節(變量) |
| | 標簽長度(2 個字節) |
| | 標簽字節(變量) |
如果給定 HFile 的 info 塊包含`MAX_TAGS_LEN`的條目,則每個單元格將包含該單元格標簽的長度,即使該長度為零。實際標簽存儲為標簽長度(2 個字節),標簽類型(1 個字節),標簽字節(變量)的序列。單個標記的字節格式取決于標記類型。
請注意,對 info 塊內容的依賴意味著在讀取任何數據塊之前,必須首先處理文件的 info 塊。它還意味著在寫入數據塊之前,您必須知道文件的信息塊是否包含`MAX_TAGS_LEN`。
#### G.3.5。修復了版本 3 中的文件預告片
使用 HFile 版本 3 編寫的固定文件預告片始終使用協議緩沖區進行序列化。此外,它還為名為 encryption_key 的版本 2 協議緩沖區添加了一個可選字段。如果 HBase 配置為加密 HFile,則此字段將存儲此特定 HFile 的數據加密密鑰,使用 AES 使用當前群集主密鑰加密。有關更多信息,請參閱 [hbase.encryption.server](#hbase.encryption.server) 。
## 附錄 H:關于 HBase 的其他信息
### H.1。 HBase 視頻
HBase 簡介
* [Todd Lipcon 介紹 HBase](https://vimeo.com/23400732) (2011 年芝加哥數據峰會)。
* [使用 HBase](https://vimeo.com/26804675) 在 Facebook 上建立實時服務作者:Jonathan Gray(柏林流行語 2011)
* [Jean-Daniel Cryans 的 HBase](http://www.cloudera.com/videos/hw10_video_how_stumbleupon_built_and_advertising_platform_using_hbase_and_hadoop) 的多重用途(柏林流行語 2011)。
### H.2。 HBase 演示文稿(幻燈片)
[高級 HBase 架構設計](https://www.slideshare.net/cloudera/hadoop-world-2011-advanced-hbase-schema-design-lars-george-cloudera)作者:Lars George(Hadoop World 2011)。
[Todd Lipcon 介紹 HBase](http://www.slideshare.net/cloudera/chicago-data-summit-apache-hbase-an-introduction) (2011 年芝加哥數據峰會)。
[通過 Ryan Rawson,Jonathan Gray(Hadoop World 2009)從 HBase 安裝](http://www.slideshare.net/cloudera/hw09-practical-h-base-getting-the-most-from-your-h-base-install)中獲得最大收益。
### H.3。 HBase 論文
[BigTable](http://research.google.com/archive/bigtable.html) 由谷歌(2006)。
[HBase 和 HDFS Locality](http://www.larsgeorge.com/2010/05/hbase-file-locality-in-hdfs.html) 作者:Lars George(2010)。
[無關系:非關系型數據庫的混合祝福](http://ianvarley.com/UT/MR/Varley_MastersReport_Full_2009-08-07.pdf),Ian Varley(2009)。
### H.4。 HBase 網站
[Cloudera 的 HBase 博客](https://blog.cloudera.com/blog/category/hbase/)有很多鏈接到有用的 HBase 信息。
[CAP Confusion](https://blog.cloudera.com/blog/2010/04/cap-confusion-problems-with-partition-tolerance/) 是分布式存儲系統背景信息的相關條目。
來自 DZone 的 [HBase RefCard](http://refcardz.dzone.com/refcardz/hbase) 。
### H.5。 HBase 書籍
[HBase:Lars George 的權威指南](http://shop.oreilly.com/product/0636920014348.do)。
### H.6。 Hadoop 書籍
[Hadoop:Tom White 的權威指南](http://shop.oreilly.com/product/9780596521981.do)。
## 附錄 I:HBase 歷史
* 2006 年: [BigTable](http://research.google.com/archive/bigtable.html) 論文由 Google 發布。
* 2006 年(年底):HBase 開發。
* 2008 年:HBase 成為 Hadoop 子項目。
* 2010 年:HBase 成為 Apache 頂級項目。
## 附錄 J:HBase 和 Apache 軟件基金會
HBase 是 Apache Software Foundation 中的一個項目,因此 ASF 有責任確保項目健康。
### J.1。 ASF 開發流程
有關 ASF 結構的各種信息(例如,PMC,提交者,貢獻者),有關貢獻和參與的提示以及開源在 ASF 中的工作原理,請參見 [Apache 開發流程頁面](https://www.apache.org/dev/#committers)。
### J.2。 ASF 董事會報告
每季度一次,ASF 投資組合中的每個項目都會向 ASF 董事會提交報告。這是由 HBase 項目負責人和提交者完成的。有關詳細信息,請參閱 [ASF 板報告](https://www.apache.org/foundation/board/reporting)。
## 附錄 K:Apache HBase Orca
圖 23\. Apache HBase Orca,HBase 顏色,&amp;字形
[Orca 是 Apache HBase 的吉祥物。](https://issues.apache.org/jira/browse/HBASE-4920) 見 NOTICES.txt。我們在這里得到的 Orca 徽標: [http://www.vectorfree.com/jumping-orca](http://www.vectorfree.com/jumping-orca) 它是 Creative Commons Attribution 3.0 的許可。參見 [https://creativecommons.org/licenses/by/3.0/us/](https://creativecommons.org/licenses/by/3.0/us/) 我們通過剝離彩色背景,反轉它然后旋轉一些來改變徽標。
“官方”HBase 顏色是“國際橙色(工程)”,舊金山[金門大橋](https://en.wikipedia.org/wiki/International_orange)的顏色和 NASA 使用的太空服。
我們的'字體'是 [Bitsumishi](http://www.dafont.com/bitsumishi.font) 。
## 附錄 L:在 HBase 中啟用類似 Dapper 的跟蹤
HBase 包括使用開源跟蹤庫 [Apache HTrace](https://htrace.incubator.apache.org/) 跟蹤請求的工具。設置跟蹤非常簡單,但是它目前需要對客戶端代碼進行一些非常小的更改(將來可能會刪除此要求)。
在 [HBASE-6449](https://issues.apache.org/jira/browse/HBASE-6449) 中添加了在 HBase 中使用 HTrace 3 支持此功能。從 HBase 2.0 開始,通過 [HBASE-18601](https://issues.apache.org/jira/browse/HBASE-18601) 對 HTrace 4 進行了不兼容的更新。本節提供的示例將使用 HTrace 4 包名稱,語法和約定。有關較舊的示例,請參閱本指南的早期版本。
### L.1。 SpanReceivers
跟蹤系統通過在稱為“Spans”的結構中收集信息來工作。您可以通過實現`SpanReceiver`接口來選擇接收此信息的方式,該接口定義了一種方法:
```
public void receiveSpan(Span span);
```
每當跨度完成時,此方法用作回調。 HTrace 允許您根據需要使用盡可能多的 SpanReceivers,因此您可以輕松地將跟蹤信息發送到多個目的地。
通過在 _hbase-site.xml_ 屬性中實現`SpanReceiver`的類的完全限定類名稱的逗號分隔列表來配置您希望我們使用的 SpanReceivers:`hbase.trace.spanreceiver.classes`。
HTrace 包含`LocalFileSpanReceiver`,它以基于 JSON 的格式將所有跨度信息寫入本地文件。 `LocalFileSpanReceiver`在 _hbase-site.xml_ 中查找`hbase.local-file-span-receiver.path`屬性,其值描述節點應寫入其跨度信息的文件的名稱。
```
<property>
<name>hbase.trace.spanreceiver.classes</name>
<value>org.apache.htrace.core.LocalFileSpanReceiver</value>
</property>
<property>
<name>hbase.htrace.local-file-span-receiver.path</name>
<value>/var/log/hbase/htrace.out</value>
</property>
```
HTrace 還提供`ZipkinSpanReceiver`,它將跨度轉換為 [Zipkin](http://github.com/twitter/zipkin) span 格式并將它們發送到 Zipkin 服務器。要使用此 span 接收器,您需要將 htrace-zipkin jar 安裝到群集中所有節點上的 HBase 類路徑中。
_htrace-zipkin_ 發布到 [Maven 中央存儲庫](http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22org.apache.htrace%22%20AND%20a%3A%22htrace-zipkin%22)。您可以從那里獲得最新版本或只是在本地構建它(請參閱 [HTrace](https://htrace.incubator.apache.org/) 主頁以獲取有關如何執行此操作的信息),然后將其復制到所有節點。
`ZipkinSpanReceiver`用于 _hbase-site.xml_ 中名為`hbase.htrace.zipkin.collector-hostname`和`hbase.htrace.zipkin.collector-port`的屬性,其值描述了發送范圍信息的 Zipkin 收集器服務器。
```
<property>
<name>hbase.trace.spanreceiver.classes</name>
<value>org.apache.htrace.core.ZipkinSpanReceiver</value>
</property>
<property>
<name>hbase.htrace.zipkin.collector-hostname</name>
<value>localhost</value>
</property>
<property>
<name>hbase.htrace.zipkin.collector-port</name>
<value>9410</value>
</property>
```
如果您不想使用附帶的跨接收發器,建議您編寫自己的接收器(以`LocalFileSpanReceiver`為例)。如果您認為其他人會從您的接收器中受益,請向 HTrace 項目提交 JIRA。
## 201.客戶修改
為了在客戶端代碼中啟用跟蹤,您必須初始化每個客戶端進程一次向接收器發送跨度的模塊。
```
private SpanReceiverHost spanReceiverHost;
...
Configuration conf = HBaseConfiguration.create();
SpanReceiverHost spanReceiverHost = SpanReceiverHost.getInstance(conf);
```
然后,您只需在您認為有趣的請求之前開始跟蹤跨度,并在請求完成時關閉它。例如,如果要跟蹤所有獲取操作,請更改此設置:
```
Configuration config = HBaseConfiguration.create();
Connection connection = ConnectionFactory.createConnection(config);
Table table = connection.getTable(TableName.valueOf("t1"));
Get get = new Get(Bytes.toBytes("r1"));
Result res = table.get(get);
```
成:
```
TraceScope ts = Trace.startSpan("Gets", Sampler.ALWAYS);
try {
Table table = connection.getTable(TableName.valueOf("t1"));
Get get = new Get(Bytes.toBytes("r1"));
Result res = table.get(get);
} finally {
ts.close();
}
```
如果你想跟蹤一半的“獲取”操作,你會傳入:
```
new ProbabilitySampler(0.5)
```
代替`Sampler.ALWAYS`至`Trace.startSpan()`。有關采樣器的更多信息,請參見 HTrace _README_ 。
## 202.追蹤 HBase Shell
您可以使用`trace`命令跟蹤來自 HBase Shell 的請求。 `trace 'start'`命令打開跟蹤,`trace 'stop'`命令關閉跟蹤。
```
hbase(main):001:0> trace 'start'
hbase(main):002:0> put 'test', 'row1', 'f:', 'val1' # traced commands
hbase(main):003:0> trace 'stop'
```
`trace 'start'`和`trace 'stop'`始終返回表示是否存在正在進行的跟蹤的布爾值。結果,`trace 'stop'`成功返回 false。如果打開跟蹤,`trace 'status'`只會返回。
```
hbase(main):001:0> trace 'start'
=> true
hbase(main):002:0> trace 'status'
=> true
hbase(main):003:0> trace 'stop'
=> false
hbase(main):004:0> trace 'status'
=> false
```
## 附錄 M:0.95 RPC 規范
在 0.95 中,所有客戶端/服務器通信都是使用 [protobuf'ed](https://developers.google.com/protocol-buffers/) 消息而不是 [Hadoop Writables](https://hadoop.apache.org/docs/current/api/org/apache/hadoop/io/Writable.html) 完成的。因此我們的 RPC 線格式會發生變化本文檔描述了客戶端/服務器請求/響應協議以及我們新的 RPC 線路格式。
對于 0.94 及之前的 RPC,請參閱 Beno?t/ Tsuna 的[非官方 Hadoop / HBase RPC 協議文檔](https://github.com/OpenTSDB/asynchbase/blob/master/src/HBaseRpc.java#L164)。有關我們如何達到此規范的更多背景信息,請參閱 [HBase RPC:WIP](https://docs.google.com/document/d/1WCKwgaLDqBw2vpux0jPsAu2WPTRISob7HGCO8YhfDTA/edit#)
### M.1。目標
1. 我們可以發展一種線形式
2. 一種格式,不需要我們的重寫服務器核心或從根本上改變其當前架構(以后)。
### M.2。去做
1. 當前指定格式的問題列表以及我們希望在版本 2 中的位置等。例如,如果要移動服務器異步或支持流/分塊,我們必須更改什么?
2. 關于它如何工作的圖表
3. 簡潔地描述線格式的語法。目前我們有這些單詞和 rpc protobuf idl 的內容,但來回的語法將有助于 groking rpc。此外,客戶端/服務器上的一個小型狀態機交互將有助于理解(并確保正確實現)。
### M.3。 RPC
客戶端將發送有關連接建立的設置信息。此后,客戶端調用針對遠程服務器的方法發送 protobuf 消息并接收 protobuf 消息作為響應。溝通是同步的。所有來回前面都有一個 int,它具有請求/響應的總長度。可選地,Cells(KeyValues)可以在后續 Cell 塊中的 protobufs 之外傳遞(因為[我們不能 protobuf 兆字節的 KeyValues](https://docs.google.com/document/d/1WEtrq-JTIUhlnlnvA0oYRLp0F8MKpEBeBSCFcQiacdw/edit#) 或 Cells)。這些 CellBlock 被編碼并可選地壓縮。
有關所涉及的 protobufs 的更多詳細信息,請參閱 master 中的 [RPC.proto](https://github.com/apache/hbase/blob/master/hbase-protocol/src/main/protobuf/RPC.proto) 文件。
#### M.3.1。連接設置
客戶端啟動連接。
##### 客戶
在連接設置上,客戶端發送前導碼,后跟連接頭。
<preamble>
```
<MAGIC 4 byte integer> <1 byte RPC Format Version> <1 byte auth type>
```
我們需要 auth 方法規范。這里,如果啟用 auth,則編碼連接頭。
例如:HBas0x000x50 - 4 個字節的 MAGIC - “HBas” - 加上一個字節的版本,在這種情況下為 0,還有一個字節,0x50(SIMPLE)。一個身份驗證類型。
<protobuf connectionheader="" message="">
有用戶信息和``protocol'',以及客戶端將使用發送 CellBlocks 的編碼器和壓縮。 CellBlock 編碼器和壓縮器用于連接的生命周期。 CellBlock 編碼器實現 org.apache.hadoop.hbase.codec.Codec。然后也可以壓縮 CellBlock。壓縮器實現 org.apache.hadoop.io.compress.CompressionCodec。這個 protobuf 是使用 writeDelimited 編寫的,所以它是以帶有序列化長度的 pb varint 開頭的
##### 服務器
客戶端發送前導碼和連接頭后,如果連接設置成功,服務器不響應。沒有響應意味著服務器準備好接受請求并給出響應。如果前導中的版本或身份驗證不合適或服務器在解析前導碼時遇到問題,則會拋出 org.apache.hadoop.hbase.ipc.FatalConnectionException 來解釋錯誤,然后斷開連接。如果連接頭中的客戶端 - 即連接前導碼后面的 protobuf'd 消息 - 要求服務器不支持服務器或服務器沒有的編解碼器,我們再次拋出 FatalConnectionException 并附帶說明。
#### M.3.2。請求
建立連接后,客戶端發出請求。服務器響應。
請求由 protobuf RequestHeader 和 protobuf Message 參數組成。標頭包括方法名稱和可選的 CellBlock 上可能跟隨的元數據。參數類型適合被調用的方法:即,如果我們正在執行 getRegionInfo 請求,則 protobuf Message param 將是 GetRegionInfoRequest 的實例。響應將是 GetRegionInfoResponse。 CellBlock 可選地用于傳送大量 RPC 數據:即 Cells / KeyValues。
##### 索取零件
<total length="">
該請求以一個 int 開頭,該 int 保存后面的總長度。
<protobuf message="" requestheader="">
將包含 call.id,trace.id 和方法名稱等,包括 IFF 上的 Cell 塊上的可選元數據。數據在此 pb 消息中是內聯的,或者可選地包含在以下 CellBlock 中
<protobuf message="" param="">
如果調用的方法是 getRegionInfo,如果您研究客戶端的服務描述符到 regionserver 協議,您會發現請求在此位置發送 GetRegionInfoRequest protobuf 消息參數。
<cellblock>
經編碼且可選地壓縮的 Cell 塊。
#### M.3.3。響應
與 Request 相同,它是一個 protobuf ResponseHeader,后跟一個 protobuf Message 響應,其中 Message 響應類型適合調用的方法。大量數據可能會出現在以下 CellBlock 中。
##### 響應部分
<total length="">
響應以一個 int 開頭,該 int 保存了后面的總長度。
<protobuf message="" responseheader="">
將有 call.id 等。如果處理失敗將包括異常。可選地包括關于可選的元數據,IFF 下面有一個 CellBlock。
<protobuf message="" response="">
如果例外,則返回或可能無效。如果調用的方法是 getRegionInfo,如果您研究客戶端的服務描述符到 regionserver 協議,您會發現響應在此位置發送 GetRegionInfoResponse protobuf 消息參數。
<cellblock>
An encoded and optionally compressed Cell block.
#### M.3.4。例外
有兩種不同的類型。請求失敗,它封裝在響應的響應頭內。連接保持打開狀態以接收新請求。第二種類型 FatalConnectionException 會終止連接。
例外可以攜帶額外的信息。請參閱 ExceptionResponse protobuf 類型。它有一個標志,表示不重試以及其他雜項有效負載,以幫助提高客戶響應能力。
#### M.3.5。牢房
這些都沒有版本。服務器可以執行編解碼器,也可以不執行。如果編解碼器的新版本說更嚴格的編碼,那么給它一個新的類名。編解碼器將一直存在于服務器上,以便老客戶端可以連接。
### M.4。筆記
約束
在某些部分,當前的線路格式 - 即所有請求和響應前面都有一個長度 - 由當前的服務器非異步架構決定。
一個胖 pb 請求或標題+參數
我們用 pb 標題跟隨 pb param 發出請求和 pb 標題然后是 pb 響應。執行 header + param 而不是一個包含 header 和 param 內容的 protobuf 消息:
1. 更接近我們現在擁有的
2. 有一個單一的脂肪 pb 需要額外的復制將已經 pb'd 的參數放入脂肪請求 pb 的主體(并且相同的結果)
3. 在我們閱讀參數之前,我們可以決定是否接受請求;例如,請求可能是低優先級。當然,我們一次性讀取 header + param,因為服務器當前已實現,因此這是一個 TODO。
優點很小。如果以后,胖請求有明顯的優勢,以后可以推出 v2。
#### M.4.1。 RPC 配置
CellBlock 編解碼器
要啟用默認`KeyValueCodec`以外的編解碼器,請將`hbase.client.rpc.codec`設置為要使用的 Codec 類的名稱。編解碼器必須實現 hbase 的`Codec`接口。連接建立后,所有傳遞的單元塊將與此編解碼器一起發送。只要編解碼器在服務器的 CLASSPATH 上,服務器就會使用相同的編解碼器返回單元塊(否則你將獲得`UnsupportedCellCodecException`)。
要更改默認編解碼器,請設置`hbase.client.default.rpc.codec`。
要完全禁用單元塊并轉到純 protobuf,請將默認值設置為空 String,并且不要在 Configuration 中指定編解碼器。因此,將`hbase.client.default.rpc.codec`設置為空字符串,不要設置`hbase.client.rpc.codec`。這將導致客戶端連接到沒有指定編解碼器的服務器。如果服務器沒有看到編解碼器,它將返回純 protobuf 中的所有響應。一直運行純 protobuf 比使用 cellblocks 運行要慢。
壓縮
使用 hadoop 的壓縮編解碼器。要啟用壓縮傳遞的 CellBlock,請將`hbase.client.rpc.compressor`設置為要使用的 Compressor 的名稱。 Compressor 必須實現 Hadoop 的 CompressionCodec 接口。連接建立后,所有傳遞的單元塊將被壓縮發送。只要壓縮器在 CLASSPATH 上,服務器就會返回使用同一壓縮器壓縮的單元塊(否則你將獲得`UnsupportedCompressionCodecException`)。
## 附錄 N:HBase 版本中已知的不兼容性
## 203\. HBase 2.0 不兼容的變化
本附錄描述了早期版本的 HBase 與 HBase 2.0 的不兼容更改。此列表并不意味著完全包含所有可能的不兼容性。相反,這些內容旨在深入了解大多數用戶將從 HBase 1.x 版本中遇到的一些明顯的不兼容性。
### 203.1。 HBase 2.0 的主要變更清單
* HBASE-1912-HBCK 是用于捕獲不一致性的 HBase 數據庫檢查工具。作為 HBase 管理員,您不應使用 HBase 1.0 版 hbck 工具來檢查 HBase 2.0 數據庫。這樣做會破壞數據庫并引發異常錯誤。
* HBASE-16189 和 HBASE-18945-您無法通過 HBase 1.0 版本打開 HBase 2.0 hfiles。如果您是使用 HBase 版本 1.x 的管理員或 HBase 用戶,則必須先滾動升級到最新版本的 HBase 1.x,然后再升級到 HBase 2.0。
* HBASE-18240 - 更改了 ReplicationEndpoint 接口。它還引入了一個新的 hbase-third party 1.0,它打包了所有第三方實用程序,這些實用程序預計將在 hbase 集群中運行。
### 203.2。協處理器 API 更改
* HBASE-16769 - 來自 MasterObserver 和 RegionServerObserver 的不推薦的 PB 引用。
* HBASE-17312 - [JDK8]使用 Observer 協處理器的默認方法。 BaseMasterAndRegionObserver,BaseMasterObserver,BaseRegionObserver,BaseRegionServerObserver 和 BaseWALObserver 的接口類使用 JDK8 的'default'關鍵字來提供空的和無操作的實現。
* 接口 HTableInterface HBase 2.0 對下面列出的方法進行了以下更改:
#### 203.2.1。 [ - ]接口協處理器環境變化(2)
| 更改 | 結果 |
| --- | --- |
| 抽象方法 getTable(TableName)已被刪除。 | NoSuchMethodError 異常可能會中斷客戶端程序。 |
| 抽象方法 getTable(TableName,ExecutorService)已被刪除。 | A client program may be interrupted by NoSuchMethodError exception. |
* 公眾觀眾
下表描述了協處理器的更改。
##### [ - ]類 CoprocessorRpcChannel(1)
| Change | Result |
| --- | --- |
| 這個類已成為界面。 | IncompatibleClassChangeError 或 InstantiationError 異常可能會中斷客戶端程序,具體取決于此類的用法。 |
##### 類 CoprocessorHost
Audience Private 但已刪除的類。
| Change | Result |
| --- | --- |
| 字段協處理器的類型已從 java.util.SortedSet <e>更改為 org.apache.hadoop.hbase.util.SortedList <e>。</e></e> | NoSuchFieldError 異常可能會中斷客戶端程序。 |
#### 203.2.2。 MasterObserver
HBase 2.0 引入了對 MasterObserver 接口的以下更改。
##### [ - ]界面 MasterObserver(14)
| Change | Result |
| --- | --- |
| 已從此界面中刪除抽象方法 voidpostCloneSnapshot(ObserverContext <mastercoprocessorenvironment>,HBaseProtos.SnapshotDescription,HTableDescriptor)。</mastercoprocessorenvironment> | A client program may be interrupted by NoSuchMethodError exception. |
| 已從此界面中刪除抽象方法 voidpostCreateTable(ObserverContext <mastercoprocessorenvironment>,HTableDescriptor,HRegionInfo [])。</mastercoprocessorenvironment> | NoSuchMethodErrorexception 可能會中斷客戶端程序。 |
| 已從此界面中刪除抽象方法 voidpostDeleteSnapshot(ObserverContext <mastercoprocessorenvironment>,HBaseProtos.SnapshotDescription)。</mastercoprocessorenvironment> | A client program may be interrupted by NoSuchMethodErrorexception. |
| 已從此接口中刪除抽象方法 voidpostGetTableDescriptors(ObserverContext <mastercoprocessorenvironment>,List <htabledescriptor>)。</htabledescriptor></mastercoprocessorenvironment> | A client program may be interrupted by NoSuchMethodErrorexception. |
| 已從此接口中刪除抽象方法 voidpostModifyTable(ObserverContext <mastercoprocessorenvironment>,TableName,HTableDescriptor)。</mastercoprocessorenvironment> | A client program may be interrupted by NoSuchMethodErrorexception. |
| 已從此界面中刪除抽象方法 voidpostRestoreSnapshot(ObserverContext <mastercoprocessorenvironment>,HBaseProtos.SnapshotDescription,HTableDescriptor)。</mastercoprocessorenvironment> | A client program may be interrupted by NoSuchMethodErrorexception. |
| 已從此界面中刪除抽象方法 voidpostSnapshot(ObserverContext <mastercoprocessorenvironment>,HBaseProtos.SnapshotDescription,HTableDescriptor)。</mastercoprocessorenvironment> | A client program may be interrupted by NoSuchMethodErrorexception. |
| 已從此界面中刪除抽象方法 voidpreCloneSnapshot(ObserverContext <mastercoprocessorenvironment>,HBaseProtos.SnapshotDescription,HTableDescriptor)。</mastercoprocessorenvironment> | A client program may be interrupted by NoSuchMethodErrorexception. |
| 已從此接口中刪除抽象方法 voidpreCreateTable(ObserverContext <mastercoprocessorenvironment>,HTableDescriptor,HRegionInfo [])。</mastercoprocessorenvironment> | A client program may be interrupted by NoSuchMethodErrorexception. |
| 已從此界面中刪除抽象方法 voidpreDeleteSnapshot(ObserverContext <mastercoprocessorenvironment>,HBaseProtos.SnapshotDescription)。</mastercoprocessorenvironment> | A client program may be interrupted by NoSuchMethodErrorexception. |
| 已從此接口中刪除抽象方法 voidpreGetTableDescriptors(ObserverContext <mastercoprocessorenvironment>,List <tablename>,List <htabledescriptor>)。</htabledescriptor></tablename></mastercoprocessorenvironment> | A client program may be interrupted by NoSuchMethodErrorexception. |
| 已從此接口中刪除抽象方法 voidpreModifyTable(ObserverContext <mastercoprocessorenvironment>,TableName,HTableDescriptor)。</mastercoprocessorenvironment> | A client program may be interrupted by NoSuchMethodErrorexception. |
| 已從此界面中刪除抽象方法 voidpreRestoreSnapshot(ObserverContext <mastercoprocessorenvironment>,HBaseProtos.SnapshotDescription,HTableDescriptor)。</mastercoprocessorenvironment> | A client program may be interrupted by NoSuchMethodErrorexception. |
| 已從此界面中刪除抽象方法 voidpreSnapshot(ObserverContext <mastercoprocessorenvironment>,HBaseProtos.SnapshotDescription,HTableDescriptor)。</mastercoprocessorenvironment> | A client program may be interrupted by NoSuchMethodErrorexception. |
#### 203.2.3。 RegionObserver
HBase 2.0 引入了對 RegionObserver 接口的以下更改。
##### [ - ] interface RegionObserver(13)
| Change | Result |
| --- | --- |
| 已從此界面中刪除抽象方法 voidpostCloseRegionOperation(ObserverContext <regioncoprocessorenvironment>,HRegion.Operation)。</regioncoprocessorenvironment> | A client program may be interrupted by NoSuchMethodError exception. |
| 已從此接口中刪除抽象方法 voidpostCompactSelection(ObserverContext <regioncoprocessorenvironment>,Store,ImmutableList <storefile>)。</storefile></regioncoprocessorenvironment> | A client program may be interrupted by NoSuchMethodError exception. |
| 已從此界面中刪除抽象方法 voidpostCompactSelection(ObserverContext <regioncoprocessorenvironment>,Store,ImmutableList <storefile>,CompactionRequest)。</storefile></regioncoprocessorenvironment> | A client program may be interrupted by NoSuchMethodError exception. |
| 已從此接口中刪除抽象方法 voidpostGetClosestRowBefore(ObserverContext <regioncoprocessorenvironment>,byte [],byte [],Result)。</regioncoprocessorenvironment> | A client program may be interrupted by NoSuchMethodError exception. |
| 已從此界面中刪除了抽象方法 DeleteTrackerpostInstantiateDeleteTracker(ObserverContext <regioncoprocessorenvironment>,DeleteTracker)。</regioncoprocessorenvironment> | A client program may be interrupted by NoSuchMethodError exception. |
| 已從此界面中刪除抽象方法 voidpostSplit(ObserverContext <regioncoprocessorenvironment>,HRegion,HRegion)。</regioncoprocessorenvironment> | A client program may be interrupted by NoSuchMethodError exception. |
| 已從此界面中刪除抽象方法 voidpostStartRegionOperation(ObserverContext <regioncoprocessorenvironment>,HRegion.Operation)。</regioncoprocessorenvironment> | A client program may be interrupted by NoSuchMethodError exception. |
| 已從此界面中刪除抽象方法 StoreFile.ReaderpostStoreFileReaderOpen(ObserverContext <regioncoprocessorenvironment>,FileSystem,Path,FSDataInputStreamWrapper,long,CacheConfig,Reference,StoreFile.Reader)。</regioncoprocessorenvironment> | A client program may be interrupted by NoSuchMethodError exception. |
| 已從此界面中刪除抽象方法 voidpostWALRestore(ObserverContext <regioncoprocessorenvironment>,HRegionInfo,HLogKey,WALEdit)。</regioncoprocessorenvironment> | A client program may be interrupted by NoSuchMethodError exception. |
| 已從此界面中刪除了抽象方法 InternalScannerpreFlushScannerOpen(ObserverContext <regioncoprocessorenvironment>,Store,KeyValueScanner,InternalScanner)。</regioncoprocessorenvironment> | A client program may be interrupted by NoSuchMethodError exception. |
| 已從此接口中刪除抽象方法 voidpreGetClosestRowBefore(ObserverContext <regioncoprocessorenvironment>,byte [],byte [],Result)。</regioncoprocessorenvironment> | A client program may be interrupted by NoSuchMethodError exception. |
| 已從此界面中刪除抽象方法 StoreFile.ReaderpreStoreFileReaderOpen(ObserverContext <regioncoprocessorenvironment>,FileSystem,Path,FSDataInputStreamWrapper,long,CacheConfig,Reference,StoreFile.Reader)。</regioncoprocessorenvironment> | A client program may be interrupted by NoSuchMethodError exception. |
| 已從此界面中刪除抽象方法 voidpreWALRestore(ObserverContext <regioncoprocessorenvironment>,HRegionInfo,HLogKey,WALEdit)。</regioncoprocessorenvironment> | A client program may be interrupted by NoSuchMethodError exception. |
#### 203.2.4。 WALObserver
HBase 2.0 引入了對 WALObserver 接口的以下更改。
###### [ - ]界面 WALObserver
| Change | Result |
| --- | --- |
| 已從此界面中刪除抽象方法 voidpostWALWrite(ObserverContext <walcoprocessorenvironment>,HRegionInfo,HLogKey,WALEdit)。</walcoprocessorenvironment> | A client program may be interrupted by NoSuchMethodError exception. |
| 已從此界面中刪除抽象方法 booleanpreWALWrite(ObserverContext <walcoprocessorenvironment>,HRegionInfo,HLogKey,WALEdit)。</walcoprocessorenvironment> | A client program may be interrupted by NoSuchMethodError exception. |
#### 203.2.5。雜
HBase 2.0 引入了以下類的更改:
hbase-server-1.0.0.jar,OnlineRegions.class 包 org.apache.hadoop.hbase.regionserver
##### [ - ] OnlineRegions.getFromOnlineRegions(String p1)[abstract]:HRegion
組織/阿帕奇/ hadoop 的/ HBase 的/ RegionServer 的/ OnlineRegions.getFromOnlineRegions:(Ljava /郎/字符串;)Lorg /阿帕奇/ hadoop 的/ HBase 的/ RegionServer 的/ HRegion;
| Change | Result |
| --- | --- |
| 返回值類型已從 Region 更改為 Region。 | 此方法已被刪除,因為返回類型是方法簽名的一部分。 NoSuchMethodError 異常可能會中斷客戶端程序。 |
hbase-server-1.0.0.jar,RegionCoprocessorEnvironment.class 包 org.apache.hadoop.hbase.coprocessor
##### [ - ] RegionCoprocessorEnvironment.getRegion()[abstract]:HRegion
組織/阿帕奇/ hadoop 的/ HBase 的/協處理器/ RegionCoprocessorEnvironment.getRegion :()Lorg /阿帕奇/ hadoop 的/ HBase 的/ RegionServer 的/ HRegion;
| Change | Result |
| --- | --- |
| 返回值類型已從 org.apache.hadoop.hbase.regionserver.HRegion 更改為 org.apache.hadoop.hbase.regionserver.Region。 | This method has been removed because the return type is part of the method signature. A client program may be interrupted by NoSuchMethodError exception. |
hbase-server-1.0.0.jar,RegionCoprocessorHost.class 包 org.apache.hadoop.hbase.regionserver
##### [ - ] RegionCoprocessorHost.postAppend(追加追加,結果結果):void
組織/阿帕奇/ hadoop 的/ HBase 的/ RegionServer 的/ RegionCoprocessorHost.postAppend:(Lorg /阿帕奇/ hadoop 的/ HBase 的/客戶端/追加; Lorg /阿帕奇/ hadoop 的/ HBase 的/客戶/結果;)V
| Change | Result |
| --- | --- |
| 返回值類型已從 void 更改為 org.apache.hadoop.hbase.client.Result。 | This method has been removed because the return type is part of the method signature. A client program may be interrupted by NoSuchMethodError exception. |
##### [ - ] RegionCoprocessorHost.preStoreFileReaderOpen(FileSystem fs,Path p,FSDataInputStreamWrapper in,long size,CacheConfig cacheConf,Reference r):StoreFile.Reader
組織/阿帕奇/ hadoop 的/ HBase 的/ RegionServer 的/ RegionCoprocessorHost.preStoreFileReaderOpen:(Lorg /阿帕奇/ hadoop 的/ FS /文件系統; Lorg /阿帕奇/ hadoop 的/ FS /路徑; Lorg /阿帕奇/ hadoop 的/ HBase 的/ IO / FSDataInputStreamWrapper; JLorg /阿帕奇/ hadoop 的/ HBase 的/ IO / HFILE / CacheConfig; Lorg /阿帕奇/ hadoop 的/ HBase 的/ IO /參考)Lorg /阿帕奇/ hadoop 的/ HBase 的/ RegionServer 的/ StoreFile $閱讀器;
| Change | Result |
| --- | --- |
| 返回值類型已從 StoreFile.Reader 更改為 StoreFileReader。 | This method has been removed because the return type is part of the method signature. A client program may be interrupted by NoSuchMethodError exception. |
#### 203.2.6。 IPC
#### 203.2.7。調度程序更改:
1. 以下方法變得抽象:
包 org.apache.hadoop.hbase.ipc
##### [ - ] class RpcScheduler(1)
| Change | Result |
| --- | --- |
| 抽象方法 void dispatch(CallRunner)已從此類中刪除。 | A client program may be interrupted by NoSuchMethodError exception. |
hbase-server-1.0.0.jar,RpcScheduler.class 包 org.apache.hadoop.hbase.ipc
##### [ - ] RpcScheduler.dispatch(CallRunner p1)[abstract]:void 1
組織/阿帕奇/ hadoop 的/ HBase 的/ IPC / RpcScheduler.dispatch:(Lorg /阿帕奇/ hadoop 的/ HBase 的/ IPC / CallRunner;)V
| Change | Result |
| --- | --- |
| 返回值類型已從 void 更改為 boolean。 | This method has been removed because the return type is part of the method signature. A client program may be interrupted by NoSuchMethodError exception. |
1. 以下摘要方法已被刪除:
##### [ - ] interface PriorityFunction(2)
| Change | Result |
| --- | --- |
| 已從此接口中刪除了抽象方法 longgetDeadline(RPCProtos.RequestHeader,Message)。 | A client program may be interrupted by NoSuchMethodError exception. |
| 抽象方法 int getPriority(RPCProtos.RequestHeader,Message)已從此接口中刪除。 | A client program may be interrupted by NoSuchMethodError exception. |
#### 203.2.8。服務器 API 更改:
##### [ - ]類 RpcServer(12)
| Change | Result |
| --- | --- |
| 字段類型 CurCall 已從 java.lang.ThreadLocal <rpcserver.call>更改為 java.lang.ThreadLocal <rpccall>。</rpccall></rpcserver.call> | A client program may be interrupted by NoSuchFieldError exception. |
| 這堂課變得抽象了。 | InstantiationError 異常可能會中斷客戶端程序。 |
| 抽象方法 int getNumOpenConnections()已添加到此類中。 | 此類變為抽象,客戶端程序可能會被 InstantiationError 異常中斷。 |
| 已從此類中刪除 org.apache.hadoop.hbase.util.Counter 類型的字段 callQueueSize。 | A client program may be interrupted by NoSuchFieldError exception. |
| 已從此類中刪除了類型為 java.util.List <rpcserver.connection>的字段 connectionList。</rpcserver.connection> | A client program may be interrupted by NoSuchFieldError exception. |
| 已從此類中刪除 int 類型的字段 maxIdleTime。 | A client program may be interrupted by NoSuchFieldError exception. |
| 已從此類中刪除 int 類型的字段 numConnections。 | A client program may be interrupted by NoSuchFieldError exception. |
| int 類型的字段端口已從此類中刪除。 | A client program may be interrupted by NoSuchFieldError exception. |
| 已從此類中刪除了 long 類型的字段 purgeTimeout。 | A client program may be interrupted by NoSuchFieldError exception. |
| RpcServer.Responder 類型的字段響應程序已從此類中刪除。 | A client program may be interrupted by NoSuchFieldError exception. |
| 已從此類中刪除 int 類型的字段 socketSendBufferSize。 | A client program may be interrupted by NoSuchFieldError exception. |
| 已從此類中刪除 int 類型的字段 thresholdIdleConnections。 | A client program may be interrupted by NoSuchFieldError exception. |
以下摘要方法已被刪除:
| Change | Result |
| --- | --- |
| 抽象方法 Pair <message>調用(BlockingService,Descriptors.MethodDescriptor,Message,CellScanner,long,MonitoredRPCHandler)已從此界面中刪除。</message> | A client program may be interrupted by NoSuchMethodError exception. |
#### 203.2.9。復制和 WAL 更改:
HBASE-18733:WALKey 已在 HBase 2.0 中完全清除。以下是 WALKey 的更改:
##### [ - ] classWALKey(8)
| Change | Result |
| --- | --- |
| 字段 clusterIds 的訪問級別已從 protected 更改為 private。 | IllegalAccessError 異常可能會中斷客戶端程序。 |
| 字段 compressionContext 的訪問級別已從 protected 更改為 private。 | A client program may be interrupted by IllegalAccessError exception. |
| 字段 encodedRegionName 的訪問級別已從 protected 更改為 private。 | A client program may be interrupted by IllegalAccessError exception. |
| 字段表名的訪問級別已從 protected 更改為 private。 | A client program may be interrupted by IllegalAccessError exception. |
| 字段 writeTime 的訪問級別已從 protected 更改為 private。 | A client program may be interrupted by IllegalAccessError exception. |
以下字段已被刪除:
| Change | Result |
| --- | --- |
| 已從此類中刪除 org.apache.commons.logging.Log 類型的字段日志。 | A client program may be interrupted by NoSuchFieldError exception. |
| WALKey.Version 類型的字段 VERSION 已從此類中刪除。 | A client program may be interrupted by NoSuchFieldError exception. |
| 已從此類中刪除了 long 類型的字段 logSeqNum。 | A client program may be interrupted by NoSuchFieldError exception. |
以下是對 WALEdit.class 的更改:hbase-server-1.0.0.jar,WALEdit.class 包 org.apache.hadoop.hbase.regionserver.wal
##### WALEdit.getCompaction(Cell kv)[靜態]:WALProtos.CompactionDescriptor(1)
組織/阿帕奇/ hadoop 的/ HBase 的/ RegionServer 的/沃爾瑪/ WALEdit.getCompaction:(Lorg /阿帕奇/ hadoop 的/ HBase 的/細胞)Lorg /阿帕奇/ hadoop 的/ HBase 的/ protobuf 的/生成/ WALProtos $ CompactionDescriptor;
| Change | Result |
| --- | --- |
| 返回值類型已從 org.apache.hadoop.hbase.protobuf.generated.WALProtos.CompactionDescriptor 更改為 org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.CompactionDescriptor。 | This method has been removed because the return type is part of the method signature. A client program may be interrupted by NoSuchMethodError exception. |
##### WALEdit.getFlushDescriptor(Cell cell)[靜態]:WALProtos.FlushDescriptor(1)
組織/阿帕奇/ hadoop 的/ HBase 的/ RegionServer 的/沃爾瑪/ WALEdit.getFlushDescriptor:(Lorg /阿帕奇/ hadoop 的/ HBase 的/細胞)Lorg /阿帕奇/ hadoop 的/ HBase 的/ protobuf 的/生成/ WALProtos $ FlushDescriptor;
| Change | Result |
| --- | --- |
| 返回值類型已從 org.apache.hadoop.hbase.protobuf.generated.WALProtos.FlushDescriptor 更改為 org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.FlushDescriptor。 | This method has been removed because the return type is part of the method signature. A client program may be interrupted by NoSuchMethodError exception. |
##### WALEdit.getRegionEventDescriptor(Cell cell)[靜態]:WALProtos.RegionEventDescriptor(1)
組織/阿帕奇/ hadoop 的/ HBase 的/ RegionServer 的/沃爾瑪/ WALEdit.getRegionEventDescriptor:(Lorg /阿帕奇/ hadoop 的/ HBase 的/細胞)Lorg /阿帕奇/ hadoop 的/ HBase 的/ protobuf 的/生成/ WALProtos $ RegionEventDescriptor;
| Change | Result |
| --- | --- |
| 返回值類型已從 org.apache.hadoop.hbase.protobuf.generated.WALProtos.RegionEventDescriptor 更改為 org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.RegionEventDescriptor。 | This method has been removed because the return type is part of the method signature. A client program may be interrupted by NoSuchMethodError exception. |
以下是對 WALKey.class:package org.apache.hadoop.hbase.wal 的更改
##### WALKey.getBuilder(WALCellCodec.ByteStringCompressor 壓縮器):WALProtos.WALKey.Builder 1
組織/阿帕奇/ hadoop 的/ HBase 的/沃爾瑪/ WALKey.getBuilder:(Lorg /阿帕奇/ hadoop 的/ HBase 的/ RegionServer 的/沃爾/ WALCellCodec $ ByteStringCompressor)Lorg /阿帕奇/ hadoop 的/ HBase 的/ protobuf 的/生成/ WALProtos $ $ WALKey 助洗劑;
| Change | Result |
| --- | --- |
| 返回值類型已從 org.apache.hadoop.hbase.protobuf.generated.WALProtos.WALKey.Builder 更改為 org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.WALKey.Builder。 | This method has been removed because the return type is part of the method signature. A client program may be interrupted by NoSuchMethodError exception. |
#### 203.2.10。不推薦使用的 API 或協處理器:
HBASE-16769 - 已刪除 MasterObserver 和 RegionServerObserver 中的 PB 引用。
#### 203.2.11。管理界面 API 更改:
您無法管理 HBase 2.0 群集與 HBase 1.0 客戶端,其中包括 Admin ops 的 RelicationAdmin,ACC,Thrift 和 REST 使用。返回 protobufs 的方法已更改為返回 POJO。 pb 不再用于 API 中。異步方法的返回值已從 void 更改為 Future。 HBASE-18106 - Admin.listProcedures 和 Admin.listLocks 重命名為 getProcedures 和 getLocks。 MapReduce 使用 Admin 執行以下 admin.getClusterStatus()來計算 Splits。
* 管理 API 的節約使用:compact(ByteBuffer)createTable(ByteBuffer,List <columndescriptor>)deleteTable(ByteBuffer)disableTable(ByteBuffer)enableTable(ByteBuffer)getTableNames()majorCompact(ByteBuffer)</columndescriptor>
* Admin API 的 REST 用法:hbase-rest org.apache.hadoop.hbase.rest RootResource getTableList()TableName [] tableNames = servlet.getAdmin()。listTableNames(); SchemaResource delete(UriInfo)Admin admin = servlet.getAdmin(); update(TableSchemaModel,boolean,UriInfo)Admin admin = servlet.getAdmin(); StorageClusterStatusResource get(UriInfo)ClusterStatus status = servlet.getAdmin()。getClusterStatus(); StorageClusterVersionResource get(UriInfo)model.setVersion(servlet.getAdmin()。getClusterStatus()。getHBaseVersion()); TableResource exists()返回 servlet.getAdmin()。tableExists(TableName.valueOf(table));
以下是對 Admin 界面的更改:
##### [ - ]界面管理員(9)
| Change | Result |
| --- | --- |
| 已從此接口中刪除抽象方法 createTableAsync(HTableDescriptor,byte [] [])。 | A client program may be interrupted by NoSuchMethodError exception. |
| 已從此接口中刪除抽象方法 disableTableAsync(TableName)。 | A client program may be interrupted by NoSuchMethodError exception. |
| 已從此接口中刪除抽象方法 enableTableAsync(TableName)。 | A client program may be interrupted by NoSuchMethodError exception. |
| 已從此接口中刪除抽象方法 getCompactionState(TableName)。 | A client program may be interrupted by NoSuchMethodError exception. |
| 已從此接口中刪除抽象方法 getCompactionStateForRegion(byte [])。 | A client program may be interrupted by NoSuchMethodError exception. |
| 抽象方法 isSnapshotFinished(HBaseProtos.SnapshotDescription)已從此界面中刪除。 | A client program may be interrupted by NoSuchMethodError exception. |
| 已從此界面中刪除抽象方法 snapshot(String,TableName,HBaseProtos.SnapshotDescription.Type)。 | A client program may be interrupted by NoSuchMethodError exception. |
| 已從此界面中刪除抽象方法快照(HBaseProtos.SnapshotDescription)。 | A client program may be interrupted by NoSuchMethodError exception. |
| 已從此接口中刪除抽象方法 takeSnapshotAsync(HBaseProtos.SnapshotDescription)。 | A client program may be interrupted by NoSuchMethodError exception. |
以下是對 Admin.class 的更改:hbase-client-1.0.0.jar,Admin.class 包 org.apache.hadoop.hbase.client
##### [ - ] Admin.createTableAsync(HTableDescriptor p1,byte [] [] p2)[abstract]:void 1
組織/阿帕奇/ hadoop 的/ HBase 的/客戶端/ Admin.createTableAsync:(Lorg /阿帕奇/ hadoop 的/ HBase 的/ HTableDescriptor; [[B)V
| Change | Result |
| --- | --- |
| 返回值類型已從 void 更改為 java.util.concurrent.Future <java.lang.void>。</java.lang.void> | This method has been removed because the return type is part of the method signature. A client program may be interrupted by NoSuchMethodError exception. |
##### [ - ] Admin.disableTableAsync(TableName p1)[abstract]:void 1
組織/阿帕奇/ hadoop 的/ HBase 的/客戶端/ Admin.disableTableAsync:(Lorg /阿帕奇/ hadoop 的/ HBase 的/表名;)V
| Change | Result |
| --- | --- |
| Return value type has been changed from void to java.util.concurrent.Future<java.lang.void>.</java.lang.void> | This method has been removed because the return type is part of the method signature. A client program may be interrupted by NoSuchMethodError exception. |
##### Admin.enableTableAsync(TableName p1)[abstract]:void 1
組織/阿帕奇/ hadoop 的/ HBase 的/客戶端/ Admin.enableTableAsync:(Lorg /阿帕奇/ hadoop 的/ HBase 的/表名;)V
| Change | Result |
| --- | --- |
| Return value type has been changed from void to java.util.concurrent.Future<java.lang.void>.</java.lang.void> | This method has been removed because the return type is part of the method signature. A client program may be interrupted by NoSuchMethodError exception. |
##### [ - ] Admin.getCompactionState(TableName p1)[abstract]:AdminProtos.GetRegionInfoResponse.CompactionState 1
組織/阿帕奇/ hadoop 的/ HBase 的/客戶端/ Admin.getCompactionState:(Lorg /阿帕奇/ hadoop 的/ HBase 的/表名)Lorg /阿帕奇/ hadoop 的/ HBase 的/ protobuf 的/生成/ AdminProtos $ $ GetRegionInfoResponse CompactionState;
| Change | Result |
| --- | --- |
| 返回值類型已從 org.apache.hadoop.hbase.protobuf.generated.AdminProtos.GetRegionInfoResponse.CompactionState 更改為 CompactionState。 | This method has been removed because the return type is part of the method signature. A client program may be interrupted by NoSuchMethodError exception. |
##### [ - ] Admin.getCompactionStateForRegion(byte [] p1)[abstract]:AdminProtos.GetRegionInfoResponse.CompactionState 1
組織/阿帕奇/ hadoop 的/ HBase 的/客戶端/ Admin.getCompactionStateForRegion:([B)Lorg /阿帕奇/ hadoop 的/ HBase 的/ protobuf 的/生成/ AdminProtos $ $ GetRegionInfoResponse CompactionState;
| Change | Result |
| --- | --- |
| Return value type has been changed from org.apache.hadoop.hbase.protobuf.generated.AdminProtos.GetRegionInfoResponse.CompactionState to CompactionState. | This method has been removed because the return type is part of the method signature. A client program may be interrupted by NoSuchMethodError exception. |
#### 203.2.12。 HTableDescriptor 和 HColumnDescriptor 發生了變化
HTableDescriptor 和 HColumnDescriptor 已成為接口,您可以通過 Builders 創建它。 HCD 已成為 CFD。它不再實現可寫接口。包 org.apache.hadoop.hbase
##### [ - ]類 HColumnDescriptor(1)
| Change | Result |
| --- | --- |
| 刪除了超級接口 org.apache.hadoop.io.WritableComparable <hcolumndescriptor>。</hcolumndescriptor> | A client program may be interrupted by NoSuchMethodError exception. |
HColumnDescriptor in 1.0.0 {code} @ InterfaceAudience.Public @ InterfaceStability.Evolving public class HColumnDescriptor 實現 WritableComparable <hcolumndescriptor>{{code}</hcolumndescriptor>
HColumnDescriptor in 2.0 {code} @ InterfaceAudience.Public @Deprecated //在 3.0 公共類中刪除它 HColumnDescriptor 實現 ColumnFamilyDescriptor,Comparable <hcolumndescriptor>{{code}</hcolumndescriptor>
對于 META_TABLEDESC,制造商方法已在 1.0.0 中的 HTD 中棄用。 OWNER_KEY 仍處于 HTD 狀態。
##### 類 HTableDescriptor(3)
| Change | Result |
| --- | --- |
| 刪除了超級接口 org.apache.hadoop.io.WritableComparable <htabledescriptor>。</htabledescriptor> | A client program may be interrupted by NoSuchMethodError exception. |
| 已從此類中刪除了類型為 HTableDescriptor 的字段 META_TABLEDESC。 | A client program may be interrupted by NoSuchFieldError exception. |
hbase-client-1.0.0.jar,HTableDescriptor.class 包 org.apache.hadoop.hbase
##### [ - ] HTableDescriptor.getColumnFamilies():HColumnDescriptor [](1)
組織/阿帕奇/ hadoop 的/ HBase 的/ HTableDescriptor.getColumnFamilies:()[Lorg /阿帕奇/ hadoop 的/ HBase 的/ HColumnDescriptor;
##### [?] class HColumnDescriptor (1)
| Change | Result |
| --- | --- |
| 返回值類型已從 HColumnDescriptor []更改為 client.ColumnFamilyDescriptor []。 | This method has been removed because the return type is part of the method signature. A client program may be interrupted by NoSuchMethodError exception. |
##### [ - ] HTableDescriptor.getCoprocessors():List <string>(1)</string>
組織/阿帕奇/ hadoop 的/ HBase 的/ HTableDescriptor.getCoprocessors :()Ljava / util 的/列表;
| Change | Result |
| --- | --- |
| 返回值類型已從 java.util.List <java.lang.string>更改為 java.util.Collection。</java.lang.string> | This method has been removed because the return type is part of the method signature. A client program may be interrupted by NoSuchMethodError exception. |
* HBASE-12990 刪除了 MetaScanner,它被 MetaTableAccessor 取代。
##### HTableWrapper 更改:
hbase-server-1.0.0.jar,HTableWrapper.class 包 org.apache.hadoop.hbase.client
##### [ - ] HTableWrapper.createWrapper(List <htableinterface>openTables,TableName tableName,CoprocessorHost.Environment env,ExecutorService pool)[靜態]:HTableInterface 1</htableinterface>
組織/阿帕奇/的 Hadoop / HBase 的/客戶/ HTableWrapper.createWrapper:(Ljava / UTIL /列表; Lorg /阿帕奇/的 Hadoop / HBase 的/表名; Lorg /阿帕奇/的 Hadoop / HBase 的/協/ CoprocessorHost $環境; Ljava / UTIL /并發/ ExecutorService 的;)Lorg /阿帕奇/ hadoop 的/ HBase 的/客戶/ HTableInterface;
| Change | Result |
| --- | --- |
| 返回值類型已從 HTableInterface 更改為 Table。 | This method has been removed because the return type is part of the method signature. A client program may be interrupted by NoSuchMethodError exception. |
* HBASE-12586:刪除所有公共 HTable 構造函數并刪除 ConnectionManager#{delete,get} Connection。
* HBASE-9117:刪除 HTablePool 和所有與 HConnection 池相關的 API。
* HBASE-13214:從 HTable 類中刪除不推薦使用和未使用的方法以下是對 Table 接口的更改:
##### [ - ]界面表(4)
| Change | Result |
| --- | --- |
| 已從此界面中刪除抽象方法批處理(List&lt;?&gt;)。 | A client program may be interrupted by NoSuchMethodError exception. |
| 已從此界面中刪除抽象方法 batchCallback(List&lt;?&gt;,Batch.Callback <r>)。</r> | A client program may be interrupted by NoSuchMethodError exception. |
| 已從此接口中刪除抽象方法 getWriteBufferSize()。 | A client program may be interrupted by NoSuchMethodError exception. |
| 已從此接口中刪除抽象方法 setWriteBufferSize(long)。 | A client program may be interrupted by NoSuchMethodError exception. |
#### 203.2.13。表(在 1.0.1 中)中不推薦使用緩沖區方法,在 2.0.0 中刪除
* HBASE-13298-澄清表。{set | get} WriteBufferSize()是否已棄用。
* LockTimeoutException 和 OperationConflictException 類已被刪除。
#### 203.2.14。 class OperationConflictException(1)
| Change | Result |
| --- | --- |
| 此課程已被刪除。 | NoClassDefFoundErrorexception 可能會中斷客戶端程序。 |
#### 203.2.15。 class class LockTimeoutException(1)
| Change | Result |
| --- | --- |
| This class has been removed. | A client program may be interrupted by NoClassDefFoundErrorexception. |
#### 203.2.16。過濾 API 更改:
已刪除以下方法:package org.apache.hadoop.hbase.filter
##### [ - ]類過濾器(2)
| Change | Result |
| --- | --- |
| 已從此類中刪除抽象方法 getNextKeyHint(KeyValue)。 | A client program may be interrupted by NoSuchMethodError exception. |
| 已從此類中刪除抽象方法 transform(KeyValue)。 | A client program may be interrupted by NoSuchMethodError exception. |
* HBASE-12296 過濾器應該與 ByteBufferedCell 一起使用。
* HBase 2.0 中刪除了 HConnection。
* RegionLoad 和 ServerLoad 在內部移動到著色的 PB。
##### [ - ] class RegionLoad(1)
| Change | Result |
| --- | --- |
| 字段 regionLoadPB 的類型已從 protobuf.generated.ClusterStatusProtos.RegionLoad 更改為 shaded.protobuf.generated.ClusterStatusProtos.RegionLoad。 | A client program may be interrupted by NoSuchFieldError exception. |
* HBASE-15783:AccessControlConstants#OP_ATTRIBUTE_ACL_STRATEGY_CELL_FIRST 不再使用。包 org.apache.hadoop.hbase.security.access
##### [ - ]接口 AccessControlConstants(3)
| Change | Result |
| --- | --- |
| 已從此接口中刪除了類型為 java.lang.String 的字段 OP_ATTRIBUTE_ACL_STRATEGY。 | A client program may be interrupted by NoSuchFieldError exception. |
| 已從此接口中刪除 byte []類型的字段 OP_ATTRIBUTE_ACL_STRATEGY_CELL_FIRST。 | A client program may be interrupted by NoSuchFieldError exception. |
| 已從此接口中刪除 byte []類型的字段 OP_ATTRIBUTE_ACL_STRATEGY_DEFAULT。 | A client program may be interrupted by NoSuchFieldError exception. |
##### ServerLoad 返回 long 而不是 int 1
hbase-client-1.0.0.jar,ServerLoad.class 包 org.apache.hadoop.hbase
##### [ - ] ServerLoad.getNumberOfRequests():int 1
組織/阿帕奇/的 Hadoop / HBase 的/ ServerLoad.getNumberOfRequests :()我
| Change | Result |
| --- | --- |
| 返回值類型已從 int 更改為 long。 | This method has been removed because the return type is part of the method signature. A client program may be interrupted by NoSuchMethodError exception. |
##### [ - ] ServerLoad.getReadRequestsCount():int 1
組織/阿帕奇/的 Hadoop / HBase 的/ ServerLoad.getReadRequestsCount :()我
| Change | Result |
| --- | --- |
| Return value type has been changed from int to long. | This method has been removed because the return type is part of the method signature. A client program may be interrupted by NoSuchMethodError exception. |
##### [ - ] ServerLoad.getTotalNumberOfRequests():int 1
組織/阿帕奇/的 Hadoop / HBase 的/ ServerLoad.getTotalNumberOfRequests :()我
| Change | Result |
| --- | --- |
| Return value type has been changed from int to long. | This method has been removed because the return type is part of the method signature. A client program may be interrupted by NoSuchMethodError exception. |
##### [ - ] ServerLoad.getWriteRequestsCount():int 1
組織/阿帕奇/的 Hadoop / HBase 的/ ServerLoad.getWriteRequestsCount :()我
| Change | Result |
| --- | --- |
| Return value type has been changed from int to long. | This method has been removed because the return type is part of the method signature. A client program may be interrupted by NoSuchMethodError exception. |
* HBASE-13636 刪除 HBASE-4072 的棄用(閱讀 zoo.cfg)
* HConstants 被刪除。 HBASE-16040 刪除配置“hbase.replication”
##### [ - ]班級 HConstants(6)
| Change | Result |
| --- | --- |
| 已從此類中刪除類型為 boolean 的字段 DEFAULT_HBASE_CONFIG_READ_ZOOKEEPER_CONFIG。 | A client program may be interrupted by NoSuchFieldError exception. |
| 已從此類中刪除了類型為 java.lang.String 的字段 HBASE_CONFIG_READ_ZOOKEEPER_CONFIG。 | A client program may be interrupted by NoSuchFieldError exception. |
| 已從此類中刪除類型為 boolean 的字段 REPLICATION_ENABLE_DEFAULT。 | A client program may be interrupted by NoSuchFieldError exception. |
| 已從此類中刪除 java.lang.String 類型的字段 REPLICATION_ENABLE_KEY。 | A client program may be interrupted by NoSuchFieldError exception. |
| 已從此類中刪除了類型為 java.lang.String 的字段 ZOOKEEPER_CONFIG_NAME。 | A client program may be interrupted by NoSuchFieldError exception. |
| 已從此類中刪除了類型為 java.lang.String 的字段 ZOOKEEPER_USEMULTI。 | A client program may be interrupted by NoSuchFieldError exception. |
* HBASE-18732:[compat 1-2] HBASE-14047 刪除了 Cell 方法而沒有棄用周期。
##### [ - ]界面單元格 5
| Change | Result |
| --- | --- |
| 抽象方法 getFamily()已從此接口中刪除。 | A client program may be interrupted by NoSuchMethodError exception. |
| 抽象方法 getMvccVersion()已從此接口中刪除。 | A client program may be interrupted by NoSuchMethodError exception. |
| 抽象方法 getQualifier()已從此接口中刪除。 | A client program may be interrupted by NoSuchMethodError exception. |
| 抽象方法 getRow()已從此接口中刪除。 | A client program may be interrupted by NoSuchMethodError exception. |
| 抽象方法 getValue()已從此接口中刪除。 | A client program may be interrupted by NoSuchMethodError exception. |
* HBASE-18795:僅為測試公開 KeyValue.getBuffer()。僅在以前不推薦使用的測試中允許 KV#getBuffer。
#### 203.2.17。區域掃描儀更改:
##### [ - ]界面 RegionScanner(1)
| Change | Result |
| --- | --- |
| 已從此接口中刪除抽象方法 boolean nextRaw(List <cell>,int)。</cell> | A client program may be interrupted by NoSuchMethodError exception. |
#### 203.2.18。 StoreFile 更改:
##### [ - ]類 StoreFile(1)
| Change | Result |
| --- | --- |
| 這個類成了界面。 | 客戶端程序可能會因 IncompatibleClassChangeError 或 InstantiationError 異常而中斷,具體取決于此類的用法。 |
#### 203.2.19。 Mapreduce 更改:
HFile *格式已在 HBase 2.0 中刪除。
#### 203.2.20。 ClusterStatus 更改:
HBASE-15843:用 Set hbase-client-1.0.0.jar,ClusterStatus.class 包 org.apache.hadoop.hbase 替換 RegionState.getRegionInTransition()Map
##### [ - ] ClusterStatus.getRegionsInTransition():Map <string>1</string>
組織/阿帕奇/ hadoop 的/ HBase 的/ ClusterStatus.getRegionsInTransition :()Ljava / util 的/地圖;
| Change | Result |
| --- | --- |
| 返回值類型已從 java.util.Map <java.lang.string>更改為 java.util.List <master.regionstate>。</master.regionstate></java.lang.string> | This method has been removed because the return type is part of the method signature. A client program may be interrupted by NoSuchMethodError exception. |
ClusterStatus 中的其他更改包括刪除從 API 中清除 PB 后不再需要的轉換方法。
#### 203.2.21。從 API 中清除 PB
PBase 已在 HBase 2.0 中的 API 中棄用。
##### [ - ] HBaseSnapshotException.getSnapshotDescription():HBaseProtos.SnapshotDescription 1
組織/阿帕奇/ hadoop 的/ HBase 的/快照/ HBaseSnapshotException.getSnapshotDescription :()Lorg /阿帕奇/ hadoop 的/ HBase 的/ protobuf 的/生成/ HBaseProtos $ SnapshotDescription;
| Change | Result |
| --- | --- |
| 返回值類型已從 org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.SnapshotDescription 更改為 org.apache.hadoop.hbase.client.SnapshotDescription。 | This method has been removed because the return type is part of the method signature. A client program may be interrupted by NoSuchMethodError exception. |
* HBASE-15609:從 Result,DoubleColumnInterpreter 和 2.0 的任何此類面向公共的類中刪除 PB 引用。 hbase-client-1.0.0.jar,Result.class 包 org.apache.hadoop.hbase.client
##### [ - ] Result.getStats():ClientProtos.RegionLoadStats 1
組織/阿帕奇/ hadoop 的/ HBase 的/客戶端/ Result.getStats :()Lorg /阿帕奇/ hadoop 的/ HBase 的/ protobuf 的/生成/ ClientProtos $ RegionLoadStats;
| Change | Result |
| --- | --- |
| 返回值類型已從 org.apache.hadoop.hbase.protobuf.generated.ClientProtos.RegionLoadStats 更改為 RegionLoadStats。 | This method has been removed because the return type is part of the method signature. A client program may be interrupted by NoSuchMethodError exception. |
#### 203.2.22。 REST 更改:
hbase-rest-1.0.0.jar,Client.class 包 org.apache.hadoop.hbase.rest.client
##### [ - ] Client.getHttpClient():HttpClient 1
組織/阿帕奇/的 Hadoop / HBase 的/ REST /客戶/ Client.getHttpClient :()Lorg /阿帕奇/公/ HttpClient 的/ HttpClient 的
| Change | Result |
| --- | --- |
| 返回值類型已從 org.apache.commons.httpclient.HttpClient 更改為 org.apache.http.client.HttpClient。 | This method has been removed because the return type is part of the method signature. A client program may be interrupted by NoSuchMethodError exception. |
hbase-rest-1.0.0.jar,Response.class 包 org.apache.hadoop.hbase.rest.client
##### [ - ] Response.getHeaders():標題[] 1
組織/阿帕奇/ hadoop 的/ HBase 的/休息/客戶端/ Response.getHeaders:()[Lorg /阿帕奇/公地/ HttpClient 的/報頭;
| Change | Result |
| --- | --- |
| 返回值類型已從 org.apache.commons.httpclient.Header []更改為 org.apache.http.Header []。 | This method has been removed because the return type is part of the method signature. A client program may be interrupted by NoSuchMethodError exception. |
#### 203.2.23。 PrettyPrinter 更改:
hbase-server-1.0.0.jar,HFilePrettyPrinter.class 包 org.apache.hadoop.hbase.io.hfile
##### [ - ] HFilePrettyPrinter.processFile(Path file):void 1
組織/阿帕奇/ hadoop 的/ HBase 的/ IO / HFILE / HFilePrettyPrinter.processFile:(Lorg /阿帕奇/ hadoop 的/ FS /路徑;)V
| Change | Result |
| --- | --- |
| 返回值類型已從 void 更改為 int。 | This method has been removed because the return type is part of the method signature. A client program may be interrupted by NoSuchMethodError exception. |
#### 203.2.24。 AccessControlClient 更改:
HBASE-13171 更改 AccessControlClient 方法以接受連接對象以減少設置時間。參數已在以下方法中更改:
* hbase-client-1.2.7-SNAPSHOT.jar,AccessControlClient.class 包 org.apache.hadoop.hbase.security.access AccessControlClient.getUserPermissions(Configuration conf,String tableRegex)[靜態]:列表 <userpermission>**DEPRECATED** org / apache / hadoop / hbase / security / access / AccessControlClient.getUserPermissions:(Lorg / apache / hadoop / conf / Configuration; Ljava / lang / String;)Ljava / util / List;</userpermission>
* AccessControlClient.grant(Configuration conf,String namespace,String userName,Permission.Action ... actions)[靜態]:void **DEPRECATED** org / apache / hadoop / hbase / security / access / AccessControlClient.grant:(Lorg /阿帕奇/ Hadoop 的/ conf 目錄/配置; Ljava /朗/字符串; Ljava /朗/字符串; Lorg /阿帕奇/的 Hadoop / HBase 的/安全/訪問/權限$行動;)V
* AccessControlClient.grant(Configuration conf,String userName,Permission.Action ... actions)[靜態]:void **DEPRECATED** org / apache / hadoop / hbase / security / access / AccessControlClient.grant:(Lorg / apache / Hadoop 的/ conf 目錄/配置; Ljava /朗/字符串; Lorg /阿帕奇/的 Hadoop / HBase 的/安全/訪問/權限$行動;)V
* AccessControlClient.grant(Configuration conf,TableName tableName,String userName,byte [] family,byte [] qual,Permission.Action ... actions)[靜態]:void **DEPRECATED** org / apache / hadoop / hbase /安全/訪問/ AccessControlClient.grant:(Lorg /阿帕奇/ hadoop 的/ CONF /配置; Lorg /阿帕奇/ hadoop 的/ HBase 的/表名; Ljava /郎/字符串; [B [B [Lorg /阿帕奇/ hadoop 的/ HBase 的/安全/訪問/權限$行動;)V
* AccessControlClient.isAccessControllerRunning(Configuration conf)[靜態]:boolean **DEPRECATED** org / apache / hadoop / hbase / security / access / AccessControlClient.isAccessControllerRunning:(Lorg / apache / hadoop / conf / Configuration;)Z
* AccessControlClient.revoke(Configuration conf,String namespace,String userName,Permission.Action ... actions)[靜態]:void **DEPRECATED** org / apache / hadoop / hbase / security / access / AccessControlClient.revoke:(Lorg /阿帕奇/ Hadoop 的/ conf 目錄/配置; Ljava /朗/字符串; Ljava /朗/字符串; Lorg /阿帕奇/的 Hadoop / HBase 的/安全/訪問/權限$行動;)V
* AccessControlClient.revoke(Configuration conf,String userName,Permission.Action ... actions)[靜態]:void **DEPRECATED** org / apache / hadoop / hbase / security / access / AccessControlClient.revoke:(Lorg / apache / Hadoop 的/ conf 目錄/配置; Ljava /朗/字符串; Lorg /阿帕奇/的 Hadoop / HBase 的/安全/訪問/權限$行動;)V
* AccessControlClient.revoke(Configuration conf,TableName tableName,String username,byte [] family,byte []限定符,Permission.Action ... actions)[靜態]:void **DEPRECATED** org / apache / hadoop / hbase /安全/訪問/ AccessControlClient.revoke:(Lorg /阿帕奇/ hadoop 的/ CONF /配置; Lorg /阿帕奇/ hadoop 的/ HBase 的/表名; Ljava /郎/字符串; [B [B [Lorg /阿帕奇/ hadoop 的/ HBase 的/安全/訪問/權限$行動;)V
* HBASE-18731:[compat 1-2]標記受保護的 QuotaSettings 方法,它們將 Protobuf 內部接觸為 IA.Private
</cellblock></protobuf></protobuf></total></cellblock></protobuf></protobuf></total></protobuf></preamble>
- 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