HBase 在 Amazon S3 (Amazon S3 儲存模式) 上 - Amazon EMR

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

HBase 在 Amazon S3 (Amazon S3 儲存模式) 上

當您HBase在 Amazon 5.2.0 EMR版或更新版本上執行 時,您可以在 Amazon S3 HBase上啟用 ,其提供下列優點:

  • HBase 根目錄儲存在 Amazon S3 中,包括HBase存放區檔案和資料表中繼資料。此資料持續存在於叢集之外,可在 Amazon EC2可用區域使用,您不需要使用快照或其他方法復原。

  • 使用 Amazon S3 中的儲存檔案,您可以根據運算需求調整 Amazon EMR叢集的大小,而不是資料需求,並在 中使用 3 倍複寫HDFS。

  • 使用 Amazon 5.7EMR.0 版或更新版本,您可以設定僅供讀取複本叢集,這可讓您在 Amazon S3 中維護資料的唯讀複本。您可以在主叢集無法使用時,從僅供讀取複本叢集存取資料來同時執行讀取操作。

  • 在 Amazon 6.2.0 版及更新EMR版本中,持久性HFile追蹤使用稱為 HBase的系統資料表hbase:storefile直接追蹤用於讀取操作的HFile路徑。此功能預設為啟用,無需執行手動遷移。

下圖顯示 Amazon S3 HBase上與 相關的HBase元件。

HBase 在 Amazon S3 架構上。

在 Amazon S3 HBase上啟用

您可以使用 Amazon 主控台、 或 Amazon 在 Amazon S3 HBase上啟用 EMR API。 EMR AWS CLI組態在叢集建立期間是一個選項。如果您選擇使用主控台,請前往 Advanced options (進階選項) 選擇該設定。當您使用 時 AWS CLI,請使用 --configurations 選項來提供JSON組態物件。組態物件屬性指定了 Amazon S3 中的儲存模式的和根目錄位置。您指定的 Amazon S3 位置應與 Amazon EMR叢集位於相同的區域。一次只能有一個作用中叢集可以使用 Amazon S3 中的相同HBase根目錄。如需使用 的主控台步驟和詳細的 create-cluster 範例 AWS CLI,請參閱 使用 建立叢集 HBase。範例組態物件會顯示在下列程式碼JSON片段中。

{ "Classification": "hbase-site", "Properties": { "hbase.rootdir": "s3://amzn-s3-demo-bucket/my-hbase-rootdir"} }, { "Classification": "hbase", "Properties": { "hbase.emr.storageMode":"s3" } }
注意

如果您使用 Amazon S3 儲存貯體做為 rootdir的 HBase,則必須在 Amazon S3 的結尾加上斜線URI。例如,您必須使用 "hbase.rootdir: s3://amzn-s3-demo-bucket/" 而不是 "hbase.rootdir: s3://amzn-s3-demo-bucket",以避免問題。

使用僅供讀取複本叢集

在 Amazon S3 HBase上使用 設定主要叢集後,您可以建立和設定僅供讀取複本叢集,以提供與主要叢集相同資料的唯讀存取權。如果主叢集無法使用,而您需要同時存取查詢資料或不中斷存取時,這非常有用。僅供讀取複本功能適用於 Amazon 5.7.0 版及更新EMR版本。

主叢集和僅供讀取複本叢集是以相同方法設定,但僅有一處重要的不同。兩個都指向相同的 hbase.rootdir 位置。不過,僅供讀取複本叢集的 hbase 分類包含了 "hbase.emr.readreplica.enabled":"true" 屬性。

例如,由於主要叢集的JSON分類如主題前面所示,僅供讀取複本叢集的組態如下所示:

{ "Classification": "hbase-site", "Properties": { "hbase.rootdir": "s3://amzn-s3-demo-bucket/my-hbase-rootdir"} }, { "Classification": "hbase", "Properties": { "hbase.emr.storageMode":"s3", "hbase.emr.readreplica.enabled":"true" } }

在您新增資料時同步僅供讀取複本

由於僅供讀取複本使用主要叢集寫入 Amazon S3 的 HBase StoreFiles 和中繼資料,因此僅供讀取複本僅與 Amazon S3 資料存放區一樣為最新版本。當您寫入資料時,以下指導有助於降低主叢集和僅供讀取複本之間的時間延遲。

  • 盡可能在主叢集上大量載入資料。如需詳細資訊,請參閱 Apache HBase 文件中的大量載入

  • 在新增資料後,將儲存檔案寫入至 Amazon S3 的排清應盡快進行。手動排清或調整排清設定以盡量減少延遲。

  • 如果壓縮可能會自動執行,請執行手動壓縮以避免壓縮觸發時間不一致。

  • 在僅供讀取複本叢集上,當任何中繼資料變更時 - 例如,發生HBase區域分割或壓縮,或新增或移除資料表時 - 執行 refresh_meta 命令。

  • 在僅供讀取複本叢集上,當表格中新增或變更記錄時,請執行 refresh_hfiles 命令。

將資料與僅供HBase讀取複本同步

持續HFile追蹤

持續HFile追蹤使用稱為 HBase的系統資料表hbase:storefile,直接追蹤用於讀取操作的HFile路徑。當其他資料新增至 時,新HFile路徑會新增至資料表HBase。這會移除重命名操作作為關鍵寫入路徑HBase操作中的遞交機制,並透過從hbase:storefile系統資料表讀取而非檔案系統目錄清單來改善開啟HBase區域的復原時間。此功能預設為在 Amazon 6.2.0 版及更新EMR版本上啟用,不需要任何手動遷移步驟。

注意

使用 HBase Storefile 系統資料表的持續HFile追蹤不支援HBase區域複寫功能。如需HBase區域複寫的詳細資訊,請參閱時間軸一致性高可用讀取

停用持續HFile追蹤

持久性HFile追蹤預設為從 Amazon 6.2.0 EMR版開始啟用。若要停用持續HFile追蹤,請在啟動叢集時指定下列組態覆寫:

{ "Classification": "hbase-site", "Properties": { "hbase.storefile.tracking.persist.enabled":"false", "hbase.hstore.engine.class":"org.apache.hadoop.hbase.regionserver.DefaultStoreEngine" } }
注意

重新設定 Amazon EMR叢集時,必須更新所有執行個體群組。

手動同步 Storefile 資料表

HFiles 建立新的 Storefile 資料表時,會保持最新狀態。但是,如果 storefile 資料表因任何原因與資料檔案不同步,可以使用下列命令來手動同步資料:

同步線上區域的 storefile 資料表:

hbase org.apache.hadoop.hbase.client.example.RefreshHFilesClient <table>

同步離線區域的 storefile 資料表:

  • 移除 storefile 資料表 znode。

    echo "ls /hbase/storefile/loaded" | sudo -u hbase hbase zkcli [<tableName>, hbase:namespace] # The TableName exists in the list echo "delete /hbase/storefile/loaded/<tableName>" | sudo -u hbase hbase zkcli # Delete the Table ZNode echo "ls /hbase/storefile/loaded" | sudo -u hbase hbase zkcli [hbase:namespace]
  • 指派區域 (在 'hbase shell' 中執行)。

    hbase cli> assign '<region name>'
  • 如果指派失敗。

    hbase cli> disable '<table name>' hbase cli> enable '<table name>'

擴展 Storefile 資料表

依預設,storefile 資料表分成四個區域。如果 storefile 資料表仍處於繁重的寫入負載下,則可以手動進一步分割此資料表。

若要分割特定的熱區域,請使用下列命令 (在 'hbase shell' 中執行)。

hbase cli> split '<region name>'

若要分割資料表,請使用下列命令 (在 'hbase shell' 中執行)。

hbase cli> split 'hbase:storefile'

營運考量事項

HBase 區域伺服器用於 BlockCache 將資料讀取儲存在記憶體中 BucketCache ,以及將資料讀取儲存在本機磁碟上。此外,區域伺服器會使用 MemStore 來存放記憶體內資料寫入,並使用預先寫入日誌在資料寫入 Amazon S3 HBase StoreFiles HDFS之前存放資料寫入。叢集的讀取效能與從內部記憶體或磁碟快取擷取記錄的頻率有關。快取遺失會導致記錄從 Amazon S3 StoreFile 中的 讀取,相較於從 讀取,其延遲和標準差明顯較高HDFS。此外,Amazon S3 所能達成的最大請求率低於本機快取的最大請求率,因此快取資料對於大量讀取的工作負載可能很重要。如需有關 Amazon S3 效能的詳細資訊,請參閱《Amazon Simple Storage Service 使用者指南》中的效能優化

為了改善效能,我們建議您盡可能在EC2執行個體儲存中快取您的資料集。由於 BucketCache 使用區域伺服器的EC2執行個體儲存體,因此您可以選擇具有足夠EC2執行個體儲存體的執行個體類型,並新增 Amazon EBS儲存體以容納所需的快取大小。您也可以使用 hbase.bucketcache.size 屬性來增加連接執行個體存放區和EBS磁碟區BucketCache 的大小。預設設定為 8,192 MB。

對於寫入,在次要和主要壓縮期間排 MemStore 清的頻率和 StoreFiles 存在的次數可能會大幅增加區域伺服器回應時間。為了獲得最佳效能,請考慮增加MemStore 排清和HRegion區塊乘數的大小,這會增加主要壓縮之間的經過時間,但如果您使用僅供讀取複本,也會增加延遲一致性。在某些情況下,您可能會使用較大的檔案區塊大小 (但小於 5 GB) 來觸發 中的 Amazon S3 分段上傳功能,進而獲得更好的效能EMRFS。Amazon EMR的區塊大小預設為 128 MB。如需詳細資訊,請參閱HDFS 組態。我們很少看到超過 1 GB 區塊大小的客戶,同時透過排清和壓縮對效能進行基準測試。此外,當 StoreFiles 需要HBase壓縮的次數較少時,壓縮和區域伺服器會以最佳方式執行。

由於大型目錄需要重新命名,資料表可能需要很長的時間才能在 Amazon S3 上刪除。考慮停用表格,而不是刪除。

有一個HBase更乾淨的程序可清除舊WAL檔案和存放檔案。使用 Amazon EMR5.17.0 版及更新版本時,全球都會啟用清除程式,並且可以使用下列組態屬性來控制清除程式行為。

組態屬性 預設值 描述

hbase.regionserver.hfilecleaner.large.thread.count

1

配置來清除過期大型 的執行緒數目HFiles。

hbase.regionserver.hfilecleaner.small.thread.count

1

配置來清除過期小型 的執行緒數目HFiles。

hbase.cleaner.scan.dir.concurrent.size

設定為所有可用核心的四分之一。

要掃描 oldWALs 目錄的執行緒數目。

hbase.oldwals.cleaner.thread.size

2

清除 oldWALs 目錄WALs下 的執行緒數目。

使用 Amazon EMR 5.17.0 及更早版本,更乾淨的操作可能會影響執行繁重工作負載時的查詢效能,因此建議您僅在離峰時間啟用更乾淨的 。清除程式具有下列 HBase Shell 命令:

  • cleaner_chore_enabled 查詢清理工具是否已啟用。

  • cleaner_chore_run 手動執行清理工具以移除檔案。

  • cleaner_chore_switch 啟用或停用清理工具,並傳回清理工具之前的狀態。例如,cleaner_chore_switch true 啟用清理工具。

Amazon S3 效能調校HBase上的 屬性

當您HBase在 Amazon S3 上使用 時,可調整下列參數來調整工作負載的效能。

組態屬性 預設值 描述

hbase.bucketcache.size

8,192

區域伺服器上 Amazon EC2執行個體存放區和 BucketCache 儲存EBS磁碟區預留的磁碟空間量,以 MB 為單位。該設定會套用於所有區域伺服器執行個體。較大的 BucketCache 大小通常對應於改善的效能

hbase.hregion.memstore.flush.size

134217728

Memstore 排清至 Amazon S3 的資料限制 (位元組) 已觸發。

hbase.hregion.memstore.block.multiplier

4

決定封鎖更新 MemStore 上限的乘數。如果 MemStore 超過此值的hbase.hregion.memstore.flush.size乘積,則會封鎖更新。 MemStore 可能會取消封鎖更新並發生壓縮。

hbase.hstore.blockingStoreFiles

10

在封鎖更新之前,儲存體中 StoreFiles 可以存在的最大數量。

hbase.hregion.max.filesize

10737418240

在區域分割之前的大小上限。

關閉和還原叢集而不遺失資料

若要關閉 Amazon EMR叢集,而不會遺失尚未寫入 Amazon S3 的資料,您應該將 MemStore 快取排清至 Amazon S3 以寫入新的存放區檔案。首先,您需要停用所有資料表。當您新增步驟到叢集時,可以使用以下步驟組態。如需詳細資訊,請參閱 Amazon AWS CLI 管理指南 中的使用 和 主控台的步驟 EMR

Name="Disable all tables",Jar="command-runner.jar",Args=["/bin/bash","/usr/lib/hbase/bin/disable_all_tables.sh"]

或者,您也可以直接執行下列 bash 命令。

bash /usr/lib/hbase/bin/disable_all_tables.sh

停用所有資料表後,請使用 HBase shell 和下列命令排清hbase:meta資料表。

flush 'hbase:meta'

然後,您可以執行 Amazon EMR叢集上提供的 Shell 指令碼來排清MemStore 快取。您可以新增它作為步驟,或使用叢集上的 AWS CLI來直接執行。指令碼會停用所有HBase資料表,這會導致每個區域伺服器中的 MemStore排清至 Amazon S3。如果該指令碼成功完成,則該資料將保留在 Amazon S3 中,且叢集可以終止。

若要重新啟動具有相同HBase資料的叢集,請在 或使用 AWS Management Console hbase.rootdir組態屬性,指定與上一個叢集相同的 Amazon S3 位置。