绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
学习HBASE
2020-05-18 15:45:40

2.安装配置

hadoop的安装配置:http://blog.itpub.net/20777547/viewspace-1745820/

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连接池

HtablePoolHbase连接池的老用法,该类在0.94后的版本中已经不建议使用,在0.98.1以后已经移除了。


点击(此处)折叠或打开

  1. package exhbase;

  2. import java.io.IOException;

  3. import org.apache.hadoop.conf.Configuration;
  4. import org.apache.hadoop.hbase.HBaseConfiguration;
  5. import org.apache.hadoop.hbase.client.HConnection;
  6. import org.apache.hadoop.hbase.client.HConnectionManager;

  7. public class ConnectPool {

  8.     // 三台zookeeper的地址
  9.     public static final String QUORUM = "192.168.18.202,192.168.18.203,192.168.18.205";
  10.     // zookeeper的端口号
  11.     public static final String CLIENTPORT = "2181";
  12.     public static Configuration conf = null;
  13.     public static HConnection conn = null;

  14.     static {
  15.         try {
  16.             conf = HBaseConfiguration.create();
  17.             conf.set("hbase.zookeeper.quorum", QUORUM);
  18.             conf.set("hbase.zookeeper.property.clientPort", CLIENTPORT);
  19.             conn = HConnectionManager.createConnection(conf);
  20.         } catch (IOException e) {
  21.             e.printStackTrace();
  22.         }
  23.     }

  24. }


4.3写入数据

点击(此处)折叠或打开

  1. package exhbase;

  2. import java.io.IOException;

  3. import org.apache.hadoop.hbase.client.Durability;
  4. import org.apache.hadoop.hbase.client.HTableInterface;
  5. import org.apache.hadoop.hbase.client.Put;

  6. public class insertData {

  7.     public static void main(String[] args) {
  8.         // TODO Auto-generated method stub

  9.         try {
  10.             HTableInterface ht = ConnectPool.conn.getTable("test1");
  11.             // 指定rowkey
  12.             Put put = new Put("004".getBytes());
  13.             put.add("info".getBytes(), "name".getBytes(), "中文".getBytes());
  14.             put.add("info".getBytes(), "lang".getBytes(), "Chinese".getBytes());
  15.             // 设置写WAL(Write-Ahead-Log)的级别
  16.             put.setDurability(Durability.USE_DEFAULT);
  17.             ht.put(put);
  18.             ht.close();
  19.         } catch (IOException e) {
  20.             // TODO Auto-generated catch block
  21.             e.printStackTrace();
  22.         }
  23.     }

  24. }

注意:
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删除数据

点击(此处)折叠或打开

  1. package exhbase;

  2. import java.io.IOException;

  3. import org.apache.hadoop.hbase.client.Delete;
  4. import org.apache.hadoop.hbase.client.HTableInterface;
  5. import org.apache.hadoop.hbase.util.Bytes;

  6. public class deleteData {

  7.     public static void main(String[] args) {
  8.         // TODO Auto-generated method stub

  9.         try {
  10.             // 指定要操作的表test1
  11.             HTableInterface ht = ConnectPool.conn.getTable("test1");
  12.             // 指定要删除的rowkey="004"
  13.             Delete del = new Delete (Bytes.toBytes("004"));
  14. //            Delete方法,不指定的话就删除rowkey中所有列的所有版本
  15. //            del.deleteColumn(family, qualifier)
  16.             ht.delete(del);
  17.             ht.close();
  18.         } catch (IOException e) {
  19.             // TODO Auto-generated catch block
  20.             e.printStackTrace();
  21.         }
  22.     }

  23. }
Delete常用方法:
 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查询数据

点击(此处)折叠或打开

  1. package exhbase;

  2. import java.io.IOException;

  3. import org.apache.hadoop.hbase.Cell;
  4. import org.apache.hadoop.hbase.CellUtil;
  5. import org.apache.hadoop.hbase.client.Get;
  6. import org.apache.hadoop.hbase.client.HTableInterface;
  7. import org.apache.hadoop.hbase.client.Result;
  8. import org.apache.hadoop.hbase.util.Bytes;

  9. public class queryByKey {

  10.     public static void main(String[] args) {
  11.         // TODO Auto-generated method stub

  12.         try {
  13.             // 指定要操作的表test1
  14.             HTableInterface ht = ConnectPool.conn.getTable("test1");
  15.             // 指定要查询的rowkey=002
  16.             Get get = new Get("002".getBytes());
  17.             // Get方法,不指定就获取所有列的的所有版本数据
  18.             // get.addColumn(Bytes.toBytes("info"), Bytes.toBytes("lang"));
  19.             Result rs = ht.get(get);
  20.             for (Cell cell : rs.rawCells()) {
  21.                 System.out.println("rowkey=" + Bytes.toString(rs.getRow())
  22.                         + " " + Bytes.toString(CellUtil.cloneFamily(cell))
  23.                         + ":" + Bytes.toString(CellUtil.cloneQualifier(cell))
  24.                         + "=" + Bytes.toString(CellUtil.cloneValue(cell)));
  25.             }
  26.             ht.close();
  27.         } catch (IOException e) {
  28.             // TODO Auto-generated catch block
  29.             e.printStackTrace();
  30.         }

  31.     }

  32. }
Get常用方法:
 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多行记录

查询所有记录:

点击(此处)折叠或打开

  1. package exhbase;

  2. import java.io.IOException;

  3. import org.apache.hadoop.hbase.Cell;
  4. import org.apache.hadoop.hbase.CellUtil;
  5. import org.apache.hadoop.hbase.client.HTableInterface;
  6. import org.apache.hadoop.hbase.client.Result;
  7. import org.apache.hadoop.hbase.client.ResultScanner;
  8. import org.apache.hadoop.hbase.client.Scan;
  9. import org.apache.hadoop.hbase.util.Bytes;

  10. public class queryAllData {

  11.     public static void main(String[] args) {
  12.         // TODO Auto-generated method stub

  13.         try {
  14.             // 指定要操作的表test1
  15.             HTableInterface ht = ConnectPool.conn.getTable("test1");
  16.             ResultScanner rs = ht.getScanner(new Scan());
  17.             // for(Result r :rs.next(n))可以只查询前n行的数据,类似mysql的limit
  18.             for (Result r : rs) {
  19.                 for (Cell cell : r.rawCells()) {
  20.                     System.out.println("rowkey=" + Bytes.toString(r.getRow())
  21.                             + " " + Bytes.toString(CellUtil.cloneFamily(cell))
  22.                             + ":"
  23.                             + Bytes.toString(CellUtil.cloneQualifier(cell))
  24.                             + "=" + Bytes.toString(CellUtil.cloneValue(cell)));
  25.                 }
  26.             }
  27.             rs.close();
  28.             ht.close();
  29.         } catch (IOException e) {
  30.             // TODO Auto-generated catch block
  31.             e.printStackTrace();
  32.         }

  33.     }

  34. }

过滤查询:

点击(此处)折叠或打开

  1. package exhbase;

  2. import java.io.IOException;

  3. import org.apache.hadoop.hbase.Cell;
  4. import org.apache.hadoop.hbase.CellUtil;
  5. import org.apache.hadoop.hbase.client.HTableInterface;
  6. import org.apache.hadoop.hbase.client.Result;
  7. import org.apache.hadoop.hbase.client.ResultScanner;
  8. import org.apache.hadoop.hbase.client.Scan;
  9. import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp;
  10. import org.apache.hadoop.hbase.filter.FilterList;
  11. import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;
  12. import org.apache.hadoop.hbase.util.Bytes;

  13. public class queryByFilter {

  14.     public static void main(String[] args) {
  15.         // TODO Auto-generated method stub

  16.         try {
  17.             // 指定要查询的表
  18.             HTableInterface ht = ConnectPool.conn.getTable("test_objects");
  19.             // MUST_PASS_ALL表示filter之间做and运算,MUST_PASS_ONE表示做or运算
  20.             FilterList filterList = new FilterList(
  21.                     FilterList.Operator.MUST_PASS_ALL);

  22.             // GREATER_OR_EQUAL:大于等于
  23.             SingleColumnValueFilter filter1 = new SingleColumnValueFilter(
  24.                     Bytes.toBytes("info"), Bytes.toBytes("OBJECT_ID"),
  25.                     CompareOp.GREATER_OR_EQUAL, Bytes.toBytes("56897"));
  26.             // LESS_OR_EQUAL:小于等于
  27.             SingleColumnValueFilter filter2 = new SingleColumnValueFilter(
  28.                     Bytes.toBytes("info"), Bytes.toBytes("OBJECT_ID"),
  29.                     CompareOp.LESS_OR_EQUAL, Bytes.toBytes("56899"));
  30.             // EQUAL:等于
  31.             SingleColumnValueFilter filter3 = new SingleColumnValueFilter(
  32.                     Bytes.toBytes("info"), Bytes.toBytes("OBJECT_TYPE"),
  33.                     CompareOp.EQUAL, Bytes.toBytes("INDEX"));
  34.             // NOT_EQUAL:不等于
  35.             SingleColumnValueFilter filter4 = new SingleColumnValueFilter(
  36.                     Bytes.toBytes("info"), Bytes.toBytes("OWNER"),
  37.                     CompareOp.NOT_EQUAL, Bytes.toBytes("SYS"));

  38.             filterList.addFilter(filter1);
  39.             filterList.addFilter(filter2);
  40.             filterList.addFilter(filter3);
  41.             filterList.addFilter(filter4);

  42.             Scan scan = new Scan();
  43.             scan.setFilter(filterList);
  44.             // scan.addColumn指定扫描列
  45.             // scan.addColumn(Bytes.toBytes("info"), Bytes.toBytes("OWNER"));
  46.             // scan.addColumn(Bytes.toBytes("info"),
  47.             // Bytes.toBytes("OBJECT_ID"));
  48.             // scan.addColumn(Bytes.toBytes("info"),
  49.             // Bytes.toBytes("OBJECT_NAME"));
  50.             // scan.addColumn(Bytes.toBytes("info"),
  51.             // Bytes.toBytes("OBJECT_TYPE"));

  52.             ResultScanner rs = ht.getScanner(scan);

  53.             for (Result r : rs) {
  54.                 for (Cell cell : r.rawCells()) {
  55.                     System.out.println("rowkey=" + Bytes.toString(r.getRow())
  56.                             + ";" + Bytes.toString(CellUtil.cloneFamily(cell))
  57.                             + ":"
  58.                             + Bytes.toString(CellUtil.cloneQualifier(cell))
  59.                             + "=" + Bytes.toString(CellUtil.cloneValue(cell)));
  60.                 }
  61.             }
  62.             rs.close();
  63.             ht.close();
  64.         } catch (IOException e) {
  65.             // TODO Auto-generated catch block
  66.             e.printStackTrace();
  67.         }
  68.     }

  69. }

通过rowkey范围查询:


点击(此处)折叠或打开

  1. package exhbase;

  2. import java.io.IOException;

  3. import org.apache.hadoop.hbase.Cell;
  4. import org.apache.hadoop.hbase.CellUtil;
  5. import org.apache.hadoop.hbase.client.HTableInterface;
  6. import org.apache.hadoop.hbase.client.Result;
  7. import org.apache.hadoop.hbase.client.ResultScanner;
  8. import org.apache.hadoop.hbase.client.Scan;
  9. import org.apache.hadoop.hbase.util.Bytes;

  10. public class queryByRange {

  11.     public static void main(String[] args) {
  12.         // TODO Auto-generated method stub

  13.         try {
  14.             // 指定要查询的表
  15.             HTableInterface ht = ConnectPool.conn.getTable("test1");
  16.             Scan scan = new Scan();
  17.             // 范围查询的起始行号,大于等于
  18.             scan.setStartRow(Bytes.toBytes("001"));
  19.             // 范围查询的结果行号,注意是小于,不等于
  20.             scan.setStopRow(Bytes.toBytes("003"));
  21.             // 可以指定查询列
  22.             // scan.addColumn(Bytes.toBytes("info"), Bytes.toBytes("test1"));
  23.             ResultScanner rs = ht.getScanner(scan);
  24.             for (Result r : rs) {
  25.                 for (Cell cell : r.rawCells()) {
  26.                     System.out.println("rowkey=" + Bytes.toString(r.getRow())
  27.                             + " " + Bytes.toString(CellUtil.cloneFamily(cell))
  28.                             + ":"
  29.                             + Bytes.toString(CellUtil.cloneQualifier(cell))
  30.                             + "=" + Bytes.toString(CellUtil.cloneValue(cell)));
  31.                 }
  32.                 // for(Cell cell : r.rawCells()){
  33.                 // System.out.println("rowkey="+Bytes.toString(r.getRow())
  34.                 // +";info:name="+Bytes.toString(CellUtil.cloneValue(cell)));
  35.                 // }

  36.             }
  37.             rs.close();
  38.             ht.close();
  39.         } catch (IOException e) {
  40.             // TODO Auto-generated catch block
  41.             e.printStackTrace();
  42.         }

  43.     }

  44. }
Scan常用方法:
 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将返回 所有已经被打上删除标记但尚未被真正删除 的数据。该功能仅用于激活了 
分享好友

分享这个小栈给你的朋友们,一起进步吧。

Hbase资料库
创建时间:2020-05-08 14:42:11
Hbase资料库一站式查询。
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • 小雨滴
    专家
  • Leila
    专家
  • 飘絮絮絮丶
    专家
戳我,来吐槽~