国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

大數(shù)據(jù)HBase學(xué)習(xí)圣經(jīng):一本書實(shí)現(xiàn)HBase學(xué)習(xí)自由

這篇具有很好參考價(jià)值的文章主要介紹了大數(shù)據(jù)HBase學(xué)習(xí)圣經(jīng):一本書實(shí)現(xiàn)HBase學(xué)習(xí)自由。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

學(xué)習(xí)目標(biāo):三棲合一架構(gòu)師

本文是《大數(shù)據(jù)HBase學(xué)習(xí)圣經(jīng)》 V1版本,是 《尼恩 大數(shù)據(jù) 面試寶典》姊妹篇。

這里特別說明一下:《尼恩 大數(shù)據(jù) 面試寶典》5個(gè)專題 PDF 自首次發(fā)布以來, 已經(jīng)匯集了 好幾百題,大量的大廠面試干貨、正貨 。 《尼恩 大數(shù)據(jù) 面試寶典》面試題集合, 將變成大數(shù)據(jù)學(xué)習(xí)和面試的必讀書籍。

于是,尼恩架構(gòu)團(tuán)隊(duì) 趁熱打鐵,推出 《大數(shù)據(jù)Flink學(xué)習(xí)圣經(jīng)》,《大數(shù)據(jù)HBASE學(xué)習(xí)圣經(jīng)》(本文)

《大數(shù)據(jù)HBase學(xué)習(xí)圣經(jīng)》 后面會不斷升級,不斷 迭代, 變成大數(shù)據(jù)領(lǐng)域 學(xué)習(xí)和面試的必讀書籍,

最終,幫助大家成長為 三棲合一架構(gòu)師,進(jìn)大廠,拿高薪。

大數(shù)據(jù)HBase學(xué)習(xí)圣經(jīng):一本書實(shí)現(xiàn)HBase學(xué)習(xí)自由,技術(shù)圣經(jīng),面試,大數(shù)據(jù),hbase,面試,后端,架構(gòu),java,分布式

《尼恩 架構(gòu)筆記》《尼恩高并發(fā)三部曲》《尼恩Java面試寶典》的PDF,請到公號【技術(shù)自由圈】獲取

“Java+大數(shù)據(jù)” 雙棲架構(gòu)成功案例

成功案例1:

驚天大逆襲:失業(yè)4個(gè)月,3年小伙1個(gè)月喜提架構(gòu)Offer,而且是大齡跨行,超級牛

成功案例2:

極速拿offer:阿里P6被裁后極速上岸,1個(gè)月內(nèi)喜提2優(yōu)質(zhì)offer(含滴滴)

1. 引言

在當(dāng)今數(shù)字化的時(shí)代,數(shù)據(jù)已經(jīng)成為了推動商業(yè)、科研和社會發(fā)展的關(guān)鍵資源。隨著互聯(lián)網(wǎng)、物聯(lián)網(wǎng)和傳感器技術(shù)的快速發(fā)展,大規(guī)模數(shù)據(jù)的產(chǎn)生呈爆炸式增長,這種數(shù)據(jù)潮流已經(jīng)超越了傳統(tǒng)關(guān)系型數(shù)據(jù)庫的處理能力。在這個(gè)新的數(shù)據(jù)格局下,分布式NoSQL數(shù)據(jù)庫逐漸嶄露頭角,成為了解決大數(shù)據(jù)存儲和處理難題的利器。

1.1 數(shù)據(jù)的價(jià)值與挑戰(zhàn)

數(shù)據(jù)已經(jīng)成為當(dāng)今世界的黃金,企業(yè)通過數(shù)據(jù)分析來洞察市場趨勢、預(yù)測客戶行為,科學(xué)家利用數(shù)據(jù)來研究氣候變化、疾病傳播等重要議題。然而,這種數(shù)據(jù)的大量涌現(xiàn)也帶來了巨大的挑戰(zhàn)。傳統(tǒng)的關(guān)系型數(shù)據(jù)庫往往無法應(yīng)對數(shù)據(jù)規(guī)模的快速擴(kuò)張,其數(shù)據(jù)模型和架構(gòu)無法滿足大規(guī)模數(shù)據(jù)存儲和高性能處理的需求。

1.2 NoSQL數(shù)據(jù)庫的崛起

為了應(yīng)對這一挑戰(zhàn),分布式NoSQL(Not Only SQL)數(shù)據(jù)庫應(yīng)運(yùn)而生。與傳統(tǒng)關(guān)系型數(shù)據(jù)庫不同,NoSQL數(shù)據(jù)庫采用了更加靈活的數(shù)據(jù)模型和分布式架構(gòu),能夠有效地處理海量數(shù)據(jù),并且能夠水平擴(kuò)展以滿足不斷增長的需求。主流的NoSQL數(shù)據(jù)庫如MongoDB、Cassandra和HBase等各自擁有獨(dú)特的特點(diǎn),適用于不同的應(yīng)用場景。

1.3 引入HBase

在眾多NoSQL數(shù)據(jù)庫中,HBase以其出色的大數(shù)據(jù)存儲和實(shí)時(shí)查詢能力而備受矚目。HBase是一款開源的分布式、可擴(kuò)展、高性能的NoSQL數(shù)據(jù)庫,構(gòu)建在Hadoop生態(tài)系統(tǒng)之上。它以其在處理海量數(shù)據(jù)和實(shí)現(xiàn)隨機(jī)訪問方面的卓越表現(xiàn)而引起廣泛關(guān)注。通過使用HBase,用戶能夠輕松地存儲、管理和檢索海量數(shù)據(jù),從而在大數(shù)據(jù)時(shí)代獲得更多的商業(yè)和科研價(jià)值。

1.4 本文的目標(biāo)

本文旨在為初學(xué)者提供關(guān)于HBase的基礎(chǔ)知識,幫助他們了解HBase的特點(diǎn)、適用場景以及基本操作。從HBase的概述到高級操作,我們將逐步引導(dǎo)大家深入了解這個(gè)強(qiáng)大的分布式NoSQL數(shù)據(jù)庫,在大數(shù)據(jù)領(lǐng)域的探索之旅提供支持和指引。

2. HBase概述

2.1 什么是HBase?

HBase(Hadoop Database的縮寫)是一個(gè)開源的分布式、可擴(kuò)展、高性能的NoSQL數(shù)據(jù)庫,它是基于Google的Bigtable論文設(shè)計(jì)而來,構(gòu)建在Hadoop生態(tài)系統(tǒng)之上。HBase的設(shè)計(jì)目標(biāo)是為了處理海量數(shù)據(jù),并且在這些數(shù)據(jù)上實(shí)現(xiàn)高效的實(shí)時(shí)隨機(jī)訪問。相比傳統(tǒng)的關(guān)系型數(shù)據(jù)庫,HBase提供了更適合大規(guī)模數(shù)據(jù)處理的數(shù)據(jù)模型和架構(gòu)。

2.2 HBase的特點(diǎn)

HBase具備許多獨(dú)特的特點(diǎn),使其成為處理大規(guī)模數(shù)據(jù)的理想選擇:

  • 分布式架構(gòu): HBase使用分布式架構(gòu),數(shù)據(jù)被分割成多個(gè)Region并分布在多個(gè)RegionServer上。這使得HBase可以水平擴(kuò)展,支持海量數(shù)據(jù)的存儲和處理。
  • 列式存儲: HBase采用列式存儲,數(shù)據(jù)按列存儲在磁盤上,這種方式有助于節(jié)約存儲空間和提高查詢效率。
  • 稀疏數(shù)據(jù): HBase支持稀疏數(shù)據(jù),這意味著每一行數(shù)據(jù)不需要都包含相同的列,這對于處理具有不同屬性的數(shù)據(jù)非常有用。
  • 實(shí)時(shí)隨機(jī)訪問: HBase支持實(shí)時(shí)的隨機(jī)讀寫操作,使其適用于需要低延遲的應(yīng)用場景,如實(shí)時(shí)分析和數(shù)據(jù)查詢。
  • 強(qiáng)一致性: HBase提供強(qiáng)一致性的數(shù)據(jù)訪問,可以確保數(shù)據(jù)的準(zhǔn)確性和一致性。

2.3 HBase與傳統(tǒng)關(guān)系型數(shù)據(jù)庫的區(qū)別

HBase與傳統(tǒng)的關(guān)系型數(shù)據(jù)庫在數(shù)據(jù)模型和架構(gòu)上存在顯著的區(qū)別:

  • 數(shù)據(jù)模型: 傳統(tǒng)關(guān)系型數(shù)據(jù)庫使用表格模型,數(shù)據(jù)以結(jié)構(gòu)化的行和列的方式存儲。而HBase使用了Bigtable模型,將數(shù)據(jù)按照列族存儲,每個(gè)列族可以包含多個(gè)列。
  • 架構(gòu): 傳統(tǒng)關(guān)系型數(shù)據(jù)庫通常以單機(jī)為基礎(chǔ),隨著數(shù)據(jù)增長,可能需要進(jìn)行垂直擴(kuò)展。而HBase采用分布式架構(gòu),支持水平擴(kuò)展,可以輕松處理大規(guī)模數(shù)據(jù)。
  • 查詢語言: 傳統(tǒng)關(guān)系型數(shù)據(jù)庫使用SQL進(jìn)行查詢,而HBase沒有提供SQL查詢語言。查詢HBase數(shù)據(jù)通常需要編寫Java或其他編程語言的代碼。
  • 靈活性: HBase在數(shù)據(jù)模型和架構(gòu)上更加靈活,適用于存儲和處理各種類型的數(shù)據(jù),包括結(jié)構(gòu)化、半結(jié)構(gòu)化和非結(jié)構(gòu)化數(shù)據(jù)。

2.4 HBase的應(yīng)用場景

HBase作為一款分布式、高性能的NoSQL數(shù)據(jù)庫,適用于多種應(yīng)用場景,特別是在處理大規(guī)模數(shù)據(jù)和需要實(shí)時(shí)隨機(jī)訪問的情況下,它發(fā)揮著重要的作用。

2.4.1 大數(shù)據(jù)存儲與處理

HBase的分布式架構(gòu)使其非常適合存儲和處理大規(guī)模數(shù)據(jù)。在大數(shù)據(jù)應(yīng)用中,數(shù)據(jù)量可能達(dá)到甚至超過PB級,傳統(tǒng)的關(guān)系型數(shù)據(jù)庫很難勝任。HBase的分布式存儲和自動水平擴(kuò)展能力,使得它能夠輕松應(yīng)對這種大規(guī)模數(shù)據(jù)的存儲和查詢需求。

2.4.2 實(shí)時(shí)數(shù)據(jù)分析

對于需要實(shí)時(shí)數(shù)據(jù)分析的場景,HBase也具備優(yōu)勢。實(shí)時(shí)數(shù)據(jù)分析要求系統(tǒng)能夠迅速地查詢和獲取數(shù)據(jù),而HBase支持實(shí)時(shí)的隨機(jī)讀寫操作,使其能夠在數(shù)據(jù)到達(dá)時(shí)即時(shí)分析,并得出有價(jià)值的結(jié)論。

2.4.3 日志數(shù)據(jù)存儲

很多應(yīng)用產(chǎn)生大量的日志數(shù)據(jù),這些數(shù)據(jù)在很大程度上是非結(jié)構(gòu)化的,而且需要長期保留以便后續(xù)分析。HBase的稀疏數(shù)據(jù)模型和高效的存儲能力使得它成為了存儲這些日志數(shù)據(jù)的理想選擇。通過HBase,您可以方便地存儲、檢索和分析海量的日志數(shù)據(jù)。

2.4.4 時(shí)序數(shù)據(jù)存儲

時(shí)序數(shù)據(jù)是時(shí)間序列的數(shù)據(jù),如傳感器數(shù)據(jù)、股票價(jià)格、氣象數(shù)據(jù)等。HBase的分布式架構(gòu)和實(shí)時(shí)查詢能力,使其非常適合存儲和處理時(shí)序數(shù)據(jù)。您可以根據(jù)時(shí)間戳進(jìn)行快速查詢,支持快速的歷史數(shù)據(jù)回溯和實(shí)時(shí)監(jiān)控。

2.4.5 高并發(fā)隨機(jī)訪問

一些應(yīng)用需要支持高并發(fā)的隨機(jī)訪問,傳統(tǒng)關(guān)系型數(shù)據(jù)庫往往無法滿足這種需求。HBase的設(shè)計(jì)目標(biāo)之一就是實(shí)現(xiàn)高性能的實(shí)時(shí)隨機(jī)訪問,它的分布式架構(gòu)和列式存儲使得它能夠輕松應(yīng)對高并發(fā)的讀寫請求。

2.4.6 全文搜索

雖然HBase不是一款專門的全文搜索引擎,但在某些情況下,它也可以用于存儲全文索引數(shù)據(jù)。通過將索引數(shù)據(jù)存儲在HBase中,您可以實(shí)現(xiàn)基于關(guān)鍵詞的快速檢索。

總之,HBase的應(yīng)用場景廣泛,尤其在處理大規(guī)模數(shù)據(jù)、實(shí)時(shí)性要求高和隨機(jī)訪問頻繁的場景下,它能夠發(fā)揮出其強(qiáng)大的特點(diǎn)。從存儲日志數(shù)據(jù)到實(shí)時(shí)數(shù)據(jù)分析,從時(shí)序數(shù)據(jù)存儲到高并發(fā)隨機(jī)訪問,HBase都能夠?yàn)槟峁┛煽康慕鉀Q方案。接下來,我們將深入探討如何安裝和配置HBase,為您搭建一個(gè)高效的數(shù)據(jù)存儲和處理環(huán)境。

3. 安裝與配置

參考 Apache HBase 配置_Hbase 中文文檔

HBase的安裝是您開始使用這個(gè)強(qiáng)大數(shù)據(jù)庫的第一步。在本節(jié)中,我們將為您介紹HBase的安裝方式,并詳細(xì)說明如何在不同模式下進(jìn)行安裝和配置。

3.1 HBase安裝方式概述

HBase的安裝可以分為以下幾種方式:

  1. 本地模式(Standalone Mode): 本地模式是最簡單的安裝方式,適用于在本地單機(jī)上進(jìn)行開發(fā)和測試。在本地模式下,HBase將運(yùn)行在單一的Java進(jìn)程中,數(shù)據(jù)存儲在本地文件系統(tǒng)。
  2. 完全分布式模式(Fully-Distributed Mode): 完全分布式模式是在真實(shí)的分布式環(huán)境中部署HBase的方式。在完全分布式模式下,HBase的各個(gè)組件分布在多臺計(jì)算機(jī)上,以實(shí)現(xiàn)高可用性、容錯(cuò)性和性能擴(kuò)展。

在接下來的小節(jié)中,我們將詳細(xì)說明每種安裝方式的步驟和配置方法,幫助您根據(jù)實(shí)際需求選擇合適的安裝方式。

3.2 本地模式安裝與配置

本地模式安裝非常適合初學(xué)者,它可以讓您在不投入太多配置的情況下迅速體驗(yàn)HBase的基本功能。在本地模式下,HBase將運(yùn)行在單一的Java進(jìn)程中,數(shù)據(jù)存儲在本地文件系統(tǒng)。

Hbase單節(jié)點(diǎn)配置是在沒有多臺計(jì)算機(jī)節(jié)點(diǎn)的情況下,對Hbase的分布式存儲和計(jì)算進(jìn)行模擬安裝和配置。通過在一臺計(jì)算機(jī)節(jié)點(diǎn)上解壓Hbase安裝壓縮包后,然后進(jìn)行Hbase相關(guān)文件進(jìn)行配置,讓Hbase運(yùn)行在一臺機(jī)器上并實(shí)現(xiàn)對數(shù)據(jù)存儲和計(jì)算的測試支持。默認(rèn)情況下,Hbase運(yùn)行在單機(jī)模式下。在單機(jī)模式中,Hbase使用本地文件系統(tǒng),而不是HDFS。

步驟:

  1. 準(zhǔn)備環(huán)境
    確保您的系統(tǒng)上已經(jīng)安裝了Java Development Kit(JDK)。HBase需要Java運(yùn)行環(huán)境。
  2. 下載HBase
    Index of /dist/hbase/2.5.5 (apache.org)
  3. 解壓縮HBase壓縮包
    在您選擇的目錄中解壓縮下載的HBase壓縮包。您可以使用以下命令(假設(shè)您的壓縮包是hbase-x.x.x.tar.gz):
tar -xzvf hbase-2.5.5-bin.tar.gz
  1. 配置HBase
    進(jìn)入解壓縮后的HBase目錄,編輯conf/hbase-site.xml文件以進(jìn)行配置。以下是一個(gè)示例配置:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
    <property>
        <name>hbase.rootdir</name>
        <value>file:///home/docker/hbase/data</value>
    </property>
    <property>
        <name>hbase.zookeeper.property.dataDir</name>
        <value>/home/docker/hbase/zookeeper</value>
    </property>
</configuration>

請?zhí)鎿Q上述示例中的路徑為您實(shí)際希望存儲數(shù)據(jù)的路徑。

  1. 啟動HBase
    打開終端,導(dǎo)航到HBase目錄,然后運(yùn)行以下命令來啟動HBase:
./bin/start-hbase.sh
  1. 訪問HBase Shell
    您可以使用HBase Shell與本地模式下的HBase進(jìn)行交互。在終端中,運(yùn)行以下命令:
./bin/hbase shell

這將打開HBase Shell,您可以在其中執(zhí)行HBase命令。

  1. 停止HBase
    要停止HBase,回到終端,導(dǎo)航到HBase目錄,然后運(yùn)行以下命令:
./bin/stop-hbase.sh

這些步驟將在本地模式下安裝和運(yùn)行HBase。請注意,本地模式下的HBase不適用于生產(chǎn)環(huán)境,但可以用于學(xué)習(xí)和開發(fā)目的。如果您要在分布式環(huán)境中使用HBase,需要進(jìn)行更詳細(xì)的配置和設(shè)置。

3.3 完全分布式模式安裝與配置

完全分布式模式是在真實(shí)的分布式環(huán)境中部署HBase的方式,它適用于需要處理大規(guī)模數(shù)據(jù)和實(shí)現(xiàn)高可用性的場景。在完全分布式模式下,HBase的各個(gè)組件分布在多臺計(jì)算機(jī)上,通過配置實(shí)現(xiàn)高可用性、容錯(cuò)性和性能擴(kuò)展。

  1. 部署 docker
# 安裝yum-config-manager配置工具
yum -y install yum-utils

# 建議使用阿里云yum源:(推薦)
#yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 安裝docker-ce版本
yum install -y docker-ce
# 啟動并開機(jī)啟動
systemctl enable --now docker
docker --version
  1. 部署 docker-compose
curl -SL https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose
docker-compose --version
  1. 創(chuàng)建網(wǎng)絡(luò)
# 創(chuàng)建,注意不能使用hadoop_network,要不然啟動hs2服務(wù)的時(shí)候會有問題?。。?/span>
docker network create hadoop-network

# 查看
docker network ls
  1. 部署zookeeper
    創(chuàng)建目錄和文件
[root@cdh1 zookeeper]# tree
.
├── docker-compose.yml
├── zk1
├── zk2
└── zk3

3 directories, 1 file

docker-compose.yml

version: '3.7'
   
# 給zk集群配置一個(gè)網(wǎng)絡(luò),網(wǎng)絡(luò)名為hadoop-network
networks:
  hadoop-network:
    external: true
  
# 配置zk集群的
# container services下的每一個(gè)子配置都對應(yīng)一個(gè)zk節(jié)點(diǎn)的docker container
services:
  zk1:
    # docker container所使用的docker image
    image: zookeeper
    hostname: zk1
    container_name: zk1
    restart: always
    # 配置docker container和宿主機(jī)的端口映射
    ports:
      - 2181:2181
      - 28081:8080
    # 配置docker container的環(huán)境變量
    environment:
      # 當(dāng)前zk實(shí)例的id
      ZOO_MY_ID: 1
      # 整個(gè)zk集群的機(jī)器、端口列表
      ZOO_SERVERS: server.1=0.0.0.0:2888:3888;2181 server.2=zk2:2888:3888;2181 server.3=zk3:2888:3888;2181
    # 將docker container上的路徑掛載到宿主機(jī)上 實(shí)現(xiàn)宿主機(jī)和docker container的數(shù)據(jù)共享
    volumes:
      - ./zk1/data:/data
      - ./zk1/datalog:/datalog
    # 當(dāng)前docker container加入名為zk-net的隔離網(wǎng)絡(luò)
    networks:
      - hadoop-network
   
  zk2:
    image: zookeeper
    hostname: zk2
    container_name: zk2
    restart: always
    ports:
      - 2182:2181
      - 28082:8080
    environment:
      ZOO_MY_ID: 2
      ZOO_SERVERS: server.1=zk1:2888:3888;2181 server.2=0.0.0.0:2888:3888;2181 server.3=zk3:2888:3888;2181
    volumes:
      - ./zk2/data:/data
      - ./zk2/datalog:/datalog
    networks:
      - hadoop-network
   
  zk3:
    image: zookeeper
    hostname: zk3
    container_name: zk3
    restart: always
    ports:
      - 2183:2181
      - 28083:8080
    environment:
      ZOO_MY_ID: 3
      ZOO_SERVERS: server.1=zk1:2888:3888;2181 server.2=zk2:2888:3888;2181 server.3=0.0.0.0:2888:3888;2181
    volumes:
      - ./zk3/data:/data
      - ./zk3/datalog:/datalog
    networks:
      - hadoop-network
wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.8.2/apache-zookeeper-3.8.2-bin.tar.gz --no-check-certificate

啟動

[root@cdh1 zookeeper]# docker-compose up -d
Creating zk3 ... done
Creating zk2 ... done
Creating zk1 ... done
  1. 下載Hadoop部署包
git clone https://gitee.com/hadoop-bigdata/docker-compose-hadoop.git
  1. 安裝部署 mysql5.7

    這里mysql主要是供hive存儲元數(shù)據(jù)

cd docker-compose-hadoop/mysql

docker-compose -f mysql-compose.yaml up -d

docker-compose -f mysql-compose.yaml ps

#root 密碼:123456,以下是登錄命令,注意一般在公司不能直接在命令行明文輸入密碼,要不然容易被安全抓,切記,切記?。?!
docker exec -it mysql mysql -uroot -p123456
  1. 安裝hadoop和hive
cd docker-compose-hadoop/hadoop_hive

docker-compose -f docker-compose.yaml up -d

# 查看
docker-compose -f docker-compose.yaml ps

# hive
docker exec -it hive-hiveserver2 hive -shoe "show databases";

# hiveserver2
docker exec -it hive-hiveserver2 beeline -u jdbc:hive2://hive-hiveserver2:10000  -n hadoop -e "show databases;"

啟動后,如果發(fā)現(xiàn)hadoop historyserver容器未健康啟動,可以執(zhí)行以下命令:

docker exec -it hadoop-hdfs-nn hdfs dfs -chmod 777 /tmp
docker restart hadoop-mr-historyserver 

hdfs格式化可以執(zhí)行以下命令:

[root@cdh1 ~]# docker exec -it hadoop-hdfs-nn hdfs dfsadmin -refreshNodes
Refresh nodes successful
[root@cdh1 ~]# docker exec -it hadoop-hdfs-dn-0 hdfs dfsadmin -fs hdfs://hadoop-hdfs-nn:9000 -refreshNodes
Refresh nodes successful
[root@cdh1 ~]# docker exec -it hadoop-hdfs-dn-1 hdfs dfsadmin -fs hdfs://hadoop-hdfs-nn:9000 -refreshNodes
Refresh nodes successful
[root@cdh1 ~]# docker exec -it hadoop-hdfs-dn-2 hdfs dfsadmin -fs hdfs://hadoop-hdfs-nn:9000 -refreshNodes
Refresh nodes successful

可以通過 cdh1:30070 查看HDFS分布情況

大數(shù)據(jù)HBase學(xué)習(xí)圣經(jīng):一本書實(shí)現(xiàn)HBase學(xué)習(xí)自由,技術(shù)圣經(jīng),面試,大數(shù)據(jù),hbase,面試,后端,架構(gòu),java,分布式

以及訪問http://cdh1:30888/cluster 查看yarn資源情況

大數(shù)據(jù)HBase學(xué)習(xí)圣經(jīng):一本書實(shí)現(xiàn)HBase學(xué)習(xí)自由,技術(shù)圣經(jīng),面試,大數(shù)據(jù),hbase,面試,后端,架構(gòu),java,分布式

  1. 配置Hbase參數(shù)
    mkdir conf
  • conf/hbase-env.sh
export JAVA_HOME=/opt/apache/jdk
export HBASE_CLASSPATH=/opt/apache/hbase/conf
export HBASE_MANAGES_ZK=false
  • conf/hbase-site.xml
<configuration>
    <property>
        <name>hbase.rootdir</name>
        <value>hdfs://hadoop-hdfs-nn:9000/hbase</value>
        <!-- hdfs://ns1/hbase 對應(yīng)hdfs-site.xml的dfs.nameservices屬性值 -->
    </property>

    <property>
        <name>hbase.cluster.distributed</name>
        <value>true</value>
    </property>
    <property>
        <name>hbase.zookeeper.quorum</name>
        <value>zk1,zk2,zk3</value>
    </property>
    <property>
        <name>hbase.zookeeper.property.clientPort</name>
        <value>2181</value>
    </property>

    <property>
        <name>hbase.master</name>
        <value>60000</value>
        <description>單機(jī)版需要配主機(jī)名/IP和端口,HA方式只需要配端口</description>
    </property>
    <property>
        <name>hbase.master.info.bindAddress</name>
        <value>0.0.0.0</value>
    </property>
    <property>
        <name>hbase.master.port</name>
        <value>16000</value>
    </property>
    <property>
        <name>hbase.master.info.port</name>
        <value>16010</value>
    </property>
    <property>
        <name>hbase.regionserver.port</name>
        <value>16020</value>
    </property>
    <property>
        <name>hbase.regionserver.info.port</name>
        <value>16030</value>
    </property>

    <property>
        <name>hbase.wal.provider</name>
        <value>filesystem</value> <!--也可以用multiwal-->
    </property>
</configuration>
  • conf/backup-masters
hbase-master-2
  • conf/regionservers
hbase-regionserver-1
hbase-regionserver-2
hbase-regionserver-3
  • conf/hadoop/core-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License. See accompanying LICENSE file.
  -->

<!-- Put site-specific property overrides in this file. -->

<configuration>
    <!--配置namenode的地址 -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop-hdfs-nn:9000</value>
    </property>

    <!-- 文件的緩沖區(qū)大小(128KB),默認(rèn)值是4KB -->
    <property>
        <name>io.file.buffer.size</name>
        <value>131072</value>
    </property>

    <!-- 文件系統(tǒng)垃圾桶保存時(shí)間 -->
    <property>
        <name>fs.trash.interval</name>
        <value>1440</value>
    </property>

    <!-- 配置hadoop臨時(shí)目錄,存儲元數(shù)據(jù)用的,請確保該目錄(/opt/apache/hadoop/data/hdfs/)已被手動創(chuàng)建,tmp目錄會自動創(chuàng)建 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/opt/apache/hadoop/data/hdfs/tmp</value>
    </property>

    <!--配置HDFS網(wǎng)頁登錄使用的靜態(tài)用戶為root-->
    <property>
        <name>hadoop.http.staticuser.user</name>
        <value>root</value>
    </property>

    <!--配置root(超級用戶)允許通過代理訪問的主機(jī)節(jié)點(diǎn)-->
    <property>
        <name>hadoop.proxyuser.root.hosts</name>
        <value>*</value>
    </property>

    <!--配置root(超級用戶)允許通過代理用戶所屬組-->
    <property>
        <name>hadoop.proxyuser.root.groups</name>
        <value>*</value>
    </property>

    <!--配置root(超級用戶)允許通過代理的用戶-->
    <property>
        <name>hadoop.proxyuser.root.user</name>
        <value>*</value>
    </property>

    <!--配置hive允許通過代理訪問的主機(jī)節(jié)點(diǎn)-->
    <property>
        <name>hadoop.proxyuser.hive.hosts</name>
        <value>*</value>
    </property>

    <!--配置hive允許通過代理用戶所屬組-->
    <property>
        <name>hadoop.proxyuser.hive.groups</name>
        <value>*</value>
    </property>

    <!--配置hive允許通過代理訪問的主機(jī)節(jié)點(diǎn)-->
    <property>
        <name>hadoop.proxyuser.hadoop.hosts</name>
        <value>*</value>
    </property>

    <!--配置hive允許通過代理用戶所屬組-->
    <property>
        <name>hadoop.proxyuser.hadoop.groups</name>
        <value>*</value>
    </property>
</configuration>
  • conf/hadoop/hdfs-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License. See accompanying LICENSE file.
  -->

<!-- Put site-specific property overrides in this file. -->

<configuration>
    <!-- namenode web訪問配置 -->
    <property>
        <name>dfs.namenode.http-address</name>
        <value>0.0.0.0:9870</value>
    </property>

    <!-- 必須將dfs.webhdfs.enabled屬性設(shè)置為true,否則就不能使用webhdfs的LISTSTATUS、LISTFILESTATUS等需要列出文件、文件夾狀態(tài)的命令,因?yàn)檫@些信息都是由namenode來保存的。 -->
    <property>
        <name>dfs.webhdfs.enabled</name>
        <value>true</value>
    </property>

    <property>
        <name>dfs.namenode.name.dir</name>
        <value>/opt/apache/hadoop/data/hdfs/namenode</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>/opt/apache/hadoop/data/hdfs/datanode/data1,/opt/apache/hadoop/data/hdfs/datanode/data2,/opt/apache/hadoop/data/hdfs/datanode/data3</value>
    </property>

    <property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>

    <!-- 設(shè)置SNN進(jìn)程運(yùn)行機(jī)器位置信息 -->
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>hadoop-hdfs-nn2:9868</value>
    </property>

    <property>
        <name>dfs.namenode.datanode.registration.ip-hostname-check</name>
        <value>false</value>
    </property>

    <!-- 白名單 -->
    <property>
        <name>dfs.hosts</name>
        <value>/opt/apache/hadoop/etc/hadoop/dfs.hosts</value>
    </property>

    <!-- 黑名單 -->
    <property>
        <name>dfs.hosts.exclude</name>
        <value>/opt/apache/hadoop/etc/hadoop/dfs.hosts.exclude</value>
    </property>

</configuration>

完成conf配置后,需要設(shè)置讀寫權(quán)限

chmod -R 777 conf/
  1. 編寫環(huán)境.env文件
HBASE_MASTER_PORT=16000
HBASE_MASTER_INFO_PORT=16010
HBASE_HOME=/opt/apache/hbase
HBASE_REGIONSERVER_PORT=16020
  1. 編排docker-compose.yaml
version: '3'
services:
  hbase-master-1:
    image: registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/hbase:2.5.4
    user: "hadoop:hadoop"
    container_name: hbase-master-1
    hostname: hbase-master-1
    restart: always
    privileged: true
    env_file:
      - .env
    volumes:
      - ./conf/hbase-env.sh:${HBASE_HOME}/conf/hbase-env.sh
      - ./conf/hbase-site.xml:${HBASE_HOME}/conf/hbase-site.xml
      - ./conf/backup-masters:${HBASE_HOME}/conf/backup-masters
      - ./conf/regionservers:${HBASE_HOME}/conf/regionservers
      - ./conf/hadoop/core-site.xml:${HBASE_HOME}/conf/core-site.xml
      - ./conf/hadoop/hdfs-site.xml:${HBASE_HOME}/conf/hdfs-site.xml
    ports:
      - "36010:${HBASE_MASTER_PORT}"
      - "36020:${HBASE_MASTER_INFO_PORT}"
    command: ["sh","-c","/opt/apache/bootstrap.sh hbase-master"]
    networks:
      - hadoop-network
    healthcheck:
      test: ["CMD-SHELL", "netstat -tnlp|grep :${HBASE_MASTER_PORT} || exit 1"]
      interval: 10s
      timeout: 20s
      retries: 3
  hbase-master-2:
    image: registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/hbase:2.5.4
    user: "hadoop:hadoop"
    container_name: hbase-master-2
    hostname: hbase-master-2
    restart: always
    privileged: true
    env_file:
      - .env
    volumes:
      - ./conf/hbase-env.sh:${HBASE_HOME}/conf/hbase-env.sh
      - ./conf/hbase-site.xml:${HBASE_HOME}/conf/hbase-site.xml
      - ./conf/backup-masters:${HBASE_HOME}/conf/backup-masters
      - ./conf/regionservers:${HBASE_HOME}/conf/regionservers
      - ./conf/hadoop/core-site.xml:${HBASE_HOME}/conf/core-site.xml
      - ./conf/hadoop/hdfs-site.xml:${HBASE_HOME}/conf/hdfs-site.xml
    ports:
      - "36011:${HBASE_MASTER_PORT}"
      - "36021:${HBASE_MASTER_INFO_PORT}"
    command: ["sh","-c","/opt/apache/bootstrap.sh hbase-master hbase-master-1 ${HBASE_MASTER_PORT}"]
    networks:
      - hadoop-network
    healthcheck:
      test: ["CMD-SHELL", "netstat -tnlp|grep :${HBASE_MASTER_PORT} || exit 1"]
      interval: 10s
      timeout: 20s
      retries: 3
  hbase-regionserver-1:
    image: registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/hbase:2.5.4
    user: "hadoop:hadoop"
    container_name: hbase-regionserver-1
    hostname: hbase-regionserver-1
    restart: always
    privileged: true
    env_file:
      - .env
    volumes:
      - ./conf/hbase-env.sh:${HBASE_HOME}/conf/hbase-env.sh
      - ./conf/hbase-site.xml:${HBASE_HOME}/conf/hbase-site.xml
      - ./conf/backup-masters:${HBASE_HOME}/conf/backup-masters
      - ./conf/regionservers:${HBASE_HOME}/conf/regionservers
      - ./conf/hadoop/core-site.xml:${HBASE_HOME}/conf/core-site.xml
      - ./conf/hadoop/hdfs-site.xml:${HBASE_HOME}/conf/hdfs-site.xml
    ports:
      - "36030:${HBASE_REGIONSERVER_PORT}"
    command: ["sh","-c","/opt/apache/bootstrap.sh hbase-regionserver hbase-master-1 ${HBASE_MASTER_PORT}"]
    networks:
      - hadoop-network
    healthcheck:
      test: ["CMD-SHELL", "netstat -tnlp|grep :${HBASE_REGIONSERVER_PORT} || exit 1"]
      interval: 10s
      timeout: 10s
      retries: 3
  hbase-regionserver-2:
    image: registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/hbase:2.5.4
    user: "hadoop:hadoop"
    container_name: hbase-regionserver-2
    hostname: hbase-regionserver-2
    restart: always
    privileged: true
    env_file:
      - .env
    volumes:
      - ./conf/hbase-env.sh:${HBASE_HOME}/conf/hbase-env.sh
      - ./conf/hbase-site.xml:${HBASE_HOME}/conf/hbase-site.xml
      - ./conf/backup-masters:${HBASE_HOME}/conf/backup-masters
      - ./conf/regionservers:${HBASE_HOME}/conf/regionservers
      - ./conf/hadoop/core-site.xml:${HBASE_HOME}/conf/core-site.xml
      - ./conf/hadoop/hdfs-site.xml:${HBASE_HOME}/conf/hdfs-site.xml
    ports:
      - "36031:${HBASE_REGIONSERVER_PORT}"
    command: ["sh","-c","/opt/apache/bootstrap.sh hbase-regionserver hbase-master-1 ${HBASE_MASTER_PORT}"]
    networks:
      - hadoop-network
    healthcheck:
      test: ["CMD-SHELL", "netstat -tnlp|grep :${HBASE_REGIONSERVER_PORT} || exit 1"]
      interval: 10s
      timeout: 10s
      retries: 3
  hbase-regionserver-3:
    image: registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/hbase:2.5.4
    user: "hadoop:hadoop"
    container_name: hbase-regionserver-3
    hostname: hbase-regionserver-3
    restart: always
    privileged: true
    env_file:
      - .env
    volumes:
      - ./conf/hbase-env.sh:${HBASE_HOME}/conf/hbase-env.sh
      - ./conf/hbase-site.xml:${HBASE_HOME}/conf/hbase-site.xml
      - ./conf/backup-masters:${HBASE_HOME}/conf/backup-masters
      - ./conf/regionservers:${HBASE_HOME}/conf/regionservers
      - ./conf/hadoop/core-site.xml:${HBASE_HOME}/conf/core-site.xml
      - ./conf/hadoop/hdfs-site.xml:${HBASE_HOME}/conf/hdfs-site.xml
    ports:
      - "36032:${HBASE_REGIONSERVER_PORT}"
    command: ["sh","-c","/opt/apache/bootstrap.sh hbase-regionserver hbase-master-1 ${HBASE_MASTER_PORT}"]
    networks:
      - hadoop-network
    healthcheck:
      test: ["CMD-SHELL", "netstat -tnlp|grep :${HBASE_REGIONSERVER_PORT} || exit 1"]
      interval: 10s
      timeout: 10s
      retries: 3
   
# 連接外部網(wǎng)絡(luò)
networks:
  hadoop-network:
    external: true
  1. 開始部署
    當(dāng)前目錄結(jié)構(gòu)如下:
[root@cdh1 hbase]# tree
.
├── .env
├── conf
│   ├── backup-masters
│   ├── hadoop
│   │   ├── core-site.xml
│   │   └── hdfs-site.xml
│   ├── hbase-env.sh
│   ├── hbase-site.xml
│   └── regionservers
├── docker-compose.yaml

啟動:

docker-compose -f docker-compose.yaml up -d

# 查看
docker-compose -f docker-compose.yaml ps

[root@cdh1 hbase]# docker-compose ps
Name                      Command                  State                                                 Ports
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
hbase-master-1         sh -c /opt/apache/bootstra ...   Up (healthy)   0.0.0.0:36010->16000/tcp,:::36010->16000/tcp, 0.0.0.0:36020->16010/tcp,:::36020->16010/tcp
hbase-master-2         sh -c /opt/apache/bootstra ...   Up (healthy)   0.0.0.0:36011->16000/tcp,:::36011->16000/tcp, 0.0.0.0:36021->16010/tcp,:::36021->16010/tcp
hbase-regionserver-1   sh -c /opt/apache/bootstra ...   Up (healthy)   0.0.0.0:36030->16020/tcp,:::36030->16020/tcp
hbase-regionserver-2   sh -c /opt/apache/bootstra ...   Up (healthy)   0.0.0.0:36031->16020/tcp,:::36031->16020/tcp
hbase-regionserver-3   sh -c /opt/apache/bootstra ...   Up (healthy)   0.0.0.0:36032->16020/tcp,:::36032->16020/tcp

通過Master: hbase-master-1 訪問集群信息

大數(shù)據(jù)HBase學(xué)習(xí)圣經(jīng):一本書實(shí)現(xiàn)HBase學(xué)習(xí)自由,技術(shù)圣經(jīng),面試,大數(shù)據(jù),hbase,面試,后端,架構(gòu),java,分布式

  1. shell測試
### 進(jìn)入容器內(nèi)部
[root@cdh1 hbase]# docker exec -it hbase-master-1 bash

### 進(jìn)入shell環(huán)境
[hadoop@hbase-master-1 hbase-2.5.4]$ hbase shell
HBase Shell
Use "help" to get list of supported commands.
Use "exit" to quit this interactive shell.
For Reference, please visit: http://hbase.apache.org/2.0/book.html#shell
Version 2.5.4, r2e426ab69d126e683577b6e94f890800c5122910, Thu Apr  6 09:11:53 PDT 2023
Took 0.0012 seconds

### 簡單建表
hbase:001:0> create 'user1', 'info', 'data'
Created table user1
Took 1.6409 seconds
=> Hbase::Table - user1

### 查看表信息
hbase:002:0> desc 'user1'
Table user1 is ENABLED
user1, {TABLE_ATTRIBUTES => {METADATA => {'hbase.store.file-tracker.impl' => 'DEFAULT'}}}
COLUMN FAMILIES DESCRIPTION
{NAME => 'data', INDEX_BLOCK_ENCODING => 'NONE', VERSIONS => '1', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', MIN_VERSIONS => '
0', REPLICATION_SCOPE => '0', BLOOMFILTER => 'ROW', IN_MEMORY => 'false', COMPRESSION => 'NONE', BLOCKCACHE => 'true', BLOCKSIZE => '65536 B (64KB)'}

{NAME => 'info', INDEX_BLOCK_ENCODING => 'NONE', VERSIONS => '1', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', MIN_VERSIONS => '
0', REPLICATION_SCOPE => '0', BLOOMFILTER => 'ROW', IN_MEMORY => 'false', COMPRESSION => 'NONE', BLOCKCACHE => 'true', BLOCKSIZE => '65536 B (64KB)'}

2 row(s)
Quota is disabled
Took 0.2303 seconds

### 查看狀態(tài)
hbase:003:0> status
1 active master, 1 backup masters, 3 servers, 0 dead, 1.0000 average load
Took 0.0853 seconds    

注意,如果hbase容器啟動失敗或有異常,可以執(zhí)行以下命令

  1. 停止hbase相關(guān)容器
docker-compose down
  1. 刪除zookeeper 中 hbase 節(jié)點(diǎn)
  2. 刪除hdfs中hbase目錄
docker exec -it hadoop-hdfs-nn hdfs dfs -rm -r /hbase
  1. 重啟hbase容器

4. 數(shù)據(jù)操作

HBase作為一個(gè)分布式NoSQL數(shù)據(jù)庫,提供了豐富的數(shù)據(jù)操作方法,可通過Shell交互或Java API來執(zhí)行。在本節(jié)中,我們將詳細(xì)介紹如何在HBase中進(jìn)行表的操作、數(shù)據(jù)的增刪改查以及如何使用計(jì)數(shù)器來滿足高并發(fā)環(huán)境下的計(jì)數(shù)需求。

4.1 表操作

在HBase中,我們可以通過Shell交互或Java API執(zhí)行多種表操作。以下是每種操作的詳細(xì)示例:

  • 創(chuàng)建表:使用create命令創(chuàng)建新表,指定表名和列族等信息。
create 'my_table', 'cf1', 'cf2'

這將創(chuàng)建一個(gè)名為my_table的表,包含兩個(gè)列族cf1cf2。

  • 刪除表:先使用disable命令禁用表,然后使用delete命令刪除表。
disable 'my_table'
delete 'my_table'

這將先禁用名為my_table的表,然后刪除它。

  • 修改表結(jié)構(gòu):通過alter命令修改表結(jié)構(gòu),如添加列族、修改配置等。
alter 'my_table', NAME => 'cf3'

這將向表my_table中添加一個(gè)新的列族cf3。

  • 禁用和啟用表:使用disable命令禁用表,使用enable命令啟用表。
disable 'my_table'

這將禁用表my_table,阻止對其進(jìn)行操作。

enable 'my_table'

這將啟用之前被禁用的表my_table,使其再次可用。

  • 列出表:使用list命令列出所有表格。
list

這將顯示當(dāng)前HBase集群中存在的所有表的列表。

4.2 數(shù)據(jù)操作

HBase提供多種數(shù)據(jù)操作方法,涵蓋數(shù)據(jù)的插入、獲取、掃描、更新和刪除等操作。以下是這些操作的詳細(xì)說明和示例:

  • 插入數(shù)據(jù):使用put命令或Java API將數(shù)據(jù)插入到表中,指定行鍵、列族、列限定符和值。
put 'my_table', 'row1', 'cf1:column1', 'value1'

這將在my_table表的cf1列族的column1列中插入值為value1的數(shù)據(jù)。

  • 獲取數(shù)據(jù):使用get命令或Java API通過行鍵獲取指定單元格的數(shù)據(jù)。
get 'my_table', 'row1'

這將獲取my_table表中row1行的所有數(shù)據(jù)。

  • 掃描數(shù)據(jù):使用scan命令或Java API執(zhí)行范圍掃描,可以按行、列族、列限定符進(jìn)行過濾。
scan 'my_table', {COLUMNS => 'cf1'}

這將對my_table表進(jìn)行掃描,只顯示cf1列族的數(shù)據(jù)。

  • 更新數(shù)據(jù):使用put命令或Java API更新已有數(shù)據(jù)的值。
put 'my_table', 'row1', 'cf1:column1', 'new_value'

這將更新my_table表中row1行的cf1列族的column1列的值為new_value。

  • 刪除數(shù)據(jù):使用delete命令或Java API刪除指定單元格或行的數(shù)據(jù)。
delete 'my_table', 'row1', 'cf1:column1'

這將刪除my_table表中row1行的cf1列族的column1列數(shù)據(jù)。

4.3 計(jì)數(shù)器

計(jì)數(shù)器是HBase中用于高并發(fā)環(huán)境下計(jì)數(shù)需求的一種特殊數(shù)據(jù)類型。在許多應(yīng)用中,需要對某些數(shù)據(jù)進(jìn)行實(shí)時(shí)的增減操作,如用戶積分、庫存數(shù)量、點(diǎn)擊次數(shù)等。在這些場景下,計(jì)數(shù)器能夠提供一種高效且原子的方式來管理這些計(jì)數(shù)值。

在HBase中,計(jì)數(shù)器是通過incrementColumnValue方法來實(shí)現(xiàn)的,它允許您原子地對指定單元格中的值進(jìn)行增加或減少操作。通過指定行鍵、列族、列限定符以及要增加或減少的值,HBase能夠確保計(jì)數(shù)操作的原子性和數(shù)據(jù)一致性,即使在高并發(fā)的情況下也能保持正確性。

以下是一個(gè)具體的計(jì)數(shù)器操作示例:

假設(shè)我們有一個(gè)HBase表名為user_scores,其中包含了用戶的積分信息。表結(jié)構(gòu)如下:

  • 表名:user_scores
  • 列族:cf
  • 列限定符:score

現(xiàn)在,我們想要為特定用戶增加積分??梢允褂靡韵旅顏韴?zhí)行計(jì)數(shù)器操作:

# 假設(shè)已經(jīng)連接到HBase并選擇了相應(yīng)的表

# 定義行鍵和列族、列限定符
row_key = 'user123'
column_family = 'cf'
column_qualifier = 'score'

# 執(zhí)行計(jì)數(shù)器操作,增加1個(gè)計(jì)數(shù)單位
incr 'user_scores', row_key, column_family:column_qualifier, 1

相應(yīng)java代碼如下:

import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.Increment;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.util.Bytes;

// 假設(shè)已經(jīng)建立了HBase連接和獲取了Table實(shí)例
Table table = connection.getTable(TableName.valueOf("user_scores"));

// 定義計(jì)數(shù)器操作
Increment increment = new Increment(Bytes.toBytes("user123")); // 指定行鍵
increment.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("score"), 1L); // 列族、列限定符、增加的值

// 執(zhí)行計(jì)數(shù)器操作
table.increment(increment);

// 關(guān)閉連接等操作
table.close();

在這個(gè)示例中,我們針對行鍵為user123的用戶,在user_scores表的cf列族下的score列執(zhí)行了一個(gè)增加操作,增加了1個(gè)計(jì)數(shù)單位。無論何時(shí)調(diào)用這個(gè)操作,HBase都會確保原子性,從而避免了并發(fā)計(jì)數(shù)問題。

這個(gè)示例演示了如何使用計(jì)數(shù)器來管理分布式環(huán)境下的高并發(fā)計(jì)數(shù)需求,保證了數(shù)據(jù)的準(zhǔn)確性和一致性。

通過上述數(shù)據(jù)操作方法,我們可以輕松地在HBase中進(jìn)行表的管理、數(shù)據(jù)的操作,并滿足高并發(fā)計(jì)數(shù)需求。

5. 數(shù)據(jù)模型與架構(gòu)

數(shù)據(jù)模型_Hbase 中文文檔

HBase架構(gòu)上分為HMaster和多個(gè)RegionServer。HMaster負(fù)責(zé)監(jiān)控RegionServer,處理DDL操作。RegionServer用于實(shí)際存儲數(shù)據(jù),負(fù)責(zé)處理DML操作。此外還有Zookeeper用于狀態(tài)維護(hù)。

HBase中核心概念包括:Table 表,Row Key行鍵,Column Family列族,Column Qualifier列限定詞,Timestamp時(shí)間戳,Cell單元格。行鍵和列組成唯一索引,按行鍵的字典序存儲。列族在表定義時(shí)確定,列限定詞可以動態(tài)增刪。時(shí)間戳用于版本控制。

5.1 HBase系統(tǒng)架構(gòu)

大數(shù)據(jù)HBase學(xué)習(xí)圣經(jīng):一本書實(shí)現(xiàn)HBase學(xué)習(xí)自由,技術(shù)圣經(jīng),面試,大數(shù)據(jù),hbase,面試,后端,架構(gòu),java,分布式

注意:請點(diǎn)擊圖像以查看清晰的架構(gòu)圖!

HBase的系統(tǒng)架構(gòu)是分布式數(shù)據(jù)庫的核心,它由多個(gè)組件協(xié)同工作以實(shí)現(xiàn)高性能的數(shù)據(jù)存儲和查詢。在這一節(jié)中,我們將深入探討HBase的系統(tǒng)架構(gòu),介紹關(guān)鍵組件的作用和相互關(guān)系。

5.1.1 HBase組件概覽

大數(shù)據(jù)HBase學(xué)習(xí)圣經(jīng):一本書實(shí)現(xiàn)HBase學(xué)習(xí)自由,技術(shù)圣經(jīng),面試,大數(shù)據(jù),hbase,面試,后端,架構(gòu),java,分布式

注意:請點(diǎn)擊圖像以查看清晰的視圖!

HBase的系統(tǒng)架構(gòu)主要由以下幾個(gè)核心組件組成:

HMaster:

HMaster是HBase集群的“大腦”,負(fù)責(zé)管理和協(xié)調(diào)整個(gè)集群的元數(shù)據(jù)信息,如表的結(jié)構(gòu)和Region分布。

  • 接收客戶端的DDL操作(如創(chuàng)建表、修改表結(jié)構(gòu))并將其轉(zhuǎn)化為對應(yīng)的RegionServer操作。
  • 維護(hù)集群的元數(shù)據(jù)信息
  • 發(fā)現(xiàn)失效的Region,并將失效的Region分配到正常的HRegionServer上
RegionServer:

RegionServer是HBase集群的工作節(jié)點(diǎn),負(fù)責(zé)實(shí)際的數(shù)據(jù)存儲和查詢操作。

每個(gè)RegionServer負(fù)責(zé)管理多個(gè)Region,每個(gè)Region又代表了表中的一部分?jǐn)?shù)據(jù)。

RegionServer負(fù)責(zé)處理客戶端的DML操作(如增刪改查)以及Region的負(fù)載均衡和自動分裂。

Zookeeper:

Zookeeper是分布式協(xié)調(diào)服務(wù),HBase使用它來管理集群中各個(gè)組件的狀態(tài)信息和配置信息。HBase通過Zookeeper來協(xié)調(diào)HMaster的選舉、RegionServer的注冊和元數(shù)據(jù)的分布。

HDFS:

HDFS(Hadoop分布式文件系統(tǒng))是HBase的底層存儲層,它用于持久化存儲表數(shù)據(jù)和元數(shù)據(jù)。HBase的數(shù)據(jù)以HDFS文件的形式存儲在數(shù)據(jù)節(jié)點(diǎn)上,通過HBase提供的讀寫接口進(jìn)行訪問。

5.1.2 組件關(guān)系與協(xié)作

大數(shù)據(jù)HBase學(xué)習(xí)圣經(jīng):一本書實(shí)現(xiàn)HBase學(xué)習(xí)自由,技術(shù)圣經(jīng),面試,大數(shù)據(jù),hbase,面試,后端,架構(gòu),java,分布式

注意:請點(diǎn)擊圖像以查看清晰的視圖!

HBase的組件之間通過復(fù)雜的協(xié)作實(shí)現(xiàn)數(shù)據(jù)的存儲和查詢。以下是這些組件的關(guān)系和協(xié)作過程的簡要描述:

  1. 客戶端向HMaster發(fā)送DDL操作(如創(chuàng)建表),HMaster將元數(shù)據(jù)信息存儲在Zookeeper中,同時(shí)通知RegionServer更新元數(shù)據(jù)。
  2. 客戶端向RegionServer發(fā)送DML操作,RegionServer根據(jù)操作類型執(zhí)行相應(yīng)的操作。對于寫入操作,RegionServer將數(shù)據(jù)寫入內(nèi)存(MemStore),并定期刷新到磁盤。
  3. 當(dāng)一個(gè)Region的MemStore大小達(dá)到閾值時(shí),RegionServer將MemStore中的數(shù)據(jù)寫入HDFS中的StoreFile,并創(chuàng)建新的MemStore。如果Region的StoreFile數(shù)量達(dá)到一定數(shù)量,Region會被自動分裂成兩個(gè)Region,以保證數(shù)據(jù)的均衡和高效查詢。
  4. 客戶端發(fā)送查詢請求到RegionServer,RegionServer從StoreFile和MemStore中檢索數(shù)據(jù),并返回結(jié)果給客戶端。
  5. 當(dāng)RegionServer發(fā)生故障或新增Region時(shí),Zookeeper將通知其他組件,并進(jìn)行相應(yīng)的處理,如選舉新的HMaster。

通過這些組件的協(xié)作,HBase實(shí)現(xiàn)了高可用性、分布式存儲和實(shí)時(shí)隨機(jī)訪問等特性。深入理解HBase的系統(tǒng)架構(gòu),有助于您更好地優(yōu)化配置和調(diào)優(yōu)性能,以滿足各種應(yīng)用場景的需求。接下來,我們將深入解釋HBase的核心概念,為您打下更堅(jiān)實(shí)的基礎(chǔ)。

5.2 核心概念解析

在HBase中,有一些核心概念是您必須理解的,它們構(gòu)成了數(shù)據(jù)存儲和訪問的基礎(chǔ)。在這一節(jié)中,我們將詳細(xì)解釋這些核心概念,幫助您更好地理解HBase的工作原理。

大數(shù)據(jù)HBase學(xué)習(xí)圣經(jīng):一本書實(shí)現(xiàn)HBase學(xué)習(xí)自由,技術(shù)圣經(jīng),面試,大數(shù)據(jù),hbase,面試,后端,架構(gòu),java,分布式

大數(shù)據(jù)HBase學(xué)習(xí)圣經(jīng):一本書實(shí)現(xiàn)HBase學(xué)習(xí)自由,技術(shù)圣經(jīng),面試,大數(shù)據(jù),hbase,面試,后端,架構(gòu),java,分布式

5.2.1 Table

在HBase中,數(shù)據(jù)被組織成一系列的表。每個(gè)表包含多行數(shù)據(jù),每行數(shù)據(jù)通過一個(gè)唯一的RowKey進(jìn)行標(biāo)識。表在HBase中的結(jié)構(gòu)是動態(tài)的,您可以在任何時(shí)候添加列族或列,而無需事先定義表的結(jié)構(gòu)。表通常用于存儲具有相同結(jié)構(gòu)的數(shù)據(jù)。

5.2.2 RowKey

RowKey是唯一標(biāo)識表中一行數(shù)據(jù)的關(guān)鍵字。它是一個(gè)字節(jié)數(shù)組,可以是任何數(shù)據(jù)類型。RowKey的設(shè)計(jì)非常重要,因?yàn)樗苯佑绊懥藬?shù)據(jù)的分布和查詢性能。較好的RowKey設(shè)計(jì)可以實(shí)現(xiàn)數(shù)據(jù)的均衡存儲和高效的查詢。

5.2.3 Column Family

Column Family(列族)是表中的一組相關(guān)列的集合。每個(gè)列族都有一個(gè)名稱,列族內(nèi)部的列可以動態(tài)地添加。在HBase中,列族是數(shù)據(jù)的物理存儲單元,所有屬于同一列族的數(shù)據(jù)存儲在一起,以實(shí)現(xiàn)更高的存儲和查詢效率。

5.2.4 Column Qualifier

Column Qualifier(列限定符)是指定列族中的具體列的名稱。它是一個(gè)字節(jié)數(shù)組,用于標(biāo)識列族內(nèi)的不同列。通過組合Column Family和Column Qualifier,您可以唯一確定表中的一個(gè)單元格(Cell)。

5.2.5 Cell

Cell是HBase中最小的數(shù)據(jù)單元,存儲著實(shí)際的數(shù)據(jù)值和對應(yīng)的時(shí)間戳。每個(gè)Cell由RowKey、Column Family、Column Qualifier和Timestamp組成。在表中,每個(gè)單元格的唯一標(biāo)識是由RowKey、Column Family和Column Qualifier組合而成的。

5.2.6 Timestamp

Timestamp是Cell的一個(gè)重要屬性,用于標(biāo)識數(shù)據(jù)的版本。HBase支持多版本數(shù)據(jù)存儲,每個(gè)Cell可以有多個(gè)不同時(shí)間戳的版本。通過Timestamp,您可以查詢和獲取不同時(shí)間點(diǎn)的數(shù)據(jù)版本。

5.2.7 Region

Region是HBase中數(shù)據(jù)的分布單元。每個(gè)表可以被劃分成多個(gè)Region,每個(gè)Region由一系列的連續(xù)行組成。Region是HBase實(shí)現(xiàn)分布式存儲和負(fù)載均衡的關(guān)鍵。

通過理解這些核心概念,您將能夠更好地設(shè)計(jì)表結(jié)構(gòu)、優(yōu)化數(shù)據(jù)訪問和查詢,并為后續(xù)的數(shù)據(jù)操作打下堅(jiān)實(shí)的基礎(chǔ)。接下來,我們將深入探討HBase的數(shù)據(jù)操作,幫助您了解如何在HBase中進(jìn)行數(shù)據(jù)的增刪改查。

5.3 內(nèi)部實(shí)現(xiàn)原理

HBase的內(nèi)部實(shí)現(xiàn)原理是其高性能和可擴(kuò)展性的關(guān)鍵。在這一節(jié)中,我們將揭示HBase的數(shù)據(jù)存儲格式、壓縮算法、緩存機(jī)制等內(nèi)部實(shí)現(xiàn)原理,幫助您深入理解其工作機(jī)制。

5.3.1 HBase讀數(shù)據(jù)流程

大數(shù)據(jù)HBase學(xué)習(xí)圣經(jīng):一本書實(shí)現(xiàn)HBase學(xué)習(xí)自由,技術(shù)圣經(jīng),面試,大數(shù)據(jù),hbase,面試,后端,架構(gòu),java,分布式

注意:請點(diǎn)擊圖像以查看清晰的視圖!

HBase是一個(gè)分布式、面向列的NoSQL數(shù)據(jù)庫系統(tǒng),針對海量數(shù)據(jù)的隨機(jī)讀取提供了高性能。以下是HBase讀取數(shù)據(jù)的詳細(xì)流程:

  1. 數(shù)據(jù)定位和訪問
    當(dāng)客戶端需要讀取數(shù)據(jù)時(shí),首先根據(jù)數(shù)據(jù)的行鍵進(jìn)行哈希計(jì)算,以確定數(shù)據(jù)位于哪個(gè)Region。然后,客戶端通過HBase的Master節(jié)點(diǎn)獲取表的元數(shù)據(jù),包括表的分區(qū)信息和RegionServer的位置。
  2. 與RegionServer通信
    客戶端會根據(jù)元數(shù)據(jù)信息,與負(fù)責(zé)該數(shù)據(jù)區(qū)域的RegionServer建立連接。這個(gè)連接將用于請求數(shù)據(jù)以及接收響應(yīng)。
  3. MemStore和StoreFile查詢
    在RegionServer上,數(shù)據(jù)首先會被查詢MemStore。如果要查找的數(shù)據(jù)在MemStore中,就直接從內(nèi)存中讀取。如果數(shù)據(jù)不在MemStore中,HBase會按照時(shí)間順序查詢StoreFile,找到合適的StoreFile進(jìn)行讀取。
  4. Block Cache利用
    如果數(shù)據(jù)在StoreFile中,HBase會將StoreFile按照塊(Block)進(jìn)行讀取。在讀取的過程中,HBase會首先檢查Block Cache,這是一個(gè)位于內(nèi)存中的緩存,用于存儲最常用的數(shù)據(jù)塊,以提高讀取性能。如果所需數(shù)據(jù)塊在Block Cache中存在,就可以直接從緩存中讀取,而不需要去磁盤上讀取StoreFile。
  5. 數(shù)據(jù)過濾和組裝
    一旦數(shù)據(jù)塊被讀取,HBase會根據(jù)請求中指定的列族和列限定符,對數(shù)據(jù)進(jìn)行過濾,只返回需要的部分?jǐn)?shù)據(jù)。然后,數(shù)據(jù)會被組裝成適當(dāng)?shù)母袷?,通常是鍵值對的形式。
  6. 返回?cái)?shù)據(jù)給客戶端
    最后,RegionServer會將請求的數(shù)據(jù)返回給客戶端??蛻舳丝梢允褂眠@些數(shù)據(jù)進(jìn)行進(jìn)一步的處理和分析。

HBase的讀取流程在訪問內(nèi)存中的MemStore、利用Block Cache、查詢StoreFile和數(shù)據(jù)過濾等環(huán)節(jié)中充分利用了緩存和索引,以提供高效的隨機(jī)讀取性能。這種架構(gòu)使得HBase適用于大規(guī)模數(shù)據(jù)集的實(shí)時(shí)查詢需求。

5.3.2 HBase寫數(shù)據(jù)流程

大數(shù)據(jù)HBase學(xué)習(xí)圣經(jīng):一本書實(shí)現(xiàn)HBase學(xué)習(xí)自由,技術(shù)圣經(jīng),面試,大數(shù)據(jù),hbase,面試,后端,架構(gòu),java,分布式

注意:請點(diǎn)擊圖像以查看清晰的視圖!

HBase是一個(gè)基于Hadoop分布式文件系統(tǒng)(HDFS)的列式存儲系統(tǒng),專為處理大規(guī)模的稀疏數(shù)據(jù)集而設(shè)計(jì)。它提供了高效的隨機(jī)讀寫能力,并且在寫入數(shù)據(jù)時(shí)有一套獨(dú)特的內(nèi)部原理和流程。

以下是HBase寫入數(shù)據(jù)的內(nèi)部原理和流程:

  1. 寫入流程初始化
    當(dāng)客戶端想要寫入數(shù)據(jù)時(shí),首先要與HBase的Master節(jié)點(diǎn)通信以獲取表的元數(shù)據(jù),包括表的結(jié)構(gòu)、分區(qū)信息等。然后,客戶端會與HBase的RegionServer建立連接,準(zhǔn)備進(jìn)行寫入操作。
  2. 寫前準(zhǔn)備
    在寫入之前,HBase會對要寫入的數(shù)據(jù)進(jìn)行預(yù)處理,如生成寫入操作的日志(Write Ahead Log,WAL)以確保數(shù)據(jù)的持久性和恢復(fù)能力。
  3. 數(shù)據(jù)分布和定位
    HBase的表會被水平分割為多個(gè)Region,每個(gè)Region負(fù)責(zé)管理一定范圍的行鍵數(shù)據(jù)。在寫入數(shù)據(jù)時(shí),HBase會根據(jù)行鍵的哈希值來定位數(shù)據(jù)所在的Region。
  4. 寫入MemStore
    當(dāng)確定了要寫入的Region后,數(shù)據(jù)首先會被寫入到該Region的內(nèi)存存儲區(qū)域,稱為MemStore。MemStore以排序的方式保存數(shù)據(jù),新的數(shù)據(jù)會被插入到適當(dāng)?shù)奈恢?,以便后續(xù)的讀取和寫入操作更高效。
  5. 持久化到HLog
    寫入MemStore后,數(shù)據(jù)同時(shí)會被寫入到HLog中,作為持久化的寫入日志。這樣可以確保即使RegionServer發(fā)生故障,數(shù)據(jù)也可以從HLog中進(jìn)行恢復(fù)。
  6. MemStore刷寫
    當(dāng)MemStore中的數(shù)據(jù)達(dá)到一定的大小閾值時(shí),HBase會觸發(fā)MemStore的刷寫操作。這將會將MemStore中的數(shù)據(jù)寫入到HDFS中的一個(gè)臨時(shí)存儲文件,稱為StoreFile。
  7. Compaction
    隨著時(shí)間的推移,多個(gè)StoreFile會不斷產(chǎn)生。為了維護(hù)數(shù)據(jù)的連續(xù)性和提高查詢性能,HBase會定期進(jìn)行Compaction操作,將多個(gè)StoreFile合并為一個(gè)較大的文件,同時(shí)刪除過期或重復(fù)的數(shù)據(jù)。
  8. 數(shù)據(jù)持久化
    在Compaction操作完成后,生成的新的StoreFile會被重命名并移動到最終的存儲位置。這樣,數(shù)據(jù)就持久化到了HDFS中。
  9. Acknowledgment
    一旦數(shù)據(jù)寫入成功并持久化,RegionServer會向客戶端發(fā)送確認(rèn)消息,表示數(shù)據(jù)已成功寫入。

總的來說,HBase的寫入過程涉及了內(nèi)存中的MemStore、持久化的HLog、StoreFile的生成和Compaction等步驟,保證了數(shù)據(jù)的持久性和高效性能。這個(gè)過程充分利用了分布式存儲和列式存儲的優(yōu)勢,使得HBase在大規(guī)模數(shù)據(jù)處理中具有出色的表現(xiàn)。

5.3.3 HBase的flush(刷寫)及compact(合并)機(jī)制

HBase的Flush(刷寫)和Compaction(合并)是維護(hù)數(shù)據(jù)一致性、減少存儲空間占用以及提高讀取性能的重要機(jī)制。以下是對HBase的Flush和Compaction機(jī)制的詳細(xì)介紹:

Flush(刷寫)機(jī)制:

Flush是指將內(nèi)存中的數(shù)據(jù)寫入到持久化存儲(HDFS)的過程。在HBase中,數(shù)據(jù)首先被寫入MemStore,這是位于RegionServer內(nèi)存中的排序數(shù)據(jù)結(jié)構(gòu),用于提高寫入性能。然而,MemStore的數(shù)據(jù)在寫入過程中并不直接寫入HDFS,而是在達(dá)到一定條件后進(jìn)行刷寫(Flush)操作,將數(shù)據(jù)持久化到磁盤上的StoreFile中。

Flush機(jī)制的過程如下:

  1. MemStore刷寫觸發(fā):當(dāng)MemStore中的數(shù)據(jù)達(dá)到一定的大小閾值(通過配置參數(shù)指定),或者在指定的時(shí)間間隔內(nèi),HBase會觸發(fā)Flush操作。
  2. 生成StoreFile:在Flush時(shí),MemStore中的數(shù)據(jù)會被寫入一個(gè)新的StoreFile中,而不是直接寫入HDFS。這個(gè)StoreFile是一個(gè)持久化的數(shù)據(jù)文件,按照鍵的順序排序。
  3. StoreFile寫入HDFS:生成的StoreFile會首先寫入HBase的HLog(Write Ahead Log),以保證數(shù)據(jù)的持久性。然后,StoreFile會被移動到HDFS中的對應(yīng)Region的數(shù)據(jù)目錄下,變?yōu)槌志没鎯Α?/li>

Flush觸發(fā)配置:

當(dāng)memstore的大小超過這個(gè)值的時(shí)候,會flush到磁盤,默認(rèn)為128M

<property>
    <name>hbase.hregion.memstore.flush.size</name>
    <value>134217728</value>
</property>

當(dāng)memstore中的數(shù)據(jù)時(shí)間超過1小時(shí),會flush到磁盤

<property>
    <name>hbase.regionserver.optionalcacheflushinterval</name>
    <value>3600000</value>
</property>

HregionServer的全局memstore的大小,超過該大小會觸發(fā)flush到磁盤的操作,默認(rèn)是堆大小的40%

<property>
    <name>hbase.regionserver.global.memstore.size</name>
    <value>0.4</value>
</property>

手動flush

flush tableName

Compaction(合并)機(jī)制:

Compaction是指合并StoreFile以優(yōu)化數(shù)據(jù)存儲、提高查詢性能和刪除過期數(shù)據(jù)的過程。由于HBase的寫入操作會產(chǎn)生多個(gè)StoreFile,而且數(shù)據(jù)可能存在多個(gè)版本,為了維護(hù)數(shù)據(jù)的連續(xù)性和刪除過期數(shù)據(jù),HBase會定期進(jìn)行Compaction。

HBase支持兩種類型的Compaction:小規(guī)模的Min Compaction大規(guī)模的Major Compaction

  • Min Compaction:也稱為較小規(guī)模的Compaction,它會合并幾個(gè)相鄰的StoreFile,但不會合并所有的StoreFile。這有助于減少數(shù)據(jù)碎片,提高查詢性能。
  • Major Compaction:也稱為較大規(guī)模的Compaction,它會合并一個(gè)Region內(nèi)的所有StoreFile,刪除已刪除的數(shù)據(jù)、刪除過期數(shù)據(jù)以及合并相同行鍵的不同版本。Major Compaction可以徹底優(yōu)化數(shù)據(jù)存儲,減少存儲空間占用,并提高讀取性能。

Compaction機(jī)制的過程如下:

  1. 選擇合并的StoreFile:HBase會選擇一些StoreFile來合并,通常是相鄰的或有重疊行鍵范圍的文件。
  2. 合并過程:在Compaction過程中,HBase會合并選定的StoreFile,并生成一個(gè)新的StoreFile。在這個(gè)過程中,重復(fù)的數(shù)據(jù)會被合并,過期數(shù)據(jù)會被刪除,不同版本的數(shù)據(jù)會被合并。
  3. 生成新StoreFile:合并后生成的新StoreFile會被寫入HDFS,并取代舊的StoreFile。
  4. 刪除舊StoreFile:合并后的新StoreFile生成后,原來的舊StoreFile會被刪除,釋放存儲空間。

Flush和Compaction機(jī)制的配合使用,確保了HBase數(shù)據(jù)的一致性、可靠性以及讀取性能。

5.3.4 緩存機(jī)制

HBase的緩存機(jī)制是為了提高讀取性能和降低對底層存儲的訪問頻率而設(shè)計(jì)的。HBase使用了兩種主要的緩存機(jī)制:Block Cache(塊緩存)和MemStore Heap Cache(MemStore堆緩存)。以下是對這兩種緩存機(jī)制的詳細(xì)介紹:

1. Block Cache(塊緩存):

Block Cache是HBase的主要緩存機(jī)制之一,用于緩存存儲在HDFS上的StoreFile中的數(shù)據(jù)塊。StoreFile通常被分成固定大小的數(shù)據(jù)塊,也稱為塊(Block),每個(gè)塊的大小通常為64KB。

Block Cache工作的基本原理如下:

  • 緩存策略:Block Cache使用LRU(Least Recently Used)策略來管理緩存中的數(shù)據(jù)塊。最近被訪問過的塊會被保留在緩存中,而較早被訪問的塊則可能被替換出緩存。
  • 塊粒度:Block Cache以塊為單位進(jìn)行緩存,這樣在讀取數(shù)據(jù)時(shí),可以在塊級別上進(jìn)行緩存命中,從而提高讀取性能。
  • 緩存位置:Block Cache位于每個(gè)RegionServer的內(nèi)存中,用于緩存該RegionServer負(fù)責(zé)的所有Region的數(shù)據(jù)塊。
  • 緩存適用性:Block Cache適用于頻繁被查詢的數(shù)據(jù),如熱點(diǎn)數(shù)據(jù)。由于數(shù)據(jù)在內(nèi)存中緩存,讀取性能顯著提高。

2. MemStore Heap Cache(MemStore堆緩存):

MemStore Heap Cache是用于緩存處于內(nèi)存中的MemStore數(shù)據(jù)的機(jī)制。當(dāng)數(shù)據(jù)被寫入HBase時(shí),首先被寫入MemStore,然后會在Flush之前被緩存在MemStore Heap Cache中。

  • 緩存目的:MemStore Heap Cache的主要目的是為了提高寫入性能。由于寫入到磁盤的Flush操作是相對較慢的,數(shù)據(jù)在Flush前可以在Heap Cache中緩存,這樣可以減少實(shí)際寫入磁盤的頻率,提高寫入性能。

  • Flush觸發(fā):當(dāng)MemStore Heap Cache達(dá)到一定大小閾值或者定時(shí)間隔到達(dá)時(shí),會觸發(fā)Flush操作,將Heap Cache中的數(shù)據(jù)刷寫到HDFS中的StoreFile中。

HBase的緩存機(jī)制在讀取和寫入方面都起到了關(guān)鍵作用。Block Cache提供了高效的讀取緩存,而MemStore Heap Cache則有助于提高寫入性能。綜合使用這些緩存機(jī)制,HBase能夠在大規(guī)模數(shù)據(jù)處理中取得出色的性能表現(xiàn)。

5.3.5 垃圾回收

由于字?jǐn)?shù)限制,此處省略

完整內(nèi)容,請參見《大數(shù)據(jù)HBase學(xué)習(xí)圣經(jīng)》,pdf 找尼恩獲取

綜上所述,HBase的數(shù)據(jù)垃圾回收機(jī)制主要通過刪除標(biāo)記、版本刪除、Minor Compaction和Major Compaction等方式來清理無效數(shù)據(jù),減少存儲空間的占用,并保持?jǐn)?shù)據(jù)的一致性和可靠性。

通過了解這些內(nèi)部實(shí)現(xiàn)原理,您將能夠更好地理解HBase的性能特點(diǎn)和工作機(jī)制。這對于優(yōu)化配置、調(diào)優(yōu)性能以及處理各種應(yīng)用場景的需求都非常有幫助。接下來,我們將深入介紹HBase的數(shù)據(jù)操作,為您提供豐富的操作示例和指導(dǎo)。

6. HBase進(jìn)階操作

在本章中,我們將深入探討HBase的進(jìn)階操作,包括使用過濾器進(jìn)行讀取控制、數(shù)據(jù)的高效導(dǎo)入方式,以及如何結(jié)合MapReduce進(jìn)行復(fù)雜的分布式計(jì)算。

當(dāng)涉及HBase的進(jìn)階操作時(shí),包括了一些更高級和復(fù)雜的用例。以下是一些進(jìn)階操作的詳細(xì)說明和具體操作示例:

6.1 高級用例

由于字?jǐn)?shù)限制,此處省略

完整內(nèi)容,請參見《大數(shù)據(jù)HBase學(xué)習(xí)圣經(jīng)》,pdf 找尼恩獲取

6.2 過濾器的使用

由于字?jǐn)?shù)限制,此處省略

完整內(nèi)容,請參見《大數(shù)據(jù)HBase學(xué)習(xí)圣經(jīng)》,pdf 找尼恩獲取

6.3 數(shù)據(jù)導(dǎo)入方式

由于字?jǐn)?shù)限制,此處省略

完整內(nèi)容,請參見《大數(shù)據(jù)HBase學(xué)習(xí)圣經(jīng)》,pdf 找尼恩獲取

在下一章節(jié)中,我們將介紹如何通過Java客戶端API進(jìn)行HBase應(yīng)用開發(fā),以及一些優(yōu)化和最佳實(shí)踐。這將幫助您更好地利用HBase構(gòu)建應(yīng)用程序。

7. 客戶端開發(fā)

在本章中,我們將詳細(xì)介紹如何使用HBase的Java客戶端API進(jìn)行應(yīng)用開發(fā)。您需要設(shè)置依賴配置,并提供完整可運(yùn)行的Java代碼示例。

7.1 依賴配置

首先,您需要在項(xiàng)目中添加HBase的Java客戶端API依賴。如果使用Maven作為項(xiàng)目構(gòu)建工具,在pom.xml文件中添加以下依賴配置:

<dependency>
    <groupId>org.apache.hbase</groupId>
    <artifactId>hbase-client</artifactId>
    <version>2.4.7</version> <!-- 請根據(jù)您的HBase版本進(jìn)行調(diào)整 -->
</dependency>

7.2 用戶信息示例

下面是一個(gè)完整的可運(yùn)行的Java代碼示例,演示了如何使用HBase的Java客戶端API連接HBase集群、創(chuàng)建用戶信息表、插入用戶數(shù)據(jù)、查詢用戶數(shù)據(jù)以及異常處理。在這個(gè)示例中,我們提供了配置信息。

  1. 初始化客戶端
public class HbaseClientDemo {
    Configuration conf=null;
    Connection conn=null;
    HBaseAdmin admin =null;
    @Before
    public void init () throws IOException {
        conf = HBaseConfiguration.create();
        conf.set("hbase.zookeeper.quorum","linux121,linux122");
        conf.set("hbase.zookeeper.property.clientPort","2181");
        conn = ConnectionFactory.createConnection(conf);
    }
    public void destroy(){
        if(admin!=null){
            try {
                admin.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if(conn !=null){
            try {
                conn.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
  1. 創(chuàng)建表
@Test
public void createTable() throws IOException {
    admin = (HBaseAdmin) conn.getAdmin();
    //創(chuàng)建表描述器
    HTableDescriptor teacher = new HTableDescriptor(TableName.valueOf("teacher"));
    //設(shè)置列族描述器
    teacher.addFamily(new HColumnDescriptor("info"));
    //執(zhí)行創(chuàng)建操作
    admin.createTable(teacher);
    System.out.println("teacher表創(chuàng)建成功??!");
}
  1. 插入數(shù)據(jù)
//插入一條數(shù)據(jù)
@Test
public void putData() throws IOException {
    //獲取一個(gè)表對象
    Table t = conn.getTable(TableName.valueOf("teacher"));
    //設(shè)定rowkey
    Put put = new Put(Bytes.toBytes("110"));
    //列族,列,value
    put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("addr"), Bytes.toBytes("beijing"));
    //執(zhí)行插入
    t.put(put);
    // t.put();//可以傳入list批量插入數(shù)據(jù)
    //關(guān)閉table對象
    t.close();
    System.out.println("插入成功?。?);
}
  1. 刪除數(shù)據(jù):
//刪除一條數(shù)據(jù)
@Test
public void deleteData() throws IOException {
    //需要獲取一個(gè)table對象
    final Table worker = conn.getTable(TableName.valueOf("worker"));
    //準(zhǔn)備delete對象
    final Delete delete = new Delete(Bytes.toBytes("110"));
    //執(zhí)行刪除
    worker.delete(delete);
    //關(guān)閉table對象
    worker.close();
    System.out.println("刪除數(shù)據(jù)成功?。?);
}
  1. 查詢某個(gè)列族數(shù)據(jù)
//查詢某個(gè)列族數(shù)據(jù)
@Test
public void getDataByCF() throws IOException {
    //獲取表對象
    HTable teacher = (HTable) conn.getTable(TableName.valueOf("teacher"));
    //創(chuàng)建查詢的get對象
    Get get = new Get(Bytes.toBytes("110"));
    //指定列族信息
    // get.addColumn(Bytes.toBytes("info"), Bytes.toBytes("sex"));
    get.addFamily(Bytes.toBytes("info"));
    //執(zhí)行查詢
    Result res = teacher.get(get);
    Cell[] cells = res.rawCells();//獲取改行的所有cell對象
    for (Cell cell : cells) {
        //通過cell獲取rowkey,cf,column,value
        String cf = Bytes.toString(CellUtil.cloneFamily(cell));
        String column = Bytes.toString(CellUtil.cloneQualifier(cell));
        String value = Bytes.toString(CellUtil.cloneValue(cell));
        String rowkey = Bytes.toString(CellUtil.cloneRow(cell));
        System.out.println(rowkey + "----" + cf + "---" + column + "---" + value);
    }
    teacher.close();//關(guān)閉表對象資源
}
  1. 通過Scan全表掃描
/**
  * 全表掃描
  */
@Test
public void scanAllData() throws IOException {
    HTable teacher = (HTable) conn.getTable(TableName.valueOf("teacher"));
    Scan scan = new Scan();
    ResultScanner resultScanner = teacher.getScanner(scan);
    for (Result result : resultScanner) {
        Cell[] cells = result.rawCells();//獲取改行的所有cell對象
        for (Cell cell : cells) {
            //通過cell獲取rowkey,cf,column,value
            String cf = Bytes.toString(CellUtil.cloneFamily(cell));
            String column = Bytes.toString(CellUtil.cloneQualifier(cell));
            String value = Bytes.toString(CellUtil.cloneValue(cell));
            String rowkey = Bytes.toString(CellUtil.cloneRow(cell));
            System.out.println(rowkey + "----" + cf + "--" + column + "---" + value);
        }
    }
    teacher.close();
}
  1. 通過startRowKey和endRowKey進(jìn)行掃描
/**
  * 通過startRowKey和endRowKey進(jìn)行掃描查詢
  */
@Test
public void scanRowKey() throws IOException {
    HTable teacher = (HTable) conn.getTable(TableName.valueOf("teacher"));
    Scan scan = new Scan();
    scan.setStartRow("0001".getBytes());
    scan.setStopRow("2".getBytes());
    ResultScanner resultScanner = teacher.getScanner(scan);
    for (Result result : resultScanner) {
        Cell[] cells = result.rawCells();//獲取改行的所有cell對象
        for (Cell cell : cells) {
            //通過cell獲取rowkey,cf,column,value
            String cf = Bytes.toString(CellUtil.cloneFamily(cell));
            String column = Bytes.toString(CellUtil.cloneQualifier(cell));
            String value = Bytes.toString(CellUtil.cloneValue(cell));
            String rowkey = Bytes.toString(CellUtil.cloneRow(cell));
            System.out.println(rowkey + "----" + cf + "--" + column + "---" + value);
        }
    }
    teacher.close();
}

7.3 SpringBoot整合HBase

在Spring Boot中整合HBase,您可以使用Spring Data Hadoop項(xiàng)目提供的HBase支持。以下是演示如何在Spring Boot中整合HBase的步驟:

1. 創(chuàng)建Spring Boot項(xiàng)目:

首先,創(chuàng)建一個(gè)新的Spring Boot項(xiàng)目。您可以使用Spring Initializr(https://start.spring.io/)來快速生成一個(gè)基本的Spring Boot項(xiàng)目,確保選擇所需的依賴項(xiàng),例如Web、HBase、和Lombok(可選)。

2. 配置application.properties:

src/main/resources目錄下的application.properties文件中,添加HBase和ZooKeeper的配置信息:

# HBase configuration
spring.data.hbase.quorum=zkHost1,zkHost2,zkHost3  # 替換為您的ZooKeeper主機(jī)名
spring.data.hbase.zk-port=2181
spring.data.hbase.zk-znode-parent=/hbase
spring.data.hbase.rootdir=hdfs://localhost:9000/hbase

# HBase auto start
spring.data.hbase.auto-startup=true

3. 創(chuàng)建HBase實(shí)體類:

創(chuàng)建一個(gè)Java類表示HBase表的實(shí)體。使用@Table注解指定表的名稱,使用@Row注解表示行鍵,使用@Column注解表示列。

import org.springframework.data.annotation.Id;
import org.springframework.data.hadoop.hbase.RowKey;
import org.springframework.data.hadoop.hbase.Table;

@Table("users")
public class User {

    @Id
    @RowKey
    private String id;

    @Column("userInfo:name")
    private String name;

    @Column("userInfo:age")
    private String age;

    // Getters and setters
}

4. 創(chuàng)建HBase Repository:

創(chuàng)建一個(gè)HBase的Repository接口,繼承自org.springframework.data.repository.CrudRepository。您可以使用繼承的方法來實(shí)現(xiàn)基本的CRUD操作。

import org.springframework.data.repository.CrudRepository;

public interface UserRepository extends CrudRepository<User, String> {
}

5. 創(chuàng)建服務(wù)層:

創(chuàng)建一個(gè)服務(wù)層,可以將Repository注入,然后在應(yīng)用程序中使用它來訪問HBase數(shù)據(jù)。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    private final UserRepository userRepository;

    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public void saveUser(User user) {
        userRepository.save(user);
    }

    public User getUserById(String id) {
        return userRepository.findById(id).orElse(null);
    }

    // 其他業(yè)務(wù)邏輯...
}

6. 創(chuàng)建控制器:

創(chuàng)建一個(gè)控制器類,處理HTTP請求。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/users")
public class UserController {

    private final UserService userService;

    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }

    @PostMapping
    public void addUser(@RequestBody User user) {
        userService.saveUser(user);
    }

    @GetMapping("/{id}")
    public User getUser(@PathVariable String id) {
        return userService.getUserById(id);
    }

    // 其他請求處理...
}

7. 運(yùn)行應(yīng)用程序:

運(yùn)行Spring Boot應(yīng)用程序,您可以使用內(nèi)置的Tomcat容器。然后,通過HTTP請求訪問控制器中定義的端點(diǎn)。

綜上所述,您現(xiàn)在已經(jīng)在Spring Boot中整合了HBase。通過使用Spring Data Hadoop的HBase支持,您可以更輕松地在Spring Boot應(yīng)用程序中進(jìn)行HBase操作,而無需處理底層的連接和配置細(xì)節(jié)。

接下來,在下一章中,我們將深入討論如何優(yōu)化HBase的性能,以及一些常見的應(yīng)用案例。

8. HBase優(yōu)化

在本章中,我們將深入探討如何優(yōu)化HBase的性能,以確保您的應(yīng)用在處理大規(guī)模數(shù)據(jù)時(shí)能夠保持高效。HBase優(yōu)化可以從多個(gè)方面著手,讓我們逐個(gè)進(jìn)行介紹。

8.1 Rowkey設(shè)計(jì)

在HBase中,RowKey的設(shè)計(jì)非常重要,因?yàn)樗苯佑绊懥藬?shù)據(jù)的存儲、訪問和性能。一個(gè)好的RowKey設(shè)計(jì)可以提高查詢效率、降低數(shù)據(jù)傾斜問題,并且有助于優(yōu)化HBase的性能。以下是一些設(shè)計(jì)RowKey的原則和優(yōu)化建議:

1. 唯一性: RowKey必須是唯一的,以確保每個(gè)行都能被正確標(biāo)識。通??梢允褂脮r(shí)間戳、UUID、業(yè)務(wù)相關(guān)的唯一標(biāo)識等作為RowKey的一部分。

2. 散列分布: 良好的RowKey設(shè)計(jì)應(yīng)該在HBase表中實(shí)現(xiàn)均勻的分布。這有助于避免熱點(diǎn)數(shù)據(jù),提高負(fù)載均衡,以及降低數(shù)據(jù)傾斜問題。一種常見的方法是使用散列函數(shù)對RowKey進(jìn)行哈希,以確保數(shù)據(jù)分布更加均勻。

3. 數(shù)據(jù)局部性: 將相關(guān)的數(shù)據(jù)存儲在相鄰的行中,以便在掃描范圍查詢時(shí)能夠最大程度地減少磁盤訪問。這可以通過將相似的數(shù)據(jù)存儲在RowKey的相同前綴下來實(shí)現(xiàn)。例如,對于存儲用戶交易記錄的表,可以使用用戶ID作為前綴,將相同用戶的交易記錄存儲在相鄰的行中。

4. 最小化字節(jié)長度: 較短的RowKey可以減少存儲空間和IO開銷。但是,不要過度追求短長度而導(dǎo)致RowKey不可讀,應(yīng)該在可讀性和長度之間做出權(quán)衡。

5. 避免頻繁變更: RowKey設(shè)計(jì)后,盡量避免頻繁地修改,因?yàn)樾薷腞owKey會導(dǎo)致數(shù)據(jù)在HBase內(nèi)部的重新分布。頻繁變更可能會影響性能和數(shù)據(jù)局部性。

6. 考慮查詢模式: 根據(jù)您的查詢需求,設(shè)計(jì)RowKey以便支持常見的查詢模式。如果經(jīng)常需要根據(jù)時(shí)間范圍查詢數(shù)據(jù),可以將時(shí)間戳作為RowKey的一部分。

7. 避免順序?qū)憻狳c(diǎn): 如果RowKey的設(shè)計(jì)使得新數(shù)據(jù)總是寫入到相同區(qū)域,可能會導(dǎo)致順序?qū)憻狳c(diǎn),影響性能。這可以通過添加隨機(jī)性到RowKey中,或者使用散列分布來緩解。

8. 使用字節(jié)編碼: 如果RowKey包含數(shù)字或日期等數(shù)據(jù),可以考慮使用適當(dāng)?shù)淖止?jié)編碼,以便保持排序和比較的正確性。

9. 行分區(qū): 對于大型表,可以考慮將表按行分區(qū),將數(shù)據(jù)分散到不同的RegionServer上。這可以通過在RowKey中添加分區(qū)標(biāo)識來實(shí)現(xiàn)。

10. 測試和優(yōu)化: 設(shè)計(jì)好的RowKey應(yīng)該經(jīng)過測試,以確保它在實(shí)際場景中表現(xiàn)良好。在設(shè)計(jì)之后,可以通過性能測試來驗(yàn)證并進(jìn)行優(yōu)化。

當(dāng)設(shè)計(jì)HBase表的RowKey時(shí),可以根據(jù)上述原則和建議來制定策略。

以下是一些示例,展示如何基于不同的情境來設(shè)計(jì)RowKey,并說明如何在Java中實(shí)現(xiàn)。

1. 唯一性和散列分布示例:

在這個(gè)示例中,我們使用UUID作為RowKey的一部分,以確保唯一性。同時(shí),我們將RowKey哈希,以實(shí)現(xiàn)更均勻的數(shù)據(jù)分布。

import org.apache.hadoop.hbase.util.Bytes;

import java.util.UUID;

public class RowKeyExample {

    public static byte[] generateRowKey() {
        UUID uuid = UUID.randomUUID();
        int hash = uuid.hashCode();
        return Bytes.toBytes(hash + "-" + uuid.toString());
    }

    public static void main(String[] args) {
        byte[] rowKey = generateRowKey();
        System.out.println("Generated RowKey: " + Bytes.toString(rowKey));
    }
}

2. 數(shù)據(jù)局部性示例:

在這個(gè)示例中,我們使用用戶ID作為RowKey的前綴,將相同用戶的數(shù)據(jù)存儲在相鄰的行中。

import org.apache.hadoop.hbase.util.Bytes;

public class UserRowKeyExample {

    public static byte[] generateRowKey(String userId) {
        return Bytes.toBytes(userId + "-" + System.currentTimeMillis());
    }

    public static void main(String[] args) {
        String userId = "user123";
        byte[] rowKey = generateRowKey(userId);
        System.out.println("Generated RowKey: " + Bytes.toString(rowKey));
    }
}

3. 避免順序?qū)憻狳c(diǎn)示例:

在這個(gè)示例中,我們將時(shí)間戳添加到RowKey中,以避免順序?qū)憻狳c(diǎn)問題。

import org.apache.hadoop.hbase.util.Bytes;

public class AvoidHotspotRowKeyExample {

    public static byte[] generateRowKey() {
        long timestamp = System.currentTimeMillis();
        int randomValue = (int) (Math.random() * 1000); // 添加隨機(jī)值
        return Bytes.toBytes(timestamp + "-" + randomValue);
    }

    public static void main(String[] args) {
        byte[] rowKey = generateRowKey();
        System.out.println("Generated RowKey: " + Bytes.toString(rowKey));
    }
}

在實(shí)際應(yīng)用中,RowKey的設(shè)計(jì)取決于您的業(yè)務(wù)需求和查詢模式。上述示例只是為了演示如何基于不同情境來設(shè)計(jì)RowKey,并不是絕對的最佳實(shí)踐。您應(yīng)該根據(jù)具體的情況進(jìn)行定制化設(shè)計(jì),進(jìn)行測試和優(yōu)化,以獲得最佳的性能和數(shù)據(jù)分布效果。

總之,HBase的RowKey設(shè)計(jì)是一個(gè)需要仔細(xì)考慮的重要決策,它直接影響了數(shù)據(jù)的存儲和查詢效率。根據(jù)具體的業(yè)務(wù)需求、查詢模式和性能要求,您可以選擇合適的RowKey設(shè)計(jì)策略。

8.2 內(nèi)存優(yōu)化

合理配置內(nèi)存參數(shù)是優(yōu)化HBase性能的重要步驟。以下是關(guān)于內(nèi)存優(yōu)化方面的擴(kuò)展說明,主要集中在MemStore優(yōu)化和塊緩存優(yōu)化。

1. MemStore優(yōu)化:

MemStore是HBase用于緩存寫入數(shù)據(jù)的內(nèi)存區(qū)域,過多的數(shù)據(jù)積累可能導(dǎo)致寫入性能下降。以下是一些優(yōu)化建議:

  • 控制刷新頻率: hbase.hregion.memstore.flush.size參數(shù)決定了當(dāng)MemStore中的數(shù)據(jù)大小達(dá)到一定閾值時(shí),會觸發(fā)數(shù)據(jù)的刷新到HFile。通過適當(dāng)調(diào)整這個(gè)閾值,可以控制刷新的頻率,以避免過于頻繁的刷新操作。
  • 合理設(shè)置阻塞系數(shù): hbase.hregion.memstore.block.multiplier參數(shù)控制了MemStore的大小,它會根據(jù)內(nèi)存分配來計(jì)算MemStore的阻塞大小。根據(jù)系統(tǒng)的可用內(nèi)存,您可以適當(dāng)調(diào)整這個(gè)參數(shù),以更好地利用可用內(nèi)存。如果系統(tǒng)內(nèi)存充足,可以增加阻塞系數(shù),提高M(jìn)emStore的大小。

2. 塊緩存優(yōu)化:

塊緩存用于緩存HFile中的數(shù)據(jù)塊,從而加速讀取操作。以下是一些塊緩存優(yōu)化的建議:

  • 根據(jù)表的讀取模式進(jìn)行配置: hbase.regionserver.global.memstore.size參數(shù)控制了塊緩存和MemStore的總內(nèi)存使用。根據(jù)您的表的讀取模式,可以調(diào)整這個(gè)參數(shù)來更好地分配內(nèi)存資源。如果表的讀取頻率高,可以增加塊緩存的比例,減少M(fèi)emStore的占用。
  • 使用hbase.regionserver.global.memstore.size.lower.limit 這個(gè)參數(shù)可以設(shè)置一個(gè)下限,確保至少有一定數(shù)量的內(nèi)存分配給塊緩存。這有助于避免當(dāng)MemStore數(shù)據(jù)較少時(shí),塊緩存占用過多的內(nèi)存資源。

在進(jìn)行內(nèi)存優(yōu)化時(shí),建議進(jìn)行實(shí)驗(yàn)和性能測試,以便根據(jù)實(shí)際情況找到最佳的內(nèi)存配置。同時(shí),還要考慮系統(tǒng)的其他資源使用情況,以避免因?yàn)檫^多的內(nèi)存分配而影響其他服務(wù)的正常運(yùn)行。

8.3 壓縮算法選擇

在HBase中,選擇適合的壓縮算法可以顯著降低存儲成本、提高數(shù)據(jù)傳輸效率,并且影響整體的性能。以下是關(guān)于壓縮算法選擇的擴(kuò)展說明:

1. Snappy壓縮算法:

  • 優(yōu)點(diǎn): Snappy是一種快速的壓縮算法,能夠在保持較高的解壓速度的同時(shí),有效地減少數(shù)據(jù)的存儲空間。它特別適用于高吞吐量和低延遲的應(yīng)用場景。
  • 適用場景: 如果您的主要關(guān)注點(diǎn)是壓縮速度和低延遲,可以考慮使用Snappy。它適用于對讀寫性能要求較高的場景,如實(shí)時(shí)分析和快速查詢。

2. LZO壓縮算法:

  • 優(yōu)點(diǎn): LZO是一種高效的壓縮算法,具有較快的解壓速度和高壓縮比。它在大數(shù)據(jù)分析場景中表現(xiàn)良好,尤其適用于MapReduce和Hive等作業(yè)。
  • 適用場景: 如果您在大數(shù)據(jù)分析中使用HBase,可以考慮使用LZO壓縮算法。它能夠減少磁盤IO和網(wǎng)絡(luò)傳輸,加速作業(yè)執(zhí)行。

3. Gzip壓縮算法:

  • 優(yōu)點(diǎn): Gzip是一種通用的壓縮算法,在壓縮比方面表現(xiàn)良好。它可以在較小的存儲空間中存儲更多的數(shù)據(jù)。
  • 適用場景: 如果您的主要關(guān)注點(diǎn)是壓縮比率,可以考慮使用Gzip。然而,需要注意的是,Gzip的壓縮和解壓縮速度相對較慢,可能會影響讀寫性能。

在選擇壓縮算法時(shí),需要綜合考慮數(shù)據(jù)的特點(diǎn)、訪問模式和硬件條件。您還可以根據(jù)不同的列族或表來選擇不同的壓縮算法,以滿足不同的需求。在配置壓縮算法時(shí),您可以使用HBase的列族級別的參數(shù)設(shè)置,例如:

<property>
    <name>hbase.columnfamily.familyName.COMPRESSION</name>
    <value>SNAPPY</value>
</property>

在實(shí)際應(yīng)用中,建議進(jìn)行性能測試,觀察不同壓縮算法在您的特定場景中的表現(xiàn),并根據(jù)測試結(jié)果做出最佳選擇。

8.4 使用Bloom Filter

Bloom Filter是一種基于哈希的數(shù)據(jù)結(jié)構(gòu),用于快速判斷一個(gè)元素是否存在于一個(gè)集合中。在HBase中,Bloom Filter可以用于提高讀取效率,減少不必要的磁盤IO。通過在某些列族上啟用Bloom Filter,可以在查詢時(shí)減少不必要的磁盤尋址,從而提升性能。

Bloom Filter的工作原理:

Bloom Filter使用一系列哈希函數(shù)將元素映射到一個(gè)位數(shù)組中。當(dāng)要判斷一個(gè)元素是否存在時(shí),會對該元素進(jìn)行相同的哈希計(jì)算,并檢查位數(shù)組中對應(yīng)的位是否都為1。如果有任何一個(gè)位為0,則元素肯定不存在;如果所有位都為1,則元素可能存在,但也有可能是誤判。

大數(shù)據(jù)HBase學(xué)習(xí)圣經(jīng):一本書實(shí)現(xiàn)HBase學(xué)習(xí)自由,技術(shù)圣經(jīng),面試,大數(shù)據(jù),hbase,面試,后端,架構(gòu),java,分布式

在HBase中使用Bloom Filter:

在HBase中,可以在列族級別配置是否啟用Bloom Filter。通過啟用Bloom Filter,可以在查詢時(shí)快速確定某行是否可能存在于HFile中,從而避免了不必要的磁盤IO。以下是配置Bloom Filter的示例:

<property>
    <name>hbase.columnfamily.familyName.BLOOMFILTER</name>
    <value>ROW</value>
</property>

在上述示例中,將familyName替換為實(shí)際的列族名稱,將ROW替換為所需的Bloom Filter類型。在HBase中,Bloom Filter支持的類型包括ROW、ROWCOLNONE。

適用場景:

使用Bloom Filter可以在某些列族上實(shí)現(xiàn)更快速的讀取操作,特別是在隨機(jī)讀取的場景下。適用場景包括:

  • 大型表中的快速查詢: 當(dāng)在大型表中進(jìn)行查詢操作時(shí),Bloom Filter可以幫助排除掉不符合條件的行,減少磁盤IO,提高查詢性能。
  • 緩存查詢結(jié)果: 如果您使用了查詢緩存,Bloom Filter可以幫助在緩存中快速判斷是否存在某行的數(shù)據(jù),從而決定是否使用緩存結(jié)果。

注意事項(xiàng):

  • Bloom Filter是概率性數(shù)據(jù)結(jié)構(gòu),可能會出現(xiàn)誤判(假陽性)。因此,它適用于那些可以接受一定誤差的場景。
  • 啟用Bloom Filter會占用一定的內(nèi)存資源,因此需要根據(jù)實(shí)際情況來權(quán)衡內(nèi)存的使用。

總之,通過在HBase中啟用Bloom Filter,您可以在查詢操作中降低不必要的磁盤IO,提高讀取效率。根據(jù)您的查詢模式和性能需求,可以選擇在適當(dāng)?shù)牧凶迳蠁⒂肂loom Filter。

8.5 索引優(yōu)化

在HBase中,雖然沒有傳統(tǒng)意義上的數(shù)據(jù)庫索引,但您可以采用一些方法來實(shí)現(xiàn)類似索引的功能,以提高查詢效率。以下是關(guān)于索引優(yōu)化的擴(kuò)展說明:

由于字?jǐn)?shù)限制,此處省略

完整內(nèi)容,請參見《大數(shù)據(jù)HBase學(xué)習(xí)圣經(jīng)》,pdf 找尼恩獲取

通過以上優(yōu)化措施,您可以大幅提升HBase的性能和效率,使其更適用于處理大規(guī)模數(shù)據(jù)和高并發(fā)的應(yīng)用場景。

在下一章中,我們將通過實(shí)際的應(yīng)用案例,進(jìn)一步展示HBase在不同領(lǐng)域的應(yīng)用。

9. HBase應(yīng)用案例

9.1 場景一:存儲日志數(shù)據(jù)

由于字?jǐn)?shù)限制,此處省略

完整內(nèi)容,請參見《大數(shù)據(jù)HBase學(xué)習(xí)圣經(jīng)》,pdf 找尼恩獲取

通過以上優(yōu)化策略,我們可以構(gòu)建一個(gè)高效的分布式日志存儲和分析平臺。該平臺不僅能夠存儲海量的訪問日志數(shù)據(jù),還能夠?qū)崿F(xiàn)實(shí)時(shí)分析和查詢,為用戶行為調(diào)優(yōu)提供支持。同時(shí),利用HBase的高擴(kuò)展性,我們可以輕松應(yīng)對不斷增長的數(shù)據(jù)量。

9.2 場景二:時(shí)序數(shù)據(jù)存儲

由于字?jǐn)?shù)限制,此處省略

完整內(nèi)容,請參見《大數(shù)據(jù)HBase學(xué)習(xí)圣經(jīng)》,pdf 找尼恩獲取

通過以上優(yōu)化策略,HBase可以支持高吞吐的時(shí)序數(shù)據(jù)寫入,同時(shí)能夠進(jìn)行復(fù)雜的實(shí)時(shí)分析,滿足電信計(jì)費(fèi)、監(jiān)控?cái)?shù)據(jù)分析等需要。HBase的分布式特性和擴(kuò)展性,使其成為時(shí)序數(shù)據(jù)存儲和分析的有力工具。

10. 與生態(tài)系統(tǒng)集成

HBase作為一個(gè)強(qiáng)大的分布式NoSQL數(shù)據(jù)庫,可以與大數(shù)據(jù)生態(tài)系統(tǒng)中的其他框架進(jìn)行緊密集成,構(gòu)建完整的大數(shù)據(jù)處理方案。在本章中,我們將介紹如何將HBase與Hadoop、Hive和Spark等框架進(jìn)行集成,發(fā)揮它們的優(yōu)勢,實(shí)現(xiàn)更強(qiáng)大的數(shù)據(jù)處理能力。

10.1 HBase與MapReduce集成

由于字?jǐn)?shù)限制,此處省略

完整內(nèi)容,請參見《大數(shù)據(jù)HBase學(xué)習(xí)圣經(jīng)》,pdf 找尼恩獲取

綜上所述,通過HBase與MapReduce的結(jié)合,可以實(shí)現(xiàn)強(qiáng)大的分布式計(jì)算能力,用于數(shù)據(jù)聚合、連接操作、數(shù)據(jù)清洗等復(fù)雜的分布式計(jì)算任務(wù)。

10.2 HBase與Hive集成

由于字?jǐn)?shù)限制,此處省略

完整內(nèi)容,請參見《大數(shù)據(jù)HBase學(xué)習(xí)圣經(jīng)》,pdf 找尼恩獲取

通過執(zhí)行這些查詢,您可以在Hive中分析和處理HBase中的數(shù)據(jù),無需編寫復(fù)雜的Java代碼。

通過HBase與Hive的集成,您可以充分發(fā)揮Hive的強(qiáng)大分析能力,同時(shí)利用HBase的高性能存儲,為數(shù)據(jù)分析和報(bào)告生成提供了更加靈活和便捷的方式。

10.3 HBase與Spark集成

由于字?jǐn)?shù)限制,此處省略

完整內(nèi)容,請參見《大數(shù)據(jù)HBase學(xué)習(xí)圣經(jīng)》,pdf 找尼恩獲取

通過以上集成示例,您可以充分發(fā)揮HBase與大數(shù)據(jù)生態(tài)系統(tǒng)的協(xié)同作用,構(gòu)建出更強(qiáng)大的數(shù)據(jù)處理和分析方案。

在最后一章中,我們將對整個(gè)教程進(jìn)行回顧,并為您提供進(jìn)一步深入學(xué)習(xí)和實(shí)踐的建議。

11. 總結(jié)

通過本教程,相信大家已經(jīng)對HBase的基本概念、架構(gòu)、安裝配置、數(shù)據(jù)模型、操作API以及優(yōu)化等方面有了一定的了解。HBase作為一個(gè)強(qiáng)大的分布式、可擴(kuò)展的NoSQL數(shù)據(jù)庫,為處理大規(guī)模數(shù)據(jù)提供了重要的支持。

當(dāng)然,要深入掌握HBase,還需要在實(shí)際項(xiàng)目中不斷實(shí)踐和優(yōu)化。如果您希望繼續(xù)學(xué)習(xí)更多高級主題,可以參考本教程中提供的參考資料,并在實(shí)際項(xiàng)目中不斷積累經(jīng)驗(yàn)。

12. 參考資料

[1] HBase中文官方文檔:http://hbase.org.cn/

[2] HBase權(quán)威指南:https://book.douban.com/subject/26560706/

[3] HBase技術(shù)內(nèi)幕:https://book.douban.com/subject/26649202/

說在后面

本文是《大數(shù)據(jù)Flink學(xué)習(xí)圣經(jīng)》 V1版本, 是 《尼恩 大數(shù)據(jù) 面試寶典》 姊妹篇。

這里特別說明一下:《尼恩 大數(shù)據(jù) 面試寶典》5個(gè)專題 PDF 自首次發(fā)布以來, 已經(jīng)收集了 好幾百題,大量的大廠面試干貨、正貨 。 《尼恩 大數(shù)據(jù) 面試寶典》面試題集合, 已經(jīng)變成大數(shù)據(jù)學(xué)習(xí)和面試的必讀書籍。

于是,尼恩架構(gòu)團(tuán)隊(duì) 趁熱打鐵,推出 《大數(shù)據(jù)Flink學(xué)習(xí)圣經(jīng)》,《大數(shù)據(jù)HBASE學(xué)習(xí)圣經(jīng)》(本文)

完整的pdf,可以關(guān)注尼恩的 公號【技術(shù)自由圈】取。

并且,《大數(shù)據(jù)HBASE學(xué)習(xí)圣經(jīng)》、《大數(shù)據(jù)Flink學(xué)習(xí)圣經(jīng)》、《尼恩 大數(shù)據(jù) 面試寶典》 都會持續(xù)迭代、不斷更新,以 吸納最新的面試題,最新版本,具體請參見 文末公號【技術(shù)自由圈】

作者介紹

一作:Andy,資深架構(gòu)師, 《Java 高并發(fā)核心編程 加強(qiáng)版》作者之1 。

二作:尼恩,41歲資深老架構(gòu)師, IT領(lǐng)域資深作家、著名博主。《Java 高并發(fā)核心編程 加強(qiáng)版 卷1、卷2、卷3》創(chuàng)世作者。 《K8S學(xué)習(xí)圣經(jīng)》《Docker學(xué)習(xí)圣經(jīng)》《Go學(xué)習(xí)圣經(jīng)》等11個(gè)PDF 圣經(jīng)的作者。 也是一個(gè) 資深架構(gòu)導(dǎo)師、架構(gòu)轉(zhuǎn)化 導(dǎo)師, 成功指導(dǎo)了多個(gè)中級Java、高級Java轉(zhuǎn)型架構(gòu)師崗位, 最高的學(xué)員年薪拿到近100W。

推薦閱讀

《消息推送 架構(gòu)設(shè)計(jì)》

《阿里2面:你們部署多少節(jié)點(diǎn)?1000W并發(fā),當(dāng)如何部署?》

《美團(tuán)2面:5個(gè)9高可用99.999%,如何實(shí)現(xiàn)?》

《網(wǎng)易一面:單節(jié)點(diǎn)2000Wtps,Kafka怎么做的?》

《字節(jié)一面:事務(wù)補(bǔ)償和事務(wù)重試,關(guān)系是什么?》

《網(wǎng)易一面:25Wqps高吞吐寫Mysql,100W數(shù)據(jù)4秒寫完,如何實(shí)現(xiàn)?》

《億級短視頻,如何架構(gòu)?》

《炸裂,靠“吹牛”過京東一面,月薪40K》

《太猛了,靠“吹?!边^順豐一面,月薪30K》

《炸裂了…京東一面索命40問,過了就50W+》

《問麻了…阿里一面索命27問,過了就60W+》

《百度狂問3小時(shí),大廠offer到手,小伙真狠!》

《餓了么太狠:面?zhèn)€高級Java,抖這多硬活、狠活》

《字節(jié)狂問一小時(shí),小伙offer到手,太狠了!》

《收個(gè)滴滴Offer:從小伙三面經(jīng)歷,看看需要學(xué)點(diǎn)啥?》

《尼恩 架構(gòu)筆記》《尼恩高并發(fā)三部曲》《尼恩Java面試寶典》PDF,請到下面公號【技術(shù)自由圈】取↓↓↓文章來源地址http://www.zghlxwxcb.cn/news/detail-691251.html

到了這里,關(guān)于大數(shù)據(jù)HBase學(xué)習(xí)圣經(jīng):一本書實(shí)現(xiàn)HBase學(xué)習(xí)自由的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 大數(shù)據(jù)面試題:HBase讀寫數(shù)據(jù)流程

    大數(shù)據(jù)面試題:HBase讀寫數(shù)據(jù)流程

    面試題來源: 《大數(shù)據(jù)面試題 V4.0》 大數(shù)據(jù)面試題V3.0,523道題,679頁,46w字 參考答案: 1、寫數(shù)據(jù)流程 1)Client先訪問zookeeper,獲取hbase:meta表位于哪個(gè)Region Server。 2)訪問對應(yīng)的Region Server,獲取hbase:meta表,根據(jù)讀請求的namespace:table/rowkey,查詢出目標(biāo)數(shù)據(jù)位于哪個(gè)Region Ser

    2024年02月15日
    瀏覽(21)
  • 大數(shù)據(jù)面試題Hbase篇

    大數(shù)據(jù)面試題Hbase篇

    目錄 1.Hbase是什么? 2.HBase 的特點(diǎn)是什么? 3.HBase 和 Hive 的區(qū)別? 4.描述 HBase 的 rowKey 的設(shè)計(jì)原則? 5.請?jiān)敿?xì)描述 HBase 中一個(gè) cell 的結(jié)構(gòu)? 6.hbase中分布式存儲的最小單元? 7.簡述 HBase 中 compact 用途是什么,什么時(shí)候觸發(fā),分為哪兩種,有什么區(qū)別,有哪些相關(guān)配置參數(shù)?

    2024年02月09日
    瀏覽(22)
  • 大數(shù)據(jù)面試題:HBase的讀寫緩存

    面試題來源: 《大數(shù)據(jù)面試題 V4.0》 大數(shù)據(jù)面試題V3.0,523道題,679頁,46w字 參考答案: HBase上RegionServer的cache主要分為兩個(gè)部分: MemStore BlockCache 。 MemStore是寫緩存,BlockCache是讀緩存。 當(dāng)數(shù)據(jù)寫入HBase時(shí),會先寫入memstore,RegionServer會給每個(gè)region提供一個(gè)memstore,memstore中的

    2024年02月14日
    瀏覽(20)
  • 程序員如何實(shí)現(xiàn)財(cái)富自由系列之:參與區(qū)塊鏈技術(shù)的開發(fā)和投資

    作者:禪與計(jì)算機(jī)程序設(shè)計(jì)藝術(shù) 隨著各行各業(yè)的人工智能技術(shù)應(yīng)用越來越普及,“區(qū)塊鏈”這個(gè)火熱詞匯在近幾年已經(jīng)掀起了一股新的熱潮。 區(qū)塊鏈(Blockchain)是一個(gè)分布式數(shù)據(jù)庫,它通過對數(shù)據(jù)進(jìn)行記錄、驗(yàn)證、存儲、防篡改等方式確保數(shù)據(jù)的真實(shí)性、完整性和有效性。

    2024年02月07日
    瀏覽(26)
  • 大數(shù)據(jù)面試題:HBase為什么查詢快

    面試題來源: 《大數(shù)據(jù)面試題 V4.0》 大數(shù)據(jù)面試題V3.0,523道題,679頁,46w字 可回答:1)HBase為什么讀快;2)HBase是根據(jù)rowkey查詢,當(dāng)數(shù)據(jù)量相當(dāng)大的時(shí)候,是怎么讀的很快的 參考答案: 1、基于LSM樹的存儲方式 HBase采用基于LSM樹的存儲方式,這種存儲方式將數(shù)據(jù)分為內(nèi)存和

    2024年02月12日
    瀏覽(25)
  • 大數(shù)據(jù)技術(shù)之HBase(超級詳細(xì))

    大數(shù)據(jù)技術(shù)之HBase(超級詳細(xì))

    第1章 HBase簡介 1.1 什么是HBase HBase的原型是Google的BigTable論文,受到了該論文思想的啟發(fā),目前作為Hadoop的子項(xiàng)目來開發(fā)維護(hù),用于支持結(jié)構(gòu)化的數(shù)據(jù)存儲。 官方網(wǎng)站:http://hbase.apache.org – 2006年Google發(fā)表BigTable白皮書 – 2006年開始開發(fā)HBase – 2008年北京成功開奧運(yùn)會,程序員

    2024年01月16日
    瀏覽(24)
  • 大數(shù)據(jù)面試題:HBase的RegionServer宕機(jī)以后怎么恢復(fù)的?

    大數(shù)據(jù)面試題:HBase的RegionServer宕機(jī)以后怎么恢復(fù)的?

    面試題來源: 《大數(shù)據(jù)面試題 V4.0》 大數(shù)據(jù)面試題V3.0,523道題,679頁,46w字 可回答:1)HBase一個(gè)節(jié)點(diǎn)宕機(jī)了怎么辦;2)HBase故障恢復(fù) 參考答案: 1、HBase常見故障 導(dǎo)致RegionServer故障的原因: FullGc引起長時(shí)間停頓 HBase對Jvm堆內(nèi)存管理不善,未合理使用堆外內(nèi)存 Jvm啟動參數(shù)配

    2024年02月14日
    瀏覽(29)
  • HBase與其他大數(shù)據(jù)技術(shù)的比較

    HBase是一個(gè)分布式、可擴(kuò)展、高性能的列式存儲系統(tǒng),基于Google的Bigtable設(shè)計(jì)。HBase是Hadoop生態(tài)系統(tǒng)的一部分,可以與HDFS、MapReduce、ZooKeeper等技術(shù)整合。HBase的核心特點(diǎn)是提供低延遲、高可擴(kuò)展性的隨機(jī)讀寫訪問。 HBase與其他大數(shù)據(jù)技術(shù)的比較有以下幾個(gè)方面: 1.1 HBase與HDFS的

    2024年02月22日
    瀏覽(21)
  • 數(shù)據(jù)分片技術(shù)及其在HBase中的應(yīng)用

    作者:禪與計(jì)算機(jī)程序設(shè)計(jì)藝術(shù) HBase是一個(gè)開源的分布式NoSQL數(shù)據(jù)庫系統(tǒng),可以用于海量結(jié)構(gòu)化和半結(jié)構(gòu)化的數(shù)據(jù)存儲。相比于傳統(tǒng)的關(guān)系型數(shù)據(jù)庫系統(tǒng),HBase在很多方面都優(yōu)秀,例如高速讀寫、高容錯(cuò)性和動態(tài)伸縮等,但同時(shí)也存在一些不足。比如它的查詢延遲較長,因?yàn)樗?/p>

    2024年02月10日
    瀏覽(22)
  • 阿里技術(shù)官親筆:Kafka限量筆記,一本書掌握Kafka的精髓

    阿里技術(shù)官親筆:Kafka限量筆記,一本書掌握Kafka的精髓

    分布式,堪稱程序員江湖中的一把利器,無論面試還是職場,皆是不可或缺的技能。而Kafka,這款分布式發(fā)布訂閱消息隊(duì)列的璀璨明珠,其魅力之強(qiáng)大,無與倫比。對于Kafka的奧秘,我們?nèi)孕枥^續(xù)探索。 要論對Kafka的熟悉程度,恐怕阿里的大佬們最有話語權(quán)。今天,我們有幸分

    2024年01月22日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包