c语言软件开发和网站开发区别,潍坊昌乐县城乡建设局网站,承德市宽城县建设局网站,公司有网站域名 如何做网站学习目标#xff1a;三栖合一架构师
本文是《大数据HBase学习圣经》 V1版本#xff0c;是 《尼恩 大数据 面试宝典》姊妹篇。
这里特别说明一下#xff1a;《尼恩 大数据 面试宝典》5个专题 PDF 自首次发布以来#xff0c; 已经汇集了 好几百题#xff0c;大量的大厂面试…学习目标三栖合一架构师
本文是《大数据HBase学习圣经》 V1版本是 《尼恩 大数据 面试宝典》姊妹篇。
这里特别说明一下《尼恩 大数据 面试宝典》5个专题 PDF 自首次发布以来 已经汇集了 好几百题大量的大厂面试干货、正货 。 《尼恩 大数据 面试宝典》面试题集合 将变成大数据学习和面试的必读书籍。
于是尼恩架构团队 趁热打铁推出 《大数据Flink学习圣经》《大数据HBASE学习圣经》本文
《大数据HBase学习圣经》 后面会不断升级不断 迭代 变成大数据领域 学习和面试的必读书籍
最终帮助大家成长为 三栖合一架构师进大厂拿高薪。 《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》的PDF请到公号【技术自由圈】获取 “Java大数据” 双栖架构成功案例
成功案例1
惊天大逆袭失业4个月3年小伙1个月喜提架构Offer而且是大龄跨行超级牛
成功案例2
极速拿offer阿里P6被裁后极速上岸1个月内喜提2优质offer(含滴滴) 文章目录 学习目标三栖合一架构师“Java大数据” 双栖架构成功案例1. 引言1.1 数据的价值与挑战1.2 NoSQL数据库的崛起1.3 引入HBase1.4 本文的目标 2. HBase概述2.1 什么是HBase2.2 HBase的特点2.3 HBase与传统关系型数据库的区别2.4 HBase的应用场景2.4.1 大数据存储与处理2.4.2 实时数据分析2.4.3 日志数据存储2.4.4 时序数据存储2.4.5 高并发随机访问2.4.6 全文搜索 3. 安装与配置3.1 HBase安装方式概述3.2 本地模式安装与配置3.3 完全分布式模式安装与配置 4. 数据操作4.1 表操作4.2 数据操作4.3 计数器 5. 数据模型与架构5.1 HBase系统架构5.1.1 HBase组件概览HMasterRegionServerZookeeperHDFS 5.1.2 组件关系与协作 5.2 核心概念解析5.2.1 Table5.2.2 RowKey5.2.3 Column Family5.2.4 Column Qualifier5.2.5 Cell5.2.6 Timestamp5.2.7 Region 5.3 内部实现原理5.3.1 HBase读数据流程5.3.2 HBase写数据流程5.3.3 HBase的flush(刷写)及compact(合并)机制5.3.4 缓存机制5.3.5 垃圾回收 6. HBase进阶操作6.1 高级用例6.2 过滤器的使用6.3 数据导入方式 7. 客户端开发7.1 依赖配置7.2 用户信息示例7.3 SpringBoot整合HBase 8. HBase优化8.1 Rowkey设计8.2 内存优化8.3 压缩算法选择8.4 使用Bloom Filter8.5 索引优化 9. HBase应用案例9.1 场景一存储日志数据9.2 场景二时序数据存储 10. 与生态系统集成10.1 HBase与MapReduce集成10.2 HBase与Hive集成10.3 HBase与Spark集成 11. 总结12. 参考资料说在后面作者介绍推荐阅读 1. 引言
在当今数字化的时代数据已经成为了推动商业、科研和社会发展的关键资源。随着互联网、物联网和传感器技术的快速发展大规模数据的产生呈爆炸式增长这种数据潮流已经超越了传统关系型数据库的处理能力。在这个新的数据格局下分布式NoSQL数据库逐渐崭露头角成为了解决大数据存储和处理难题的利器。
1.1 数据的价值与挑战
数据已经成为当今世界的黄金企业通过数据分析来洞察市场趋势、预测客户行为科学家利用数据来研究气候变化、疾病传播等重要议题。然而这种数据的大量涌现也带来了巨大的挑战。传统的关系型数据库往往无法应对数据规模的快速扩张其数据模型和架构无法满足大规模数据存储和高性能处理的需求。
1.2 NoSQL数据库的崛起
为了应对这一挑战分布式NoSQLNot Only SQL数据库应运而生。与传统关系型数据库不同NoSQL数据库采用了更加灵活的数据模型和分布式架构能够有效地处理海量数据并且能够水平扩展以满足不断增长的需求。主流的NoSQL数据库如MongoDB、Cassandra和HBase等各自拥有独特的特点适用于不同的应用场景。
1.3 引入HBase
在众多NoSQL数据库中HBase以其出色的大数据存储和实时查询能力而备受瞩目。HBase是一款开源的分布式、可扩展、高性能的NoSQL数据库构建在Hadoop生态系统之上。它以其在处理海量数据和实现随机访问方面的卓越表现而引起广泛关注。通过使用HBase用户能够轻松地存储、管理和检索海量数据从而在大数据时代获得更多的商业和科研价值。
1.4 本文的目标
本文旨在为初学者提供关于HBase的基础知识帮助他们了解HBase的特点、适用场景以及基本操作。从HBase的概述到高级操作我们将逐步引导大家深入了解这个强大的分布式NoSQL数据库在大数据领域的探索之旅提供支持和指引。
2. HBase概述
2.1 什么是HBase
HBaseHadoop Database的缩写是一个开源的分布式、可扩展、高性能的NoSQL数据库它是基于Google的Bigtable论文设计而来构建在Hadoop生态系统之上。HBase的设计目标是为了处理海量数据并且在这些数据上实现高效的实时随机访问。相比传统的关系型数据库HBase提供了更适合大规模数据处理的数据模型和架构。
2.2 HBase的特点
HBase具备许多独特的特点使其成为处理大规模数据的理想选择
分布式架构 HBase使用分布式架构数据被分割成多个Region并分布在多个RegionServer上。这使得HBase可以水平扩展支持海量数据的存储和处理。列式存储 HBase采用列式存储数据按列存储在磁盘上这种方式有助于节约存储空间和提高查询效率。稀疏数据 HBase支持稀疏数据这意味着每一行数据不需要都包含相同的列这对于处理具有不同属性的数据非常有用。实时随机访问 HBase支持实时的随机读写操作使其适用于需要低延迟的应用场景如实时分析和数据查询。强一致性 HBase提供强一致性的数据访问可以确保数据的准确性和一致性。
2.3 HBase与传统关系型数据库的区别
HBase与传统的关系型数据库在数据模型和架构上存在显著的区别
数据模型 传统关系型数据库使用表格模型数据以结构化的行和列的方式存储。而HBase使用了Bigtable模型将数据按照列族存储每个列族可以包含多个列。架构 传统关系型数据库通常以单机为基础随着数据增长可能需要进行垂直扩展。而HBase采用分布式架构支持水平扩展可以轻松处理大规模数据。查询语言 传统关系型数据库使用SQL进行查询而HBase没有提供SQL查询语言。查询HBase数据通常需要编写Java或其他编程语言的代码。灵活性 HBase在数据模型和架构上更加灵活适用于存储和处理各种类型的数据包括结构化、半结构化和非结构化数据。
2.4 HBase的应用场景
HBase作为一款分布式、高性能的NoSQL数据库适用于多种应用场景特别是在处理大规模数据和需要实时随机访问的情况下它发挥着重要的作用。
2.4.1 大数据存储与处理
HBase的分布式架构使其非常适合存储和处理大规模数据。在大数据应用中数据量可能达到甚至超过PB级传统的关系型数据库很难胜任。HBase的分布式存储和自动水平扩展能力使得它能够轻松应对这种大规模数据的存储和查询需求。
2.4.2 实时数据分析
对于需要实时数据分析的场景HBase也具备优势。实时数据分析要求系统能够迅速地查询和获取数据而HBase支持实时的随机读写操作使其能够在数据到达时即时分析并得出有价值的结论。
2.4.3 日志数据存储
很多应用产生大量的日志数据这些数据在很大程度上是非结构化的而且需要长期保留以便后续分析。HBase的稀疏数据模型和高效的存储能力使得它成为了存储这些日志数据的理想选择。通过HBase您可以方便地存储、检索和分析海量的日志数据。
2.4.4 时序数据存储
时序数据是时间序列的数据如传感器数据、股票价格、气象数据等。HBase的分布式架构和实时查询能力使其非常适合存储和处理时序数据。您可以根据时间戳进行快速查询支持快速的历史数据回溯和实时监控。
2.4.5 高并发随机访问
一些应用需要支持高并发的随机访问传统关系型数据库往往无法满足这种需求。HBase的设计目标之一就是实现高性能的实时随机访问它的分布式架构和列式存储使得它能够轻松应对高并发的读写请求。
2.4.6 全文搜索
虽然HBase不是一款专门的全文搜索引擎但在某些情况下它也可以用于存储全文索引数据。通过将索引数据存储在HBase中您可以实现基于关键词的快速检索。
总之HBase的应用场景广泛尤其在处理大规模数据、实时性要求高和随机访问频繁的场景下它能够发挥出其强大的特点。从存储日志数据到实时数据分析从时序数据存储到高并发随机访问HBase都能够为您提供可靠的解决方案。接下来我们将深入探讨如何安装和配置HBase为您搭建一个高效的数据存储和处理环境。
3. 安装与配置 参考 Apache HBase 配置_Hbase 中文文档 HBase的安装是您开始使用这个强大数据库的第一步。在本节中我们将为您介绍HBase的安装方式并详细说明如何在不同模式下进行安装和配置。
3.1 HBase安装方式概述
HBase的安装可以分为以下几种方式
本地模式Standalone Mode 本地模式是最简单的安装方式适用于在本地单机上进行开发和测试。在本地模式下HBase将运行在单一的Java进程中数据存储在本地文件系统。完全分布式模式Fully-Distributed Mode 完全分布式模式是在真实的分布式环境中部署HBase的方式。在完全分布式模式下HBase的各个组件分布在多台计算机上以实现高可用性、容错性和性能扩展。
在接下来的小节中我们将详细说明每种安装方式的步骤和配置方法帮助您根据实际需求选择合适的安装方式。
3.2 本地模式安装与配置
本地模式安装非常适合初学者它可以让您在不投入太多配置的情况下迅速体验HBase的基本功能。在本地模式下HBase将运行在单一的Java进程中数据存储在本地文件系统。
Hbase单节点配置是在没有多台计算机节点的情况下对Hbase的分布式存储和计算进行模拟安装和配置。通过在一台计算机节点上解压Hbase安装压缩包后然后进行Hbase相关文件进行配置让Hbase运行在一台机器上并实现对数据存储和计算的测试支持。默认情况下Hbase运行在单机模式下。在单机模式中Hbase使用本地文件系统而不是HDFS。
步骤
准备环境 确保您的系统上已经安装了Java Development KitJDK。HBase需要Java运行环境。下载HBase Index of /dist/hbase/2.5.5 (apache.org)解压缩HBase压缩包 在您选择的目录中解压缩下载的HBase压缩包。您可以使用以下命令假设您的压缩包是hbase-x.x.x.tar.gz
tar -xzvf hbase-2.5.5-bin.tar.gz配置HBase 进入解压缩后的HBase目录编辑conf/hbase-site.xml文件以进行配置。以下是一个示例配置
?xml version1.0?
?xml-stylesheet typetext/xsl hrefconfiguration.xsl?
configurationpropertynamehbase.rootdir/namevaluefile:///home/docker/hbase/data/value/propertypropertynamehbase.zookeeper.property.dataDir/namevalue/home/docker/hbase/zookeeper/value/property
/configuration请替换上述示例中的路径为您实际希望存储数据的路径。
启动HBase 打开终端导航到HBase目录然后运行以下命令来启动HBase
./bin/start-hbase.sh访问HBase Shell 您可以使用HBase Shell与本地模式下的HBase进行交互。在终端中运行以下命令
./bin/hbase shell这将打开HBase Shell您可以在其中执行HBase命令。
停止HBase 要停止HBase回到终端导航到HBase目录然后运行以下命令
./bin/stop-hbase.sh这些步骤将在本地模式下安装和运行HBase。请注意本地模式下的HBase不适用于生产环境但可以用于学习和开发目的。如果您要在分布式环境中使用HBase需要进行更详细的配置和设置。
3.3 完全分布式模式安装与配置
完全分布式模式是在真实的分布式环境中部署HBase的方式它适用于需要处理大规模数据和实现高可用性的场景。在完全分布式模式下HBase的各个组件分布在多台计算机上通过配置实现高可用性、容错性和性能扩展。
部署 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
# 启动并开机启动
systemctl enable --now docker
docker --version部署 docker-compose
curl -SL https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-composechmod x /usr/local/bin/docker-compose
docker-compose --version创建网络
# 创建注意不能使用hadoop_network要不然启动hs2服务的时候会有问题
docker network create hadoop-network# 查看
docker network ls部署zookeeper 创建目录和文件
[rootcdh1 zookeeper]# tree
.
├── docker-compose.yml
├── zk1
├── zk2
└── zk33 directories, 1 filedocker-compose.yml
version: 3.7# 给zk集群配置一个网络网络名为hadoop-network
networks:hadoop-network:external: true# 配置zk集群的
# container services下的每一个子配置都对应一个zk节点的docker container
services:zk1:# docker container所使用的docker imageimage: zookeeperhostname: zk1container_name: zk1restart: always# 配置docker container和宿主机的端口映射ports:- 2181:2181- 28081:8080# 配置docker container的环境变量environment:# 当前zk实例的idZOO_MY_ID: 1# 整个zk集群的机器、端口列表ZOO_SERVERS: server.10.0.0.0:2888:3888;2181 server.2zk2:2888:3888;2181 server.3zk3:2888:3888;2181# 将docker container上的路径挂载到宿主机上 实现宿主机和docker container的数据共享volumes:- ./zk1/data:/data- ./zk1/datalog:/datalog# 当前docker container加入名为zk-net的隔离网络networks:- hadoop-networkzk2:image: zookeeperhostname: zk2container_name: zk2restart: alwaysports:- 2182:2181- 28082:8080environment:ZOO_MY_ID: 2ZOO_SERVERS: server.1zk1:2888:3888;2181 server.20.0.0.0:2888:3888;2181 server.3zk3:2888:3888;2181volumes:- ./zk2/data:/data- ./zk2/datalog:/datalognetworks:- hadoop-networkzk3:image: zookeeperhostname: zk3container_name: zk3restart: alwaysports:- 2183:2181- 28083:8080environment:ZOO_MY_ID: 3ZOO_SERVERS: server.1zk1:2888:3888;2181 server.2zk2:2888:3888;2181 server.30.0.0.0:2888:3888;2181volumes:- ./zk3/data:/data- ./zk3/datalog:/datalognetworks:- hadoop-networkwget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.8.2/apache-zookeeper-3.8.2-bin.tar.gz --no-check-certificate启动
[rootcdh1 zookeeper]# docker-compose up -d
Creating zk3 ... done
Creating zk2 ... done
Creating zk1 ... done下载Hadoop部署包
git clone https://gitee.com/hadoop-bigdata/docker-compose-hadoop.git安装部署 mysql5.7 这里mysql主要是供hive存储元数据
cd docker-compose-hadoop/mysqldocker-compose -f mysql-compose.yaml up -ddocker-compose -f mysql-compose.yaml ps#root 密码123456以下是登录命令注意一般在公司不能直接在命令行明文输入密码要不然容易被安全抓切记切记
docker exec -it mysql mysql -uroot -p123456安装hadoop和hive
cd docker-compose-hadoop/hadoop_hivedocker-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;启动后如果发现hadoop historyserver容器未健康启动可以执行以下命令
docker exec -it hadoop-hdfs-nn hdfs dfs -chmod 777 /tmp
docker restart hadoop-mr-historyserver hdfs格式化可以执行以下命令
[rootcdh1 ~]# docker exec -it hadoop-hdfs-nn hdfs dfsadmin -refreshNodes
Refresh nodes successful
[rootcdh1 ~]# docker exec -it hadoop-hdfs-dn-0 hdfs dfsadmin -fs hdfs://hadoop-hdfs-nn:9000 -refreshNodes
Refresh nodes successful
[rootcdh1 ~]# docker exec -it hadoop-hdfs-dn-1 hdfs dfsadmin -fs hdfs://hadoop-hdfs-nn:9000 -refreshNodes
Refresh nodes successful
[rootcdh1 ~]# docker exec -it hadoop-hdfs-dn-2 hdfs dfsadmin -fs hdfs://hadoop-hdfs-nn:9000 -refreshNodes
Refresh nodes successful可以通过 cdh1:30070 查看HDFS分布情况 以及访问http://cdh1:30888/cluster 查看yarn资源情况 配置Hbase参数 mkdir conf
conf/hbase-env.sh
export JAVA_HOME/opt/apache/jdk
export HBASE_CLASSPATH/opt/apache/hbase/conf
export HBASE_MANAGES_ZKfalseconf/hbase-site.xml
configurationpropertynamehbase.rootdir/namevaluehdfs://hadoop-hdfs-nn:9000/hbase/value!-- hdfs://ns1/hbase 对应hdfs-site.xml的dfs.nameservices属性值 --/propertypropertynamehbase.cluster.distributed/namevaluetrue/value/propertypropertynamehbase.zookeeper.quorum/namevaluezk1,zk2,zk3/value/propertypropertynamehbase.zookeeper.property.clientPort/namevalue2181/value/propertypropertynamehbase.master/namevalue60000/valuedescription单机版需要配主机名/IP和端口HA方式只需要配端口/description/propertypropertynamehbase.master.info.bindAddress/namevalue0.0.0.0/value/propertypropertynamehbase.master.port/namevalue16000/value/propertypropertynamehbase.master.info.port/namevalue16010/value/propertypropertynamehbase.regionserver.port/namevalue16020/value/propertypropertynamehbase.regionserver.info.port/namevalue16030/value/propertypropertynamehbase.wal.provider/namevaluefilesystem/value !--也可以用multiwal--/property
/configurationconf/backup-masters
hbase-master-2conf/regionservers
hbase-regionserver-1
hbase-regionserver-2
hbase-regionserver-3conf/hadoop/core-site.xml
?xml version1.0 encodingUTF-8?
?xml-stylesheet typetext/xsl hrefconfiguration.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 athttp://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed 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 andlimitations under the License. See accompanying LICENSE file.--!-- Put site-specific property overrides in this file. --configuration!--配置namenode的地址 --propertynamefs.defaultFS/namevaluehdfs://hadoop-hdfs-nn:9000/value/property!-- 文件的缓冲区大小(128KB),默认值是4KB --propertynameio.file.buffer.size/namevalue131072/value/property!-- 文件系统垃圾桶保存时间 --propertynamefs.trash.interval/namevalue1440/value/property!-- 配置hadoop临时目录存储元数据用的请确保该目录(/opt/apache/hadoop/data/hdfs/)已被手动创建tmp目录会自动创建 --propertynamehadoop.tmp.dir/namevalue/opt/apache/hadoop/data/hdfs/tmp/value/property!--配置HDFS网页登录使用的静态用户为root--propertynamehadoop.http.staticuser.user/namevalueroot/value/property!--配置root(超级用户)允许通过代理访问的主机节点--propertynamehadoop.proxyuser.root.hosts/namevalue*/value/property!--配置root(超级用户)允许通过代理用户所属组--propertynamehadoop.proxyuser.root.groups/namevalue*/value/property!--配置root(超级用户)允许通过代理的用户--propertynamehadoop.proxyuser.root.user/namevalue*/value/property!--配置hive允许通过代理访问的主机节点--propertynamehadoop.proxyuser.hive.hosts/namevalue*/value/property!--配置hive允许通过代理用户所属组--propertynamehadoop.proxyuser.hive.groups/namevalue*/value/property!--配置hive允许通过代理访问的主机节点--propertynamehadoop.proxyuser.hadoop.hosts/namevalue*/value/property!--配置hive允许通过代理用户所属组--propertynamehadoop.proxyuser.hadoop.groups/namevalue*/value/property
/configurationconf/hadoop/hdfs-site.xml
?xml version1.0 encodingUTF-8?
?xml-stylesheet typetext/xsl hrefconfiguration.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 athttp://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed 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 andlimitations under the License. See accompanying LICENSE file.--!-- Put site-specific property overrides in this file. --configuration!-- namenode web访问配置 --propertynamedfs.namenode.http-address/namevalue0.0.0.0:9870/value/property!-- 必须将dfs.webhdfs.enabled属性设置为true否则就不能使用webhdfs的LISTSTATUS、LISTFILESTATUS等需要列出文件、文件夹状态的命令因为这些信息都是由namenode来保存的。 --propertynamedfs.webhdfs.enabled/namevaluetrue/value/propertypropertynamedfs.namenode.name.dir/namevalue/opt/apache/hadoop/data/hdfs/namenode/value/propertypropertynamedfs.datanode.data.dir/namevalue/opt/apache/hadoop/data/hdfs/datanode/data1,/opt/apache/hadoop/data/hdfs/datanode/data2,/opt/apache/hadoop/data/hdfs/datanode/data3/value/propertypropertynamedfs.replication/namevalue3/value/property!-- 设置SNN进程运行机器位置信息 --propertynamedfs.namenode.secondary.http-address/namevaluehadoop-hdfs-nn2:9868/value/propertypropertynamedfs.namenode.datanode.registration.ip-hostname-check/namevaluefalse/value/property!-- 白名单 --propertynamedfs.hosts/namevalue/opt/apache/hadoop/etc/hadoop/dfs.hosts/value/property!-- 黑名单 --propertynamedfs.hosts.exclude/namevalue/opt/apache/hadoop/etc/hadoop/dfs.hosts.exclude/value/property/configuration完成conf配置后需要设置读写权限
chmod -R 777 conf/编写环境.env文件
HBASE_MASTER_PORT16000
HBASE_MASTER_INFO_PORT16010
HBASE_HOME/opt/apache/hbase
HBASE_REGIONSERVER_PORT16020编排docker-compose.yaml
version: 3
services:hbase-master-1:image: registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/hbase:2.5.4user: hadoop:hadoopcontainer_name: hbase-master-1hostname: hbase-master-1restart: alwaysprivileged: trueenv_file:- .envvolumes:- ./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.xmlports:- 36010:${HBASE_MASTER_PORT}- 36020:${HBASE_MASTER_INFO_PORT}command: [sh,-c,/opt/apache/bootstrap.sh hbase-master]networks:- hadoop-networkhealthcheck:test: [CMD-SHELL, netstat -tnlp|grep :${HBASE_MASTER_PORT} || exit 1]interval: 10stimeout: 20sretries: 3hbase-master-2:image: registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/hbase:2.5.4user: hadoop:hadoopcontainer_name: hbase-master-2hostname: hbase-master-2restart: alwaysprivileged: trueenv_file:- .envvolumes:- ./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.xmlports:- 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-networkhealthcheck:test: [CMD-SHELL, netstat -tnlp|grep :${HBASE_MASTER_PORT} || exit 1]interval: 10stimeout: 20sretries: 3hbase-regionserver-1:image: registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/hbase:2.5.4user: hadoop:hadoopcontainer_name: hbase-regionserver-1hostname: hbase-regionserver-1restart: alwaysprivileged: trueenv_file:- .envvolumes:- ./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.xmlports:- 36030:${HBASE_REGIONSERVER_PORT}command: [sh,-c,/opt/apache/bootstrap.sh hbase-regionserver hbase-master-1 ${HBASE_MASTER_PORT}]networks:- hadoop-networkhealthcheck:test: [CMD-SHELL, netstat -tnlp|grep :${HBASE_REGIONSERVER_PORT} || exit 1]interval: 10stimeout: 10sretries: 3hbase-regionserver-2:image: registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/hbase:2.5.4user: hadoop:hadoopcontainer_name: hbase-regionserver-2hostname: hbase-regionserver-2restart: alwaysprivileged: trueenv_file:- .envvolumes:- ./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.xmlports:- 36031:${HBASE_REGIONSERVER_PORT}command: [sh,-c,/opt/apache/bootstrap.sh hbase-regionserver hbase-master-1 ${HBASE_MASTER_PORT}]networks:- hadoop-networkhealthcheck:test: [CMD-SHELL, netstat -tnlp|grep :${HBASE_REGIONSERVER_PORT} || exit 1]interval: 10stimeout: 10sretries: 3hbase-regionserver-3:image: registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/hbase:2.5.4user: hadoop:hadoopcontainer_name: hbase-regionserver-3hostname: hbase-regionserver-3restart: alwaysprivileged: trueenv_file:- .envvolumes:- ./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.xmlports:- 36032:${HBASE_REGIONSERVER_PORT}command: [sh,-c,/opt/apache/bootstrap.sh hbase-regionserver hbase-master-1 ${HBASE_MASTER_PORT}]networks:- hadoop-networkhealthcheck:test: [CMD-SHELL, netstat -tnlp|grep :${HBASE_REGIONSERVER_PORT} || exit 1]interval: 10stimeout: 10sretries: 3# 连接外部网络
networks:hadoop-network:external: true开始部署 当前目录结构如下
[rootcdh1 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[rootcdh1 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 访问集群信息 shell测试
### 进入容器内部
[rootcdh1 hbase]# docker exec -it hbase-master-1 bash### 进入shell环境
[hadoophbase-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 secondsHbase::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### 查看状态
hbase:003:0 status
1 active master, 1 backup masters, 3 servers, 0 dead, 1.0000 average load
Took 0.0853 seconds 注意如果hbase容器启动失败或有异常可以执行以下命令 停止hbase相关容器 docker-compose down删除zookeeper 中 hbase 节点删除hdfs中hbase目录 docker exec -it hadoop-hdfs-nn hdfs dfs -rm -r /hbase重启hbase容器 4. 数据操作
HBase作为一个分布式NoSQL数据库提供了丰富的数据操作方法可通过Shell交互或Java API来执行。在本节中我们将详细介绍如何在HBase中进行表的操作、数据的增删改查以及如何使用计数器来满足高并发环境下的计数需求。
4.1 表操作
在HBase中我们可以通过Shell交互或Java API执行多种表操作。以下是每种操作的详细示例
创建表使用create命令创建新表指定表名和列族等信息。
create my_table, cf1, cf2这将创建一个名为my_table的表包含两个列族cf1和cf2。
删除表先使用disable命令禁用表然后使用delete命令删除表。
disable my_table
delete my_table这将先禁用名为my_table的表然后删除它。
修改表结构通过alter命令修改表结构如添加列族、修改配置等。
alter my_table, NAME cf3这将向表my_table中添加一个新的列族cf3。
禁用和启用表使用disable命令禁用表使用enable命令启用表。
disable my_table这将禁用表my_table阻止对其进行操作。
enable my_table这将启用之前被禁用的表my_table使其再次可用。
列出表使用list命令列出所有表格。
list这将显示当前HBase集群中存在的所有表的列表。
4.2 数据操作
HBase提供多种数据操作方法涵盖数据的插入、获取、扫描、更新和删除等操作。以下是这些操作的详细说明和示例
插入数据使用put命令或Java API将数据插入到表中指定行键、列族、列限定符和值。
put my_table, row1, cf1:column1, value1这将在my_table表的cf1列族的column1列中插入值为value1的数据。
获取数据使用get命令或Java API通过行键获取指定单元格的数据。
get my_table, row1这将获取my_table表中row1行的所有数据。
扫描数据使用scan命令或Java API执行范围扫描可以按行、列族、列限定符进行过滤。
scan my_table, {COLUMNS cf1}这将对my_table表进行扫描只显示cf1列族的数据。
更新数据使用put命令或Java API更新已有数据的值。
put my_table, row1, cf1:column1, new_value这将更新my_table表中row1行的cf1列族的column1列的值为new_value。
删除数据使用delete命令或Java API删除指定单元格或行的数据。
delete my_table, row1, cf1:column1这将删除my_table表中row1行的cf1列族的column1列数据。
4.3 计数器
计数器是HBase中用于高并发环境下计数需求的一种特殊数据类型。在许多应用中需要对某些数据进行实时的增减操作如用户积分、库存数量、点击次数等。在这些场景下计数器能够提供一种高效且原子的方式来管理这些计数值。
在HBase中计数器是通过incrementColumnValue方法来实现的它允许您原子地对指定单元格中的值进行增加或减少操作。通过指定行键、列族、列限定符以及要增加或减少的值HBase能够确保计数操作的原子性和数据一致性即使在高并发的情况下也能保持正确性。
以下是一个具体的计数器操作示例
假设我们有一个HBase表名为user_scores其中包含了用户的积分信息。表结构如下
表名user_scores列族cf列限定符score
现在我们想要为特定用户增加积分。可以使用以下命令来执行计数器操作
# 假设已经连接到HBase并选择了相应的表# 定义行键和列族、列限定符
row_key user123
column_family cf
column_qualifier score# 执行计数器操作增加1个计数单位
incr user_scores, row_key, column_family:column_qualifier, 1相应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;// 假设已经建立了HBase连接和获取了Table实例
Table table connection.getTable(TableName.valueOf(user_scores));// 定义计数器操作
Increment increment new Increment(Bytes.toBytes(user123)); // 指定行键
increment.addColumn(Bytes.toBytes(cf), Bytes.toBytes(score), 1L); // 列族、列限定符、增加的值// 执行计数器操作
table.increment(increment);// 关闭连接等操作
table.close();在这个示例中我们针对行键为user123的用户在user_scores表的cf列族下的score列执行了一个增加操作增加了1个计数单位。无论何时调用这个操作HBase都会确保原子性从而避免了并发计数问题。
这个示例演示了如何使用计数器来管理分布式环境下的高并发计数需求保证了数据的准确性和一致性。
通过上述数据操作方法我们可以轻松地在HBase中进行表的管理、数据的操作并满足高并发计数需求。
5. 数据模型与架构
数据模型_Hbase 中文文档
HBase架构上分为HMaster和多个RegionServer。HMaster负责监控RegionServer处理DDL操作。RegionServer用于实际存储数据负责处理DML操作。此外还有Zookeeper用于状态维护。
HBase中核心概念包括Table 表Row Key行键Column Family列族Column Qualifier列限定词Timestamp时间戳Cell单元格。行键和列组成唯一索引按行键的字典序存储。列族在表定义时确定列限定词可以动态增删。时间戳用于版本控制。
5.1 HBase系统架构 注意请点击图像以查看清晰的架构图 HBase的系统架构是分布式数据库的核心它由多个组件协同工作以实现高性能的数据存储和查询。在这一节中我们将深入探讨HBase的系统架构介绍关键组件的作用和相互关系。
5.1.1 HBase组件概览 注意请点击图像以查看清晰的视图 HBase的系统架构主要由以下几个核心组件组成
HMaster
HMaster是HBase集群的“大脑”负责管理和协调整个集群的元数据信息如表的结构和Region分布。
接收客户端的DDL操作如创建表、修改表结构并将其转化为对应的RegionServer操作。维护集群的元数据信息发现失效的Region并将失效的Region分配到正常的HRegionServer上
RegionServer
RegionServer是HBase集群的工作节点负责实际的数据存储和查询操作。
每个RegionServer负责管理多个Region每个Region又代表了表中的一部分数据。
RegionServer负责处理客户端的DML操作如增删改查以及Region的负载均衡和自动分裂。
Zookeeper
Zookeeper是分布式协调服务HBase使用它来管理集群中各个组件的状态信息和配置信息。HBase通过Zookeeper来协调HMaster的选举、RegionServer的注册和元数据的分布。
HDFS
HDFSHadoop分布式文件系统是HBase的底层存储层它用于持久化存储表数据和元数据。HBase的数据以HDFS文件的形式存储在数据节点上通过HBase提供的读写接口进行访问。
5.1.2 组件关系与协作 注意请点击图像以查看清晰的视图 HBase的组件之间通过复杂的协作实现数据的存储和查询。以下是这些组件的关系和协作过程的简要描述
客户端向HMaster发送DDL操作如创建表HMaster将元数据信息存储在Zookeeper中同时通知RegionServer更新元数据。客户端向RegionServer发送DML操作RegionServer根据操作类型执行相应的操作。对于写入操作RegionServer将数据写入内存MemStore并定期刷新到磁盘。当一个Region的MemStore大小达到阈值时RegionServer将MemStore中的数据写入HDFS中的StoreFile并创建新的MemStore。如果Region的StoreFile数量达到一定数量Region会被自动分裂成两个Region以保证数据的均衡和高效查询。客户端发送查询请求到RegionServerRegionServer从StoreFile和MemStore中检索数据并返回结果给客户端。当RegionServer发生故障或新增Region时Zookeeper将通知其他组件并进行相应的处理如选举新的HMaster。
通过这些组件的协作HBase实现了高可用性、分布式存储和实时随机访问等特性。深入理解HBase的系统架构有助于您更好地优化配置和调优性能以满足各种应用场景的需求。接下来我们将深入解释HBase的核心概念为您打下更坚实的基础。
5.2 核心概念解析
在HBase中有一些核心概念是您必须理解的它们构成了数据存储和访问的基础。在这一节中我们将详细解释这些核心概念帮助您更好地理解HBase的工作原理。 5.2.1 Table
在HBase中数据被组织成一系列的表。每个表包含多行数据每行数据通过一个唯一的RowKey进行标识。表在HBase中的结构是动态的您可以在任何时候添加列族或列而无需事先定义表的结构。表通常用于存储具有相同结构的数据。
5.2.2 RowKey
RowKey是唯一标识表中一行数据的关键字。它是一个字节数组可以是任何数据类型。RowKey的设计非常重要因为它直接影响了数据的分布和查询性能。较好的RowKey设计可以实现数据的均衡存储和高效的查询。
5.2.3 Column Family
Column Family列族是表中的一组相关列的集合。每个列族都有一个名称列族内部的列可以动态地添加。在HBase中列族是数据的物理存储单元所有属于同一列族的数据存储在一起以实现更高的存储和查询效率。
5.2.4 Column Qualifier
Column Qualifier列限定符是指定列族中的具体列的名称。它是一个字节数组用于标识列族内的不同列。通过组合Column Family和Column Qualifier您可以唯一确定表中的一个单元格Cell。
5.2.5 Cell
Cell是HBase中最小的数据单元存储着实际的数据值和对应的时间戳。每个Cell由RowKey、Column Family、Column Qualifier和Timestamp组成。在表中每个单元格的唯一标识是由RowKey、Column Family和Column Qualifier组合而成的。
5.2.6 Timestamp
Timestamp是Cell的一个重要属性用于标识数据的版本。HBase支持多版本数据存储每个Cell可以有多个不同时间戳的版本。通过Timestamp您可以查询和获取不同时间点的数据版本。
5.2.7 Region
Region是HBase中数据的分布单元。每个表可以被划分成多个Region每个Region由一系列的连续行组成。Region是HBase实现分布式存储和负载均衡的关键。
通过理解这些核心概念您将能够更好地设计表结构、优化数据访问和查询并为后续的数据操作打下坚实的基础。接下来我们将深入探讨HBase的数据操作帮助您了解如何在HBase中进行数据的增删改查。
5.3 内部实现原理
HBase的内部实现原理是其高性能和可扩展性的关键。在这一节中我们将揭示HBase的数据存储格式、压缩算法、缓存机制等内部实现原理帮助您深入理解其工作机制。
5.3.1 HBase读数据流程 注意请点击图像以查看清晰的视图 HBase是一个分布式、面向列的NoSQL数据库系统针对海量数据的随机读取提供了高性能。以下是HBase读取数据的详细流程
数据定位和访问 当客户端需要读取数据时首先根据数据的行键进行哈希计算以确定数据位于哪个Region。然后客户端通过HBase的Master节点获取表的元数据包括表的分区信息和RegionServer的位置。与RegionServer通信 客户端会根据元数据信息与负责该数据区域的RegionServer建立连接。这个连接将用于请求数据以及接收响应。MemStore和StoreFile查询 在RegionServer上数据首先会被查询MemStore。如果要查找的数据在MemStore中就直接从内存中读取。如果数据不在MemStore中HBase会按照时间顺序查询StoreFile找到合适的StoreFile进行读取。Block Cache利用 如果数据在StoreFile中HBase会将StoreFile按照块Block进行读取。在读取的过程中HBase会首先检查Block Cache这是一个位于内存中的缓存用于存储最常用的数据块以提高读取性能。如果所需数据块在Block Cache中存在就可以直接从缓存中读取而不需要去磁盘上读取StoreFile。数据过滤和组装 一旦数据块被读取HBase会根据请求中指定的列族和列限定符对数据进行过滤只返回需要的部分数据。然后数据会被组装成适当的格式通常是键值对的形式。返回数据给客户端 最后RegionServer会将请求的数据返回给客户端。客户端可以使用这些数据进行进一步的处理和分析。
HBase的读取流程在访问内存中的MemStore、利用Block Cache、查询StoreFile和数据过滤等环节中充分利用了缓存和索引以提供高效的随机读取性能。这种架构使得HBase适用于大规模数据集的实时查询需求。
5.3.2 HBase写数据流程 注意请点击图像以查看清晰的视图 HBase是一个基于Hadoop分布式文件系统HDFS的列式存储系统专为处理大规模的稀疏数据集而设计。它提供了高效的随机读写能力并且在写入数据时有一套独特的内部原理和流程。
以下是HBase写入数据的内部原理和流程
写入流程初始化 当客户端想要写入数据时首先要与HBase的Master节点通信以获取表的元数据包括表的结构、分区信息等。然后客户端会与HBase的RegionServer建立连接准备进行写入操作。写前准备 在写入之前HBase会对要写入的数据进行预处理如生成写入操作的日志Write Ahead LogWAL以确保数据的持久性和恢复能力。数据分布和定位 HBase的表会被水平分割为多个Region每个Region负责管理一定范围的行键数据。在写入数据时HBase会根据行键的哈希值来定位数据所在的Region。写入MemStore 当确定了要写入的Region后数据首先会被写入到该Region的内存存储区域称为MemStore。MemStore以排序的方式保存数据新的数据会被插入到适当的位置以便后续的读取和写入操作更高效。持久化到HLog 写入MemStore后数据同时会被写入到HLog中作为持久化的写入日志。这样可以确保即使RegionServer发生故障数据也可以从HLog中进行恢复。MemStore刷写 当MemStore中的数据达到一定的大小阈值时HBase会触发MemStore的刷写操作。这将会将MemStore中的数据写入到HDFS中的一个临时存储文件称为StoreFile。Compaction 随着时间的推移多个StoreFile会不断产生。为了维护数据的连续性和提高查询性能HBase会定期进行Compaction操作将多个StoreFile合并为一个较大的文件同时删除过期或重复的数据。数据持久化 在Compaction操作完成后生成的新的StoreFile会被重命名并移动到最终的存储位置。这样数据就持久化到了HDFS中。Acknowledgment 一旦数据写入成功并持久化RegionServer会向客户端发送确认消息表示数据已成功写入。
总的来说HBase的写入过程涉及了内存中的MemStore、持久化的HLog、StoreFile的生成和Compaction等步骤保证了数据的持久性和高效性能。这个过程充分利用了分布式存储和列式存储的优势使得HBase在大规模数据处理中具有出色的表现。
5.3.3 HBase的flush(刷写)及compact(合并)机制
HBase的Flush刷写和Compaction合并是维护数据一致性、减少存储空间占用以及提高读取性能的重要机制。以下是对HBase的Flush和Compaction机制的详细介绍
Flush刷写机制
Flush是指将内存中的数据写入到持久化存储HDFS的过程。在HBase中数据首先被写入MemStore这是位于RegionServer内存中的排序数据结构用于提高写入性能。然而MemStore的数据在写入过程中并不直接写入HDFS而是在达到一定条件后进行刷写Flush操作将数据持久化到磁盘上的StoreFile中。
Flush机制的过程如下
MemStore刷写触发当MemStore中的数据达到一定的大小阈值通过配置参数指定或者在指定的时间间隔内HBase会触发Flush操作。生成StoreFile在Flush时MemStore中的数据会被写入一个新的StoreFile中而不是直接写入HDFS。这个StoreFile是一个持久化的数据文件按照键的顺序排序。StoreFile写入HDFS生成的StoreFile会首先写入HBase的HLogWrite Ahead Log以保证数据的持久性。然后StoreFile会被移动到HDFS中的对应Region的数据目录下变为持久化存储。
Flush触发配置
当memstore的大小超过这个值的时候会flush到磁盘,默认为128M
propertynamehbase.hregion.memstore.flush.size/namevalue134217728/value
/property当memstore中的数据时间超过1小时会flush到磁盘
propertynamehbase.regionserver.optionalcacheflushinterval/namevalue3600000/value
/propertyHregionServer的全局memstore的大小超过该大小会触发flush到磁盘的操作,默认是堆大小的40%
propertynamehbase.regionserver.global.memstore.size/namevalue0.4/value
/property手动flush
flush tableNameCompaction合并机制
Compaction是指合并StoreFile以优化数据存储、提高查询性能和删除过期数据的过程。由于HBase的写入操作会产生多个StoreFile而且数据可能存在多个版本为了维护数据的连续性和删除过期数据HBase会定期进行Compaction。
HBase支持两种类型的Compaction小规模的Min Compaction和大规模的Major Compaction。
Min Compaction也称为较小规模的Compaction它会合并几个相邻的StoreFile但不会合并所有的StoreFile。这有助于减少数据碎片提高查询性能。Major Compaction也称为较大规模的Compaction它会合并一个Region内的所有StoreFile删除已删除的数据、删除过期数据以及合并相同行键的不同版本。Major Compaction可以彻底优化数据存储减少存储空间占用并提高读取性能。
Compaction机制的过程如下
选择合并的StoreFileHBase会选择一些StoreFile来合并通常是相邻的或有重叠行键范围的文件。合并过程在Compaction过程中HBase会合并选定的StoreFile并生成一个新的StoreFile。在这个过程中重复的数据会被合并过期数据会被删除不同版本的数据会被合并。生成新StoreFile合并后生成的新StoreFile会被写入HDFS并取代旧的StoreFile。删除旧StoreFile合并后的新StoreFile生成后原来的旧StoreFile会被删除释放存储空间。
Flush和Compaction机制的配合使用确保了HBase数据的一致性、可靠性以及读取性能。
5.3.4 缓存机制
HBase的缓存机制是为了提高读取性能和降低对底层存储的访问频率而设计的。HBase使用了两种主要的缓存机制Block Cache块缓存和MemStore Heap CacheMemStore堆缓存。以下是对这两种缓存机制的详细介绍
1. Block Cache块缓存
Block Cache是HBase的主要缓存机制之一用于缓存存储在HDFS上的StoreFile中的数据块。StoreFile通常被分成固定大小的数据块也称为块Block每个块的大小通常为64KB。
Block Cache工作的基本原理如下
缓存策略Block Cache使用LRULeast Recently Used策略来管理缓存中的数据块。最近被访问过的块会被保留在缓存中而较早被访问的块则可能被替换出缓存。块粒度Block Cache以块为单位进行缓存这样在读取数据时可以在块级别上进行缓存命中从而提高读取性能。缓存位置Block Cache位于每个RegionServer的内存中用于缓存该RegionServer负责的所有Region的数据块。缓存适用性Block Cache适用于频繁被查询的数据如热点数据。由于数据在内存中缓存读取性能显著提高。
2. MemStore Heap CacheMemStore堆缓存
MemStore Heap Cache是用于缓存处于内存中的MemStore数据的机制。当数据被写入HBase时首先被写入MemStore然后会在Flush之前被缓存在MemStore Heap Cache中。 缓存目的MemStore Heap Cache的主要目的是为了提高写入性能。由于写入到磁盘的Flush操作是相对较慢的数据在Flush前可以在Heap Cache中缓存这样可以减少实际写入磁盘的频率提高写入性能。 Flush触发当MemStore Heap Cache达到一定大小阈值或者定时间隔到达时会触发Flush操作将Heap Cache中的数据刷写到HDFS中的StoreFile中。
HBase的缓存机制在读取和写入方面都起到了关键作用。Block Cache提供了高效的读取缓存而MemStore Heap Cache则有助于提高写入性能。综合使用这些缓存机制HBase能够在大规模数据处理中取得出色的性能表现。
5.3.5 垃圾回收 … 由于字数限制此处省略 完整内容请参见《大数据HBase学习圣经》pdf 找尼恩获取 综上所述HBase的数据垃圾回收机制主要通过删除标记、版本删除、Minor Compaction和Major Compaction等方式来清理无效数据减少存储空间的占用并保持数据的一致性和可靠性。
通过了解这些内部实现原理您将能够更好地理解HBase的性能特点和工作机制。这对于优化配置、调优性能以及处理各种应用场景的需求都非常有帮助。接下来我们将深入介绍HBase的数据操作为您提供丰富的操作示例和指导。
6. HBase进阶操作
在本章中我们将深入探讨HBase的进阶操作包括使用过滤器进行读取控制、数据的高效导入方式以及如何结合MapReduce进行复杂的分布式计算。
当涉及HBase的进阶操作时包括了一些更高级和复杂的用例。以下是一些进阶操作的详细说明和具体操作示例
6.1 高级用例 … 由于字数限制此处省略 完整内容请参见《大数据HBase学习圣经》pdf 找尼恩获取 6.2 过滤器的使用 … 由于字数限制此处省略 完整内容请参见《大数据HBase学习圣经》pdf 找尼恩获取 6.3 数据导入方式 … 由于字数限制此处省略 完整内容请参见《大数据HBase学习圣经》pdf 找尼恩获取 在下一章节中我们将介绍如何通过Java客户端API进行HBase应用开发以及一些优化和最佳实践。这将帮助您更好地利用HBase构建应用程序。
7. 客户端开发
在本章中我们将详细介绍如何使用HBase的Java客户端API进行应用开发。您需要设置依赖配置并提供完整可运行的Java代码示例。
7.1 依赖配置
首先您需要在项目中添加HBase的Java客户端API依赖。如果使用Maven作为项目构建工具在pom.xml文件中添加以下依赖配置
dependencygroupIdorg.apache.hbase/groupIdartifactIdhbase-client/artifactIdversion2.4.7/version !-- 请根据您的HBase版本进行调整 --
/dependency7.2 用户信息示例
下面是一个完整的可运行的Java代码示例演示了如何使用HBase的Java客户端API连接HBase集群、创建用户信息表、插入用户数据、查询用户数据以及异常处理。在这个示例中我们提供了配置信息。
初始化客户端
public class HbaseClientDemo {Configuration confnull;Connection connnull;HBaseAdmin admin null;Beforepublic 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();}}}
}创建表
Test
public void createTable() throws IOException {admin (HBaseAdmin) conn.getAdmin();//创建表描述器HTableDescriptor teacher new HTableDescriptor(TableName.valueOf(teacher));//设置列族描述器teacher.addFamily(new HColumnDescriptor(info));//执行创建操作admin.createTable(teacher);System.out.println(teacher表创建成功);
}插入数据
//插入一条数据
Test
public void putData() throws IOException {//获取一个表对象Table t conn.getTable(TableName.valueOf(teacher));//设定rowkeyPut put new Put(Bytes.toBytes(110));//列族列valueput.addColumn(Bytes.toBytes(info), Bytes.toBytes(addr), Bytes.toBytes(beijing));//执行插入t.put(put);// t.put();//可以传入list批量插入数据//关闭table对象t.close();System.out.println(插入成功);
}删除数据
//删除一条数据
Test
public void deleteData() throws IOException {//需要获取一个table对象final Table worker conn.getTable(TableName.valueOf(worker));//准备delete对象final Delete delete new Delete(Bytes.toBytes(110));//执行删除worker.delete(delete);//关闭table对象worker.close();System.out.println(删除数据成功);
}查询某个列族数据
//查询某个列族数据
Test
public void getDataByCF() throws IOException {//获取表对象HTable teacher (HTable) conn.getTable(TableName.valueOf(teacher));//创建查询的get对象Get get new Get(Bytes.toBytes(110));//指定列族信息// get.addColumn(Bytes.toBytes(info), Bytes.toBytes(sex));get.addFamily(Bytes.toBytes(info));//执行查询Result res teacher.get(get);Cell[] cells res.rawCells();//获取改行的所有cell对象for (Cell cell : cells) {//通过cell获取rowkey,cf,column,valueString 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();//关闭表对象资源
}通过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,valueString 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();
}通过startRowKey和endRowKey进行扫描
/*** 通过startRowKey和endRowKey进行扫描查询*/
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,valueString 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项目提供的HBase支持。以下是演示如何在Spring Boot中整合HBase的步骤
1. 创建Spring Boot项目
首先创建一个新的Spring Boot项目。您可以使用Spring Initializrhttps://start.spring.io/来快速生成一个基本的Spring Boot项目确保选择所需的依赖项例如Web、HBase、和Lombok可选。
2. 配置application.properties
在src/main/resources目录下的application.properties文件中添加HBase和ZooKeeper的配置信息
# HBase configuration
spring.data.hbase.quorumzkHost1,zkHost2,zkHost3 # 替换为您的ZooKeeper主机名
spring.data.hbase.zk-port2181
spring.data.hbase.zk-znode-parent/hbase
spring.data.hbase.rootdirhdfs://localhost:9000/hbase# HBase auto start
spring.data.hbase.auto-startuptrue3. 创建HBase实体类
创建一个Java类表示HBase表的实体。使用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 {IdRowKeyprivate String id;Column(userInfo:name)private String name;Column(userInfo:age)private String age;// Getters and setters
}4. 创建HBase Repository
创建一个HBase的Repository接口继承自org.springframework.data.repository.CrudRepository。您可以使用继承的方法来实现基本的CRUD操作。
import org.springframework.data.repository.CrudRepository;public interface UserRepository extends CrudRepositoryUser, String {
}5. 创建服务层
创建一个服务层可以将Repository注入然后在应用程序中使用它来访问HBase数据。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;Service
public class UserService {private final UserRepository userRepository;Autowiredpublic 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);}// 其他业务逻辑...
}6. 创建控制器
创建一个控制器类处理HTTP请求。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;RestController
RequestMapping(/users)
public class UserController {private final UserService userService;Autowiredpublic UserController(UserService userService) {this.userService userService;}PostMappingpublic void addUser(RequestBody User user) {userService.saveUser(user);}GetMapping(/{id})public User getUser(PathVariable String id) {return userService.getUserById(id);}// 其他请求处理...
}7. 运行应用程序
运行Spring Boot应用程序您可以使用内置的Tomcat容器。然后通过HTTP请求访问控制器中定义的端点。
综上所述您现在已经在Spring Boot中整合了HBase。通过使用Spring Data Hadoop的HBase支持您可以更轻松地在Spring Boot应用程序中进行HBase操作而无需处理底层的连接和配置细节。
接下来在下一章中我们将深入讨论如何优化HBase的性能以及一些常见的应用案例。
8. HBase优化
在本章中我们将深入探讨如何优化HBase的性能以确保您的应用在处理大规模数据时能够保持高效。HBase优化可以从多个方面着手让我们逐个进行介绍。
8.1 Rowkey设计
在HBase中RowKey的设计非常重要因为它直接影响了数据的存储、访问和性能。一个好的RowKey设计可以提高查询效率、降低数据倾斜问题并且有助于优化HBase的性能。以下是一些设计RowKey的原则和优化建议
1. 唯一性 RowKey必须是唯一的以确保每个行都能被正确标识。通常可以使用时间戳、UUID、业务相关的唯一标识等作为RowKey的一部分。
2. 散列分布 良好的RowKey设计应该在HBase表中实现均匀的分布。这有助于避免热点数据提高负载均衡以及降低数据倾斜问题。一种常见的方法是使用散列函数对RowKey进行哈希以确保数据分布更加均匀。
3. 数据局部性 将相关的数据存储在相邻的行中以便在扫描范围查询时能够最大程度地减少磁盘访问。这可以通过将相似的数据存储在RowKey的相同前缀下来实现。例如对于存储用户交易记录的表可以使用用户ID作为前缀将相同用户的交易记录存储在相邻的行中。
4. 最小化字节长度 较短的RowKey可以减少存储空间和IO开销。但是不要过度追求短长度而导致RowKey不可读应该在可读性和长度之间做出权衡。
5. 避免频繁变更 RowKey设计后尽量避免频繁地修改因为修改RowKey会导致数据在HBase内部的重新分布。频繁变更可能会影响性能和数据局部性。
6. 考虑查询模式 根据您的查询需求设计RowKey以便支持常见的查询模式。如果经常需要根据时间范围查询数据可以将时间戳作为RowKey的一部分。
7. 避免顺序写热点 如果RowKey的设计使得新数据总是写入到相同区域可能会导致顺序写热点影响性能。这可以通过添加随机性到RowKey中或者使用散列分布来缓解。
8. 使用字节编码 如果RowKey包含数字或日期等数据可以考虑使用适当的字节编码以便保持排序和比较的正确性。
9. 行分区 对于大型表可以考虑将表按行分区将数据分散到不同的RegionServer上。这可以通过在RowKey中添加分区标识来实现。
10. 测试和优化 设计好的RowKey应该经过测试以确保它在实际场景中表现良好。在设计之后可以通过性能测试来验证并进行优化。
当设计HBase表的RowKey时可以根据上述原则和建议来制定策略。
以下是一些示例展示如何基于不同的情境来设计RowKey并说明如何在Java中实现。
1. 唯一性和散列分布示例
在这个示例中我们使用UUID作为RowKey的一部分以确保唯一性。同时我们将RowKey哈希以实现更均匀的数据分布。
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. 数据局部性示例
在这个示例中我们使用用户ID作为RowKey的前缀将相同用户的数据存储在相邻的行中。
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. 避免顺序写热点示例
在这个示例中我们将时间戳添加到RowKey中以避免顺序写热点问题。
import org.apache.hadoop.hbase.util.Bytes;public class AvoidHotspotRowKeyExample {public static byte[] generateRowKey() {long timestamp System.currentTimeMillis();int randomValue (int) (Math.random() * 1000); // 添加随机值return Bytes.toBytes(timestamp - randomValue);}public static void main(String[] args) {byte[] rowKey generateRowKey();System.out.println(Generated RowKey: Bytes.toString(rowKey));}
}在实际应用中RowKey的设计取决于您的业务需求和查询模式。上述示例只是为了演示如何基于不同情境来设计RowKey并不是绝对的最佳实践。您应该根据具体的情况进行定制化设计进行测试和优化以获得最佳的性能和数据分布效果。
总之HBase的RowKey设计是一个需要仔细考虑的重要决策它直接影响了数据的存储和查询效率。根据具体的业务需求、查询模式和性能要求您可以选择合适的RowKey设计策略。
8.2 内存优化
合理配置内存参数是优化HBase性能的重要步骤。以下是关于内存优化方面的扩展说明主要集中在MemStore优化和块缓存优化。
1. MemStore优化
MemStore是HBase用于缓存写入数据的内存区域过多的数据积累可能导致写入性能下降。以下是一些优化建议
控制刷新频率 hbase.hregion.memstore.flush.size参数决定了当MemStore中的数据大小达到一定阈值时会触发数据的刷新到HFile。通过适当调整这个阈值可以控制刷新的频率以避免过于频繁的刷新操作。合理设置阻塞系数 hbase.hregion.memstore.block.multiplier参数控制了MemStore的大小它会根据内存分配来计算MemStore的阻塞大小。根据系统的可用内存您可以适当调整这个参数以更好地利用可用内存。如果系统内存充足可以增加阻塞系数提高MemStore的大小。
2. 块缓存优化
块缓存用于缓存HFile中的数据块从而加速读取操作。以下是一些块缓存优化的建议
根据表的读取模式进行配置 hbase.regionserver.global.memstore.size参数控制了块缓存和MemStore的总内存使用。根据您的表的读取模式可以调整这个参数来更好地分配内存资源。如果表的读取频率高可以增加块缓存的比例减少MemStore的占用。使用hbase.regionserver.global.memstore.size.lower.limit 这个参数可以设置一个下限确保至少有一定数量的内存分配给块缓存。这有助于避免当MemStore数据较少时块缓存占用过多的内存资源。
在进行内存优化时建议进行实验和性能测试以便根据实际情况找到最佳的内存配置。同时还要考虑系统的其他资源使用情况以避免因为过多的内存分配而影响其他服务的正常运行。
8.3 压缩算法选择
在HBase中选择适合的压缩算法可以显著降低存储成本、提高数据传输效率并且影响整体的性能。以下是关于压缩算法选择的扩展说明
1. Snappy压缩算法
优点 Snappy是一种快速的压缩算法能够在保持较高的解压速度的同时有效地减少数据的存储空间。它特别适用于高吞吐量和低延迟的应用场景。适用场景 如果您的主要关注点是压缩速度和低延迟可以考虑使用Snappy。它适用于对读写性能要求较高的场景如实时分析和快速查询。
2. LZO压缩算法
优点 LZO是一种高效的压缩算法具有较快的解压速度和高压缩比。它在大数据分析场景中表现良好尤其适用于MapReduce和Hive等作业。适用场景 如果您在大数据分析中使用HBase可以考虑使用LZO压缩算法。它能够减少磁盘IO和网络传输加速作业执行。
3. Gzip压缩算法
优点 Gzip是一种通用的压缩算法在压缩比方面表现良好。它可以在较小的存储空间中存储更多的数据。适用场景 如果您的主要关注点是压缩比率可以考虑使用Gzip。然而需要注意的是Gzip的压缩和解压缩速度相对较慢可能会影响读写性能。
在选择压缩算法时需要综合考虑数据的特点、访问模式和硬件条件。您还可以根据不同的列族或表来选择不同的压缩算法以满足不同的需求。在配置压缩算法时您可以使用HBase的列族级别的参数设置例如
propertynamehbase.columnfamily.familyName.COMPRESSION/namevalueSNAPPY/value
/property在实际应用中建议进行性能测试观察不同压缩算法在您的特定场景中的表现并根据测试结果做出最佳选择。
8.4 使用Bloom Filter
Bloom Filter是一种基于哈希的数据结构用于快速判断一个元素是否存在于一个集合中。在HBase中Bloom Filter可以用于提高读取效率减少不必要的磁盘IO。通过在某些列族上启用Bloom Filter可以在查询时减少不必要的磁盘寻址从而提升性能。
Bloom Filter的工作原理
Bloom Filter使用一系列哈希函数将元素映射到一个位数组中。当要判断一个元素是否存在时会对该元素进行相同的哈希计算并检查位数组中对应的位是否都为1。如果有任何一个位为0则元素肯定不存在如果所有位都为1则元素可能存在但也有可能是误判。 在HBase中使用Bloom Filter
在HBase中可以在列族级别配置是否启用Bloom Filter。通过启用Bloom Filter可以在查询时快速确定某行是否可能存在于HFile中从而避免了不必要的磁盘IO。以下是配置Bloom Filter的示例
propertynamehbase.columnfamily.familyName.BLOOMFILTER/namevalueROW/value
/property在上述示例中将familyName替换为实际的列族名称将ROW替换为所需的Bloom Filter类型。在HBase中Bloom Filter支持的类型包括ROW、ROWCOL和NONE。
适用场景
使用Bloom Filter可以在某些列族上实现更快速的读取操作特别是在随机读取的场景下。适用场景包括
大型表中的快速查询 当在大型表中进行查询操作时Bloom Filter可以帮助排除掉不符合条件的行减少磁盘IO提高查询性能。缓存查询结果 如果您使用了查询缓存Bloom Filter可以帮助在缓存中快速判断是否存在某行的数据从而决定是否使用缓存结果。
注意事项
Bloom Filter是概率性数据结构可能会出现误判假阳性。因此它适用于那些可以接受一定误差的场景。启用Bloom Filter会占用一定的内存资源因此需要根据实际情况来权衡内存的使用。
总之通过在HBase中启用Bloom Filter您可以在查询操作中降低不必要的磁盘IO提高读取效率。根据您的查询模式和性能需求可以选择在适当的列族上启用Bloom Filter。
8.5 索引优化
在HBase中虽然没有传统意义上的数据库索引但您可以采用一些方法来实现类似索引的功能以提高查询效率。以下是关于索引优化的扩展说明 … 由于字数限制此处省略 完整内容请参见《大数据HBase学习圣经》pdf 找尼恩获取 通过以上优化措施您可以大幅提升HBase的性能和效率使其更适用于处理大规模数据和高并发的应用场景。
在下一章中我们将通过实际的应用案例进一步展示HBase在不同领域的应用。
9. HBase应用案例
9.1 场景一存储日志数据 … 由于字数限制此处省略 完整内容请参见《大数据HBase学习圣经》pdf 找尼恩获取 通过以上优化策略我们可以构建一个高效的分布式日志存储和分析平台。该平台不仅能够存储海量的访问日志数据还能够实现实时分析和查询为用户行为调优提供支持。同时利用HBase的高扩展性我们可以轻松应对不断增长的数据量。
9.2 场景二时序数据存储 … 由于字数限制此处省略 完整内容请参见《大数据HBase学习圣经》pdf 找尼恩获取 通过以上优化策略HBase可以支持高吞吐的时序数据写入同时能够进行复杂的实时分析满足电信计费、监控数据分析等需要。HBase的分布式特性和扩展性使其成为时序数据存储和分析的有力工具。
10. 与生态系统集成
HBase作为一个强大的分布式NoSQL数据库可以与大数据生态系统中的其他框架进行紧密集成构建完整的大数据处理方案。在本章中我们将介绍如何将HBase与Hadoop、Hive和Spark等框架进行集成发挥它们的优势实现更强大的数据处理能力。
10.1 HBase与MapReduce集成 … 由于字数限制此处省略 完整内容请参见《大数据HBase学习圣经》pdf 找尼恩获取 综上所述通过HBase与MapReduce的结合可以实现强大的分布式计算能力用于数据聚合、连接操作、数据清洗等复杂的分布式计算任务。
10.2 HBase与Hive集成 … 由于字数限制此处省略 完整内容请参见《大数据HBase学习圣经》pdf 找尼恩获取 通过执行这些查询您可以在Hive中分析和处理HBase中的数据无需编写复杂的Java代码。
通过HBase与Hive的集成您可以充分发挥Hive的强大分析能力同时利用HBase的高性能存储为数据分析和报告生成提供了更加灵活和便捷的方式。
10.3 HBase与Spark集成 … 由于字数限制此处省略 完整内容请参见《大数据HBase学习圣经》pdf 找尼恩获取 通过以上集成示例您可以充分发挥HBase与大数据生态系统的协同作用构建出更强大的数据处理和分析方案。
在最后一章中我们将对整个教程进行回顾并为您提供进一步深入学习和实践的建议。
11. 总结
通过本教程相信大家已经对HBase的基本概念、架构、安装配置、数据模型、操作API以及优化等方面有了一定的了解。HBase作为一个强大的分布式、可扩展的NoSQL数据库为处理大规模数据提供了重要的支持。
当然要深入掌握HBase还需要在实际项目中不断实践和优化。如果您希望继续学习更多高级主题可以参考本教程中提供的参考资料并在实际项目中不断积累经验。
12. 参考资料
[1] HBase中文官方文档http://hbase.org.cn/
[2] HBase权威指南https://book.douban.com/subject/26560706/
[3] HBase技术内幕https://book.douban.com/subject/26649202/
说在后面
本文是《大数据Flink学习圣经》 V1版本 是 《尼恩 大数据 面试宝典》 姊妹篇。
这里特别说明一下《尼恩 大数据 面试宝典》5个专题 PDF 自首次发布以来 已经收集了 好几百题大量的大厂面试干货、正货 。 《尼恩 大数据 面试宝典》面试题集合 已经变成大数据学习和面试的必读书籍。
于是尼恩架构团队 趁热打铁推出 《大数据Flink学习圣经》《大数据HBASE学习圣经》本文
完整的pdf可以关注尼恩的 公号【技术自由圈】取。
并且《大数据HBASE学习圣经》、《大数据Flink学习圣经》、《尼恩 大数据 面试宝典》 都会持续迭代、不断更新以 吸纳最新的面试题最新版本具体请参见 文末公号【技术自由圈】
作者介绍
一作Andy资深架构师 《Java 高并发核心编程 加强版》作者之1 。
二作尼恩41岁资深老架构师 IT领域资深作家、著名博主。《Java 高并发核心编程 加强版 卷1、卷2、卷3》创世作者。 《K8S学习圣经》《Docker学习圣经》《Go学习圣经》等11个PDF 圣经的作者。 也是一个 资深架构导师、架构转化 导师 成功指导了多个中级Java、高级Java转型架构师岗位 最高的学员年薪拿到近100W。
推荐阅读
《消息推送 架构设计》
《阿里2面你们部署多少节点1000W并发当如何部署》
《美团2面5个9高可用99.999%如何实现》
《网易一面单节点2000WtpsKafka怎么做的》
《字节一面事务补偿和事务重试关系是什么》
《网易一面25Wqps高吞吐写Mysql100W数据4秒写完如何实现》
《亿级短视频如何架构》
《炸裂靠“吹牛”过京东一面月薪40K》
《太猛了靠“吹牛”过顺丰一面月薪30K》
《炸裂了…京东一面索命40问过了就50W》
《问麻了…阿里一面索命27问过了就60W》
《百度狂问3小时大厂offer到手小伙真狠》
《饿了么太狠面个高级Java抖这多硬活、狠活》
《字节狂问一小时小伙offer到手太狠了》
《收个滴滴Offer从小伙三面经历看看需要学点啥》 《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》PDF请到下面公号【技术自由圈】取↓↓↓