1.hbase client Դ??
2.[知识讲解篇-155]HBase最佳实践-客户端超时机制
3.[知识讲解篇-189] hbase 参数解析,史上最全(二)
hbase client Դ??
一、通常向HBase批量导入数据有三种常用方式
1、使用HBase提供的TableOutputFormat,原理是通过一个Mapreduce作业将数据导入HBase
2、还有一种方式就是真值到源码使用HBase原生Client API(put)
3、前两种方式因为须要频繁的与数据所存储的RegionServer通信。一次性入库大量数据时,特别占用资源,所以都不是很有效。因为HBase在HDFS中是以HFile文件结构存储的,所以高效便捷的方法就是直接生成HFile文件然后使用Bulk Load方法,即HBase提供的HFileOutputFormat类。
二、Bulk Load基本原理
Bulk Load处理由两个主要步骤组成:
1、生成HFile文件
Bulk Load的第一步会执行一个Mapreduce作业,其中使用到了HFileOutputFormat输出HBase数据文件:StoreFile。
HFileOutputFormat的作用在于使得输出的HFile文件能够适应单个region。使用TotalOrderPartitioner类将map输出结果分区到各个不同的电力 仓库 源码key区间中,每一个key区间都相应着HBase表的region。
2、导入HBase表
第二步使用completebulkload工具将第一步的结果文件依次交给负责文件相应region的RegionServer,并将文件move到region在HDFS上的存储文件夹中。一旦完毕。将数据开放给clients。
假设在bulk load准备导入或在准备导入与完毕导入的临界点上发现region的边界已经改变,completebulkload工具会自己主动split数据文件到新的边界上。可是这个过程并非最佳实践,所以用户在使用时须要最小化准备导入与导入集群间的延时,特别是当其它client在同一时候使用其它工具向同一张表导入数据。
Bulk Load常遇到的一个ERROR:”java.io.IOException: Retry attempted times without completing, bailing out”
错误解析:
我们使用的Hbase1.0.2版本下,如果Hfile文件 跨越多个region,bulkload会自动地将Hfile文件split,但是对于每次retry只会将指定的Hfile文件split一次。但是在hbase-site.xml配置文件里有个参数hbase.bulkload.retries.number控制了hbase对一个hfile最多plit多少次。这个参数默认是,如果某个hfile跨越的点过114源码region数超过个就会报上述Exception。
解决方案:
将hbase.bulkload.retries.number这个参数设置为更大的值,比如目标表的region数量或者将这个参数设置成0,0表示不断重试直到成功。设置之后问题解决。
[知识讲解篇-]HBase最佳实践-客户端超时机制
客户端超时设置对整个系统的稳定性以及敏感性至关重要。不当的超时设置可能导致服务器端的长时间卡顿引起客户端阻塞等待,影响上层应用。HBase提供了多个客户端参数以设置超时,包括 hbase.rpc.timeout、hbase.client.operation.timeout 和 hbase.client.scanner.timeout.period。尽管官方文档对此没有详细说明,本文将详细介绍这三个参数。
其中,hbase.rpc.timeout 表示一次RPC请求的超时时间。如果请求耗时超过此时间,客户端将主动关闭socket,服务器端会捕获SocketTimeoutException异常。默认值为ms(1分钟)。付费查询源码
hbase.client.operation.timeout 则表示HBase客户端发起数据操作直至得到响应的总超时时间,包括了多个可能的RPC请求。例如,在一次PUT请求中,如果因为服务器端Full GC导致RPC请求超时,则对应hbase.rpc.timeout。而如果请求过程中发生网络抖动导致网络异常,则对应hbase.client.operation.timeout。
至于hbase.client.scanner.timeout.period,它为扫描操作提供了一个单独的超时设置。由于扫描操作可能导致的服务器端IO利用率过高、网络带宽占用和客户端内存OOM等问题,HBase会将一次扫描操作拆分为多个RPC请求。该参数设置了一个RPC请求的超时时间,默认为ms,超时后会抛出SocketTimeoutException异常。
在设置这些参数时,应根据实际情况选择合理的突破分时源码值。hbase.rpc.timeout与hbase.client.operation.timeout的值应综合考虑系统的并发量、服务器性能以及网络状况。而hbase.client.scanner.timeout.period的值则需要根据待检索数据量和客户端内存限制进行调整。
需要额外注意的是,一次扫描操作实际上会拆分为多个RPC请求。具体拆分的数量由一次扫描的待检索条数和单次RPC请求的数据条数决定。在设置参数时,应平衡扫描效率和资源占用,避免一次扫描请求的数据量过大导致内存问题,同时也要避免拆分过多RPC请求增加网络成本。
在实际使用中,如果在扫描过程中遇到RegionServer端抛出的leaseException,这与HBase的租约机制有关。租约机制是为了防止在客户端意外宕机时,服务器端的资源得不到释放。RegionServer在接收到第一次RPC请求时,会生成全局唯一的scanId和超时时间的lease,如果在超时时间内后续请求未到达,则会认为客户端异常,释放相关资源。
总结,合理设置客户端超时参数是保障系统稳定性和响应敏感性的关键。应避免盲目将超时时间设长,而是深入分析超时原因,确保系统在异常情况下能够快速响应,避免上层应用长时间卡顿。通过修改配置文件或代码设置参数时,应根据实际情况灵活调整,平衡资源利用与系统响应速度。
[知识讲解篇-] hbase 参数解析,史上最全(二)
zookeeper.znode.acl.parent
根节点用于访问控制列表,通常默认即可。
hbase.zookeeper.peerport
Zookeeper成员间交互端口,通常默认即可。
hbase.zookeeper.leaderport
Zookeeper用于选举主节点的端口,通常默认即可。
hbase.zookeeper.property.initLimit
从Zookeeper配置文件zoo.cfg读取的属性,初始同步阶段的时间长度,默认为*tickTime,tickTime为滴答单位。
hbase.zookeeper.property.syncLimit
从Zookeeper配置文件zoo.cfg读取的属性,发送请求与获得确认之间的最大时间间隔,默认为5*tickTime。
hbase.zookeeper.property.dataDir
Zookeeper数据snapshot存储目录。
hbase.zookeeper.property.clientPort
从Zookeeper配置文件zoo.cfg读取的属性,客户端连接端口,通常默认为。
hbase.zookeeper.property.maxClientCnxns
从Zookeeper配置文件zoo.cfg读取的属性,单个客户端可连接的zookeeper成员的最大数量,默认为。
hbase.client.retries.number
客户端操作的最大重试次数,与重试时间间隔相关,默认为。
hbase.client.max.total.tasks
一个HTable实例可以提交给集群的最大并发任务数,默认为。
hbase.client.max.perserver.tasks
一个HTable实例给单个region server提交的最大并发任务数,默认为2。
hbase.client.max.perregion.tasks
客户端对于单个region维护的最大并发连接数。
hbase.client.perserver.requests.threshold
所有客户端线程对单个服务器的最大并发挂起请求数,默认值为,防止慢速region server占用用户线程。
hbase.client.scanner.caching
scanner一次从服务端获取的行数,默认为Integer.MAX_VALUE,以充分利用网络而不受具体行数限制,最大值设置可根据需要调整。
hbase.client.keyvalue.maxsize
HBase列族的最大值,默认为M。
hbase.server.keyvalue.maxsize
单个cell的最大允许大小,包括value和所有key组件,值为0或负数将禁用检查,默认为MB。
hbase.client.scanner.timeout.period
客户端scanner租期时间,以毫秒为单位。
hbase.bulkload.retries.number
最大重试次数,原子批量加载尝试的迭代次数,默认为。
hbase.compaction.after.bulkload.enable
批量加载后立即触发compaction,默认为false。
hbase.master.balancer.maxRitPercent
均衡时允许的最大region迁移比例,值默认为1.0,无限制。设置为0.表示最多1%的region在迁移,集群平衡时可用性至少为%。
hbase.balancer.period
Master上运行均衡器的周期,以毫秒为单位,默认值为。
hbase.regions.slop
当任何regionserver的平均加权值超过平均值加上平均值与slop的乘积时,需要进行均衡,默认值取决于负载均衡器类型。
hbase.normalizer.period
Master上运行normalizer的周期,以毫秒为单位,默认值为。
hbase.normalizer.split.enabled
在normalization过程中是否启用split,默认为true。
hbase.normalizer.merge.enabled
在normalization过程中是否启用merge,默认为true。
hbase.normalizer.min.region.count
考虑合并normalization的表中region数量的最小值,默认值为3。
hbase.normalizer.merge.min_region_age.days
region被考虑合并的最小天数,默认值为3天。
hbase.normalizer.merge.min_region_size.mb
考虑合并的region的最小大小,以完整MB为单位,默认值为1MB。