設定 HBase - Amazon EMR

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

設定 HBase

雖然預設 HBase 設定應該適用於大多數應用程式,但您可以修改 HBase 組設設定。若要執行此操作,請使用 HBase 組態分類屬性。如需詳細資訊,請參閱設定應用程式

下列範例會以 Amazon S3 中儲存的 myConfig.json 組態檔案為基礎,建立包含備用 HBase 根目錄的叢集。

注意

包含 Linux 行接續字元 (\) 是為了提高可讀性。它們可以在 Linux 命令中移除或使用。對於 Windows,請將其移除或取代為插入符號 (^)。

aws emr create-cluster --release-label emr-7.9.0 --applications Name=HBase \ --instance-type m5.xlarge --instance-count 3 --configurations https://s3.amazonaws.com/amzn-s3-demo-bucket/myfolder/myConfig.json

myConfig.json 檔案為 hbase.rootdir 組態分類指定 hbase-site 屬性,如以下範例所示。將 ip-XXX-XX-XX-XXX.ec2.internal 取代為叢集主節點的內部 DNS 主機名稱。

[ { "Classification":"hbase-site", "Properties": { "hbase.rootdir": "hdfs://ip-XXX-XX-XX-XXX.ec2.internal:8020/user/myCustomHBaseDir" } } ]
注意

對於 Amazon EMR 版本 5.21.0 及更高版本,您可以覆寫叢集組態,並且為執行中叢集的每個執行個體群組,指定額外組態分類。您可以使用 Amazon EMR 主控台、 AWS Command Line Interface (AWS CLI) 或 AWS SDK 來執行此操作。如需詳細資訊,請參閱為執行中叢集的執行個體群組提供組態

YARN 中的記憶體分配變更

HBase 並非以 YARN 應用程式的方式執行,因此它需要重新計算分配到 YARN 及其應用程式的記憶體,若 HBase 已安裝,這會造成 YARN 可用的整體記憶體下降。當您計畫在相同叢集上共同定位 YARN 應用程式和 HBase 時,這點應該納入考量。記憶體少於 64 GB 的執行個體類型,只有一半的記憶體可供 NodeManager 使用,然後再分配給 HBase RegionServer。對於記憶體大於 64 GB 的執行個體類型,HBase RegionServer 記憶體上限為 32 GB。一般而言,YARN 設定記憶體是 MapReduce 縮減器任務記憶體的某些倍數。

任務組態設定的預設值 中的表格,顯示了根據 HBase 所需記憶體的 YARN 設定變更。

HBase 連接埠編號

有些 HBase 連接埠號碼的選擇與預設值不同。以下是 HBase on Amazon EMR 的介面和連接埠。

HBase 連接埠
介面 連線埠 通訊協定
HMaster 16000 TCP
HMaster 使用者介面 16010 HTTP
RegionServer 16020 TCP
RegionServer 資訊 16030 HTTP
REST 伺服器 8070 HTTP
REST 使用者介面 8085 HTTP
Thrift 伺服器 9090 TCP
Thrift 伺服器使用者介面 9095 HTTP
重要

在 Amazon EMR 發行版本 4.6.0 及更新版本中,kms-http-port 為 9700,且 kms-admin-port 為 9701。

HBase 網站優化設定

您可以設定任何或所有 HBase 網站設定,以為您的應用程式工作負載最佳化 HBase 叢集。在您的調查中,我們建議用以下設定做為起點。

zookeeper.session.timeout

預設逾時時間為 40 秒 (40000 毫秒)。如果某個區域伺服器損毀,這是主伺服器注意到缺少區域伺服器,並開始復原所需的時間。為了協助主伺服器更快復原,您可以將此值設定為較短的期間。下列範例會使用 30 秒或 30000 毫秒:

[ { "Classification":"hbase-site", "Properties": { "zookeeper.session.timeout": "30000" } } ]

hbase.regionserver.handler.count

這定義了區域伺服器為了向表格提供請求,而保持開啟的執行緒數量。預設值 10 為低,以防止使用者在使用大量並行用戶端的大量寫入緩衝區時,刪除其區域伺服器。依經驗而言,是當每個請求的有效負載接近 MB 範圍時 (使用大型快取的大型投入、掃描),保持此數值為低;而在有效負載很小時 (取得、小型投入、ICV、刪除),將該數值保持為高。下列範例將開放執行緒數量提升為 30:

[ { "Classification":"hbase-site", "Properties": { "hbase.regionserver.handler.count": "30" } } ]

hbase.hregion.max.filesize

此參數以位元組為單位控制個別區域的大小。預設會設定為 1073741824。如果您將大量資料寫入 HBase 叢集,造成分割更加頻繁,則可增加個別區域的大小。如此一來,資料分割的頻率便會降低;但系統需要花費更多時間,才能在各個伺服器間平衡區域負載。

[ { "Classification":"hbase-site", "Properties": { "hbase.hregion.max.filesize": "1073741824" } } ]

hbase.hregion.memstore.flush.size

此參數可在其排清至磁碟前,依位元組為單位控制記憶體大小上限。在預設情況下,大小上限為 134217728。如果工作負載包含寫入操作的瞬間突發狀況,則可能需要增加此限制,讓系統在突發狀況期間仍能保留記憶體中的所有寫入操作,並在稍後排清至磁碟。這可在突發狀況期間提高效能。

[ { "Classification":"hbase-site", "Properties": { "hbase.hregion.memstore.flush.size": "134217728" } } ]

效能考量

啟用 HBase 的 Z 垃圾收集器 (ZGC)

使用 Amazon EMR 7.10.0 版及更新版本,使用者可以順暢地為其 HBase 叢集設定垃圾回收 (GC) 設定。我們建議啟用 Z Garbage Collector (ZGC) 以達到低延遲和低於毫秒的 GC 暫停時間。

以下是啟用 ZGC for HBase RegionServer(s) 的組態:

[ { "Classification": "hbase-env", "Properties": {}, "Configurations": [ { "Classification": "export", "Properties": { "JAVA_HOME": "/usr/lib/jvm/jre-21", "HBASE_REGIONSERVER_GC_OPTS": "\"-XX:+UseZGC -XX:+ZGenerational\"" } } ] } ]
注意

使用 Generational ZGC (建議) 時必須設定 JAVA_HOME 環境變數,因為它是在 JDK 21 中引入,如果您想要使用 ZGC 的非世代模式 (不含 -XX:+ZGenerational),則不需要設定 JAVA_HOME。在 JDK 24 中,ZGC 的非世代模式已移除。

ZGC 調校

  1. 啟用 JVM 固定堆積

    使用固定堆積記憶體設定時,Z Garbage Collector (ZGC) 會更有效率地執行,消除將記憶體傳回作業系統的額外負荷。若要為您的 HBase 叢集設定固定堆積記憶體,請使用下列組態:

    [ { "Classification": "hbase", "Properties": { "hbase.regionserver.fixed.heap.enabled": "true" } } ]
  2. 啟用預先觸控

    啟用預先觸控功能可降低初始延遲並提供更可預測的效能,進而改善垃圾回收 (GC) 效能。若要為您的 HBase 叢集啟用預先觸控,請使用下列組態:

    [ { "Classification": "hbase-env", "Properties": {}, "Configurations": [ { "Classification": "export", "Properties": { "JAVA_HOME": "/usr/lib/jvm/jre-21", "HBASE_REGIONSERVER_GC_OPTS": "\"-XX:+UseZGC -XX:+ZGenerational -XX:+AlwaysPreTouch\"" } } ] } ]