`
hougbin
  • 浏览: 502491 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

HBASE

 
阅读更多

1、搭建环境

新建JAVA项目,添加的包有:

有关Hadoop的hadoop-core-0.20.204.0.jar

有关Hbase的hbase-0.90.4.jar、hbase-0.90.4-tests.jar以及Hbase资源包中lib目录下的所有jar包

 

2、主要程序

 

Java代码
  1. package com.wujintao.hbase.test;
  2. import java.io.IOException;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import org.apache.hadoop.conf.Configuration;
  6. import org.apache.hadoop.hbase.HBaseConfiguration;
  7. import org.apache.hadoop.hbase.HColumnDescriptor;
  8. import org.apache.hadoop.hbase.HTableDescriptor;
  9. import org.apache.hadoop.hbase.KeyValue;
  10. import org.apache.hadoop.hbase.MasterNotRunningException;
  11. import org.apache.hadoop.hbase.ZooKeeperConnectionException;
  12. import org.apache.hadoop.hbase.client.Delete;
  13. import org.apache.hadoop.hbase.client.Get;
  14. import org.apache.hadoop.hbase.client.HBaseAdmin;
  15. import org.apache.hadoop.hbase.client.HTable;
  16. import org.apache.hadoop.hbase.client.HTablePool;
  17. import org.apache.hadoop.hbase.client.Put;
  18. import org.apache.hadoop.hbase.client.Result;
  19. import org.apache.hadoop.hbase.client.ResultScanner;
  20. import org.apache.hadoop.hbase.client.Scan;
  21. import org.apache.hadoop.hbase.filter.Filter;
  22. import org.apache.hadoop.hbase.filter.FilterList;
  23. import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;
  24. import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp;
  25. import org.apache.hadoop.hbase.util.Bytes;
  26. public class JinTaoTest {
  27. public static Configuration configuration;
  28. static {
  29. configuration = HBaseConfiguration.create();
  30. configuration.set("hbase.zookeeper.property.clientPort", "2181");
  31. configuration.set("hbase.zookeeper.quorum", "192.168.1.100");
  32. configuration.set("hbase.master", "192.168.1.100:600000");
  33. }
  34. public static void main(String[] args) {
  35. // createTable("wujintao");
  36. // insertData("wujintao");
  37. // QueryAll("wujintao");
  38. // QueryByCondition1("wujintao");
  39. // QueryByCondition2("wujintao");
  40. //QueryByCondition3("wujintao");
  41. //deleteRow("wujintao","abcdef");
  42. deleteByCondition("wujintao","abcdef");
  43. }
  44. /**
  45. * 创建表
  46. * @param tableName
  47. */
  48. public static void createTable(String tableName) {
  49. System.out.println("start create table ......");
  50. try {
  51. HBaseAdmin hBaseAdmin = new HBaseAdmin(configuration);
  52. if (hBaseAdmin.tableExists(tableName)) {// 如果存在要创建的表,那么先删除,再创建
  53. hBaseAdmin.disableTable(tableName);
  54. hBaseAdmin.deleteTable(tableName);
  55. System.out.println(tableName + " is exist,detele....");
  56. }
  57. HTableDescriptor tableDescriptor = new HTableDescriptor(tableName);
  58. tableDescriptor.addFamily(new HColumnDescriptor("column1"));
  59. tableDescriptor.addFamily(new HColumnDescriptor("column2"));
  60. tableDescriptor.addFamily(new HColumnDescriptor("column3"));
  61. hBaseAdmin.createTable(tableDescriptor);
  62. } catch (MasterNotRunningException e) {
  63. e.printStackTrace();
  64. } catch (ZooKeeperConnectionException e) {
  65. e.printStackTrace();
  66. } catch (IOException e) {
  67. e.printStackTrace();
  68. }
  69. System.out.println("end create table ......");
  70. }
  71. /**
  72. * 插入数据
  73. * @param tableName
  74. */
  75. public static void insertData(String tableName) {
  76. System.out.println("start insert data ......");
  77. HTablePool pool = new HTablePool(configuration, 1000);
  78. HTable table = (HTable) pool.getTable(tableName);
  79. Put put = new Put("112233bbbcccc".getBytes());// 一个PUT代表一行数据,再NEW一个PUT表示第二行数据,每行一个唯一的ROWKEY,此处rowkey为put构造方法中传入的值
  80. put.add("column1".getBytes(), null, "aaa".getBytes());// 本行数据的第一列
  81. put.add("column2".getBytes(), null, "bbb".getBytes());// 本行数据的第三列
  82. put.add("column3".getBytes(), null, "ccc".getBytes());// 本行数据的第三列
  83. try {
  84. table.put(put);
  85. } catch (IOException e) {
  86. e.printStackTrace();
  87. }
  88. System.out.println("end insert data ......");
  89. }
  90. /**
  91. * 删除一张表
  92. * @param tableName
  93. */
  94. public static void dropTable(String tableName) {
  95. try {
  96. HBaseAdmin admin = new HBaseAdmin(configuration);
  97. admin.disableTable(tableName);
  98. admin.deleteTable(tableName);
  99. } catch (MasterNotRunningException e) {
  100. e.printStackTrace();
  101. } catch (ZooKeeperConnectionException e) {
  102. e.printStackTrace();
  103. } catch (IOException e) {
  104. e.printStackTrace();
  105. }
  106. }
  107. /**
  108. * 根据 rowkey删除一条记录
  109. * @param tablename
  110. * @param rowkey
  111. */
  112. public static void deleteRow(String tablename, String rowkey) {
  113. try {
  114. HTable table = new HTable(configuration, tablename);
  115. List list = new ArrayList();
  116. Delete d1 = new Delete(rowkey.getBytes());
  117. list.add(d1);
  118. table.delete(list);
  119. System.out.println("删除行成功!");
  120. } catch (IOException e) {
  121. e.printStackTrace();
  122. }
  123. }
  124. /**
  125. * 组合条件删除
  126. * @param tablename
  127. * @param rowkey
  128. */
  129. public static void deleteByCondition(String tablename, String rowkey) {
  130. //目前还没有发现有效的API能够实现 根据非rowkey的条件删除 这个功能能,还有清空表全部数据的API操作
  131. }
  132. /**
  133. * 查询所有数据
  134. * @param tableName
  135. */
  136. public static void QueryAll(String tableName) {
  137. HTablePool pool = new HTablePool(configuration, 1000);
  138. HTable table = (HTable) pool.getTable(tableName);
  139. try {
  140. ResultScanner rs = table.getScanner(new Scan());
  141. for (Result r : rs) {
  142. System.out.println("获得到rowkey:" + new String(r.getRow()));
  143. for (KeyValue keyValue : r.raw()) {
  144. System.out.println("列:" + new String(keyValue.getFamily())
  145. + "====值:" + new String(keyValue.getValue()));
  146. }
  147. }
  148. } catch (IOException e) {
  149. e.printStackTrace();
  150. }
  151. }
  152. /**
  153. * 单条件查询,根据rowkey查询唯一一条记录
  154. * @param tableName
  155. */
  156. public static void QueryByCondition1(String tableName) {
  157. HTablePool pool = new HTablePool(configuration, 1000);
  158. HTable table = (HTable) pool.getTable(tableName);
  159. try {
  160. Get scan = new Get("abcdef".getBytes());// 根据rowkey查询
  161. Result r = table.get(scan);
  162. System.out.println("获得到rowkey:" + new String(r.getRow()));
  163. for (KeyValue keyValue : r.raw()) {
  164. System.out.println("列:" + new String(keyValue.getFamily())
  165. + "====值:" + new String(keyValue.getValue()));
  166. }
  167. } catch (IOException e) {
  168. e.printStackTrace();
  169. }
  170. }
  171. /**
  172. * 单条件按查询,查询多条记录
  173. * @param tableName
  174. */
  175. public static void QueryByCondition2(String tableName) {
  176. try {
  177. HTablePool pool = new HTablePool(configuration, 1000);
  178. HTable table = (HTable) pool.getTable(tableName);
  179. Filter filter = new SingleColumnValueFilter(Bytes
  180. .toBytes("column1"), null, CompareOp.EQUAL, Bytes
  181. .toBytes("aaa")); // 当列column1的值为aaa时进行查询
  182. Scan s = new Scan();
  183. s.setFilter(filter);
  184. ResultScanner rs = table.getScanner(s);
  185. for (Result r : rs) {
  186. System.out.println("获得到rowkey:" + new String(r.getRow()));
  187. for (KeyValue keyValue : r.raw()) {
  188. System.out.println("列:" + new String(keyValue.getFamily())
  189. + "====值:" + new String(keyValue.getValue()));
  190. }
  191. }
  192. } catch (Exception e) {
  193. e.printStackTrace();
  194. }
  195. }
  196. /**
  197. * 组合条件查询
  198. * @param tableName
  199. */
  200. public static void QueryByCondition3(String tableName) {
  201. try {
  202. HTablePool pool = new HTablePool(configuration, 1000);
  203. HTable table = (HTable) pool.getTable(tableName);
  204. List<Filter> filters = new ArrayList<Filter>();
  205. Filter filter1 = new SingleColumnValueFilter(Bytes
  206. .toBytes("column1"), null, CompareOp.EQUAL, Bytes
  207. .toBytes("aaa"));
  208. filters.add(filter1);
  209. Filter filter2 = new SingleColumnValueFilter(Bytes
  210. .toBytes("column2"), null, CompareOp.EQUAL, Bytes
  211. .toBytes("bbb"));
  212. filters.add(filter2);
  213. Filter filter3 = new SingleColumnValueFilter(Bytes
  214. .toBytes("column3"), null, CompareOp.EQUAL, Bytes
  215. .toBytes("ccc"));
  216. filters.add(filter3);
  217. FilterList filterList1 = new FilterList(filters);
  218. Scan scan = new Scan();
  219. scan.setFilter(filterList1);
  220. ResultScanner rs = table.getScanner(scan);
  221. for (Result r : rs) {
  222. System.out.println("获得到rowkey:" + new String(r.getRow()));
  223. for (KeyValue keyValue : r.raw()) {
  224. System.out.println("列:" + new String(keyValue.getFamily())
  225. + "====值:" + new String(keyValue.getValue()));
  226. }
  227. }
  228. rs.close();
  229. } catch (Exception e) {
  230. e.printStackTrace();
  231. }
  232. }
  233. }

注意:可能大家没看到更新数据的操作,其实更新的操作跟添加完全一致,只不过是添加呢rowkey不存在,更新呢rowkey已经存在,并且timstamp相同的情况下,还有就是目前好像还没办法实现hbase数据的分页查询,不知道有没有人知道怎么做

 

HBase性能优化建议:

针对前面的代码,有很多不足之处,在此我就不修改上面的代码了,只是提出建议的地方,大家自己加上

1)配置

当你调用create方法时将会加载两个配置文件:hbase-default.xml and hbase-site.xml,利用的是当前的java类路径, 代码中configuration设置的这些配置将会覆盖hbase-default.xml和hbase-site.xml中相同的配置,如果两个配置文件都存在并且都设置好了相应参上面的属性下面的属性即可

 

2)关于建表

 

public void createTable(HTableDescriptor desc)

 

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

setMaxFileSize,指定最大的region size

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

增加family通过 addFamily方法

 

public void addFamily(final HColumnDescriptor family)

 

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

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

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

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

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

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

 

注意的是,一般我们不去setInMemory为true,默认是关闭的

 

3)关于入库

官方建议

table.setAutoFlush(false); //数据入库之前先设置此项为false

table.setflushCommits();//入库完成后,手动刷入数据

注意:

在入库过程中,put.setWriteToWAL(true/flase);

关于这一项如果不希望大量数据在存储过程中丢失,建议设置为true,如果仅是在测试演练阶段,为了节省入库时间建议设置为false

 

4)关于获取表实例

HTablePool pool = new HTablePool(configuration, Integer.MAX_VALUE);

HTable table = (HTable) pool.getTable(tableName);

建议用表连接池的方式获取表,具体池有什么作用,我想用过数据库连接池的同学都知道,我就不再重复

不建议使用new HTable(configuration,tableName);的方式获取表

 

5)关于查询

建议每个查询语句都放入try catch语句块,并且finally中要进行关闭ResultScanner实例以及将不使用的表重新放入到HTablePool中的操作,具体做法如下

 

Java代码
  1. public static void QueryAll(String tableName) {
  2. HTablePool pool = new HTablePool(configuration, Integer.MAX_VALUE);
  3. HTable table = null;
  4. ResultScanner rs = null;
  5. try {
  6. Scan scan = new Scan();
  7. table = (HTable) pool.getTable(tableName);
  8. rs = table.getScanner(scan);
  9. for (Result r : rs) {
  10. System.out.println("获得到rowkey:" + new String(r.getRow()));
  11. for (KeyValue keyValue : r.raw()) {
  12. System.out.println("列:" + new String(keyValue.getFamily())
  13. + "====值:" + new String(keyValue.getValue()));
  14. }
  15. }
  16. } catch (IOException e) {
  17. e.printStackTrace();
  18. }finally{
  19. rs.close();// 最后还得关闭
  20. pool.putTable(table); //实际应用过程中,pool获取实例的方式应该抽取为单例模式的,不应在每个方法都重新获取一次(单例明白?就是抽取到专门获取pool的逻辑类中,具体逻辑为如果pool存在着直接使用,如果不存在则new)
  21. }
  22. }
分享到:
评论

相关推荐

    HbaseTemplate 操作hbase

    在IT行业中,尤其是在大数据处理领域,HBase是一个广泛使用的分布式、高性能、列式存储的NoSQL数据库。HBase是建立在Hadoop文件系统(HDFS)之上,为处理大规模数据提供了一个高效的数据存储解决方案。而Spring Data...

    Hbase权威指南(HBase: The Definitive Guide)

    ### HBase权威指南知识点概述 #### 一、引言与背景 - **大数据时代的来临**:随着互联网技术的发展,人类社会产生了前所未为的数据量。这些数据不仅数量巨大,而且种类繁多,传统的数据库系统难以应对这样的挑战。 ...

    HBase可视化客户端

    基于JavaFX + HBase API开发,支持HBase2.4.x版本 核心功能如下: 1. 查询:支持对 HBase 进行单行查询、范围查询以及全表扫描,并支持 14 种过滤器的实现以及多版本查询! 2. 管理:HBase表格数据的增删查、命名...

    HBase官方文档中文版-HBase手册中文版

    HBase是一种分布式、基于列族的NoSQL数据库,由Apache软件基金会开发并维护,是Hadoop生态系统中的重要组件。这份“HBase官方文档中文版”提供了全面深入的HBase知识,帮助用户理解和掌握如何在大数据场景下有效地...

    hbase配置内置的zookeeper

    ### HBase 配置内置 ZooKeeper 的详细步骤与解析 #### 一、配置背景与目的 在 HBase 的部署环境中,ZooKeeper 起着非常重要的作用,它主要用于协调集群中的各个节点,并且管理 HBase 的元数据。通常情况下,HBase ...

    基于springboot集成hbase过程解析

    "基于SpringBoot集成HBase过程解析" SpringBoot集成HBase是当前大数据处理和存储解决方案中的一种常见组合。HBase是基于Hadoop的分布式、可扩展的NoSQL数据库,能够存储大量的结构化和非结构化数据。SpringBoot则...

    hbase用于查询客户端工具

    HBase是一种分布式、基于列族的NoSQL数据库,它在大数据领域中扮演着重要的角色,尤其是在需要实时查询大规模数据集时。HBase以其高吞吐量、低延迟和水平扩展能力而闻名,常用于存储非结构化和半结构化数据。在HBase...

    HBase(hbase-2.4.9-bin.tar.gz)

    HBase(hbase-2.4.9-bin.tar.gz)是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System...

    CDH-Hbase的安装1

    在本文中,我们将深入探讨HBase的安装过程及其在CDH环境中的集成。HBase是Apache Hadoop生态系统中的一个核心组件,它是一个分布式、版本化的、支持列族的NoSQL数据库,特别适合处理大规模的数据存储。CDH(Cloudera...

    hbase-2.4.17-bin 安装包

    HBase是Apache Hadoop生态系统中的一个分布式、版本化、列族式存储系统,设计用于处理大规模数据集。这个“hbase-2.4.17-bin”安装包提供了HBase的最新稳定版本2.4.17,适用于大数据处理和分析场景。下面将详细介绍...

    hbase的hbase-1.2.0-cdh5.14.2.tar.gz资源包

    3. **配置HBase**:编辑`conf/hbase-site.xml`,设置HBase的主配置,如`hbase.rootdir`(HDFS中的HBase目录)和`hbase.zookeeper.quorum`(Zookeeper集群地址)。 4. **启动与停止**:使用`start-hbase.sh`启动HBase...

    在windows上安装Hbase

    在Windows上安装HBase 本文将指导您如何在Windows平台上安装HBase,包括配置详解。安装完成后,您将能够配置集群。 一、前提条件 在安装HBase前,需要安装Cygwin和Hadoop。这两个软件的安装不在本文的讨论范围内...

    HBase开启审计日志

    ### HBase开启审计日志详解 #### 一、概述 HBase是一款分布式列式存储系统,基于Google的Bigtable论文实现。它具有高可靠性、高性能、面向列、可伸缩的特点,非常适合处理海量数据。在大数据领域,HBase被广泛用于...

    hbase-1.1.5-bin版本的压缩包,下载到本地解压后即可使用 HBase 是一个开源的、分布式的NoSQL数据库

    HBase 是一个开源的、分布式的、版本化的 NoSQL 数据库(也即非关系型数据库),它利用 Hadoop 分布式文件系统(Hadoop Distributed File System,HDFS)提供分布式数据存储。与传统的关系型数据库类似,HBase 也以...

    hbase安装与使用

    ### HBase 安装与使用知识点详解 #### 概述 HBase 是一款构建于 Hadoop 之上的分布式、可扩展的大规模数据存储系统。它提供了类似 Google BigTable 的功能特性,非常适合处理海量数据和高并发读写需求的应用场景。...

    centos7 安装 hbase单机版

    首先下载hbase安装包 wget http://mirror.bit.edu.cn/apache/hbase/stable/hbase-2.2.3-bin.tar.gz 解压压缩包 tar -zxvf hbase-2.2.3-bin.tar.gz 修改/opt/hbase-2.2.3/conf/hbse-env.sh文件 第一步 设置javahome ...

    scala API 操作hbase表

    在本文中,我们将深入探讨如何使用Scala API操作HBase数据库。HBase是一个分布式、面向列的NoSQL数据库,它构建于Hadoop之上,提供实时访问大量数据的能力。Scala是一种强大的函数式编程语言,与Java虚拟机(JVM)...

    python3连接hbase包

    Python3 连接 HBase 的方法是现代大数据处理中的一项重要技能,特别是在处理海量数据时。HBase 是一个分布式、可扩展的列式数据库,它建立在 Apache Hadoop 文件系统之上,非常适合存储非结构化和半结构化数据。...

    java操作Hbase之从Hbase中读取数据写入hdfs中源码

    在Java编程环境中,操作HBase并将其数据写入HDFS(Hadoop Distributed File System)是一项常见的任务,特别是在大数据处理和分析的场景下。本篇将详细介绍如何使用Java API实现这一功能,以及涉及到的关键技术和...

Global site tag (gtag.js) - Google Analytics