大数据培训-Module06HBase二次开发_第1页
大数据培训-Module06HBase二次开发_第2页
大数据培训-Module06HBase二次开发_第3页
大数据培训-Module06HBase二次开发_第4页
大数据培训-Module06HBase二次开发_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、版权所有 2015 华为技术有限公司HBase二次开发第1页.前言.第1页HBase是一个高可靠性、高性能、面向列、可伸缩的分布式数据库,设计目标是用来解决关系型数据库在处理海量数据 时的局限性。本章主要介绍HBase的接口以及二次开发的使用指导。目录.第2页1.HBase常用接口介绍常用Shell接口常用Java接口HBase常用接口.第3页客户端使用主要方式:HBase ShellHBase的命令行工具,最简单的接口,适合 HBase管理使用。Java API HBase客户端程序通过底层RPC接口与HBase集群进行通信,客户程序直接集成HBase的Java包,通过调用相关API即可完成

2、操作。其余接口:REST 接口REST(Representational State Transfer)表述性状态转 移接口。Thrift接口Thrift 是一个基于静态代码生成的跨语言的RPC协议栈实 现,它可以生成包括C+, Java, Python, Ruby, PHP 等主 流语言的代码,这些代码实现了 RPC 的协议层和传输层 功能,从而让用户可以集中精力于服务的调用和实现。Avro接口Avro是一个数据序列化系统,设计用于支持大批量数据 交换的应用。目录.第4页1.HBase常用接口介绍常用Shell接口常用Java接口常用Shell接口 连接通过/hbase shell来连接正在

3、运行的HBase Shell客户端用法:/ 安全登录,在进入hbase shell客户端之前,需要进行安装客户端和用户登录的准备工作,具体需要参考CPI文档中安 装与使用客户端章节/进入HBase shell客户端# .bin/hbase shellHBase Shell; enter help for list of supported commands. Type exit to leave the HBase ShellVersion 0.94.0, r, Sun Aug 26 22:12:56 CST 2012hbase(main):001:0.第5页常用Shell接口 创建表创建表时

4、,可以选择多个参数,但表名和列族名是必须的参数,其它参数还包括版本数、TTL 以及预分Region建表的key数组等用法:hbase create t1, NAME = f1, VERSIONS = 5hbase create t1, NAME = f1, NAME = f2, NAME = f3hbase # The above in shorthand would be the following: hbase create t1, f1, f2, f3hbase create t1, NAME = f1, VERSIONS = 1, TTL = 2592000, BLOCKCACHE =

5、 true hbase create t1, f1, SPLITS = 10, 20, 30, 40hbase create t1, f1, SPLITS_FILE = splits.txt hbase # Optionally pre-split the table into NUMREGIONS, usinghbase # SPLITALGO (HexStringSplit, UniformSplit or classname)hbase create t1, f1, NUMREGIONS = 15, SPLITALGO = HexStringSplit.第6页常用Shell接口 插入一行

6、数据PutPut数据时,必选参数是表名、RowKey、列名(包括列族和列名)和值,可选参数包括时间戳用法:hbase put t1, r1, c1, value, ts1例如,向表test中put三条数据,并通过count命令计算test表中的数据的条数 示例:/向表test中put数据,RowKey为rowkey1,列族名为cf,列名为qualifier1,值为value1.第7页hbase(main):002:0 0 row(s) in 0.5940 hbase(main):003:0 0 row(s) in 0.0080/指定时间戳为3 hbase(main):011:0 0 row(s

7、) in 0.0510 hbase(main):013:0 3 row(s) in 0.0160put test,rowkey1,cf:qualifier1,value1 secondsput test,rowkey2,cf:qualifier2,value2 secondsput test,rowkey3,cf:qualifier3,value3,3 secondscount test seconds常用Shell接口 读取一行数据Get查询一行数据时,必选参数是表名和RowKey,可选参数包括列名(包括列族和列名)、时间戳、版本数等用法:.第8页hbase hbase hbase hbas

8、e hbase hbaseget t1,get t1,get t1,get t1,get t1,get t1,r1 r1,r1,r1,r1,r1,TIMERANGE= ts1, ts2= c1= c1, c2, c3=COLUMNCOLUMNCOLUMNCOLUMNc1,c1,TIMESTAMP TIMERANGE= ts1= ts1,ts2,VERSIONS = 4hbase get VERSIONS = 4t1,r1,COLUMN = c1,c1c1, c2c1, c2TIMESTAMP= ts1,hbase hbase hbaseget t1,get t1,get t1,r1,r1,r1

9、,常用Shell接口 读取多行数据Scan查询多行数据,必选参数是表名,可选参数包括列名(包括列族和列名)、起止Key、Filter用法:/查询元表.第9页hbase hbase hbase hbase hbasescan scan scan scan scan.META.META., COLUMNS = info:regioninfot1,t1,t1,COLUMNS = c1, c2, LIMIT = 10, STARTROW = xyzCOLUMNS = c1, TIMERANGE = 1303668804, 1303668904FILTER = (PrefixFilter (row2)

10、AND (QualifierFilter s(=,binary:xyz)AND (TimestampsFilter hbase scan t1,( 123, 456)FILTER =org.apache.hadoop.hbase.filter.ColumnPaginationFilter.new(1, 0) hbase scan t1, COLUMNS = c1, c2, CACHE_BLOCKS = false hbase scan t1, RAW = true, VERSIONS = 10常用Shell接口 其他常用命令HBase还提供了一些其它的Shell API,包括general、d

11、dl、dml、tools、replication和security六组,每 组又包括多个Shell命令。每组命令和每个命令的用法均可以通过help查询其用法COMMAND GROUPS:Group name: generalCommands: status, version, whoamiGroup name: ddlCommands: alter, alter_async, alter_status, create, describe, disable, disable_all, drop, drop_all, enable, enable_all, exists, is_disabled,

12、 is_enabled, list, show_filtersGroup name: dmlCommands: count, delete, deleteall, get, get_counter, incr, put,scan, truncateGroup name: toolsCommands: assign, balance_switch, balancer, close_region, compact, flush, hlog_roll, major_compact, move, split, unassign, zk_dumpGroup name: replicationComman

13、ds: add_peer, disable_peer, enable_peer, list_peers, remove_peer, start_replication, stop_replicationGroup name: securityCommands: grant, revoke, user_permission.第10页目录.第11页1.HBase常用接口介绍常用Shell接口常用Java接口在开始使用HBase Java API之前,需要做几项准备工作: 要求JDK版本1.7及以上版本。HBase开发相关的jar包(包括ZooKeeper、HDFS、MapReduce等)需要和 H

14、Base集群节点上的版本保持一致。在hosts文件中添加HBase服务器节点的IP和HostName的映射关系。HBase采用的接口与Apache HBase保持一致,请参见:/apidocs/index.html.第12页工程搭建 准备工作1. 获取客户端安装包中的配置文件core-site.xml、hbase-site.xml、hdfs- site.xml并放置在到Java工程中的conf目录下。并将conf目录添加到classpath下。 2. 获取客户端安装包中的HBase开发依赖的jar文件,并添加到工程的classpath路 径下。3.

15、具体操作请参考CPI文档中开发环境准备的章节。在Eclipse工具中,单击“New Java Project”,输入工程名,单击“Finish” 即可创建Java工程。下载客户端安装包配置开发环境创建Java工程开发应用编译运行/ 初始化配置信息Configuration conf = HBaseConfiguration.create();/ 创建表HBaseAdmin admin = new HBaseAdmin(conf);admin.createTable(htd);/ 插入一行数据HTable table = new HTable(conf, tableName);Put put =

16、 new Put(Bytes.toBytes(012005000201); put.add(FAMILIES, Bytes.toBytes(name), Bytes.toBytes(张三); put.add(FAMILIES, Bytes.toBytes(gender), Bytes.toBytes(男);put.add(FAMILIES, Bytes.toBytes(address), Bytes.toBytes(广东省深圳市);table.put(put);工程搭建 准备工作.第13页/ 安全版本Configuration conf = HBaseConfiguration.create(

17、);conf.addResource(user-hbase.xml);.第14页if (User.isHBaseSecurityEnabled(conf) conf.set(HBASE_KEYTAB_FILE,System.getProperty(user.dir) + File.separator + conf+ File.separator + conf.get(HBASE_KEYTAB_FILE);String krbfilepath = System.getProperty(user.dir) + File.separator+ conf + File.separator + krb5

18、.conf; System.setProperty(java.security.krb5.conf, krbfilepath);try ZKUtil.loginClient(conf, HBASE_KEYTAB_FILE, HBASE_KERBEROS_PRINCIPAL, InetAddress.getLocalHost().getCanonicalHostName();User.login(conf, HBASE_KEYTAB_FILE, HBASE_KERBEROS_PRINCIPAL,InetAddress.getLocalHost().getCanonicalHostName();

19、catch (IOException e) e.printStackTrace();通过调用HBaseConfiguration的 create()方法来实例化。否则,将 无法正确加载HBase中的相关配置 项常用Java接口 创建安全版本的Configuration实例通过HBaseAdmin的createTable方法来创建一张表,指定表名、列族名称。创建表分为快速建表和预分Region建表,前 者表示创建表后整张表只有一个Region,随 着数据量的增加会自动分裂成多个Region; 后者表示,创建表时预先分配多个Region, 此种方法建表可以提高写入大量数据初期的 数据写入速度示例:

20、/ 表名和列族名称String tableName = myTable; String families = f1;/ 通过已有的Configuration对象实例化一个HBaseAdmin对象HBaseAdmin admin = new HBaseAdmin(config);/ 表的描述信息,指定表名、列族名称HTableDescriptor tableDesc = newHTableDescriptor(tableName);tableDesc.addFamily(new HColumnDescriptor(familiesi);/ 不预分Region建表admin.createTable

21、(tableDesc);/ 预分Region建表的两种方式:/ 指定起止RowKey和Region个数;此时的起始RowKey为第一个Region的 endKey,结束key为最后一个Region的startKey。 admin.createTable(tableDesc, Bytes.toBytes(10),Bytes.toBytes(800000), 30);/ 指定RowKey数组,不包括第一个Region的startKey和最后一个Region的 endKey,因此Region个数等于数组长度+1/ 例如以下语句创建的表包括4个Region,各Region的起止key分别为,a), a

22、,k), k,z),z,),可以看成左闭右开区间,a属于a,k)这个Region,k属于k,z)这个 Region,z属于z,)这个Region。byte keys = Bytes.toBytes(a), Bytes.toBytes(k), Bytes.toBytes(z);admin.createTable(tableDesc, keys);.第15页常用Java接口 创建表开启压缩功能有利于减少HBase中数据存储 的冗余数据,HBase中有两类压缩机制, HFile文件级别的压缩Compress和 DataBlockEncode前缀压缩。HBase中数据 存储格式是HFile,文件级别的

23、压缩既是针对 HFile的压缩,前缀压缩式针对HFile中数据 主要部分DataBlock进行压缩。 使用HBase压缩功能的方法是在创建表时, 针对列族在HColumnDescriptor类中通过接 口设置示例:columnDesc = new HColumnDescriptor(familiesi);/ 设置前缀压缩,HBase提供了PREFIX、DIF、FAST_DIFF三种前缀压 缩方法 columnDesc.setDataBlockEncoding(DataBlockEncoding.FAST_DIFF);/ 设置文件压缩,文件压缩通常需要安装压缩算法共享库,这里建议先先 通过/ o

24、rg.apache.hadoop.hbase.util.CompressionTest检查一下压缩算 法可用性columnDesc.setCompressionType(Algorithm.SNAPPY);tableDesc.addFamily(columnDesc);.第16页常用Java接口 开启压缩方式HBase是一个面向列的数据库,一行数据, 可能对应多个列族,而一个列族又可以对应 多个列。通常,写入数据的时候,我们需要 指定要写入的列(含列族名称和列名称)。如果要往HBase表中写入一行数据,需要首 先构建一个Put实例。Put中包含了数据的 RowKey值和指定列(含列族名称和列名

25、称) 的Value值,一个RowKey的Value值可以有 多个(即包含多个列)示例:/ 表的名称为personprivate static final byte TABLENAME = Bytes.toBytes(person);/ 列族名称的名称为privateInfoprivate static final byte FAMILIES =Bytes.toBytes(privateInfo);.第17页/ 列族privateInfo中有两个列name和addressprivate static final byte qualifiers = Bytes.toBytes(name),Byte

26、s.toBytes(addres) ;/ 实例化一个put对象Put put = new Put(Bytes.toBytes(rowkey);put.add(FAMILIES, qualifiers0, Bytes.toBytes(values00 + i); put.add(FAMILIES, qualifiers0, Bytes.toBytes(values01 + i);/ 多个put存放到一个List中puts.add(put);/ 提交一次put数据请求hTable.put(puts);常用Java接口 插入数据Put从表中读取一条数据,首先需要实例化 该表对应的HTable对象,然

27、后创建一个 Get对象。也可以为get对象设定参数值, 如列族的名称和列的名称。查询结果的 该行数据存储Result对象中,Result中 存储了多个KeyValue对示例:HTable table = null;try table = new HTable(conf, tableName);Get get = new Get(rowKey.getBytes();/ 设定列族名和列名get.addColumn(family, qualifier);/ 设定列族名get.addFamily(family);Result result = table.get(get);for (KeyValue

28、kv : result.raw() System.out.println(kv.getRow() + + (kv.getFamily() + + (kv.getQualifier() + + kv.getTimestamp() + + kv.getValue() + ); catch (IOException e) / TODO finally if (null != table) try table.close(); catch (IOException e) / TODO.第18页常用Java接口 读取一行数据Get要从表中读取数据,首先需要实例化该表 对应的HTable对象,然后创建一个

29、Scan对 象,并针对查询条件设置scan的参数值, 为了提高查询效率,最好指定StartKey和 EndKey。查询结果的多行数据保存在 ResultScanner对象,每行数据以Result对 象形式存储,Result中存储了多个 KeyValue对示例:HTable table = null;ResultScanner rScanner = null; try table = new HTable(conf, tableName); Scan scan = new Scan(); scan.setStartRow(startRow); scan.setStopRow(stopRow);/

30、 重要参数:每次RPC从服务端取回的记录数scan.setCaching(1000);.第19页rScanner = table.getScanner(scan);for (Result r = rScanner.next(); r != null; r = rScanner.next() for (KeyValue kv : r.raw() / TODO catch (IOException e) / TODO finally if (null != rScanner) rScanner.close();if (null != table) try table.close(); catch

31、(IOException e) / TODO常用Java接口 读取多行数据Scan HBase Filter主要通过设置一些过滤条件,在 查询(Scan)过程中进行Row级别的数据过滤。 可以设置RowKey过滤条件,也可以设置列名或 者列值的过滤条件。 HBase中提供了多种过滤器,这些过滤器都在 org.apache.hadoop.hbase.filter包中。单个过 滤器的使用,首先需要创建一个Scan对象,然后 设置该对象的Filter参数为过滤器对象。也可以多 个过滤器条件配合使用,采用FilterList。具体 HBase中提供了哪些filter,可以查询API示例:Scan s

32、= new Scan();/ 前缀过滤器,查找RowKey以“132”开头的行s.setFilter(new PrefixFilter(Bytes.toBytes(132);/ 查找符合条件的6行数据s.setFilter(new PageFilter(6);/ 多个过滤器结合使用FilterList list = new FilterList(Operator.MUST_PASS_ALL);list.addFilter(new SingleColumnValueFilter(family, qualifier,CompareOp.EQUAL, value); list.addFilter(n

33、ew PageFilter(6); s.setFilter(list);.第20页常用Java接口 过滤器Filter示例:/ new IndexAdmin对象进行索引管理操作HBaseAdmin admin = new IndexAdmin(conf);.第21页/ 创建表的Desc对象和列族对象String userTableName = testAddIndex;HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(userTableName); HColumnDescriptor hcd = new HColumnDescriptor(cf);htd.addFamily(hcd);/ 创建一个二级索引对象TableIndices tableIndices = new TableIndices(); tableIndices.addIndex(iSpec);IndexSpecification spec = new IndexSpecification(index1);spec.addIndexColumn(hcd, q1, ValueType.String, 10);/ 创建表和二级索引admin.createTable

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论