广州市建设招标管理办公室网站,品牌网站建设有哪些,互联网平面设计是干什么的,地区电商网站系统5.1 RowKey 设计
一条数据的唯一标识就是 rowkey#xff0c;那么这条数据存储于哪个分区#xff0c;取决于 rowkey 处于 哪个一个预分区的区间内#xff0c;设计 rowkey的主要目的 #xff0c;就是让数据均匀的分布于所有的 region 中#xff0c;在一定程度上防止数据倾斜…5.1 RowKey 设计
一条数据的唯一标识就是 rowkey那么这条数据存储于哪个分区取决于 rowkey 处于 哪个一个预分区的区间内设计 rowkey的主要目的 就是让数据均匀的分布于所有的 region 中在一定程度上防止数据倾斜。接下来我们就谈一谈 rowkey 常用的设计方案。
1生成随机数、hash、散列值 2时间戳反转 3字符串拼接
**需求**使用 hbase 存储下列数据要求能够通过 hbase 的 API 读取数据完成两个统计需求。 5.1.1 实现需求 1
为了能够统计张三在 2021 年 12 月份消费的总金额我们需要用 scan 命令能够得到张三在这个月消费的所有记录之后在进行累加即可。Scan 需要填写 startRow 和 stopRow
scan : startRow - ^A^Azhangsan2021-12 endRow - ^A^Azhangsan2021-12.注意点 1避免扫描数据混乱解决字段长度不一致的问题可以使用相同阿斯卡码值的符 号进行填充框架底层填充使用的是阿斯卡码值为 1 的^A。 2最后的日期结尾处需要使用阿斯卡码略大于’-’的值 最终得到 rowKey 的设计为 //注意 rowkey 相同的数据会视为相同数据覆盖掉之前的版本 rowKey: userdate(yyyy-MM-dd HH:mm:SS) 5.1.2 实现需求 2
问题提出按照需要 1 的 rowKey 设计会发现对于需求 2完全没有办法写 rowKey 的 扫描范围。此处能够看出 hbase 设计 rowKey 使用的特点为
适用性强 泛用性差 能够完美实现一个需求 但是不能同时完美实现多个需要。
如果想要同时完成两个需求需要对 rowKey 出现字段的顺序进行调整。
调整的原则为可枚举的放在前面。其中时间是可以枚举的用户名称无法枚举所以 必须把时间放在前面。
最终满足 2 个需求的设计
可以穷举的写在前面即可
rowKey 设计格式 date(yyyy-MM)^A^Auserdate(-dd hh:mm:ss ms)1统计张三在 2021 年 12 月份消费的总金额
scan: startRow 2021-12^A^AzhangsanstopRow 2021-12^A^Azhangsan.2统计所有人在 2021 年 12 月份消费的总金额
scan: startRow 2021-12stopRow 2021-12.5.1.3 添加预分区优化
预分区的分区号同样需要遵守 rowKey 的 scan 原则。所有必须添加在 rowKey 的最前面前缀为最简单的数字。同时使用 hash 算法将用户名和月份拼接决定分区号。单独使用用户名会造成单一用户所有数据存储在一个分区。
添加预分区优化
startKey stopKey
001
001 002
002 003
...
119 120分区号 hash(userdate(MM)) % 120分区号填充 如果得到 1 001rowKey 设计格式 分区号 date(yyyy-MM)^A^Auserdate(-dd hh:mm:ss ms)缺点实现需求 2 的时候由于每个分区都有 12 月份的数据需要扫描 120 个分区。 解决方法提前将分区号和月份进行对应。
提前将月份和分区号对应一下 000 到 009 分区 存储的都是 1 月份数据 010 到 019 分区 存储的都是 2 月份数据 … 110 到 119 分区 存储的都是 12 月份数据
是 9 月份的数据
分区号 hash(userdate(MM)) % 10 80分区号填充 如果得到 85 085
得到 12 月份所有人的数据
扫描 10 次
scan: startRow 1102021-12stopRow 1102021-12.
...startRow 1122021-12stopRow 1122021-12.
..startRow 1192021-12stopRow 1192021-12.5.2 参数优化
1Zookeeper 会话超时时间
hbase-site.xml
属性zookeeper.session.timeout解释默认值为 90000 毫秒90s。当某个 RegionServer 挂掉90s 之后 Master 才能察觉到。
可适当减小此值尽可能快地检测 regionserver 故障可调整至 20-30s。看你能有都能忍耐超时同时可以调整重试时间和重试次数
hbase.client.pause默认值 100ms
hbase.client.retries.number默认 15 次2设置 RPC 监听数量
hbase-site.xml
属性hbase.regionserver.handler.count
解释默认值为 30用于指定 RPC 监听的数量可以根据客户端的请求数进行调整读写请求较多时增加此值。3手动控制 Major Compaction
hbase-site.xml
属性hbase.hregion.majorcompaction
解释默认值604800000 秒7 天 Major Compaction 的周期若关闭自动 Major
Compaction可将其设为 0。如果关闭一定记得自己手动合并因为大合并非常有意义。4优化 HStore 文件大小
hbase-site.xml
属性hbase.hregion.max.filesize解释默认值 1073741824010GB如果需要运行 HBase 的 MR 任务可以减小此值
因为一个 region 对应一个 map 任务如果单个 region 过大会导致 map 任务执行时间过长。
该值的意思就是如果 HFile 的大小达到这个数值则这个 region 会被切分为两个 Hfile。5优化 HBase 客户端缓存
hbase-site.xml
属性hbase.client.write.buffer解释默认值 2097152bytes2M用于指定 HBase 客户端缓存
增大该值可以减少 RPC调用次数但是会消耗更多内存反之则反之。
一般我们需要设定一定的缓存大小以达到减少 RPC 次数的目的。6指定 scan.next 扫描 HBase 所获取的行数
hbase-site.xml
属性hbase.client.scanner.caching解释用于指定 scan.next 方法获取的默认行数值越大消耗内存越大。7BlockCache 占用 RegionServer 堆内存的比例
hbase-site.xml
属性hfile.block.cache.size
解释默认 0.4读请求比较多的情况下可适当调大8MemStore 占用 RegionServer 堆内存的比例
hbase-site.xml
属性hbase.regionserver.global.memstore.size
解释默认 0.4写请求较多的情况下可适当调大Lars Hofhansl拉斯·霍夫汉斯大神推荐 Region 设置 20G刷写大小设置 128M其它默认。
hbase-site.xml文件
?xml version1.0?
?xml-stylesheet typetext/xsl hrefconfiguration.xsl?
!--
/** Licensed to the Apache Software Foundation (ASF) under one* or more contributor license agreements. See the NOTICE file* distributed with this work for additional information* regarding copyright ownership. The ASF licenses this file* to you 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.*/
--
configuration!--The following properties are set for running HBase as a single process on adeveloper workstation. With this configuration, HBase is running instand-alone mode and without a distributed file system. In this mode, andwithout further configuration, HBase and ZooKeeper data are stored on thelocal filesystem, in a path under the value configured for hbase.tmp.dir.This value is overridden from its default value of /tmp because manysystems clean /tmp on a regular basis. Instead, it points to a path withinthis HBase installation directory.Running against the LocalFileSystem, as opposed to a distributedfilesystem, runs the risk of data integrity issues and data loss. NormallyHBase will refuse to run in such an environment. Settinghbase.unsafe.stream.capability.enforce to false overrides this behavior,permitting operation. This configuration is for the developer workstationonly and __should not be used in production!__See also https://hbase.apache.org/book.html#standalone_dist--propertynamehbase.cluster.distributed/namevaluefalse/value/propertypropertynamehbase.tmp.dir/namevalue./tmp/value/propertypropertynamehbase.unsafe.stream.capability.enforce/namevaluefalse/value/property
propertynamehbase.zookeeper.quorum/namevaluehadoop102,hadoop103,hadoop104/valuedescriptionThe directory shared by RegionServers./description/property
propertynamehbase.zookeeper.quorum/namevaluehadoop102,hadoop103,hadoop104/value/property
!-**加粗样式**- property--
!-- namehbase.zookeeper.property.dataDir/name--
!-- value/export/zookeeper/value--
!-- description 记得修改 ZK 的配置文件 --
!-- ZK 的信息不能保存到临时文件夹--
!-- /description--
!-- /property--propertynamehbase.rootdir/namevaluehdfs://hadoop102:8020/hbase/valuedescriptionThe directory shared by RegionServers./description/propertypropertynamehbase.cluster.distributed/namevaluetrue/value/property
/configuration
5.3 JVM 调优
JVM 调优的思路有两部分一是内存设置二是垃圾回收器设置。
垃圾回收的修改是使用并发垃圾回收默认 POPS 是并行垃圾回收会有大量的暂停。 理由是 HBsae 大量使用内存用于存储数据容易遭遇数据洪峰造成 OOM同时写缓存的数 据是不能垃圾回收的主要回收的就是读缓存而读缓存垃圾回收不影响性能所以最终设 置的效果可以总结为防患于未然早洗早轻松。
1设置使用 CMS 收集器
-XX:UseConcMarkSweepGC2保持新生代尽量小同时尽早开启 GC例如
//在内存占用到 70%的时候开启 GC
-XX:CMSInitiatingOccupancyFraction70//指定使用 70%不让 JVM 动态调整
-XX:UseCMSInitiatingOccupancyOnly//新生代内存设置为 512m
-Xmn512m//并行执行新生代垃圾回收
-XX:UseParNewGC// 设 置 scanner 扫 描 结 果 占 用 内 存 大 小 在 hbase-site.xml 中设置
hbase.client.scanner.max.result.size(默认值为 2M)为 eden 空间的 1/8
大概在 64M// 设置多个与 max.result.size * handler.count 相乘的结果小于 Survivor
Space(新生代经过垃圾回收之后存活的对象)5.4 HBase 使用经验法则
官方给出了权威的使用法则