设为首页 收藏本站
查看: 1021|回复: 0

[经验分享] Hadoop HBase

[复制链接]

尚未签到

发表于 2018-10-29 11:42:03 | 显示全部楼层 |阅读模式
  一、概述:
  1、定义:HBase是Google Bigtable的开源山寨版本。是建立的HDFS之上,提供高可靠性、高性能、列存储、可伸缩、实时、随机读写的数据库系统。
  它介于nosql和RDBMS之间,仅能通过主键(row key)和主键的range来检索数据,仅支持单行事务(可通过hive支持来实现多表join等复杂操作)。主要用来存储非结构化和半结构化的松散数据。与hadoop一样,Hbase目标主要依靠横向扩展,通过不断增加廉价的商用服务器,来增加计算和存储能力。
  2、特点:
  HBase中的表一般有这样的特点:
  (1) 、大:一个表可以有上亿行,上百万列
  (2)、 面向列:面向列(族)的存储和权限控制,列(族)独立检索。
  (3)、稀疏:对于为空(null)的列,并不占用存储空间,因此,表可以设计的非常稀疏。
  二、hbase命令行:
  1、进入hbase命令行  ./hbase shell
  2、显示hbase中的表   list
  3、创建user表,包含info、data两个列族
  create 'user', {NAME => 'info', VERSIONS => '3'},{NAME => 'data'}
  4、向user表中插入信息:
  (1)、插入row key为rk0001,列族info中添加name列标示符,值为zhangsan
  put 'user', 'rk0001', 'info:name', 'zhangsan'
  (2)、插入row key为rk0001,列族info中添加gender列标示符,值为female
  put 'user', 'rk0001', 'info:gender', 'female'
  (3)、插入row key为rk0001,列族info中添加age列标示符,值为20
  put 'user', 'rk0001', 'info:age', 20
  (4)、插入row key为rk0001,列族data中添加pic列标示符,值为picture
  put 'user', 'rk0001', 'data:pic', 'picture'
  5、get获取数据:
  (1)、获取user表中row key为rk0001的所有信息
  get 'user', 'rk0001'
  (2)、获取user表中row key为rk0001,info列族的所有信息
  get 'user', 'rk0001', 'info'
  (3)、获取user表中row key为rk0001,info列族的name、age列标示符的信息
  get 'user', 'rk0001', 'info:name', 'info:age'
  (4)、获取user表中row key为rk0001,info、data列族的信息
  get 'user', 'rk0001', 'info', 'data'
  get 'user', 'rk0001', {COLUMN => ['info', 'data']}
  (5)、获取user表中row key为rk0001,列族为info,版本号最新5个的信息
  get 'user', 'rk0001', {COLUMN => 'info:name', VERSIONS => 5}
  6、scan获取数据:
  (1)、查询user表中的所有信息
  scan 'user'
  (2)、查询user表中row key以rk字符开头的
  scan 'user',{FILTER=>"PrefixFilter('rk')"}
  (3)、查询user表中列族为info,rk范围是[rk0001, rk0003)的数据
  scan 'people', {COLUMNS => 'info', STARTROW => 'rk0001', ENDROW => 'rk0003'}
  (4)、查询user表中列族为info和data且列标示符中含有a字符的信息
  scan 'user', {COLUMNS => ['info', 'data'], FILTER => "(QualifierFilter(=,'substring:a'))"}
  (5)、查询user表中指定范围的数据
  scan 'user', {TIMERANGE => [1392368783980, 1392380169184]}
  7、删除数据
  (1)、删除user表row key为rk0001,列标示符为info:name的数据
  delete 'user', 'rk0001', 'info:name'
  (2)、删除user表row key为rk0001,列标示符为info:name,timestamp为1392383705316的数据
  delete 'user', 'rk0001', 'info:name', 1392383705316
  8、删除表
  disable 'user'
  drop 'user'
  三、HBase的java api:
  import java.util.List;
  import org.apache.hadoop.conf.Configuration;
  import org.apache.hadoop.hbase.Cell;
  import org.apache.hadoop.hbase.HBaseConfiguration;
  import org.apache.hadoop.hbase.HColumnDescriptor;
  import org.apache.hadoop.hbase.HTableDescriptor;
  import org.apache.hadoop.hbase.KeyValue;
  import org.apache.hadoop.hbase.TableName;
  import org.apache.hadoop.hbase.client.Delete;
  import org.apache.hadoop.hbase.client.Get;
  import org.apache.hadoop.hbase.client.HBaseAdmin;
  import org.apache.hadoop.hbase.client.HTable;
  import org.apache.hadoop.hbase.client.Put;
  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.BinaryComparator;
  import org.apache.hadoop.hbase.filter.BinaryPrefixComparator;
  import org.apache.hadoop.hbase.filter.ByteArrayComparable;
  import org.apache.hadoop.hbase.filter.ColumnPrefixFilter;
  import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp;
  import org.apache.hadoop.hbase.filter.FamilyFilter;
  import org.apache.hadoop.hbase.filter.Filter;
  import org.apache.hadoop.hbase.filter.MultipleColumnPrefixFilter;
  import org.apache.hadoop.hbase.filter.PrefixFilter;
  import org.apache.hadoop.hbase.filter.QualifierFilter;
  import org.apache.hadoop.hbase.filter.RegexStringComparator;
  import org.apache.hadoop.hbase.filter.RowFilter;
  import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;
  import org.apache.hadoop.hbase.filter.SubstringComparator;
  import org.apache.hadoop.hbase.master.TableNamespaceManager;
  import org.apache.hadoop.hbase.util.Bytes;
  import org.junit.Before;
  import org.junit.Test;

  public>  private Configuration conf = null;
  @Before
  public void init(){
  conf = HBaseConfiguration.create();
  conf.set("hbase.zookeeper.quorum", "node1,node2,node3");
  }
  @Test
  public void testDrop() throws Exception{
  HBaseAdmin admin = new HBaseAdmin(conf);
  admin.disableTable("account");
  admin.deleteTable("account");
  admin.close();
  }
  @Test
  public void testPut() throws Exception{
  HTable table = new HTable(conf, "person_info");
  Put p = new Put(Bytes.toBytes("person_rk_bj_zhang_000002"));
  p.add("base_info".getBytes(), "name".getBytes(), "zhangwuji".getBytes());
  table.put(p);
  table.close();
  }
  @Test
  public void testGet() throws Exception{
  HTable table = new HTable(conf, "person_info");
  Get get = new Get(Bytes.toBytes("person_rk_bj_zhang_000001"));
  get.setMaxVersions(5);
  Result result = table.get(get);
  List cells = result.listCells();
  //result.getValue(family, qualifier);  可以从result中直接取出一个特定的value
  //遍历出result中所有的键值对
  for(KeyValue kv : result.list()){
  String family = new String(kv.getFamily());
  System.out.println(family);
  String qualifier = new String(kv.getQualifier());
  System.out.println(qualifier);
  System.out.println(new String(kv.getValue()));
  }
  table.close();
  }
  /**
  * 多种过滤条件的使用方法
  * @throws Exception
  */
  @Test
  public void testScan() throws Exception{
  HTable table = new HTable(conf, "person_info".getBytes());
  Scan scan = new Scan(Bytes.toBytes("person_rk_bj_zhang_000001"), Bytes.toBytes("person_rk_bj_zhang_000002"));
  //前缀过滤器----针对行键
  Filter filter = new PrefixFilter(Bytes.toBytes("rk"));
  //行过滤器
  ByteArrayComparable rowComparator = new BinaryComparator(Bytes.toBytes("person_rk_bj_zhang_000001"));
  RowFilter rf = new RowFilter(CompareOp.LESS_OR_EQUAL, rowComparator);
  /**
  * 假设rowkey格式为:创建日期_发布日期_ID_TITLE
  * 目标:查找  发布日期  为  2014-12-21  的数据
  */
  rf = new RowFilter(CompareOp.EQUAL , new SubstringComparator("_2014-12-21_"));
  //单值过滤器 1 完整匹配字节数组
  new SingleColumnValueFilter("base_info".getBytes(), "name".getBytes(), CompareOp.EQUAL, "zhangsan".getBytes());
  //单值过滤器2 匹配正则表达式
  ByteArrayComparable comparator = new RegexStringComparator("zhang.");
  new SingleColumnValueFilter("info".getBytes(), "NAME".getBytes(), CompareOp.EQUAL, comparator);
  //单值过滤器2 匹配是否包含子串,大小写不敏感
  comparator = new SubstringComparator("wu");
  new SingleColumnValueFilter("info".getBytes(), "NAME".getBytes(), CompareOp.EQUAL, comparator);
  //键值对元数据过滤-----family过滤----字节数组完整匹配
  FamilyFilter ff = new FamilyFilter(
  CompareOp.EQUAL ,
  new BinaryComparator(Bytes.toBytes("base_info"))   //表中不存在inf列族,过滤结果为空
  );
  //键值对元数据过滤-----family过滤----字节数组前缀匹配
  ff = new FamilyFilter(
  CompareOp.EQUAL ,
  new BinaryPrefixComparator(Bytes.toBytes("inf"))   //表中存在以inf打头的列族info,过滤结果为该列族所有行
  );
  //键值对元数据过滤-----qualifier过滤----字节数组完整匹配
  filter = new QualifierFilter(
  CompareOp.EQUAL ,
  new BinaryComparator(Bytes.toBytes("na"))   //表中不存在na列,过滤结果为空
  );
  filter = new QualifierFilter(
  CompareOp.EQUAL ,
  new BinaryPrefixComparator(Bytes.toBytes("na"))   //表中存在以na打头的列name,过滤结果为所有行的该列数据
  );
  //基于列名(即Qualifier)前缀过滤数据的ColumnPrefixFilter
  filter = new ColumnPrefixFilter("na".getBytes());
  //基于列名(即Qualifier)多个前缀过滤数据的MultipleColumnPrefixFilter
  byte[][] prefixes = new byte[][] {Bytes.toBytes("na"), Bytes.toBytes("me")};
  filter = new MultipleColumnPrefixFilter(prefixes);
  //为查询设置过滤条件
  scan.setFilter(filter);
  scan.addFamily(Bytes.toBytes("base_info"));
  ResultScanner scanner = table.getScanner(scan);
  for(Result r : scanner){
  /**
  for(KeyValue kv : r.list()){
  String family = new String(kv.getFamily());
  System.out.println(family);
  String qualifier = new String(kv.getQualifier());
  System.out.println(qualifier);
  System.out.println(new String(kv.getValue()));
  }
  */
  //直接从result中取到某个特定的value
  byte[] value = r.getValue(Bytes.toBytes("base_info"), Bytes.toBytes("name"));
  System.out.println(new String(value));
  }
  table.close();
  }
  @Test
  public void testDel() throws Exception{
  HTable table = new HTable(conf, "user");
  Delete del = new Delete(Bytes.toBytes("rk0001"));
  del.deleteColumn(Bytes.toBytes("data"), Bytes.toBytes("pic"));
  table.delete(del);
  table.close();
  }
  public static void main(String[] args) throws Exception {
  Configuration conf = HBaseConfiguration.create();
  //conf.set("hbase.zookeeper.quorum", "weekend05:2181,weekend06:2181,weekend07:2181");
  HBaseAdmin admin = new HBaseAdmin(conf);
  TableName tableName = TableName.valueOf("person_info");
  HTableDescriptor td = new HTableDescriptor(tableName);
  HColumnDescriptor cd = new HColumnDescriptor("base_info");
  cd.setMaxVersions(10);
  td.addFamily(cd);
  admin.createTable(td);
  admin.close();
  }
  }
  


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-627962-1-1.html 上篇帖子: ambari安装hadoop页面问题 下篇帖子: hadoop-11841085
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表