博文

MemStore 调优

图片
HBase会在如下几种情况下触发flush操作,需要注意的是MemStore的最小flush单元是HRegion而不是单个MemStore。可想而知,如果一个HRegion中Memstore过多,每次flush的开销必然会很大,因此建议在进行表设计的时候尽量减少ColumnFamily的个数以及长度。触发时机有下面几种情况 checkResource Memstore级别限制 MemStoreFlusher周期性检查 max logs限制 手动flush Region合并 Region分裂 Bulk HFile 做Table的快照 checkResource 源码跟踪流程Put -> checkResource -> HReion::flushcache -> internalFlushcache -> internalFlushCacheAndCommit checkResource是在客户端Put、Delete、Update操作时,执行checkResource操作做如下检查 1)Meta Region(HBase系统表,hbase:acl,hbase:meta,hbase:namespace),不做资源约束或者阻塞更新操作。 2)如果Region当前内存大小memstoreSize超过阈值blockingMemStoreSize(hbase.hregion.memstore.block.multiplier * hbase.hregion.memstore.flush.size)则更新阻塞请求计数器,发起刷新MemStore请求,并抛出RegionTooBusyException异常,阻塞数据更新操作。 3)触发flush 核心代码如下。 a. checkResource private void checkResources() throws RegionTooBusyException { // If catalog region, do not impose resource constraints or block updates. if (this.getRegionInfo().isMetaRegion()) return; if (this.memstoreSize.g

Kerberos in windows

Kerberos in windows Kerberos安装 下载kerberos客户端, 戳这儿 首先配置kerberos环境变量 a. 下载kerberos服务的krb5.conf并重命名为krb5.ini,设置如下环境变量 KRB5CCNAME=C:tempkrb5cache KRB5_CONFIG=C:tempkrb5.ini b. 拷贝krb5.ini到C:window目录 Program FilesMITKerberoskrb5.ini 安装kerberos并重启电脑 在KDC生成keytab放在C:tempkrb5cache目录,cd到heimdal bin目录执行kinit命令获取TGT klist验证是否成功 注意window防火墙需要关闭, aes256-cts验证方式需要安装额外的jar包,更多参考2.2.9关于AES-256加密:。推荐不使用 如果发现打印信息不对,那么可以是使用系统的的klist命令,切换到heimdal客户端bin目录执行klist命令即可。有关kerberos更详细的操作可以 瞅这儿 参考 [1] https://www.secure-endpoints.com/heimdal/ [2] http://tongchenxi.blogspot.hk/2017/06/kerberos.html

Windows环境下玩转kerberos

Kerberos in windows Kerberos安装 下载kerberos客户端, 戳这儿 首先配置kerberos环境变量 a. 下载kerberos服务的krb5.conf并重命名为krb5.ini,设置如下环境变量 KRB5CCNAME=C:tempkrb5cache KRB5_CONFIG=C:tempkrb5.ini b. 拷贝krb5.ini到C:window目录 Program FilesMITKerberoskrb5.ini 安装kerberos并重启电脑 在KDC生成keytab放在C:tempkrb5cache目录,cd到heimdal bin目录执行kinit命令获取TGT klist验证是否成功 注意window防火墙需要关闭, aes256-cts验证方式需要安装额外的jar包,更多参考2.2.9关于AES-256加密:。推荐不使用 如果发现打印信息不对,那么可以是使用系统的的klist命令,切换到heimdal客户端bin目录执行klist命令即可。有关kerberos更详细的操作可以 瞅这儿 参考 [1] https://www.secure-endpoints.com/heimdal/ [2] http://tongchenxi.blogspot.hk/2017/06/kerberos.html

HBase追溯

图片
本文主要是介绍下HBase一些背景知识,希望通过这篇文章可以让大家对HBase的认识能有一个大致的轮廓。 在LSM之前,常用的有三种基本存储引擎,分别是 哈希 B树 LSM-Tree(Log-Structured Merge Tree) 哈希 哈希存储引擎是哈希表的持久化实现,支持增、删、改,以及随机读取操作,但不支持顺序扫描,对应的存储系统为键值(Key-Value)存储系统,如 Bitcask。它仅支持追加操作,删除也只是通过标识 value 为特殊值,通过定期合并(Compaction)实现垃圾回收。 B 树 B 树存储引擎是 B 树的持久化实现,不仅支持单条记录的增、删、读、改操作,还支持顺序扫描,对应的存储系统是关系数据库。关系数据库中通过索引访问数据,在 Mysql InnoDB 中,有一个称为聚集索引的东西,行的数据存于其中,组织成 B+ 树的结构。更多B系树的内容可以参考 这里 。 重点是看LSM-Tree LSM-Tree 图片来源 lsm-tree论文 。LSM-Tree原理把一棵大树拆分成N棵小树,它首先写入内存中,随着小树越来越大,内存中的小树会flush到磁盘中,磁盘中的树定期可以做merge操作,合并成一棵大树,以优化读性能。内存中树的一部分和磁盘中第一层树做merge,对于磁盘中的树直接做update操作有可能会破坏物理block的连续性,但是实际应用中,一般lsm有多层,当磁盘中的小树合并成一个大树的时候,可以重新排好顺序,使得写入block连续,优化读性能。 HBase存储引擎采用LSM-Tree架构,大体原理图如下 当RegionServer(RS)收到写请求的时候(write request),RS会将请求转至相应的Region。每一个Region都存储着一些列(a set of rows),根据其列族的不同,将这些列数据存储在相应的列族中(Column Family,简写CF)。不同的CFs中的数据存储在各自的HStore中,HStore由一个Memstore及一系列StoreFile组成(StoreFile就是对HFile做了轻量级包装,即StoreFile底层就是HFile)。Memstore位于RS的主内存中,而HFiles被写入到HDFS中。当RS处理写请求的时候,数据首先写入到Me

RSGroup

HBase RSGroup Git环境 window环境下,警用crlf自动转换 git config --global core.autocrlf false protobuf环境 yum install autoconfautomake libtool cmake gcc* -y yum install ncurses-devel -y yum install openssl-devel -y wget https://github.com/google/protobuf/releases/download/v2.5.0/protobuf-2.5.0.tar.gz tar -xzvf ./protobuf-2.5.0.tar.gz cd protobuf-2.5.0 ./configure make && make install protoc --version 对于Ubuntu系统需要修改profile文件 vim ~/.profile export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib source ~/.profile hbase-6721-v15-branch-1.1.patch新增GroupAdmin,Group两个protos,另外加上HBase.proto新增两个字段,重新编译然后替换HBaseProtos类 protoc HBase.proto --java_out=/home/chenxi/hbase/pb 或则使用maven命令 cd hbase-protocol mvn compile -Pcompile-protobuf 编译HBase tarball options: -Xms1024m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=256M mvn -DskipTests clean install && mvn -DskipTests package assembly:single maven编译hbase-1.3.0源码时,默认采用-Dhadoop.profile=2.0,使用${hadoop-two.version}(2.5.1)版本,tarba