深圳微商城网站制作,网站搭建哪家好,青岛网站建设王道下拉??,接推广一般多少钱文章目录 一、简介1、数据模型结构2、物理存储结构3、数据模型4、基本架构 二、安装1、下载解压安装包2、修改配置文件3、启动服务(单机、集群)4、配置高可用(HA) 三、命令行操作1、建表2、新增/更新数据3、查看表数据4、删除数据5、修改默认保存的数据版本 四、架构1、RegionS… 文章目录 一、简介1、数据模型结构2、物理存储结构3、数据模型4、基本架构 二、安装1、下载解压安装包2、修改配置文件3、启动服务(单机、集群)4、配置高可用(HA) 三、命令行操作1、建表2、新增/更新数据3、查看表数据4、删除数据5、修改默认保存的数据版本 四、架构1、RegionServer 架构2、写流程3、MemStore Flush4、读流程5、Region Split(Region切分) 五、API1、获取链接2、获取Table对象3、Put4、Get5、Scan6、Delete删除7、完整代码 六、HBase使用设计1、预分区2、RowKey设计3、内存优化4、基础优化 一、简介
HBase是一种分布式、可扩展、支持海量数据存储的NoSQL数据库。
1、数据模型结构
逻辑上HBase的数据模型同关系型数据库很类似数据存储在一张表中有行有列。但从HBase的底层物理存储结构K-V来看HBase更像是一个multi-dimensional map多维地图
HBase逻辑结构 2、物理存储结构 3、数据模型
Name Space命名空间Table表Row行RowKeyColumn Family列簇Column QualifierTime Stamp版本(时间戳)Cell单元格Region若干行(按行划分存储)
1Name Space
命名空间类似于关系型数据库的database概念每个命名空间下有多个表。HBase两个自带的命名空间分别是hbase和defaulthbase中存放的是HBase内置的表default表是用户默认使用的命名空间。一个表可以自由选择是否有命名空间如果创建表的时候加上了命名空间后这个表名字以Namespace:Table作为区分。
2Table
类似于关系型数据库的表概念。不同的是HBase定义表时只需要声明列族即可不需要声明具体的列。这意味着往HBase写入数据时字段可以动态、按需指定。因此和关系型数据库相比HBase能够轻松应对字段变更的场景。
3Row
HBase表中的每行数据都由一个RowKey和多个Column列组成数据是按照RowKey的字典顺序存储的并且查询数据时只能根据RowKey进行检索所以RowKey的设计十分重要。
4) RowKey
Rowkey由用户指定的一串不重复的字符串定义是一行的唯一标识数据是按照RowKey的字典顺序存储的并且查询数据时只能根据RowKey进行检索所以RowKey的设计十分重要。
如果使用了之前已经定义的RowKey那么会将之前的数据更新掉。
5Column Family
列族是多个列的集合。一个列族可以动态地灵活定义多个列。表的相关属性大部分都定义在列族上同一个表里的不同列族可以有完全不同的属性配置但是同一个列族内的所有列都会有相同的属性。
列族存在的意义是HBase会把相同列族的列尽量放在同一台机器上所以说如果想让某几个列被放到一起你就给他们定义相同的列族。
官方建议一张表的列族定义的越少越好列族太多会极大程度地降低数据库性能且目前版本Hbase的架构容易出BUG。
6) Column Qualifier
Hbase中的列是可以随意定义的一个行中的列不限名字、不限数量只限定列族。因此列必须依赖于列族存在列的名称前必须带着其所属的列族例如infonameinfoage。
因为HBase中的列全部都是灵活的可以随便定义的因此创建表的时候并不需要指定列列只有在你插入第一条数据的时候才会生成。其他行有没有当前行相同的列是不确定只有在扫描数据的时候才能得知。
7Time Stamp
用于标识数据的不同版本version每条数据写入时系统会自动为其加上该字段其值为写入HBase的时间。在读取单元格的数据时版本号可以省略如果不指定Hbase默认会获取最后一个版本的数据返回。
8Cell
由{rowkey, column Familycolumn Qualifier, time Stamp} 唯一确定的单元。cell中的数据全部是字节码形式存贮。
9Region
Region由一个表的若干行组成。在Region中行的排序按照行键rowkey字典排序。Region不能跨RegionSever且当数据量大的时候HBase会拆分Region。
Region由RegionServer进程管理。HBase在进行负载均衡的时候一个Region有可能会从当前RegionServer移动到其他RegionServer上。
Region是基于HDFS的它的所有数据存取操作都是调用了HDFS的客户端接口来实现的。
4、基本架构 1Region Server Region Server为 Region的管理者其实现类为HRegionServer主要作用如下:
对于数据的操作get, put, delete对于Region的操作splitRegion、compactRegion。
2Master Master是所有Region Server的管理者其实现类为HMaster主要作用如下
对于表的操作create, delete, alter对于RegionServer的操作分配regions到每个RegionServer监控每个RegionServer的状态负载均衡和故障转移。
3Zookeeper HBase通过Zookeeper来做master的高可用、RegionServer的监控、元数据的入口以及集群配置的维护等工作。 4HDFS HDFS为HBase提供最终的底层数据存储服务同时为HBase提供高容错的支持。
二、安装
下面的安装配置都是在所有节点都需要配置的
1、下载解压安装包
下载Hbase
wget https://gitcode.net/weixin_44624117/software/-/raw/master/software/Linux/Hbase/hbase-2.0.5-bin.tar.gz解压安装包
tar -zxvf hbase-2.0.5-bin.tar.gz -C /opt/module修改文件目录
mv /opt/module/hbase-2.0.5 /opt/module/hbase2、修改配置文件
配置环境变量
sudo vim /etc/profile.d/my_env.sh#HBASE_HOME
export HBASE_HOME/opt/module/hbase
export PATH$PATH:$HBASE_HOME/bin修改配置文件
cd /opt/module/hbase/conf
vim hbase-env.sh# 修改内容
export HBASE_MANAGES_ZKfalse修改配置文件hbase-site.xml
vim hbase-site.xml# 修改内容
configurationpropertynamehbase.rootdir/namevaluehdfs://hadoop101:8020/hbase/value/propertypropertynamehbase.cluster.distributed/namevaluetrue/value/propertypropertynamehbase.zookeeper.quorum/namevaluehadoop101,hadoop102,hadoop103/value/propertypropertynamehbase.unsafe.stream.capability.enforce/namevaluefalse/value/propertypropertynamehbase.wal.provider/namevaluefilesystem/value/property
/configuration3、启动服务(单机、集群)
启动(单节点启动)
cd /opt/module/hbase
bin/hbase-daemon.sh start master
bin/hbase-daemon.sh start regionserver关闭节点
bin/hbase-daemon.sh stop master
bin/hbase-daemon.sh stop regionserver启动(启动集群)(Hadoop101主节点)
cd /opt/module/hbase
bin/start-hbase.sh关闭集群
bin/stop-hbase.sh查看页面
http://hadoop101:16010/
4、配置高可用(HA)
关闭集群
cd /opt/module/hbase
bin/stop-hbase.sh在conf目录下创建backup-masters文件
touch conf/backup-masters在backup-masters文件中配置高可用HMaster节点
echo hadoop102 conf/backup-masters重启hbase
cd /opt/module/hbase
bin/start-hbase.sh打开页面测试查看(多了一个back Master节点)
http://hadooo102:16010 三、命令行操作
1、建表
登录Hbase
bin/hbase shell查看帮助
help查看表列表
list创建表
表名student列簇info、address
create student,info
create student, info, address新增列簇
alter student, address2、新增/更新数据
插入数据
命名空间default表明studentrowKey1001列簇info列名info、sex值18
put student,1001,info,male
put student,1001,info:sex,male
put student,1001,info:age,18
put student,1002,info:name,Janna
put student,1002,info:sex,female
put student,1002,info:age,20更新数据
put student,1001,info:name,Zhangsan3、查看表数据
扫描表数据
scan student
# 指定开始和结束rowKey
scan student,{STARTROW 1001, STOPROW 1001}
scan student,{STARTROW 1001}只显示指定的列
scan student, {LIMIT 3, COLUMNS [info:name, info:age], FORMATTER toString}查看表数据
get 表名,rowkey# 查看列数据
get student,1001
# 查看列簇中列数据
get student,1001,info:name查看数据并且显示中文(shell默认十六进制)
get student,1001, {FORMATTER toString}查看表结构
describe student查看数据行数(rowKey数量)
count student4、删除数据
删除某rowkey的某一列数据
delete student,1002,info:sex删除某rowKey数据
deleteall student,1001清空表数据
truncate student该表为disable状态
disable student删除表(需先将表置为disable)
drop student5、修改默认保存的数据版本
修改保存数据版本数量
alter student,{NAMEinfo,VERSIONS3}更新4个版本的数据
put student,1001,info:name,Zhangsan001
put student,1001,info:name,Zhangsan002
put student,1001,info:name,Zhangsan003
put student,1001,info:name,Zhangsan004查看保留的数据版本
get student,1001,{COLUMNinfo:name,VERSIONS3}四、架构
1、RegionServer 架构 1StoreFile
保存实际数据的物理文件StoreFile以Hfile的形式存储在HDFS上。每个Store会有一个或多个StoreFileHFile数据在每个StoreFile中都是有序的。
2MemStore
写缓存由于HFile中的数据要求是有序的所以数据是先存储在MemStore中排好序后等到达刷写时机才会刷写到HFile每次刷写都会形成一个新的HFile。
3HLog
由于数据要经MemStore排序后才能刷写到HFile但把数据保存在内存中会有很高的概率导致数据丢失为了解决这个问题数据会先写在一个实现了Write-Ahead logfile机制的文件HLog中然后再写入MemStore中。所以在系统出现故障的时候数据可以通过这个日志文件重建。
4BlockCache
读缓存每次查询出的数据会缓存在BlockCache中方便下次查询。
2、写流程 1Client先访问zookeeper获取hbase:meta表位于哪个Region Server。
2访问对应的Region Server获取hbase:meta表根据写请求的namespace:table/rowkey查询出目标数据位于哪个Region Server中的哪个Region中。并将该table的region信息以及meta表的位置信息缓存在客户端的meta cache方便下次访问。
3与目标Region Server进行通讯
4将数据顺序写入追加到HLog
5将数据写入对应的MemStore数据会在MemStore进行排序
6向客户端发送ack
7等达到MemStore的刷写时机后将数据刷写到HFile。
3、MemStore Flush Memstore级别
当某个memstroe的大小达到了hbase.hregion.memstore.flush.size默认值128M其所在region的所有memstore都会刷写。因此不建议创建太多的列族。
Region级别
当一个Region中所有的memstore的大小达到了hbase.hregion.memstore.flush.size默认值128M * hbase.hregion.memstore.block.multiplier默认值4时会阻止继续往该Region写数据进行所有Memstore的刷写。
RegionServer级别
一个RegionServer中的阈值大于java_heapsize * hbase.regionserver.global.memstore.size默认值0.4* hbase.regionserver.global.memstore.size.lower.limit默认值0.95。region会按照其所有memstore的大小顺序由大到小依次进行刷写。直到region server中所有memstore的总大小减小到上述值以下。
当regionserver中memstore的总大小达到java_heapsize * hbase.regionserver.global.memstore.size默认值0.4时会阻止继续往所有的memstore写数据。
HLog数量上限
当WAL文件的数量超过hbase.regionserver.max.logsregion会按照时间顺序依次进行刷写直到WAL文件数量减小到hbase.regionserver.max.log以下该属性名已经废弃现无需手动设置最大值为32
定时刷写
到达自动刷写的时间也会触发memstore flush。自动刷新的时间间隔由该属性进行配置hbase.regionserver.optionalcacheflushinterval默认1小时
手动刷写
可以在客户端手动flush 表名 或 region名 或regionserver名
4、读流程 RegionServer返回数据 1Client先访问zookeeper获取hbase:meta表位于哪个Region Server。 2访问对应的Region Server获取hbase:meta表根据读请求的namespace:table/rowkey查询出目标数据位于哪个Region Server中的哪个Region中。并将该table的region信息以及meta表的位置信息缓存在客户端的meta cache方便下次访问。 3向目标Region Server发送读请求 4分别在MemStore和Store FileHFile中查询目标数据并将查到的所有数据进行合并。此处所有数据是指同一条数据的不同版本time stamp或者不同的类型Put/Delete。 5将查询到的新的数据块BlockHFile数据存储单元默认大小为64KB缓存到Block Cache。 6将合并后的最终结果返回给客户端。
5、Region Split(Region切分)
默认情况下每个Table起初只有一个Region随着数据的不断写入Region会自动进行拆分。刚拆分时两个子Region都位于当前的Region Server但处于负载均衡的考虑HMaster有可能会将某个Region转移给其他的Region Server。
0.94版本之前的策略
0.94版本之前采取的是 ConstantSizeRegionSplitPolicy , 当一个Store对应一个列族的StoreFile大小大于配置hbase.hregion.max.filesize默认10G时就会拆分。
0.94版本之后的策略
0.94版本之后的切分策略取决于hbase.regionserver.region.split.policy参数的配置默认使用IncreasingToUpperBoundRegionSplitPolicy策略切分region。
该策略分为两种情况第一种为如果在当前RegionServer中某个Table的Region个数介于 0-100之间那么当1个region中的某个Store下所有StoreFile的总大小超过Min(initialSize*R^3 ,hbase.hregion.max.filesize)该Region就会进行拆分。其中initialSize的默认值为2*hbase.hregion.memstore.flush.sizeR为当前Region Server中属于该Table的Region个数。
具体的切分策略为
第一次split1^3 * 256 256MB第二次split2^3 * 256 2048MB第三次split3^3 * 256 6912MB第四次split4^3 * 256 16384MB 10GB因此取较小的值10GB后面每次split的size都是10GB了。
第二种为如果当前RegionServer中某个Table的Region个数超过100个则超过10GB才会切分一次region。
2.0版本之后的策略
Hbase 2.0引入了新的split策略SteppingSplitPolicy。如果当前RegionSer ver上该表只有一个Region按照2 * hbase.hregion.memstore.flush.size分裂否则按照hbase.hregion.max.filesize分裂。 禁止分裂
region的分裂需要消耗一定的性能因此如果对region已经提前预分区那么可以设置禁止region自动分裂即使用DisableSplitPolicy。
五、API
1、获取链接
public Connection getConn() {Connection connection null;try {connection ConnectionFactory.createConnection();} catch (IOException e) {e.printStackTrace();}return connection;
}2、获取Table对象
/*** 1、获取表对象*/
Test
public void getTable() throws IOException {Connection conn new HbaseUtils().getConn();String tableName student;if (StringUtils.isBlank(tableName)) {throw new RuntimeException(表名非法);}Table table conn.getTable(TableName.valueOf(tableName));
}3、Put
/*** 2、新增行数据** throws IOException*/
Test
public void testPUt() throws IOException {Connection conn new HbaseUtils().getConn();String tableName student;Table table conn.getTable(TableName.valueOf(tableName));ArrayListPut puts new ArrayList();puts.add(createPut(a3, info, name, jack));puts.add(createPut(a3, info, age, 20));puts.add(createPut(a3, info, gender, male));table.put(puts);table.close();
}
public Put createPut(String rowkey, String cf, String cq, String value) {Put put new Put(Bytes.toBytes(rowkey));return put.addColumn(Bytes.toBytes(cf), Bytes.toBytes(cq), Bytes.toBytes(value));
}4、Get
/*** 3、get获取值** throws IOException*/
Test
public void getTables() throws IOException {Connection conn new HbaseUtils().getConn();TableName tableName TableName.valueOf(student);Table table conn.getTable(tableName);Get get new Get(Bytes.toBytes(a3));Result result table.get(get);// 打印结果parseResult(result);table.close();
}
/*** 遍历Get的一行结果* 一行由若干列组成每个列都有若干个cell*/
public void parseResult(Result result) {//获取一行中最原始的cellCell[] cells result.rawCells();//遍历for (Cell cell : cells) {System.out.print( rowkey Bytes.toString(CellUtil.cloneRow(cell)));System.out.print( 列名 Bytes.toString(CellUtil.cloneFamily(cell)) : Bytes.toString(CellUtil.cloneQualifier(cell)));System.out.print( 值: Bytes.toString(CellUtil.cloneValue(cell)));System.out.println();}
}5、Scan
/*** 4、Scan查询数据** throws IOException*/
Test
public void testScan() throws IOException {// 创建表对象Connection conn new HbaseUtils().getConn();TableName tableName TableName.valueOf(student);Table table conn.getTable(tableName);// 封装查询条件Scan scan new Scan();scan.withStartRow(Bytes.toBytes(a1));scan.withStopRow(Bytes.toBytes(z1));ResultScanner scanner table.getScanner(scan);// 返回结果处理for (Result result : scanner) {parseResult(result);}table.close();
}6、Delete删除
/*** 4、删除数据** throws IOException*/
Test
public void testDelete() throws IOException {Connection conn new HbaseUtils().getConn();Table table conn.getTable(TableName.valueOf(student));Delete delete new Delete(Bytes.toBytes(a3));// 删一列的最新版本 向指定的列添加一个cell (type Delete, ts 最新的cell的ts)delete.addColumn(Bytes.toBytes(f1), Bytes.toBytes(age));// 删除这列的所有版本 向指定的列添加一个cell (type DeleteColumn, ts 当前时间)delete.addColumns(Bytes.toBytes(f1), Bytes.toBytes(age));// 删除列族的所有版本 向指定的行添加一个cell f1:,timestamp 当前时间, type DeleteFamilydelete.addFamily(Bytes.toBytes(f1));// 删除一行的所有列族table.delete(delete);table.close();
}7、完整代码
建表语句
create student,info代码测试类
import org.apache.commons.lang3.StringUtils;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import org.junit.jupiter.api.Test;import java.io.IOException;
import java.util.ArrayList;class HbaseUtilsTest {/*** 1、获取表对象*/Testpublic void getTable() throws IOException {Connection conn new HbaseUtils().getConn();String tableName student;if (StringUtils.isBlank(tableName)) {throw new RuntimeException(表名非法);}Table table conn.getTable(TableName.valueOf(tableName));}/*** 2、新增行数据** throws IOException*/Testpublic void testPUt() throws IOException {Connection conn new HbaseUtils().getConn();String tableName student;Table table conn.getTable(TableName.valueOf(tableName));ArrayListPut puts new ArrayList();puts.add(createPut(a3, info, name, jack));puts.add(createPut(a3, info, age, 20));puts.add(createPut(a3, info, gender, male));table.put(puts);table.close();}public Put createPut(String rowkey, String cf, String cq, String value) {Put put new Put(Bytes.toBytes(rowkey));return put.addColumn(Bytes.toBytes(cf), Bytes.toBytes(cq), Bytes.toBytes(value));}/*** 3、get获取值** throws IOException*/Testpublic void getTables() throws IOException {Connection conn new HbaseUtils().getConn();TableName tableName TableName.valueOf(student);Table table conn.getTable(tableName);Get get new Get(Bytes.toBytes(a3));Result result table.get(get);// 打印结果parseResult(result);table.close();}/*** 遍历Get的一行结果* 一行由若干列组成每个列都有若干个cell*/public void parseResult(Result result) {//获取一行中最原始的cellCell[] cells result.rawCells();//遍历for (Cell cell : cells) {System.out.print( rowkey Bytes.toString(CellUtil.cloneRow(cell)));System.out.print( 列名 Bytes.toString(CellUtil.cloneFamily(cell)) : Bytes.toString(CellUtil.cloneQualifier(cell)));System.out.print( 值: Bytes.toString(CellUtil.cloneValue(cell)));System.out.println();}}/*** 4、Scan查询数据** throws IOException*/Testpublic void testScan() throws IOException {// 创建表对象Connection conn new HbaseUtils().getConn();TableName tableName TableName.valueOf(student);Table table conn.getTable(tableName);// 封装查询条件Scan scan new Scan();scan.withStartRow(Bytes.toBytes(a1));scan.withStopRow(Bytes.toBytes(z1));ResultScanner scanner table.getScanner(scan);// 返回结果处理for (Result result : scanner) {parseResult(result);}table.close();}/*** 4、删除数据** throws IOException*/Testpublic void testDelete() throws IOException {Connection conn new HbaseUtils().getConn();Table table conn.getTable(TableName.valueOf(student));Delete delete new Delete(Bytes.toBytes(a3));// 删一列的最新版本 向指定的列添加一个cell (type Delete, ts 最新的cell的ts)delete.addColumn(Bytes.toBytes(f1), Bytes.toBytes(age));// 删除这列的所有版本 向指定的列添加一个cell (type DeleteColumn, ts 当前时间)delete.addColumns(Bytes.toBytes(f1), Bytes.toBytes(age));// 删除列族的所有版本 向指定的行添加一个cell f1:,timestamp 当前时间, type DeleteFamilydelete.addFamily(Bytes.toBytes(f1));// 删除一行的所有列族table.delete(delete);table.close();}}HbaseUtils工具类
package com.lydms.demohbase.utils;import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;import java.io.IOException;public class HbaseUtils {public Connection getConn() {Connection connection null;try {connection ConnectionFactory.createConnection();} catch (IOException e) {e.printStackTrace();}return connection;}public void closeConn(Connection connection) throws IOException {if (connection ! null) {connection.close();}}}Resource目录下创建hbase-site.xml文件
configurationpropertynamehbase.zookeeper.quorum/namevaluehadoop101,hadoop102,hadoop103/value/property
/configurationpom文件
!-- Hbase--
dependencygroupIdorg.apache.hbase/groupIdartifactIdhbase-server/artifactIdversion2.0.5/versionexclusionsexclusiongroupIdorg.glassfish/groupIdartifactIdjavax.el/artifactId/exclusion/exclusions
/dependency
dependencygroupIdorg.apache.hbase/groupIdartifactIdhbase-client/artifactIdversion2.0.5/version
/dependency
dependencygroupIdorg.glassfish/groupIdartifactIdjavax.el/artifactIdversion3.0.1-b06/version
/dependency六、HBase使用设计
1、预分区
每一个region维护着startRow与endRowKey如果加入的数据符合某个region维护的rowKey范围则该数据交给这个region维护。那么依照这个原则我们可以将数据所要投放的分区提前大致的规划好以提高HBase性能。
手动设定分区
create staff1,info, SPLITS [1000,2000,3000,4000]生成16进制序列预分区
create staff2,info,{NUMREGIONS 15, SPLITALGO HexStringSplit}按照文件中设置的规则预分区
新建文件splits.txt
aaaa
bbbb
cccc
dddd执行脚本命令
create staff3, info,SPLITS_FILE splits.txt2、RowKey设计
一条数据的唯一标识就是rowkey那么这条数据存储于哪个分区取决于rowkey处于哪个region的区间内设计rowkey的主要目的 就是让数据均匀的分布于所有的region中在一定程度上防止数据倾斜。接下来我们就谈一谈如何让rowkey足够散列。
生成随机数、hash、散列值
原本rowKey为1001的SHA1后变成dd01903921ea24941c26a48f2cec24e0bb0e8cc7
原本rowKey为3001的SHA1后变成49042c54de64a1e9bf0b33e00245660ef92dc7bd
原本rowKey为5001的SHA1后变成7b61dec07e02c188790670af43e717f0f46e8913字符串反转
20170524000001转成10000042507102
20170524000002转成20000042507102字符串拼接
a12e_20170524000001
93i7_201705240000013、内存优化
HBase操作过程中需要大量的内存开销毕竟Table是可以缓存在内存中的但是不建议分配非常大的堆内存因为GC过程持续太久会导致RegionServer处于长期不可用状态一般16~36G内存就可以了如果因为框架占用内存过高导致系统内存不足框架一样会被系统服务拖死。
内存优化需要修改HBase家目录conf中的hbase-env.sh文件
#对master和regionserver都有效
export HBASE_HEAPSIZE1G#只对master有效
export HBASE_MASTER_OPTS自定义的jvm虚拟机参数#只对regionserver有效
export HBASE_REGIONSERVER_OPTS自定义的jvm虚拟机参数4、基础优化
1) RPC监听数量
hbase-site.xml
属性hbase.regionserver.handler.count
解释默认值为30用于指定RPC监听的数量可以根据客户端的请求数进行调整读写请求较多时增加此值。2手动控制Major Compaction
hbase-site.xml
属性hbase.hregion.majorcompaction解释默认值604800000秒7天 Major Compaction的周期若关闭自动Major Compaction可将其设为03优化HStore文件大小
hbase-site.xml
属性hbase.hregion.max.filesize解释默认值1073741824010GB如果需要运行HBase的MR任务可以减小此值因为一个region对应一个map任务如果单个region过大会导致map任务执行时间过长。该值的意思就是如果HFile的大小达到这个数值则这个region会被切分为两个Hfile。4优化HBase客户端缓存
hbase-site.xml
属性hbase.client.write.buffer解释默认值2097152bytes2M用于指定HBase客户端缓存增大该值可以减少RPC调用次数但是会消耗更多内存反之则反之。一般我们需要设定一定的缓存大小以达到减少RPC次数的目的。5指定scan.next扫描HBase所获取的行数
hbase-site.xml
属性hbase.client.scanner.caching解释用于指定scan.next方法获取的默认行数值越大消耗内存越大。6BlockCache占用RegionServer堆内存的比例
hbase-site.xml
属性hfile.block.cache.size解释默认0.4读请求比较多的情况下可适当调大7MemStore占用RegionServer堆内存的比例
hbase-site.xml
属性hbase.regionserver.global.memstore.size
解释默认0.4写请求较多的情况下可适当调大