2.安装配置
2.1规划
主机 | 职责 |
dehadp01,dehadp02 | hmaster |
dehadp03,dehadp04,dehadp05 | regionserver,zookeeper |
2.2解压
[grid@dehadp01 ~]$ tar zxvf hbase-0.98.13-hadoop2-bin.tar.gz
。。。
[grid@dehadp01 ~]$ mv hbase-0.98.13-hadoop2 hbase
2.3修改hbase-env.sh
[grid@dehadp01 ~]$ vi hbase/conf/hbase-env.sh
。。。
export JAVA_HOME=/opt/jdk1.7
。。。
export HBASE_MANAGES_ZK=false
。。。
2.4修改hbase-site.xml
[grid@dehadp01 ~]$ vi hbase/conf/hbase-site.xml
<configuration>
<!--因为是多台master,所以hbase.roodir的值跟hadoop配置文件hdfs-site.xml中dfs.nameservices的值是一样的-->
<property>
<name>hbase.rootdir</name>
<value>hdfs://masters/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.tmp.dir</name>
<value>/home/grid/hbase/data/tmp</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>dehadp03,dehadp04,dehadp05</value>
</property>
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>2181</value>
</property>
<!--跟zookeeperper配置的dataDir一致-->
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/home/grid/zookeeper/data</value>
</property>
</configuration>
2.5修改regionservers
[grid@dehadp01 ~]$ vi hbase/conf/regionservers
dehadp03
dehadp04
dehadp05
2.6复制hbase到其他主机上
[grid@dehadp01 ~]$ scp -r hbase grid@dehadp02:/home/grid
。。。
[grid@dehadp01 ~]$ scp -r hbase grid@dehadp03:/home/grid
。。。
[grid@dehadp01 ~]$ scp -r hbase grid@dehadp04:/home/grid
。。。
[grid@dehadp01 ~]$ scp -r hbase grid@dehadp05:/home/grid
。。。
2.7启动hbase
目前不知道是Bug还是什么原因,需要到每台机器上去启动hbase的服务
[grid@dehadp01 ~]$ hbase-daemon.sh start master
starting master, logging to /home/grid/hbase/logs/hbase-grid-master-dehadp01.out
[grid@dehadp02 ~]$ hbase-daemon.sh start master
starting master, logging to /home/grid/hbase/logs/hbase-grid-master-dehadp02.out
[grid@dehadp03 ~]$ hbase-daemon.sh start regionserver
starting regionserver, logging to /home/grid/hbase/logs/hbase-grid-regionserver-dehadp03.out
[grid@dehadp04 ~]$ hbase-daemon.sh start regionserver
starting regionserver, logging to /home/grid/hbase/logs/hbase-grid-regionserver-dehadp04.out
[grid@dehadp05 ~]$ hbase-daemon.sh start regionserver
starting regionserver, logging to /home/grid/hbase/logs/hbase-grid-regionserver-dehadp05.out
2.8查看hbase状态
http://dehadp01:60010/master-status
http://dehadp02:60010/master-status
http://dehadp03:60030/rs-status
http://dehadp04:60030/rs-status
http://dehadp05:60030/rs-status
3.hbase shell
3.1启动hbase shell
[grid@dehadp01 ~]$ hbase shell
2015-07-31 17:16:23,793 INFO [main] Configuration.deprecation: hadoop.native.lib is deprecated. Instead, use io.native.lib.available
HBase Shell; enter 'help<RETURN>' for list of supported commands.
Type "exit<RETURN>" to leave the HBase Shell
Version 0.98.13-hadoop2, r8f54f8daf8cf4d1a629f8ed62363be29141c1b6e, Wed Jun 10 23:01:33 PDT 2015
3.2查看status
hbase(main):001:0> status
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/grid/hbase/lib/slf4j-log4j12-1.6.4.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/grid/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
3 servers, 0 dead, 0.6667 average load
3.3查看版本
hbase(main):002:0> version
0.98.13-hadoop2, r8f54f8daf8cf4d1a629f8ed62363be29141c1b6e, Wed Jun 10 23:01:33 PDT 2015
3.4创建一个表
hbase(main):003:0> create 'test1','info'
0 row(s) in 0.9680 seconds
=> Hbase::Table - test1
3.5put记录
hbase(main):004:0> put 'test1','001','info:name','paololiu'
0 row(s) in 0.1910 seconds
hbase(main):005:0> put 'test1','002','info:name','liuwei'
0 row(s) in 0.0210 seconds
hbase(main):006:0> put 'test1','003','info:name','$7.50'
0 row(s) in 0.0150 seconds
hbase(main):007:0> put 'test1','002','info:depart','it'
0 row(s) in 0.0160 seconds
3.6scan记录
hbase(main):008:0> scan 'test1'
ROW COLUMN+CELL
001 column=info:name, timestamp=1438334585117, value=paololiu
002 column=info:depart, timestamp=1438334674726, value=it
002 column=info:name, timestamp=1438334601092, value=liuwei
003 column=info:name, timestamp=1438334615245, value=$7.50
3 row(s) in 0.0810 seconds
3.7get记录
hbase(main):010:0> get 'test1','002'
COLUMN CELL
info:depart timestamp=1438334674726, value=it
info:name timestamp=1438334601092, value=liuwei
2 row(s) in 0.0270 seconds
3.8count记录
hbase(main):011:0> count 'test1'
3 row(s) in 0.0450 seconds
=> 3
4.java操作hbase
4.1新建一个项目exhbase,并加入habse/lib下面所有的jar文件。
4.2ConnectPool连接池
HtablePool是Hbase连接池的老用法,该类在0.94后的版本中已经不建议使用,在0.98.1以后已经移除了。
点击(此处)折叠或打开
- package exhbase;
- import java.io.IOException;
- import org.apache.hadoop.conf.Configuration;
- import org.apache.hadoop.hbase.HBaseConfiguration;
- import org.apache.hadoop.hbase.client.HConnection;
- import org.apache.hadoop.hbase.client.HConnectionManager;
- public class ConnectPool {
- // 三台zookeeper的地址
- public static final String QUORUM = "192.168.18.202,192.168.18.203,192.168.18.205";
- // zookeeper的端口号
- public static final String CLIENTPORT = "2181";
- public static Configuration conf = null;
- public static HConnection conn = null;
- static {
- try {
- conf = HBaseConfiguration.create();
- conf.set("hbase.zookeeper.quorum", QUORUM);
- conf.set("hbase.zookeeper.property.clientPort", CLIENTPORT);
- conn = HConnectionManager.createConnection(conf);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
4.3写入数据
点击(此处)折叠或打开
- package exhbase;
- import java.io.IOException;
- import org.apache.hadoop.hbase.client.Durability;
- import org.apache.hadoop.hbase.client.HTableInterface;
- import org.apache.hadoop.hbase.client.Put;
- public class insertData {
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- try {
- HTableInterface ht = ConnectPool.conn.getTable("test1");
- // 指定rowkey
- Put put = new Put("004".getBytes());
- put.add("info".getBytes(), "name".getBytes(), "中文".getBytes());
- put.add("info".getBytes(), "lang".getBytes(), "Chinese".getBytes());
- // 设置写WAL(Write-Ahead-Log)的级别
- put.setDurability(Durability.USE_DEFAULT);
- ht.put(put);
- ht.close();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
注意:
1)Put的构造函数都需要指定rowkey,如果是全新的rowkey,则新增加一行,如果是已有的rowkey,则做更新操作;
2)创建Put对象及put.add过程都是在构建一行的数据,创建Put对象时相当于创建了航对象,add的过程就是向目标行里面添加cell,直到ht.put才将数据插入hbase;
3)设置写WAL(Write-Ahead-Log)的级别,setDurability
参数是一个枚举值:
?ASYNC_WAL : 当数据变动时,异步写WAL日志
?SYNC_WAL : 当数据变动时,同步写WAL日志
?FSYNC_WAL : 当数据变动时,同步写WAL日志,并且,强制将数据写入磁盘
?SKIP_WAL : 不写WAL日志
?USE_DEFAULT : 使用HBase全局默认的WAL写入级别,即SYNC_WAL
4.4删除数据
点击(此处)折叠或打开
- package exhbase;
- import java.io.IOException;
- import org.apache.hadoop.hbase.client.Delete;
- import org.apache.hadoop.hbase.client.HTableInterface;
- import org.apache.hadoop.hbase.util.Bytes;
- public class deleteData {
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- try {
- // 指定要操作的表test1
- HTableInterface ht = ConnectPool.conn.getTable("test1");
- // 指定要删除的rowkey="004"
- Delete del = new Delete (Bytes.toBytes("004"));
- // Delete方法,不指定的话就删除rowkey中所有列的所有版本
- // del.deleteColumn(family, qualifier)
- ht.delete(del);
- ht.close();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
Delete deleteColumn (byte[] family, byte[] qualifier) 删除指定列的 新版本 的数据。
Delete deleteColumn s (byte[] family, byte[] qualifier) 删除指定列的 所有版本 的数据。
Delete deleteColumn (byte[] family, byte[] qualifier, long timestamp ) 删除指定列的 指定版本 的数据。
Delete deleteColumn s (byte[] family, byte[] qualifier, long timestamp ) 删除指定列的,时间戳 小于等于给定时间戳 的 所有 版本的数据。
Delete deleteFamily (byte[] family) 删除指定列族的所有列的 所有 版本数据。
Delete deleteFamily (byte[] family, long timestamp) 删除指定列族的所有列中 时间戳 小于等于 指定时间戳 的所有数据。
Delete deleteFamilyVersion (byte[] family, long timestamp) 删除指定列族中所有 列的时间戳 等于 指定时间戳 的版本数据。
void setTimestamp (long timestamp) 为Delete对象设置时间戳。
4.5通过rowkey查询数据
点击(此处)折叠或打开
- package exhbase;
- import java.io.IOException;
- import org.apache.hadoop.hbase.Cell;
- import org.apache.hadoop.hbase.CellUtil;
- import org.apache.hadoop.hbase.client.Get;
- import org.apache.hadoop.hbase.client.HTableInterface;
- import org.apache.hadoop.hbase.client.Result;
- import org.apache.hadoop.hbase.util.Bytes;
- public class queryByKey {
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- try {
- // 指定要操作的表test1
- HTableInterface ht = ConnectPool.conn.getTable("test1");
- // 指定要查询的rowkey=002
- Get get = new Get("002".getBytes());
- // Get方法,不指定就获取所有列的的所有版本数据
- // get.addColumn(Bytes.toBytes("info"), Bytes.toBytes("lang"));
- Result rs = ht.get(get);
- for (Cell cell : rs.rawCells()) {
- System.out.println("rowkey=" + Bytes.toString(rs.getRow())
- + " " + Bytes.toString(CellUtil.cloneFamily(cell))
- + ":" + Bytes.toString(CellUtil.cloneQualifier(cell))
- + "=" + Bytes.toString(CellUtil.cloneValue(cell)));
- }
- ht.close();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
Get addFamily(byte[] family) 指定希望获取的列族
Get addColumn(byte[] family, byte[] qualifier) 指定希望获取的列
Get setTimeRange(long minStamp, long maxStamp) 设置获取数据的 时间戳范围
Get setTimeStamp(long timestamp) 设置获取数据的时间戳
Get setMaxVersions(int maxVersions) 设定获取数据的版本数
Get setMaxVersions() 设定获取数据的 所有版本
Get setFilter(Filter filter) 为Get对象添加过滤器,过滤器详解请参见:http://blog.csdn.net/u010967382/article/details/37653177
void setCacheBlocks(boolean cacheBlocks) 设置该Get获取的数据是否缓存在内存中
4.6scan多行记录
查询所有记录:
点击(此处)折叠或打开
- package exhbase;
- import java.io.IOException;
- import org.apache.hadoop.hbase.Cell;
- import org.apache.hadoop.hbase.CellUtil;
- import org.apache.hadoop.hbase.client.HTableInterface;
- import org.apache.hadoop.hbase.client.Result;
- import org.apache.hadoop.hbase.client.ResultScanner;
- import org.apache.hadoop.hbase.client.Scan;
- import org.apache.hadoop.hbase.util.Bytes;
- public class queryAllData {
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- try {
- // 指定要操作的表test1
- HTableInterface ht = ConnectPool.conn.getTable("test1");
- ResultScanner rs = ht.getScanner(new Scan());
- // for(Result r :rs.next(n))可以只查询前n行的数据,类似mysql的limit
- for (Result r : rs) {
- for (Cell cell : r.rawCells()) {
- System.out.println("rowkey=" + Bytes.toString(r.getRow())
- + " " + Bytes.toString(CellUtil.cloneFamily(cell))
- + ":"
- + Bytes.toString(CellUtil.cloneQualifier(cell))
- + "=" + Bytes.toString(CellUtil.cloneValue(cell)));
- }
- }
- rs.close();
- ht.close();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
过滤查询:
点击(此处)折叠或打开
- package exhbase;
- import java.io.IOException;
- import org.apache.hadoop.hbase.Cell;
- import org.apache.hadoop.hbase.CellUtil;
- import org.apache.hadoop.hbase.client.HTableInterface;
- import org.apache.hadoop.hbase.client.Result;
- import org.apache.hadoop.hbase.client.ResultScanner;
- import org.apache.hadoop.hbase.client.Scan;
- import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp;
- import org.apache.hadoop.hbase.filter.FilterList;
- import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;
- import org.apache.hadoop.hbase.util.Bytes;
- public class queryByFilter {
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- try {
- // 指定要查询的表
- HTableInterface ht = ConnectPool.conn.getTable("test_objects");
- // MUST_PASS_ALL表示filter之间做and运算,MUST_PASS_ONE表示做or运算
- FilterList filterList = new FilterList(
- FilterList.Operator.MUST_PASS_ALL);
- // GREATER_OR_EQUAL:大于等于
- SingleColumnValueFilter filter1 = new SingleColumnValueFilter(
- Bytes.toBytes("info"), Bytes.toBytes("OBJECT_ID"),
- CompareOp.GREATER_OR_EQUAL, Bytes.toBytes("56897"));
- // LESS_OR_EQUAL:小于等于
- SingleColumnValueFilter filter2 = new SingleColumnValueFilter(
- Bytes.toBytes("info"), Bytes.toBytes("OBJECT_ID"),
- CompareOp.LESS_OR_EQUAL, Bytes.toBytes("56899"));
- // EQUAL:等于
- SingleColumnValueFilter filter3 = new SingleColumnValueFilter(
- Bytes.toBytes("info"), Bytes.toBytes("OBJECT_TYPE"),
- CompareOp.EQUAL, Bytes.toBytes("INDEX"));
- // NOT_EQUAL:不等于
- SingleColumnValueFilter filter4 = new SingleColumnValueFilter(
- Bytes.toBytes("info"), Bytes.toBytes("OWNER"),
- CompareOp.NOT_EQUAL, Bytes.toBytes("SYS"));
- filterList.addFilter(filter1);
- filterList.addFilter(filter2);
- filterList.addFilter(filter3);
- filterList.addFilter(filter4);
- Scan scan = new Scan();
- scan.setFilter(filterList);
- // scan.addColumn指定扫描列
- // scan.addColumn(Bytes.toBytes("info"), Bytes.toBytes("OWNER"));
- // scan.addColumn(Bytes.toBytes("info"),
- // Bytes.toBytes("OBJECT_ID"));
- // scan.addColumn(Bytes.toBytes("info"),
- // Bytes.toBytes("OBJECT_NAME"));
- // scan.addColumn(Bytes.toBytes("info"),
- // Bytes.toBytes("OBJECT_TYPE"));
- ResultScanner rs = ht.getScanner(scan);
- for (Result r : rs) {
- for (Cell cell : r.rawCells()) {
- System.out.println("rowkey=" + Bytes.toString(r.getRow())
- + ";" + Bytes.toString(CellUtil.cloneFamily(cell))
- + ":"
- + Bytes.toString(CellUtil.cloneQualifier(cell))
- + "=" + Bytes.toString(CellUtil.cloneValue(cell)));
- }
- }
- rs.close();
- ht.close();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
通过rowkey范围查询:
点击(此处)折叠或打开
- package exhbase;
- import java.io.IOException;
- import org.apache.hadoop.hbase.Cell;
- import org.apache.hadoop.hbase.CellUtil;
- import org.apache.hadoop.hbase.client.HTableInterface;
- import org.apache.hadoop.hbase.client.Result;
- import org.apache.hadoop.hbase.client.ResultScanner;
- import org.apache.hadoop.hbase.client.Scan;
- import org.apache.hadoop.hbase.util.Bytes;
- public class queryByRange {
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- try {
- // 指定要查询的表
- HTableInterface ht = ConnectPool.conn.getTable("test1");
- Scan scan = new Scan();
- // 范围查询的起始行号,大于等于
- scan.setStartRow(Bytes.toBytes("001"));
- // 范围查询的结果行号,注意是小于,不等于
- scan.setStopRow(Bytes.toBytes("003"));
- // 可以指定查询列
- // scan.addColumn(Bytes.toBytes("info"), Bytes.toBytes("test1"));
- ResultScanner rs = ht.getScanner(scan);
- for (Result r : rs) {
- for (Cell cell : r.rawCells()) {
- System.out.println("rowkey=" + Bytes.toString(r.getRow())
- + " " + Bytes.toString(CellUtil.cloneFamily(cell))
- + ":"
- + Bytes.toString(CellUtil.cloneQualifier(cell))
- + "=" + Bytes.toString(CellUtil.cloneValue(cell)));
- }
- // for(Cell cell : r.rawCells()){
- // System.out.println("rowkey="+Bytes.toString(r.getRow())
- // +";info:name="+Bytes.toString(CellUtil.cloneValue(cell)));
- // }
- }
- rs.close();
- ht.close();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
Scan setStartRow (byte[] startRow) 设置Scan的开始行, 默认 结果集 包含 该行。 如果希望结果集不包含该行,可以在行键末尾加上0。
Scan setStopRow (byte[] stopRow) 设置Scan的结束行, 默认 结果集 不包含 该行。 如果希望结果集包含该行,可以在行键末尾加上0。
Scan setTimeRange (long minStamp, long maxStamp) 扫描指定 时间范围 的数据
Scan setTimeStamp (long timestamp) 扫描指定 时间 的数据
Scan addColumn (byte[] family, byte[] qualifier) 指定扫描的列
Scan addFamily (byte[] family) 指定扫描的列族
Scan setFilter (Filter filter) 为Scan设置过滤器
Scan setReversed (boolean reversed) 设置Scan的扫描顺序,默认是正向扫描(false),可以设置为逆向扫描(true)。注意:该方法0.98版本以后才可用!!
Scan setMaxVersions () 获取所有版本的数据
Scan setMaxVersions (int maxVersions) 设置获取的大版本数
void setCaching (int caching) 设定缓存在内存中的行数,缓存得越多,以后查询结果越快,同时也消耗更多内存
void setRaw (boolean raw) 激活或者禁用raw模式。如果raw模式被激活,Scan将返回 所有已经被打上删除标记但尚未被真正删除 的数据。该功能仅用于激活了