hbase总结~hbase配置和使用

 

Base配置和使用文档...................................................................................................... 1html

1、 HBase原理和结构说明............................................................................................. 2java

2、 HBase的表结构....................................................................................................... 2node

1) Row Key............................................................................................................... 3linux

2) 列族 column family.............................................................................................. 4web

3) 单元 Cell............................................................................................................. 4算法

4) 时间戳 timestamp................................................................................................. 4sql

3、 HBASe单机配置...................................................................................................... 5shell

2) 使用root身份登陆目标服务器系统(Suse10Linux).................................................. 5数据库

3) 建立hadoop用户,$useraddhadoop能够用$passwdhadoop修改hadoop用户的登陆密码. 5apache

4) 解压hadoop:......................................................................................................... 6

5) 配置hbase-site.xml文件........................................................................................ 6

6) 启动和关闭.......................................................................................................... 7

7) 说明..................................................................................................................... 7

4、 Hbase配置解释........................................................................................................ 8

1) 修改linux 系统参数 Linux系统最大可打开文件数通常默认的参数值是1024,若是你不进行修改并发量上来的时候会出现“TooMany Open Files”的错误,致使整个HBase不可运行,你能够用ulimit-n 命令进行修改,或者修改/etc/security/limits.conf 和/proc/sys/fs/file-max 的参数,具体如何修改能够去Google 关键字 “linux limits.conf ”........................................................................................................ 8

2) JVM 配置 修改hbase-env.sh 文件中的配置参数,根据你的机器硬件和当前操做系统的JVM(32/64位)配置适当的参数 HBASE_HEAPSIZE 4000 HBase使用的 JVM 堆的大小 HBASE_OPTS "‐server ‐XX:+UseConcMarkSweepGC"JVMGC 选项 HBASE_MANAGES_ZKfalse 是否使用Zookeeper进行分布式管理 8

3) 配置HBase运行参数 hbase.rootdir.................................................................. 9

5、 HBase shell的基本用法........................................................................................... 23

1) 创建一个表和列族.............................................................................................. 23

2) 按设计的表结构插入值:.................................................................................... 24

3) 根据键值查询数据.............................................................................................. 24

4) 扫描全部数据..................................................................................................... 25

5) 删除指定数据..................................................................................................... 25

6) 修改表结构......................................................................................................... 26

7) 统计行数:......................................................................................................... 27

8) disable 和 enable 操做........................................................................................ 27

9) 表的删除............................................................................................................ 27

10) hbase shell脚本.................................................................................................. 28

6、 JAVA操做HBASE方面......................................................................................... 28

1) 链接原理和配置.................................................................................................. 28

2) 建立表................................................................................................................ 30

3) 删除表................................................................................................................ 31

4) 查询数据............................................................................................................ 31

5) 插入数据............................................................................................................ 33

6) 删除数据............................................................................................................ 34

7) 切分表................................................................................................................ 35

1、HBase原理和结构说明

HBase是一个分布式的、面向列的开源数据库,源于google的一篇论文《bigtable:一个结构化数据的分布式存储系统》

HBase是Google Bigtable的开源实现,它利用Hadoop HDFS做为其文件存储系统,利用Hadoop MapReduce来处理HBase中的海量数据,利用Zookeeper做为协同服务。

 

2、HBase的表结构

 

HBase以表的形式存储数据。表有行和列组成。列划分为若干个列族/列簇(column family)。

 

实际状况为:

 

 

如上图所示,key1,key2,key3是三条记录的惟一的row key值,column-family1,column-family2,column-family3是三个列族,每一个列族下又包括几列。好比column-family1这个列族下包括两列,名字是column1和column2,t1:abc,t2:gdxdf是由rowkey1和column-family1-column1惟一肯定的一个单元cell。这个cell中有两个数据,abc和gdxdf。两个值的时间戳不同,分别是t1,t2, hbase会返回最新时间的值给请求者。

 

这些名词的具体含义以下:

 

1) Row Key

 

与nosql数据库们同样,row key是用来检索记录的主键。访问hbase table中的行,只有三种方式:

 

(1.1) 经过单个row key访问

 

(1.2) 经过row key的range

 

(1.3) 全表扫描

 

Rowkey行键 (Row key)能够是任意字符串(最大长度是 64KB,实际应用中长度通常为 10-100bytes),在hbase内部,row key保存为字节数组。

 

存储时,数据按照Row key的字典序(byte order)排序存储。设计key时,要充分排序存储这个特性,将常常一块儿读取的行存储放到一块儿。(位置相关性)

 

注意:

 

字典序对int排序的结果是1,10,100,11,12,13,14,15,16,17,18,19,2,20,21,…,9,91,92,93,94,95,96,97,98,99。要保持整形的天然序,行键必须用0做左填充。

 

行的一次读写是原子操做 (不论一次读写多少列)。这个设计决策可以使用户很容易的理解程序在对同一个行进行并发更新操做时的行为。

 

2) 列族 column family

 

hbase表中的每一个列,都归属与某个列族。列族是表的chema的一部分(而列不是),必须在使用表以前定义。列名都以列族做为前缀。例如courses:history , courses:math 都属于courses 这个列族。

 

访问控制、磁盘和内存的使用统计都是在列族层面进行的。实际应用中,列族上的控制权限能帮助咱们管理不一样类型的应用:咱们容许一些应用能够添加新的基本数据、一些应用能够读取基本数据并建立继承的列族、一些应用则只容许浏览数据(甚至可能由于隐私的缘由不能浏览全部数据)。

 

3) 单元 Cell

 

HBase中经过row和columns肯定的为一个存贮单元称为cell。由{row key, column( =<family> + <label>), version} 惟一肯定的单元。cell中的数据是没有类型的,所有是字节码形式存贮。

 

4) 时间戳 timestamp

 

每一个cell都保存着同一份数据的多个版本。版本经过时间戳来索引。时间戳的类型是 64位整型。时间戳能够由hbase(在数据写入时自动 )赋值,此时时间戳是精确到毫秒的当前系统时间。时间戳也能够由客户显式赋值。若是应用程序要避免数据版本冲突,就必须本身生成具备惟一性的时间戳。每一个cell中,不一样版本的数据按照时间倒序排序,即最新的数据排在最前面。

 

为了不数据存在过多版本形成的的管理 (包括存贮和索引)负担,hbase提供了两种数据版本回收方式。一是保存数据的最后n个版本,二是保存最近一段时间内的版本(好比最近七天)。用户能够针对每一个列族进行设置。

3、HBASe单机配置

1) 下载
在Apache/Hadoop项目的网站(hadoop.apache.org/)下载hadoophbase发行包,此处两个发行包的大版本号必定要一致,譬如都是0.18版本:hadoop-0.18.2.tar.gzhbase-0.18.1.tar.gz

 

2) 使用root身份登陆目标服务器系统(Suse10Linux)

首先安装java虚拟机,这个比较简单,随便找个绿色的解压就能够了,在这个例子里面我使用IBMWAS6.1附带的jdk,它的home目录是/opt/IBM/WebSphere/AppServer/java,咱们只须要配置系统的环境变量就能够了.
编辑全局环境变量文件/etc/profile,在文件后面添加
exportJAVA_HOME=/opt/IBM/WebSphere/AppServer/java
exportPATH=$JAVA_HOME:$PATH
保存profile文件后使用$source/etc/profile命令从新加载profile,而后随便在一个目录下面运行$java-version查看javahome环境变量和path变量是否被正确加载.
另外到/etc/hosts文件中查看主机映射是否存在,例如127.0.0.1localhost或者什么其余的名字,在这里默认配置本机为localhost,若是须要作分布式的话,本机要作namenode,因此要把全部的datanode的host添加到这里面.

3) 建立hadoop用户,$useraddhadoop能够用$passwdhadoop修改hadoop用户的登陆密码.

建立hadoop用户的home目录,若是打算在别处安装hadoop/hbase的话能够不这样作,这里咱们默认将hadoophbase安装在/home/${username}目录下.

$cd/home
$mkdirhadoop
将目录用户指派给hadoop
$chownhadoophadoop
改变目录权限,这里咱们配大一些,其实只要644就足够了:
$chmod755hadoop

使用hadoop用户登陆系统,将下载的两个发行包文件传到/home/hadoop目录下面,而后给它们加上执行权限:
$chmoda+xhadoop-0.18.2.tar.gz
$chmoda+xhbase-0.18.1.tar.gz

4) 解压hadoop:

$tarzxvfhadoop-0.18.2.tar.gz
这样作会在/home/hadoop目录下解压hadoop发行包并建立到/home/hadoop/hadoop。

5) 配置hbase-site.xml文件

<configuration>

<property>

<name>hbase.rootdir</name>

<value>file:///home/data/hbase</value>

</property>

<property>

<name>hbase.coprocessor.user.region.classes</name>

<value>com.avos.uluru.hbase.AggrEndPoint</value>

</property>

<property>

<name>hbase.zookeeper.quorum</name>

<value>10.5.31.10</value>

</property>

<property>

<name>zookeeper.session.timeout</name>

<value>60000</value>

</property>

<property>

<name>hbase.zookeeper.property.clientPort</name>

<value>2181</value>

</property>

<property>

<name>hbase.regionserver.dns.nameserver</name>

<value>test.hbase.com</value>

</property>

<property>

<name>hbase.master.dns.interface</name>

<value>em3</value>

</property>

</configuration>

6) 启动和关闭

/bin/start-hbase.sh

/bin/stop-hbase.sh

7) 说明

必须配置的参数:

Hbase.zookeeper.quorum 本机的IP地址,不能为localhost或127.0.0.1,不然不能远程连接。

 

Hbase.master.dns.interface 为master绑定的网卡,多网卡的服务器必须配置,不然默认绑定到虚拟的轮回网卡,不配置不能远程连接。

 

ZooKeeper服务不认Ip,只认主机名,所以须要在/etc/hosts文件里增长一个ZooKeeper服务的IP地址与本机主机名的配置。如:10.5.31.10 amber-mts

若是不配置,Zookerper会绑定到locahost的主机名,远程就不能连接。

 

远程调用客户端也须要配置本机的DNS,在c:\windows\system32\driver\etc\host文件里增长Zookerper的Ip与主机名的配置。

 

4、Hbase配置解释

1) 修改linux 系统参数 
Linux系统最大可打开文件数通常默认的参数值是1024,若是你不进行修改并发量上来的时候会出现“Too Many Open Files”的错误,致使整个HBase不可运行,你能够用ulimit -n 命令进行修改,或者修改/etc/security/limits.conf和/proc/sys/fs/file-max 的参数,具体如何修改能够去Google 关键字“linux limits.conf ”

2) JVM 配置 
修改 hbase-env.sh 文件中的配置参数,根据你的机器硬件和当前操做系统的JVM(32/64位)配置适当的参数
HBASE_HEAPSIZE 4000 HBase使用的 JVM 堆的大小
HBASE_OPTS "‐server‐XX:+UseConcMarkSweepGC"JVMGC 选项
HBASE_MANAGES_ZKfalse 是否使用Zookeeper进行分布式管理

HBase持久化
重启操做系统后HBase中数据全无,你能够不作任何修改的状况下,建立一张表,写一条数据进行,而后将机器重启,重启后你再进入HBase的shell中使用 list 命令查看当前所存在的表,一个都没有了。是否是很杯具?没有关系你能够在hbase/conf/hbase-default.xml中设置hbase.rootdir的值,来设置文件的保存位置指定一个文件夹,例如:<value>file:///you/hbase-data/path</value>,你创建的HBase中的表和数据就直接写到了你的磁盘上,如图所示:
一样你也能够指定你的分布式文件系统HDFS的路径例如:hdfs://NAMENODE_SERVER:PORT/HBASE_ROOTDIR,这样就写到了你的分布式文件系统上了。

3) 配置HBase运行参数 
hbase.rootdir

这个目录是region server的共享目录,用来持久化Hbase。URL须要是'彻底正确'的,还要包含文件系统的scheme。例如,要表示hdfs中的'/hbase'目录,namenode 运行在namenode.example.org的9090端口。则须要设置为hdfs://namenode.example.org:9000 /hbase。默认状况下Hbase是写到/tmp的。不改这个配置,数据会在重启的时候丢失。

默认:file:///tmp/hbase-${user.name}/hbase

hbase.master.port

Hbase的Master的端口.

默认: 60000

hbase.cluster.distributed

Hbase的运行模式。false是单机模式,true是分布式模式。若为false,Hbase和Zookeeper会运行在同一个JVM里面。

默认: false

hbase.tmp.dir

本地文件系统的临时文件夹。能够修改到一个更为持久的目录上。(/tmp会在重启时清楚)

默认:/tmp/hbase-${user.name}

hbase.master.info.port

HBase Master web界面端口. 设置为-1 意味着你不想让他运行。

默认: 60010

hbase.master.info.bindAddress

HBase Master web界面绑定的端口

默认:0.0.0.0

hbase.client.write.buffer

HTable 客户端的写缓冲的默认大小。这个值越大,须要消耗的内存越大。由于缓冲在客户端和服务端都有实例,因此须要消耗客户端和服务端两个地方的内存。获得的好处是,能够减小RPC的次数。能够这样估算服务器端被占用的内存:hbase.client.write.buffer * hbase.regionserver.handler.count

默认:2097152

hbase.regionserver.port

HBaseRegionServer绑定的端口

默认: 60020

hbase.regionserver.info.port

HBaseRegionServer web 界面绑定的端口 设置为 -1 意味这你不想与运行RegionServer 界面.

默认: 60030

hbase.regionserver.info.port.auto

Master或RegionServer是否要动态搜一个能够用的端口来绑定界面。当hbase.regionserver.info.port已经被占用的时候,能够搜一个空闲的端口绑定。这个功能在测试的时候颇有用。默认关闭。

默认: false

hbase.regionserver.info.bindAddress

HBaseRegionServer web 界面的IP地址

默认:0.0.0.0

hbase.regionserver.class

RegionServer 使用的接口。客户端打开代理来链接region server的时候会使用到。

默认:org.apache.hadoop.hbase.ipc.HRegionInterface

hbase.client.pause

一般的客户端暂停时间。最多的用法是客户端在重试前的等待时间。好比失败的get操做和region查询操做等都极可能用到。

默认: 1000

hbase.client.retries.number

最大重试次数。例如region查询,Get操做,Update操做等等均可能发生错误,须要重试。这是最大重试错误的值。

默认: 10

hbase.client.scanner.caching

当 调用Scanner的next方法,而值又不在缓存里的时候,从服务端一次获取的行数。越大的值意味着Scanner会快一些,可是会占用更多的内存。当缓冲被占满的时候,next方法调用会愈来愈慢。慢到必定程度,可能会致使超时。例如超过了 hbase.regionserver.lease.period。

默认: 1

hbase.client.keyvalue.maxsize

一 个KeyValue实例的最大size.这个是用来设置存储文件中的单个entry的大小上界。由于一个KeyValue是不能分割的,因此能够避免由于 数据过大致使region不可分割。明智的作法是把它设为能够被最大region size整除的数。若是设置为0或者更小,就会禁用这个检查。默认10MB。

默认:10485760

hbase.regionserver.lease.period

客户端租用HRegionserver 期限,即超时阀值。单位是毫秒。默认状况下,客户端必须在这个时间内发一条信息,不然视为死掉。

默认: 60000

hbase.regionserver.handler.count

RegionServers受理的RPCServer实例数量。对于Master来讲,这个属性是Master受理的handler数量

默认: 10

hbase.regionserver.msginterval

RegionServer 发消息给Master 时间间隔,单位是毫秒

默认: 3000

hbase.regionserver.optionallogflushinterval

将Hlog同步到HDFS的间隔。若是Hlog没有积累到必定的数量,到了时间,也会触发同步。默认是1秒,单位毫秒。

默认: 1000

hbase.regionserver.regionSplitLimit

region的数量到了这个值后就不会在分裂了。这不是一个region数量的硬性限制。可是起到了必定指导性的做用,到了这个值就该中止分裂了。默认是MAX_INT.就是说不阻止分裂。

默认:2147483647

hbase.regionserver.logroll.period

提交commitlog的间隔,无论有没有写足够的值。

默认:3600000

hbase.regionserver.hlog.reader.impl

HLog file reader的实现.

默认:org.apache.hadoop.hbase.regionserver.wal.SequenceFileLogReader

hbase.regionserver.hlog.writer.impl

HLog file writer的实现.

默认:org.apache.hadoop.hbase.regionserver.wal.SequenceFileLogWriter

hbase.regionserver.thread.splitcompactcheckfrequency

region server 多久执行一次split/compaction检查.

默认: 20000

hbase.regionserver.nbreservationblocks

储备的内存block的数量(译者注:就像石油储备同样)。当发生out of memory 异常的时候,咱们能够用这些内存在RegionServer中止以前作清理操做。

默认: 4

hbase.zookeeper.dns.interface

当使用DNS的时候,Zookeeper用来上报的IP地址的网络接口名字。

默认: default

hbase.zookeeper.dns.nameserver

当使用DNS的时候,Zookeepr使用的DNS的域名或者IP地址,Zookeeper用它来肯定和master用来进行通信的域名.

默认:default

hbase.regionserver.dns.interface

当使用DNS的时候,RegionServer用来上报的IP地址的网络接口名字。

默认:default

hbase.regionserver.dns.nameserver

当使用DNS的时候,RegionServer使用的DNS的域名或者IP 地址,RegionServer用它来肯定和master用来进行通信的域名.

默认:default

hbase.master.dns.interface

当使用DNS的时候,Master用来上报的IP地址的网络接口名字。

默认:default

hbase.master.dns.nameserver

当使用DNS的时候,RegionServer使用的DNS的域名或者IP 地址,Master用它来肯定用来进行通信的域名.

默认:default

hbase.balancer.period

Master执行regionbalancer的间隔。

默认: 300000

hbase.regions.slop

当任一regionserver有average + (average * slop)个region是会执行Rebalance

默认: 0

hbase.master.logcleaner.ttl

Hlog存在于.oldlogdir文件夹的最长时间, 超过了就会被 Master 的线程清理掉.

默认: 600000

hbase.master.logcleaner.plugins

LogsCleaner 服务会执行的一组LogCleanerDelegat。值用逗号间隔的文本表示。这些WAL/HLog cleaners会按顺序调用。能够把先调用的放在前面。你能够实现本身的LogCleanerDelegat,加到Classpath下,而后在这里写下类的全称。通常都是加在默认值的前面。

默认:org.apache.hadoop.hbase.master.TimeToLiveLogCleaner

hbase.regionserver.global.memstore.upperLimit

单个regionserver的所有memtores的最大值。超过这个值,一个新的update操做会被挂起,强制执行flush操做。

默认: 0.4

hbase.regionserver.global.memstore.lowerLimit

当强制执行flush操做的时候,当低于这个值的时候,flush会中止。默认是堆大小的 35% . 若是这个值和hbase.regionserver.global.memstore.upperLimit 相同就意味着当update操做由于内存限制被挂起时,会尽可能少的执行flush(译者注:一旦执行flush,值就会比下限要低,再也不执行)

默认: 0.35

hbase.server.thread.wakefrequency

service工做的sleep间隔,单位毫秒。能够做为service线程的sleep间隔,好比log roller.

默认: 10000

hbase.hregion.memstore.flush.size

当memstore的大小超过这个值的时候,会flush到磁盘。这个值被一个线程每隔hbase.server.thread.wakefrequency检查一下。

默认:67108864

hbase.hregion.preclose.flush.size

当一个region中的memstore的大小大于这个值的时候,咱们又触发了close.会先运行“pre-flush”操做,清理这个须要关闭的 memstore,而后将这个region下线。当一个region下线了,咱们没法再进行任何写操做。若是一个memstore很大的时候,flush 操做会消耗不少时间。"pre-flush"操做意味着在region下线以前,会先把memstore清空。这样在最终执行close操做的时 候,flush操做会很快。

默认:5242880

hbase.hregion.memstore.block.multiplier

若是memstore有hbase.hregion.memstore.block.multiplier倍数的hbase.hregion.flush.size的大小,就会阻塞update操做。这是为了预防在update高峰期会致使的失控。若是不设上 界,flush的时候会花很长的时间来合并或者分割,最坏的状况就是引起out of memory异常。(译者注:内存操做的速度和磁盘不匹配,须要等一等。原文彷佛有误)

默认: 2

hbase.hregion.memstore.mslab.enabled

体验特性:启用memStore分配本地缓冲区。这个特性是为了防止在大量写负载的时候堆的碎片过多。这能够减小GC操做的频率。(GC有可能会Stopthe world)(译者注:实现的原理至关于预分配内存,而不是每个值都要从堆里分配)

默认: false

hbase.hregion.max.filesize

最大HStoreFile大小。若某个Column families的HStoreFile增加达到这个值,这个Hegion会被切割成两个。 Default: 256M.

默认:268435456

hbase.hstore.compactionThreshold

当一个HStore含有多于这个值的HStoreFiles(每个memstore flush产生一个HStoreFile)的时候,会执行一个合并操做,把这HStoreFiles写成一个。这个值越大,须要合并的时间就越长。

默认: 3

hbase.hstore.blockingStoreFiles

当一个HStore含有多于这个值的HStoreFiles(每个memstore flush产生一个HStoreFile)的时候,会执行一个合并操做,update会阻塞直到合并完成,直到超过了hbase.hstore.blockingWaitTime的值

默认: 7

hbase.hstore.blockingWaitTime

hbase.hstore.blockingStoreFiles所限制的StoreFile数量会致使update阻塞,这个时间是来限制阻塞时间的。当超过了这个时间,HRegion会中止阻塞update操做,不过合并还有没有完成。默认为90s.

默认: 90000

hbase.hstore.compaction.max

每一个“小”合并的HStoreFiles最大数量。

默认: 10

hbase.hregion.majorcompaction

一个Region中的全部HStoreFile的major compactions的时间间隔。默认是1天。 设置为0就是禁用这个功能。

默认:86400000

hbase.mapreduce.hfileoutputformat.blocksize

MapReduce 中HFileOutputFormat能够写 storefiles/hfiles. 这个值是hfile的blocksize的最小值。一般在Hbase写Hfile的时候,bloocksize是由table schema(HColumnDescriptor)决定的,可是在mapreduce写的时候,咱们没法获取schema中blocksize。这个值 越小,你的索引就越大,你随机访问须要获取的数据就越小。若是你的cell都很小,并且你须要更快的随机访问,能够把这个值调低。

默认: 65536

hfile.block.cache.size

分配给HFile/StoreFile的block cache占最大堆(-Xmx setting)的比例。默认是20%,设置为0就是不分配。

默认: 0.2

hbase.hash.type

哈希函数使用的哈希算法。能够选择两个值:: murmur (MurmurHash) 和 jenkins(JenkinsHash). 这个哈希是给 bloom filters用的.

默认: murmur

hbase.master.keytab.file

HMaster server验证登陆使用的kerberoskeytab 文件路径。(译者注:Hbase使用Kerberos实现安全)

默认:

hbase.master.kerberos.principal

例如."hbase/_HOST@EXAMPLE.COM". HMaster运行须要使用 kerberos principal name. principal name 能够在:user/hostname@DOMAIN 中获取. 若是"_HOST" 被用作hostname portion,须要使用实际运行的hostname来替代它。

默认:

hbase.regionserver.keytab.file

HRegionServer验证登陆使用的kerberoskeytab 文件路径。

默认:

hbase.regionserver.kerberos.principal

例如."hbase/_HOST@EXAMPLE.COM". HRegionServer运行须要使用 kerberos principalname. principal name 能够在: user/hostname@DOMAIN 中获取. 若是 "_HOST" 被用作hostname portion,须要使用实际运行的hostname来替代它。在这个文件中必需要有一个entry来描述 hbase.regionserver.keytab.file

默认:

zookeeper.session.timeout

ZooKeeper 会话超时.Hbase把这个值传递改zk集群,向他推荐一个会话的最大超时时间。详见http://hadoop.apache.org/zookeeper/docs/current/zookeeperProgrammers.html#ch_zkSessions "The client sends a requestedtimeout, the server responds with the timeout that it can givethe client. "。 单位是毫秒

默认: 180000

zookeeper.znode.parent

ZooKeeper中的Hbase的根ZNode。全部的Hbase的ZooKeeper会用这个目录配置相对路径。默认状况下,全部的Hbase的ZooKeeper文件路径是用相对路径,因此他们会都去这个目录下面。

默认: /hbase

zookeeper.znode.rootserver

ZNode 保存的 根region的路径. 这个值是由Master来写,client和regionserver 来读的。若是设为一个相对地址,父目录就是 ${zookeeper.znode.parent}.默认情形下,意味着根region的路径存储在/hbase/root-region- server.

默认:root-region-server

hbase.zookeeper.quorum

Zookeeper 集群的地址列表,用逗号分割。例 如:"host1.mydomain.com,host2.mydomain.com,host3.mydomain.com".默认是 localhost,是给伪分布式用的。要修改才能在彻底分布式的状况下使用。若是在hbase-env.sh设置了HBASE_MANAGES_ZK, 这些ZooKeeper节点就会和Hbase一块儿启动。

默认:localhost

hbase.zookeeper.peerport

ZooKeeper节点使用的端口。详细参见:http://hadoop.apache.org/zookeeper/docs/r3.1.1/zookeeperStarted.html#sc_RunningReplicatedZooKeeper

默认: 2888

hbase.zookeeper.leaderport

ZooKeeper用来选择Leader的端口,详细参见:http://hadoop.apache.org/zookeeper/docs/r3.1.1/zookeeperStarted.html#sc_RunningReplicatedZooKeeper

默认: 3888

hbase.zookeeper.property.initLimit

ZooKeeper的zoo.conf中的配置。初始化synchronization阶段的ticks数量限制

默认: 10

hbase.zookeeper.property.syncLimit

ZooKeeper的zoo.conf中的配置。发送一个请求到得到认可之间的ticks的数量限制

默认: 5

hbase.zookeeper.property.dataDir

ZooKeeper的zoo.conf中的配置。 快照的存储位置

默认:${hbase.tmp.dir}/zookeeper

hbase.zookeeper.property.clientPort

ZooKeeper的zoo.conf中的配置。客户端链接的端口

默认: 2181

hbase.zookeeper.property.maxClientCnxns

ZooKeeper的zoo.conf中的配置。 ZooKeeper集群中的单个节点接受的单个Client(以IP区分)的请求的并发数。这个值能够调高一点,防止在单机和伪分布式模式中出问题。

默认: 2000

hbase.rest.port

HBase RESTserver的端口

默认: 8080

hbase.rest.readonly

定义RESTserver的运行模式。能够设置成以下的值: false: 全部的HTTP请求都是被容许的 - GET/PUT/POST/DELETE. true:只有GET请求是被容许的

默认: false

hbase.client.write.buffer 
描述:这个参数能够设置写入数据缓冲区的大小,当客户端和服务器端传输数据,服务器为了提升系统运行性能开辟一个写的缓冲区来处理它,这个参数设置若是设置的大了,将会对系统的内存有必定的要求,直接影响系统的性能。

hbasta.thread.rescanfrequency 
描述:多长时间 HMaster对系统表 root 和meta扫描一次,这个参数能够设置的长一些,下降系统的能耗。

hbase.regionserveunt 
描述:因为HBase/Hadoop的Server是采用Multiplexed, non-blocking I/O方式而设计的,因此它能够透过一个Thread来完成处理,可是因为处理Client端所呼叫的方法是Blocking I/O,因此它的设计会将Client所传递过来的物件先放置在Queue,并在启动Server时就先产生一堆Handler(Thread),该Handler会透过Polling的方式来取得该物件并执行对应的方法,默认为25,根据实际场景能够设置大一些。

hbase.regionserver.thread.splitcompactcheckfrequency 
描述:这个参数是表示多久去RegionServer服务器运行一次split/compaction的时间间隔,固然split以前会先进行一个compact操做.这个compact操做多是minorcompact也多是major compact.compact后,会从全部的Store下的全部StoreFile文件最大的那个取midkey.这个midkey可能并不处于所有数据的mid中.一个row-key的下面的数据可能会跨不一样的HRegion。

hbase.hregion.max.filesize
描述:HRegion中的HStoreFile最大值,任何表中的列族一旦超过这个大小将会被切分,而HStroeFile的默认大小是256M。

hfile.block.cache.size
描述:指定 HFile/StoreFile 缓存在JVM堆中分配的百分比,默认值是0.2,意思就是20%,而若是你设置成0,就表示对该选项屏蔽。

hbase.zookeeper.property.maxClientCnxns 
描述:这项配置的选项就是从zookeeper中来的,表示ZooKeeper客户端同时访问的并发链接数,ZooKeeper对于HBase来讲就是一个入口这个参数的值能够适当放大些。

hbase.regionservemstore.upperLimit
描述:在Region Server中全部memstores占用堆的大小参数配置,默认值是0.4,表示40%,若是设置为0,就是对选项进行屏蔽。

hbasmstore.flush.size
描述:Memstore中缓存的内容超过配置的范围后将会写到磁盘上,例如:删除操做是先写入MemStore里作个标记,指示那个value, column 或 family等下是要删除的,HBase会按期对存储文件作一个major compaction,在那时HBase会把MemStore刷入一个新的HFile存储文件中。若是在必定时间范围内没有作major compaction,而Memstore中超出的范围就写入磁盘上了。

4) HBase中log4j的日志
HBase中日志输出等级默认状态下是把debug、 info 级别的日志打开的,能够根据本身的须要调整log级别,HBase的log4j日志配置文件在 hbase\conf\log4j.properties 目录下。

 

5、HBase shell的基本用法

hbase提供了一个shell的终端给用户交互。使用命令hbase shell进入命令界面。经过执行 help能够看到命令的帮助信息。

 

以网上的一个学生成绩表的例子来演示hbase的用法。

 

namegrad course

mathart

Tom 597 87

Jim 489 80

 

这里grad对于表来讲是一个只有它本身的列族,course对于表来讲是一个有两个列的列族,这个列族由两个列组成math和art,固然咱们能够根据咱们的须要在course中创建更多的列族,如computer,physics等相应的列添加入course列族。

1) 创建一个表和列族

复制代码 代码以下:

hbase(main):001:0>create ‘scores','grade', ‘course'

 

可使用list命令来查看当前HBase里有哪些表。使用describe命令来查看表结构。(记得全部的代表、列名都须要加上引号)

 

2) 按设计的表结构插入值:

复制代码 代码以下:

put ‘scores','Tom','grade:','5′

put ‘scores','Tom','course:math','97′

put ‘scores','Tom','course:art','87′

put ‘scores','Jim','grade','4′

put ‘scores','Jim','course:','89′

put ‘scores','Jim','course:','80′

 

这样表结构就起来了,其实比较自由,列族里边能够自由添加子列很方便。若是列族下没有子列,加不加冒号都是能够的。

 

put命令比较简单,只有这一种用法:

hbase>put ‘t1′, ‘r1′, ‘c1′, ‘value', ts1

 

t1指表名,r1指行键名,c1指列名,value指单元格值。ts1指时间戳,通常都省略掉了。

 

3) 根据键值查询数据

 

get ‘scores','Jim'

get ‘scores','Jim','grade'

 

可能你就发现规律了,HBase的shell操做,一个大概顺序就是操做关键词后跟表名,行名,列名这样的一个顺序,若是有其余条件再用花括号加上。

get有用法以下:

 

hbase>get ‘t1′, ‘r1′

hbase>get ‘t1′, ‘r1′, {TIMERANGE => [ts1, ts2]}

hbase>get ‘t1′, ‘r1′, {COLUMN => ‘c1′}

hbase>get ‘t1′, ‘r1′, {COLUMN => ['c1', 'c2','c3']}

hbase>get ‘t1′, ‘r1′, {COLUMN => ‘c1′, TIMESTAMP => ts1}

hbase>get ‘t1′, ‘r1′, {COLUMN => ‘c1′, TIMERANGE => [ts1, ts2], VERSIONS => 4}

hbase>get ‘t1′, ‘r1′, {COLUMN => ‘c1′, TIMESTAMP => ts1, VERSIONS => 4}

hbase>get ‘t1′, ‘r1′, ‘c1′

hbase>get ‘t1′, ‘r1′, ‘c1′, ‘c2′

hbase>get ‘t1′, ‘r1′, ['c1', 'c2']

 

4) 扫描全部数据

 

scan ‘scores'

 

也能够指定一些修饰词:TIMERANGE, FILTER, LIMIT,STARTROW, STOPROW, TIMESTAMP, MAXLENGTH,or COLUMNS。没任何修饰词,就是上边例句,就会显示全部数据行。

 

例句以下:

复制代码 代码以下:

hbase>scan ‘.META.'

hbase>scan ‘.META.', {COLUMNS => ‘info:regioninfo'}

hbase>scan ‘t1′, {COLUMNS => ['c1', 'c2'], LIMIT =>10, STARTROW => ‘xyz'}

hbase>scan ‘t1′, {COLUMNS => ‘c1′, TIMERANGE => [1303668804, 1303668904]}

hbase>scan ‘t1′, {FILTER => “(PrefixFilter (‘row2′) AND (QualifierFilter (>=, ‘binary:xyz'))) AND (TimestampsFilter ( 123, 456))”}

hbase>scan ‘t1′, {FILTER =>org.apache.hadoop.hbase.filter.ColumnPaginationFilter.new(1, 0)}

 

 

过滤器filter有两种方法指出:

 

a.Using a filterString –more information on this is available in the

FilterLanguage document attached to the HBASE-4176 JIRA

b.Using the entire package name of the filter.

 

还有一个CACHE_BLOCKS修饰词,开关scan的缓存的,默认是开启的(CACHE_BLOCKS=>true),能够选择关闭(CACHE_BLOCKS=>false)。

 

5) 删除指定数据

复制代码 代码以下:

delete‘scores','Jim','grade'

delete‘scores','Jim'

 

删除数据命令也没太多变化,只有一个:

 

hbase>delete ‘t1′, ‘r1′, ‘c1′, ts1

 

另外有一个deleteall命令,能够进行整行的范围的删除操做,慎用!

若是须要进行全表删除操做,就使用truncate命令,其实没有直接的全表删除命令,这个命令也是disable,drop,create三个命令组合出来的。

6) 修改表结构

复制代码 代码以下:

disable‘scores'

alter ‘scores',NAME=>'info'

enable‘scores'

 

alter命令使用以下(若是没法成功的版本,须要先通用表disable):

a、改变或添加一个列族:

 

hbase>alter ‘t1′, NAME => ‘f1′, VERSIONS => 5

 

b、删除一个列族:

复制代码 代码以下:

hbase>alter ‘t1′, NAME => ‘f1′, METHOD => ‘delete'

hbase>alter ‘t1′, ‘delete' => ‘f1′

 

c、也能够修改表属性如MAX_FILESIZE

MEMSTORE_FLUSHSIZE,READONLY,和 DEFERRED_LOG_FLUSH:

hbase>alter ‘t1′, METHOD => ‘table_att', MAX_FILESIZE => '134217728′

d、能够添加一个表协同处理器

 

hbase>alter ‘t1′, METHOD => ‘table_att', ‘coprocessor'=> ‘hdfs:///foo.jar|com.foo.FooRegionObserver|1001|arg1=1,arg2=2′

 

一个表上能够配置多个协同处理器,一个序列会自动增加进行标识。加载协同处理器(能够说是过滤程序)须要符合如下规则:

 

[coprocessorjar file location] | class name | [priority] | [arguments]

 

e、移除coprocessor以下:

 

hbase>alter ‘t1′, METHOD => ‘table_att_unset', NAME => ‘MAX_FILESIZE'

hbase>alter ‘t1′, METHOD => ‘table_att_unset', NAME => ‘coprocessor$1′

 

f、能够一次执行多个alter命令:

 

hbase>alter ‘t1′, {NAME => ‘f1′}, {NAME => ‘f2′, METHOD => ‘delete'}

 

7) 统计行数:

复制代码 代码以下:

hbase>count ‘t1′

hbase>count ‘t1′, INTERVAL => 100000

hbase>count ‘t1′, CACHE => 1000

hbase>count ‘t1′, INTERVAL => 10, CACHE => 1000

 

count通常会比较耗时,使用mapreduce进行统计,统计结果会缓存,默认是10行。统计间隔默认的是1000行(INTERVAL)。

 

8) disable 和 enable 操做

不少操做须要先暂停表的可用性,好比上边说的alter操做,删除表也须要这个操做。disable_all和enable_all可以操做更多的表。

 

9) 表的删除

先中止表的可以使用性,而后执行删除命令。

 

drop ‘t1′

 

以上是一些经常使用命令详解,具体的全部hbase的shell命令以下,分了几个命令群,看英文是能够看出大概用处的,详细的用法使用help “cmd” 进行了解。

 

复制代码 代码以下:

COMMANDGROUPS:

Groupname: general

Commands:status, version

 

Groupname: ddl

Commands:alter, alter_async, alter_status, create, describe, disable, disable_all, drop,drop_all,

enable,enable_all, exists, is_disabled, is_enabled, list, show_filters

 

Groupname: dml

Commands:count, delete, deleteall, get, get_counter, incr, put, scan, truncate

 

Groupname: tools

Commands:assign, balance_switch, balancer, close_region, compact, flush, hlog_roll,major_compact,

move,split, unassign, zk_dump

 

Groupname: replication

Commands:add_peer, disable_peer, enable_peer, list_peers, remove_peer,start_replication,

stop_replication

 

Groupname: security

Commands:grant, revoke, user_permission

 

 

 

 

10) hbase shell脚本

既然是shell命令,固然也能够把全部的hbase shell命令写入到一个文件内,想linux shell脚本程序那样去顺序的执行全部命令。如同写linux shell,把全部hbase shell命令书写在一个文件内,而后执行以下命令便可:

复制代码 代码以下:

$hbase shell test.hbaseshell

 

 

6、JAVA操做HBASE方面

1) 链接原理和配置

HBase Master是服务器负责管理全部的HRegion服务器,HBase Master并不存储HBase服务器的任何数据,HBase逻辑上的表可能会划分为多个HRegion,而后存储在HRegion Server群中,HBase Master Server中存储的是从数据到HRegion Server的映射。

一台机器只能运行一个HRegion服务器,数据的操做会记录在Hlog中,在读取数据时候,HRegion会先访问Hmemcache缓存,若是 缓存中没有数据才回到Hstore中上找,没一个列都会有一个Hstore集合,每一个Hstore集合包含了不少具体的HstoreFile文件,这些文 件是B树结构的,方便快速读取。

 

再看下HBase数据物理视图以下:

Row Key

Timestamp

Column Family

URI

Parser

r1

t3

url=http://www.taobao.com

title=每天特价

t2

host=taobao.com

 

t1

   

r2

t5

url=http://www.alibaba.com

content=天天…

t4

host=alibaba.com

 

? Row Key: 行键,Table的主键,Table中的记录按照Row Key排序

? Timestamp: 时间戳,每次数据操做对应的时间戳,能够看做是数据的versionnumber

? Column Family:列簇,Table在水平方向有一个或者多个Column Family组成,一个Column Family中能够由任意多个Column组成,即Column Family支持动态扩展,无需预先定义Column的数量以及类型,全部Column均以二进制格式存储,用户须要自行进行类型转换。

 

了解了HBase的体系结构和HBase数据视图够,如今让咱们一块儿看看怎样经过Java来操做HBase数据吧!

先说说具体的API先,以下

 

HBaseConfiguration是每个hbase client都会使用到的对象,它表明的是HBase配置信息。它有两种构造方式:

public HBaseConfiguration()

public HBaseConfiguration(final Configuration c)

默认的构造方式会尝试从hbase-default.xml和hbase-site.xml中读取配置。若是classpath没有这两个文件,就须要你本身设置配置。

Configuration HBASE_CONFIG = new Configuration();

HBASE_CONFIG.set(“hbase.zookeeper.quorum”,“zkServer”);

HBASE_CONFIG.set(“hbase.zookeeper.property.clientPort”,“2181″);

HBaseConfiguration cfg = newHBaseConfiguration(HBASE_CONFIG);

 

2) 建立表

建立表是经过HBaseAdmin对象来操做的。HBaseAdmin负责表的META信息处理。HBaseAdmin提供了createTable这个方法:

public void createTable(HTableDescriptor desc)

HTableDescriptor 表明的是表的schema, 提供的方法中比较有用的有

setMaxFileSize,指定最大的region size

setMemStoreFlushSize 指定memstore flush到HDFS上的文件大小

 

增长family经过 addFamily方法

public void addFamily(final HColumnDescriptorfamily)

HColumnDescriptor 表明的是column的schema,提供的方法比较经常使用的有

setTimeToLive:指定最大的TTL,单位是ms,过时数据会被自动删除。

setInMemory:指定是否放在内存中,对小表有用,可用于提升效率。默认关闭

setBloomFilter:指定是否使用BloomFilter,可提升随机查询效率。默认关闭

setCompressionType:设定数据压缩类型。默认无压缩。

setMaxVersions:指定数据最大保存的版本个数。默认为3。

 

一个简单的例子,建立了4个family的表:

 

HBaseAdmin hAdmin = new HBaseAdmin(hbaseConfig);

HTableDescriptor t = newHTableDescriptor(tableName);

t.addFamily(new HColumnDescriptor(“f1″));

t.addFamily(new HColumnDescriptor(“f2″));

t.addFamily(new HColumnDescriptor(“f3″));

t.addFamily(new HColumnDescriptor(“f4″));

hAdmin.createTable(t);

 

3) 删除表

删除表也是经过HBaseAdmin来操做,删除表以前首先要disable表。这是一个很是耗时的操做,因此不建议频繁删除表。

disableTable和deleteTable分别用来disable和delete表。

Example:

HBaseAdmin hAdmin = new HBaseAdmin(hbaseConfig);

if (hAdmin.tableExists(tableName)) {

hAdmin.disableTable(tableName);

hAdmin.deleteTable(tableName);

}

 

4) 查询数据

查询分为单条随机查询和批量查询。

单条查询是经过rowkey在table中查询某一行的数据。HTable提供了get方法来完成单条查询。

批量查询是经过制定一段rowkey的范围来查询。HTable提供了个getScanner方法来完成批量查询。

public Result get(final Get get)

public ResultScanner getScanner(final Scan scan)

Get对象包含了一个Get查询须要的信息。它的构造方法有两种:

publicGet(byte [] row)

publicGet(byte [] row, RowLock rowLock)

Rowlock是为了保证读写的原子性,你能够传递一个已经存在Rowlock,不然HBase会自动生成一个新的rowlock。

Scan对象提供了默认构造函数,通常使用默认构造函数。

 

Get/Scan的经常使用方法有:

addFamily/addColumn:指定须要的family或者column,若是没有调用任何addFamily或者Column,会返回全部的columns.

setMaxVersions:指定最大的版本个数。若是不带任何参数调用setMaxVersions,表示取全部的版本。若是不掉用setMaxVersions,只会取到最新的版本。

setTimeRange:指定最大的时间戳和最小的时间戳,只有在此范围内的cell才能被获取。

setTimeStamp:指定时间戳。

setFilter:指定Filter来过滤掉不须要的信息

 

Scan特有的方法:

setStartRow:指定开始的行。若是不调用,则从表头开始。

setStopRow:指定结束的行(不含此行)。

setBatch:指定最多返回的Cell数目。用于防止一行中有过多的数据,致使OutofMemory错误。

ResultScanner是Result的一个容器,每次调用ResultScanner的next方法,会返回Result.

public Result next() throws IOException;

public Result [] next(int nbRows) throwsIOException;

 

Result表明是一行的数据。经常使用方法有:

getRow:返回rowkey

raw:返回全部的key value数组。

getValue:按照column来获取cell的值

 

Example:

Scan s = new Scan();

s.setMaxVersions();

ResultScanner ss = table.getScanner(s);

for(Result r:ss){

System.out.println(new String(r.getRow()));

for(KeyValue kv:r.raw()){

System.out.println(newString(kv.getColumn()));

}

}

 

5) 插入数据

HTable经过put方法来插入数据。

public void put(final Put put) throws IOException

public void put(final List puts) throws IOException

能够传递单个批Put对象或者List put对象来分别实现单条插入和批量插入。

Put提供了3种构造方式:

public Put(byte [] row)

public Put(byte [] row, RowLock rowLock)

public Put(Put putToCopy)

 

Put经常使用的方法有:

add:增长一个Cell

setTimeStamp:指定全部cell默认的timestamp,若是一个Cell没有指定timestamp,就会用到这个值。若是没有调用,HBase会将当前时间做为未指定timestamp的cell的timestamp.

setWriteToWAL: WAL是Write Ahead Log的缩写,指的是HBase在插入操做前是否写Log。默认是打开,关掉会提升性能,可是若是系统出现故障(负责插入的Region Server挂掉),数据可能会丢失。

另外HTable也有两个方法也会影响插入的性能

setAutoFlash: AutoFlush指的是在每次调用HBase的Put操做,是否提交到HBase Server。默认是true,每次会提交。若是此时是单条插入,就会有更多的IO,从而下降性能.

setWriteBufferSize: Write Buffer Size在AutoFlush为false的时候起做用,默认是2MB,也就是当插入数据超过2MB,就会自动提交到Server

 

Example:

HTable table = new HTable(hbaseConfig, tableName);

table.setAutoFlush(autoFlush);

List lp = new ArrayList();

int count = 10000;

byte[] buffer = new byte[1024];

Random r = new Random();

for (int i = 1; i <= count; ++i) {

Put p= new Put(String.format(“row%09d”,i).getBytes());

r.nextBytes(buffer);

p.add(“f1″.getBytes(), null, buffer);

p.add(“f2″.getBytes(), null, buffer);

p.add(“f3″.getBytes(), null, buffer);

p.add(“f4″.getBytes(),null, buffer);

p.setWriteToWAL(wal);

lp.add(p);

if(i%1000==0){

table.put(lp);

lp.clear();

}

}

 

6) 删除数据

HTable 经过delete方法来删除数据。

public voiddelete(final Delete delete)

 

Delete构造方法有:

public Delete(byte [] row)

public Delete(byte [] row, long timestamp, RowLockrowLock)

public Delete(final Delete d)

Delete经常使用方法有

deleteFamily/deleteColumns:指定要删除的family或者column的数据。若是不调用任何这样的方法,将会删除整行。

注意:若是某个Cell的timestamp高于当前时间,这个Cell将不会被删除,仍然能够查出来。

 

Example:

HTable table = new HTable(hbaseConfig, “mytest”);

Delete d = new Delete(“row1″.getBytes());

table.delete(d)

 

7) 切分表

HBaseAdmin提供split方法来将table 进行split.

public void split(final StringtableNameOrRegionName)

 

若是提供的tableName,那么会将table全部region进行split ;若是提供的regionName,那么只会split这个region.

因为split是一个异步操做,咱们并不能确切的控制region的个数。

 

Example:

public void split(String tableName,int number,inttimeout) throws Exception {

Configuration HBASE_CONFIG = new Configuration();

HBASE_CONFIG.set(“hbase.zookeeper.quorum”, GlobalConf.ZOOKEEPER_QUORUM);

HBASE_CONFIG.set(“hbase.zookeeper.property.clientPort”,GlobalConf.ZOOKEEPER_PORT);

HBaseConfiguration cfg = new HBaseConfiguration(HBASE_CONFIG);

HBaseAdmin hAdmin = new HBaseAdmin(cfg);

HTablehTable = new HTable(cfg,tableName);

intoldsize = 0;

t = System.currentTimeMillis();

while(true){

intsize = hTable.getRegionsInfo().size();

logger.info(“the region number=”+size);

if(size>=number ) break;

if(size!=oldsize){

hAdmin.split(hTable.getTableName());

oldsize = size;

} elseif(System.currentTimeMillis()-t>timeout){

break;

}

Thread.sleep(1000*10);

}

}

相关文章
相关标签/搜索