精华内容
下载资源
问答
  • hbase 开发环境搭建 及运行hbase 小实例HBase 0.98.3 新api 问题导读 1.如何搭建hbase 开发环境 2.HTableDescriptor 初始化产生了那些变化 3.eclipse 如何连接hbase 集群 hbase 开发环境搭建与hadoop 开发环境搭建...
  • hbase 开发实例

    2012-03-21 14:41:25
    hbase 开发实例
  • hbase开发依赖包.zip

    2021-01-18 00:56:00
    HBase开发常用依赖包 内容包括: com.google.guava_1.6.0.jar / com.google.protobuf-2.4.0.jar / slf4j-nop-1.7.6.jar
  • 一个Vagrantfile,用于启动和运行Hadoop和HBase开发。 概述 该项目的目的是在短短几分钟内建立一个可用于Hadoop和HBase开发的虚拟机。 VM是Ubuntu 14.04(可信任)盒,已通过。 在运行了vagrant up ,将以伪分布式...
  • hbase开发依赖包

    2014-07-16 15:29:09
    HBase开发常用依赖包,内容包括:com.google.guava_1.6.0.jar com.google.protobuf-2.4.0.jar slf4j-nop-1.7.6.jar
  • Hbase开发实例

    2016-10-24 01:25:00
    在进行Hbase开发前,需要安装JDK、Hadoop和HBase 根据自己的安装环境修改版本信息,使用Maven构建项目,在pom.xml中添加hbase的依赖 2、初始化配置 设置HBase的配置,如ZooKeeper的地址、端口号等等。可以通过org...

    1、开发环境

    在进行Hbase开发前,需要安装JDK、Hadoop和HBase

    根据自己的安装环境修改版本信息,使用Maven构建项目,在pom.xml中添加hbase的依赖

    2、初始化配置

    设置HBase的配置,如ZooKeeper的地址、端口号等等。可以通过org.apache.hadoop.conf.Configuration.set方法手工设置HBase的配置信息,也可以直接将HBase的hbase-site.xml配置文件引入项目即可。

    3、常见API的使用

    HBase的常用操作包括建表、插入表数据、删除表数据、获取一行数据、表扫描、删除列族、删除表等等,下面给出具体代码。

    3.1 创建数据库表

    1.  // 创建数据库表  
    2. public static void createTable(String tableName, String[] columnFamilys) throws IOException {  
    3.     // 建立一个数据库的连接  
    4.     Connection conn = ConnectionFactory.createConnection(conf);  
    5.     // 创建一个数据库管理员  
    6.     HBaseAdmin hAdmin = (HBaseAdmin) conn.getAdmin();  
    7.     if (hAdmin.tableExists(tableName)) {  
    8.         System.out.println(tableName + "表已存在");  
    9.         conn.close();  
    10.         System.exit(0);  
    11.     } else {  
    12.         // 新建一个表描述  
    13.         HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(tableName));  
    14.         // 在表描述里添加列族  
    15.         for (String columnFamily : columnFamilys) {  
    16.             tableDesc.addFamily(new HColumnDescriptor(columnFamily));  
    17.         }  
    18.         // 根据配置好的表描述建表  
    19.         hAdmin.createTable(tableDesc);  
    20.         System.out.println("创建" + tableName + "表成功");  
    21.     }  
    22.     conn.close();  
    23. }  

    3.2 添加一条数据

    1.  // 添加一条数据  
    2. public static void addRow(String tableName, String rowKey, String columnFamily, String column, String value)   
    3.         throws IOException {  
    4.     // 建立一个数据库的连接  
    5.     Connection conn = ConnectionFactory.createConnection(conf);  
    6.     // 获取表  
    7.     HTable table = (HTable) conn.getTable(TableName.valueOf(tableName));  
    8.     // 通过rowkey创建一个put对象  
    9.     Put put = new Put(Bytes.toBytes(rowKey));  
    10.     // 在put对象中设置列族、列、值  
    11.     put.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(column), Bytes.toBytes(value));  
    12.     // 插入数据,可通过put(List<Put>)批量插入  
    13.     table.put(put);  
    14.     // 关闭资源  
    15.     table.close();  
    16.     conn.close();  
    17. }  

    3.3 获取一条数

    1. // 通过rowkey获取一条数据  
    2. public static void getRow(String tableName, String rowKey) throws IOException {  
    3.     // 建立一个数据库的连接  
    4.     Connection conn = ConnectionFactory.createConnection(conf);  
    5.     // 获取表  
    6.     HTable table = (HTable) conn.getTable(TableName.valueOf(tableName));  
    7.     // 通过rowkey创建一个get对象  
    8.     Get get = new Get(Bytes.toBytes(rowKey));  
    9.     // 输出结果  
    10.     Result result = table.get(get);  
    11.     for (Cell cell : result.rawCells()) {  
    12.         System.out.println(  
    13.                 "行键:" + new String(CellUtil.cloneRow(cell)) + "\t" +  
    14.                 "列族:" + new String(CellUtil.cloneFamily(cell)) + "\t" +   
    15.                 "列名:" + new String(CellUtil.cloneQualifier(cell)) + "\t" +   
    16.                 "值:" + new String(CellUtil.cloneValue(cell)) + "\t" +  
    17.                 "时间戳:" + cell.getTimestamp());  
    18.     }  
    19.     // 关闭资源  
    20.     table.close();  
    21.     conn.close();  
    22. }  

    3.4 全表扫描

    1. // 全表扫描  
    2.     public static void scanTable(String tableName) throws IOException {  
    3.         // 建立一个数据库的连接  
    4.         Connection conn = ConnectionFactory.createConnection(conf);  
    5.         // 获取表  
    6.         HTable table = (HTable) conn.getTable(TableName.valueOf(tableName));  
    7.         // 创建一个扫描对象  
    8.         Scan scan = new Scan();  
    9.         // 扫描全表输出结果  
    10.         ResultScanner results = table.getScanner(scan);  
    11.         for (Result result : results) {  
    12.             for (Cell cell : result.rawCells()) {  
    13.                 System.out.println(  
    14.                         "行键:" + new String(CellUtil.cloneRow(cell)) + "\t" +  
    15.                         "列族:" + new String(CellUtil.cloneFamily(cell)) + "\t" +   
    16.                         "列名:" + new String(CellUtil.cloneQualifier(cell)) + "\t" +   
    17.                         "值:" + new String(CellUtil.cloneValue(cell)) + "\t" +  
    18.                         "时间戳:" + cell.getTimestamp());  
    19.             }  
    20.         }  
    21.         // 关闭资源  
    22.         results.close();  
    23.         table.close();  
    24.         conn.close();  
    25. }  

    3.5 删除一条数据

    1. // 删除一条数据  
    2. public static void delRow(String tableName, String rowKey) throws IOException {  
    3.     // 建立一个数据库的连接  
    4.     Connection conn = ConnectionFactory.createConnection(conf);  
    5.     // 获取表  
    6.     HTable table = (HTable) conn.getTable(TableName.valueOf(tableName));  
    7.     // 删除数据  
    8.     Delete delete = new Delete(Bytes.toBytes(rowKey));  
    9.     table.delete(delete);  
    10.     // 关闭资源  
    11.     table.close();  
    12.     conn.close();  
    13. }  

    3.6 删除多条数据

    1. // 删除多条数据  
    2. public static void delRows(String tableName, String[] rows) throws IOException {  
    3.     // 建立一个数据库的连接  
    4.     Connection conn = ConnectionFactory.createConnection(conf);  
    5.     // 获取表  
    6.     HTable table = (HTable) conn.getTable(TableName.valueOf(tableName));  
    7.     // 删除多条数据  
    8.     List<Delete> list = new ArrayList<Delete>();  
    9.     for (String row : rows) {  
    10.         Delete delete = new Delete(Bytes.toBytes(row));  
    11.         list.add(delete);  
    12.     }  
    13.     table.delete(list);  
    14.     // 关闭资源  
    15.     table.close();  
    16.     conn.close();  
    17. }  

    3.7 删除列族

    1. // 删除列族  
    2. public static void delColumnFamily(String tableName, String columnFamily) throws IOException {  
    3.     // 建立一个数据库的连接  
    4.     Connection conn = ConnectionFactory.createConnection(conf);  
    5.     // 创建一个数据库管理员  
    6.     HBaseAdmin hAdmin = (HBaseAdmin) conn.getAdmin();  
    7.     // 删除一个表的指定列族  
    8.     hAdmin.deleteColumn(tableName, columnFamily);  
    9.     // 关闭资源  
    10.     conn.close();  
    11. }  

    3.8 删除数据库表

    1. // 删除数据库表  
    2. public static void deleteTable(String tableName) throws IOException {  
    3.     // 建立一个数据库的连接  
    4.     Connection conn = ConnectionFactory.createConnection(conf);  
    5.     // 创建一个数据库管理员  
    6.     HBaseAdmin hAdmin = (HBaseAdmin) conn.getAdmin();  
    7.     if (hAdmin.tableExists(tableName)) {  
    8.         // 失效表  
    9.         hAdmin.disableTable(tableName);  
    10.         // 删除表  
    11.         hAdmin.deleteTable(tableName);  
    12.         System.out.println("删除" + tableName + "表成功");  
    13.         conn.close();  
    14.     } else {  
    15.         System.out.println("需要删除的" + tableName + "表不存在");  
    16.         conn.close();  
    17.         System.exit(0);  
    18.     }  
    19. }  

    3.9 追加插入

    1. // 追加插入(将原有value的后面追加新的value,如原有value=a追加value=bc则最后的value=abc)  
    2. public static void appendData(String tableName, String rowKey, String columnFamily, String column, String value)   
    3.         throws IOException {  
    4.     // 建立一个数据库的连接  
    5.     Connection conn = ConnectionFactory.createConnection(conf);  
    6.     // 获取表  
    7.     HTable table = (HTable) conn.getTable(TableName.valueOf(tableName));  
    8.     // 通过rowkey创建一个append对象  
    9.     Append append = new Append(Bytes.toBytes(rowKey));  
    10.     // 在append对象中设置列族、列、值  
    11.     append.add(Bytes.toBytes(columnFamily), Bytes.toBytes(column), Bytes.toBytes(value));  
    12.     // 追加数据  
    13.     table.append(append);  
    14.     // 关闭资源  
    15.     table.close();  
    16.     conn.close();  
    17. }  

    3.10 符合条件后添加数据

    1. // 符合条件后添加数据(只能针对某一个rowkey进行原子操作)  
    2. public static boolean checkAndPut(String tableName, String rowKey, String columnFamilyCheck, String columnCheck, String valueCheck, String columnFamily, String column, String value) throws IOException {  
    3.     // 建立一个数据库的连接  
    4.     Connection conn = ConnectionFactory.createConnection(conf);  
    5.     // 获取表  
    6.     HTable table = (HTable) conn.getTable(TableName.valueOf(tableName));  
    7.     // 设置需要添加的数据  
    8.     Put put = new Put(Bytes.toBytes(rowKey));  
    9.     put.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(column), Bytes.toBytes(value));  
    10.     // 当判断条件为真时添加数据  
    11.     boolean result = table.checkAndPut(Bytes.toBytes(rowKey), Bytes.toBytes(columnFamilyCheck),   
    12.             Bytes.toBytes(columnCheck), Bytes.toBytes(valueCheck), put);  
    13.     // 关闭资源  
    14.     table.close();  
    15.     conn.close();  
    16.       
    17.     return result;  
    18. }  

    3.11 符合条件后删除数据

    1. // 符合条件后刪除数据(只能针对某一个rowkey进行原子操作)  
    2. public static boolean checkAndDelete(String tableName, String rowKey, String columnFamilyCheck, String columnCheck,   
    3.         String valueCheck, String columnFamily, String column) throws IOException {  
    4.     // 建立一个数据库的连接  
    5.     Connection conn = ConnectionFactory.createConnection(conf);  
    6.     // 获取表  
    7.     HTable table = (HTable) conn.getTable(TableName.valueOf(tableName));  
    8.     // 设置需要刪除的delete对象  
    9.     Delete delete = new Delete(Bytes.toBytes(rowKey));  
    10.     delete.addColumn(Bytes.toBytes(columnFamilyCheck), Bytes.toBytes(columnCheck));  
    11.     // 当判断条件为真时添加数据  
    12.     boolean result = table.checkAndDelete(Bytes.toBytes(rowKey), Bytes.toBytes(columnFamilyCheck), Bytes.toBytes(columnCheck),   
    13.             Bytes.toBytes(valueCheck), delete);  
    14.     // 关闭资源  
    15.     table.close();  
    16.     conn.close();  
    17.   
    18.     return result;  
    19. }  

    3.12 计数器

    1. // 计数器(amount为正数则计数器加,为负数则计数器减,为0则获取当前计数器的值)  
    2. public static long incrementColumnValue(String tableName, String rowKey, String columnFamily, String column, long amount)   
    3.         throws IOException {  
    4.     // 建立一个数据库的连接  
    5.     Connection conn = ConnectionFactory.createConnection(conf);  
    6.     // 获取表  
    7.     HTable table = (HTable) conn.getTable(TableName.valueOf(tableName));  
    8.     // 计数器  
    9.     long result = table.incrementColumnValue(Bytes.toBytes(rowKey), Bytes.toBytes(columnFamily), Bytes.toBytes(column), amount);  
    10.     // 关闭资源  
    11.     table.close();  
    12.     conn.close();  
    13.       
    14.     return result;  
    15. }  

    4、内置过滤器的使用

    HBase为筛选数据提供了一组过滤器,通过这个过滤器可以在HBase中数据的多个维度(行、列、数据版本)上进行对数据的筛选操作,也就是说过滤器最终能够筛选的数据能够细化到具体的一个存储单元格上(由行键、列名、时间戳定位)。通常来说,通过行键、值来筛选数据的应用场景较多。需要说明的是,过滤器会极大地影响查询效率。所以,在数据量较大的数据表中,应尽量避免使用过滤器。

    下面介绍一些常用的HBase内置过滤器的用法:

    1、RowFilter:筛选出匹配的所有的行。使用BinaryComparator可以筛选出具有某个行键的行,或者通过改变比较运算符(下面的例子中是CompareFilter.CompareOp.EQUAL)来筛选出符合某一条件的多条数据,如下示例就是筛选出行键为row1的一行数据。

    1. // 筛选出匹配的所有的行  
    2. Filter rf = new RowFilter(CompareFilter.CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes("row1")));

    2、PrefixFilter:筛选出具有特定前缀的行键的数据。这个过滤器所实现的功能其实也可以由RowFilter结合RegexComparator来实现,不过这里提供了一种简便的使用方法,如下示例就是筛选出行键以row为前缀的所有的行。

    1. // 筛选匹配行键的前缀成功的行  
    2. Filter pf = new PrefixFilter(Bytes.toBytes("row"));  

    3、KeyOnlyFilter:这个过滤器唯一的功能就是只返回每行的行键,值全部为空,这对于只关注于行键的应用场景来说非常合适,这样忽略掉其值就可以减少传递到客户端的数据量,能起到一定的优化作用。

    1. // 返回所有的行键,但值全是空  
    2. Filter kof = new KeyOnlyFilter();

    4、RandomRowFilter:按照一定的几率(<=0会过滤掉所有的行,>=1会包含所有的行)来返回随机的结果集,对于同样的数据集,多次使用同一个RandomRowFilter会返回不同的结果集,对于需要随机抽取一部分数据的应用场景,可以使用此过滤器。

    1. // 随机选出一部分的行  
    2. Filter rrf = new RandomRowFilter((float) 0.8);

    5、InclusiveStopFilter:扫描的时候,我们可以设置一个开始行键和一个终止行键,默认情况下,这个行键的返回是前闭后开区间,即包含起始行,但不包含终止行。如果我们想要同时包含起始行和终止行,那么可以使用此过滤器。

    1. // 包含了扫描的上限在结果之内  
    2. Filter isf = new InclusiveStopFilter(Bytes.toBytes("row1"));

    6、FirstKeyOnlyFilter:如果想要返回的结果集中只包含第一列的数据,那么这个过滤器能够满足要求。它在找到每行的第一列之后会停止扫描,从而使扫描的性能也得到了一定的提升。

    1. // 筛选出每行的第一个单元格  
    2. Filter fkof = new FirstKeyOnlyFilter();

    7、ColumnPrefixFilter:它按照列名的前缀来筛选单元格,如果我们想要对返回的列的前缀加以限制的话,可以使用这个过滤器。

    1. // 筛选出前缀匹配的列  
    2. Filter cpf = new ColumnPrefixFilter(Bytes.toBytes("qual1"));

    8、ValueFilter:按照具体的值来筛选单元格的过滤器,这会把一行中值不能满足的单元格过滤掉,如下面的构造器,对于每一行的一个列,如果其对应的值不包含ROW2_QUAL1,那么这个列就不会返回给客户端。

    1. // 筛选某个(值的条件满足的)特定的单元格  
    2. Filter vf = new ValueFilter(CompareFilter.CompareOp.EQUAL, new SubstringComparator("ROW2_QUAL1"));

    9、ColumnCountGetFilter:这个过滤器在遇到一行的列数超过我们所设置的限制值的时候,结束扫描操作。

    1. // 如果突然发现一行中的列数超过设定的最大值时,整个扫描操作会停止  
    2. Filter ccf = new ColumnCountGetFilter(2);

    10、SingleColumnValueFilter:用一列的值决定这一行的数据是否被过滤,可对它的对象调用setFilterIfMissing方法,默认的参数是false。其作用是,对于咱们要使用作为条件的列,如果参数为true,这样的行将会被过滤掉,如果参数为false,这样的行会包含在结果集中。

    1. // 将满足条件的列所在的行过滤掉  
    2.  
    3. SingleColumnValueFilter scvf = new SingleColumnValueFilter(    
    4.          Bytes.toBytes("colfam1"),     
    5.          Bytes.toBytes("qual2"),     
    6.          CompareFilter.CompareOp.NOT_EQUAL,     
    7.          new SubstringComparator("BOGUS"));    
    8. scvf.setFilterIfMissing(true);  

    11、SingleColumnValueExcludeFilter:这个过滤器与第10种过滤器唯一的区别就是,作为筛选条件的列,其行不会包含在返回的结果中。

    12、SkipFilter:这是一种附加过滤器,其与ValueFilter结合使用,如果发现一行中的某一列不符合条件,那么整行就会被过滤掉。

    1. // 发现某一行中的一列需要过滤时,整个行就会被过滤掉  
    2. Filter skf = new SkipFilter(vf);

    13、WhileMatchFilter:使用这个过滤器,当遇到不符合设定条件的数据的时候,整个扫描结束。

    1. // 当遇到不符合过滤器rf设置的条件时,整个扫描结束  
    2. Filter wmf = new WhileMatchFilter(rf);

    14. FilterList:可以用于综合使用多个过滤器。其有两种关系: Operator.MUST_PASS_ONE表示关系AND,Operator.MUST_PASS_ALL表示关系OR,并且FilterList可以嵌套使用,使得我们能够表达更多的需求。

    1. // 综合使用多个过滤器,AND和OR两种关系  
    2. List<Filter> filters = new ArrayList<Filter>();    
    3. filters.add(rf);    
    4. filters.add(vf);    
    5. FilterList fl = new FilterList(FilterList.Operator.MUST_PASS_ALL,filters);

    5、HBase与MapReduce

    我们知道,在伪分布式模式和完全分布式模式下的HBase是架构在HDFS之上的,因此完全可以将MapReduce编程框架和HBase结合起来使用。也就是说,将HBase作为底层存储结构,MapReduce调用HBase进行特殊的处理,这样能够充分结合HBase分布式大型数据库和MapReduce并行计算的优点。

    HBase实现了TableInputFormatBase类,该类提供了对表数据的大部分操作,其子类TableInputFormat则提供了完整的实现,用于处理表数据并生成键值对。TableInputFormat类将数据表按照Region分割成split,即有多少个Regions就有多个splits,然后将Region按行键分成<key,value>对,key值对应与行键,value值为该行所包含的数据。

    HBase实现了MapReduce计算框架对应的TableMapper类和TableReducer类。其中,TableMapper类并没有具体的功能,只是将输入的<key,value>对的类型分别限定为Result和ImmutableBytesWritable。IdentityTableMapper类和IdentityTableReducer类则是上述两个类的具体实现,其和Mapper类和Reducer类一样,只是简单地将<key,value>对输出到下一个阶段。

    HBase实现的TableOutputFormat将输出的<key,value>对写到指定的HBase表中,该类不会对WAL(Write-Ahead Log)进行操作,即如果服务器发生故障将面临丢失数据的风险。可以使用MultipleTableOutputFormat类解决这个问题,该类可以对是否写入WAL进行设置。

    为了能使Hadoop集群上运行HBase程序,还需要把相关的类文件引入Hadoop集群上,不然会出现ClassNotFoundException错误。其具体方法是可在hadoop的环境配置文件hadoop-env.sh中引入HBASE_HOME和HBase的相关jar包,或者直接将HBase的jar包打包到应用程序文件中。

    下例子是将MapReduce和HBase结合起来的WordCount程序,它首先从指定文件中搜集数据,进行统计计算,最后将结果存储到HBase中。代码省略。

    6、HBase的Bulkload

    HBase可以让我们随机的、实时的访问大数据,但是怎样有效的将数据导入到HBase呢?HBase有多种导入数据的方法,最直接的方法就是在MapReduce作业中使用TableOutputFormat作为输出,或者使用标准的客户端API,但是这些都不是非常有效的方法。

    如果HDFS中有海量数据要导入HBase,可以先将这些数据生成HFile文件,然后批量导入HBase的数据表中,这样可以极大地提升数据导入HBase的效率。这就是HBase的Bulkload,即利用MapReduce作业输出HBase内部数据格式的表数据,然后将生成的StoreFiles直接导入到集群中。与使用HBase API相比,使用Bulkload导入数据占用更少的CPU和网络资源。两个表之间的数据迁移也可以使用这种方法。首先将HDFS中的数据文件通过MapReduce任务生成HFile文件,然后将HFile文件导入HBase数据表(该数据表已存在)。

    转载于:https://www.cnblogs.com/fangdai/p/5991620.html

    展开全文
  • eclipse构建HBase开发环境并运行实例对Hbase建表增删改查。本次HBase版本为hbase-0.90.5版本,Hadoop版本为Hadoop-0.20.2版本。
  • 1.如何搭建hbase开发环境? 2.HTableDescriptor初始化产生了那些变化? 3.eclipse如何连接hbase集群? hbase开发环境搭建与hadoop开发环境搭建差不多的。这里是以win7为例。 首先我们看一下hadoop的开发...

    http://www.aboutyun.com/thread-8401-1-1.html

    问题导读:
    1.如何搭建hbase开发环境?
    2.HTableDescriptor初始化产生了那些变化?
    3.eclipse如何连接hbase集群?





    hbase开发环境搭建与hadoop开发环境搭建差不多的。这里是以win7为例。
    首先我们看一下hadoop的开发环境搭建,参考hadoop开发方式总结及操作指导,这里讲了两个方式,一种是用插件,另外一种是不是用插件。
    那么对于hbase的开发环境是什么样子的,该如何搭建?
    我们采用的是添加包的方式。
    首先需要下载安装包:

    1.安装包下载


    可以通过官网下载:
    http://mirror.bit.edu.cn/apache/hbase/hbase-0.98.3/

     


    百度网盘下载:
    hbase-0.98.3-hadoop2-bin.tar.gz
    链接:http://pan.baidu.com/s/1mguTsRu 密码:xlhc


    2.添加包

    (1)我们解压包
    解压之后,得到如下包
     


    (2)添加包
    添加包的操作

     

    如上图5个步骤:
    单击hbase-》属性弹出(2所示)Properties for hbase属性对话框.

    然后我们通过下标5,单击Add External JARs。
    找到hbase_home/lib,我这里是D:\hadoop2\hbase-0.98.3-hadoop2\lib

     


    添加完毕,这样开发环境就搭建完毕。





    搭建完毕,我们先做个简单的例子吧
    就创建一个blog表。
    1.首先通过list命令查看表

     



    2.我们运行下面程序:

    运行通过下面操作方式:
     


    package www.aboutyun.com.hbase;

    import java.io.IOException;

    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.hbase.HBaseConfiguration;
    import org.apache.hadoop.hbase.HColumnDescriptor;
    import org.apache.hadoop.hbase.HTableDescriptor;
    import org.apache.hadoop.hbase.client.HBaseAdmin;
    import org.apache.hadoop.hbase.TableName;
    import org.apache.hadoop.hbase.util.Bytes;

    public class OperateTable {
             public static void main(String[] args) throws IOException {
             
             Configuration conf = HBaseConfiguration.create();
             conf.set("hbase.zookeeper.quorum", "master");//使用eclipse时必须添加这个,否则无法定位
             conf.set("hbase.zookeeper.property.clientPort", "2181");
             HBaseAdmin admin = new HBaseAdmin(conf);// 新建一个数据库管理员//新api
             HTableDescriptor desc=new HTableDescriptor(TableName.valueOf("blog"));
             //HTableDescriptor desc = new HTableDescriptor("blog");
             desc.addFamily(new HColumnDescriptor("article"));
             desc.addFamily(new HColumnDescriptor("author"));
             admin.createTable(desc );
             admin.close();
             //admin.disableTable("blog");
             //admin.deleteTable("blog");
             //assertThat(admin.tableExists("blog"),is(false));
       }
    }





    注释:
       conf.set("hbase.zookeeper.quorum", "master");//使用eclipse时必须添加这个,否则无法定位
    这里因为使用的是win7,所以master需要配置hosts。如下图所示
     



    hosts的路径为C:\Windows\System32\drivers\etc







    得到结果:我们看到blog就创建成功了。

     

    这里说一下:
    HTableDescriptor的初始化发生变化:
     

    新API
      HTableDescriptor desc=new HTableDescriptor(TableName.valueOf("blog"));
    旧API
      HTableDescriptor desc = new HTableDescriptor("blog");






    更多编程内容参考:

    Java操作hbase编程
    http://www.aboutyun.com/thread-7075-1-1.html


    spark使用java读取hbase数据做分布式计算
    http://www.aboutyun.com/thread-8242-1-1.html

    hbase编程:通过Java api操作hbase
    http://www.aboutyun.com/thread-7151-1-1.html

    hbase HTable之Put、delete、get等源码分析
    http://www.aboutyun.com/thread-7644-1-1.html

    Hbase Java编程实现增删改查
    http://www.aboutyun.com/thread-6901-1-1.html

    总结Eclipse 远程连接 HBase问题及解决方案大全
    http://www.aboutyun.com/thread-5866-1-1.html

    HBase中如何开发LoadBalance插件
    http://www.aboutyun.com/thread-8350-1-1.html

    Hbase与eclipse集成的第一个例子
    http://www.aboutyun.com/thread-7837-1-1.html

    hbase分页应用场景及分页思路与代码实现
    http://www.aboutyun.com/thread-7030-1-1.html


    HBase MapReduce排序Secondary Sort
    http://www.aboutyun.com/thread-7304-1-1.html


    CDH4源码搭建hbase开发环境
    http://www.aboutyun.com/thread-7259-1-1.html

    Thrift了解4:C#通过Thrift操作HBase实战
    http://www.aboutyun.com/thread-7142-1-1.html




    hbase API

    hadoop2.2.0帮助手册下载API及HBase 0.98.1-hadoop2 API
    http://www.aboutyun.com/thread-6113-1-1.html

    HBase数据迁移(1)-使用HBase的API中的Put方法
    http://www.aboutyun.com/thread-8336-1-1.html


    hbase编程:Java API连接Hbase进行增删改查讲解实例
    http://www.aboutyun.com/thread-8290-1-1.html

    展开全文
  • HBase开发实例学习

    2016-08-12 17:42:59
    在进行Hbase开发前,需要安装JDK、Hadoop和HBase,选择一款合适的开发IDE,具体安装方法就不介绍了,网上有很多参考资料,这里给出我的开发环境: 操作系统:Ubuntu 14.04 LTS Java版本:jdk1.7.0_79 Hadoop版本...

    1 开发环境

    在进行Hbase开发前,需要安装JDK、Hadoop和HBase,选择一款合适的开发IDE,具体安装方法就不介绍了,网上有很多参考资料,这里给出我的开发环境:

    操作系统:Ubuntu 14.04 LTS

    Java版本:jdk1.7.0_79

    Hadoop版本:hadoop-2.6.0-cdh5.7.1

    HBase版本:hbase-1.2.0-cdh5.7.1

    Ecipse版本:Eclipse Java EE LunaRelease

    使用Maven构建项目,在pom.xml中添加hbase的依赖如下:

     

    [html] view plain copy
     
    1.   <repositories>  
    2.       <repository>  
    3.         <id>cloudera</id>  
    4.         <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>  
    5.       </repository>  
    6.   </repositories>  
    7.   
    8.   <dependencies>  
    9.       <dependency>  
    10.           <groupId>junit</groupId>  
    11.           <artifactId>junit</artifactId>  
    12.           <version>3.8.1</version>  
    13.           <scope>test</scope>  
    14.       </dependency>  
    15.       <dependency>    
    16.           <groupId>org.apache.hadoop</groupId>    
    17.           <artifactId>hadoop-common</artifactId>    
    18.           <version>2.6.0-cdh5.7.1</version>    
    19.       </dependency>    
    20.       <dependency>    
    21.           <groupId>org.apache.hadoop</groupId>    
    22.           <artifactId>hadoop-hdfs</artifactId>    
    23.           <version>2.6.0-cdh5.7.1</version>    
    24.       </dependency>  
    25.       <dependency>    
    26.           <groupId>org.apache.hbase</groupId>    
    27.           <artifactId>hbase-client</artifactId>    
    28.           <version>1.2.0-cdh5.7.1</version>    
    29.       </dependency>  
    30. <dependency>    
    31.           <groupId>org.apache.hbase</groupId>    
    32.           <artifactId>hbase-server</artifactId>    
    33.           <version>1.2.0-cdh5.7.1</version>    
    34.       </dependency>  
    35.   </dependencies>  

     

    2 初始化配置

     

    首先需要设置HBase的配置,如ZooKeeper的地址、端口号等等。可以通过org.apache.hadoop.conf.Configuration.set方法手工设置HBase的配置信息,也可以直接将HBase的hbase-site.xml配置文件引入项目即可。下面给出配置代码:

    [java] view plain copy
     
    1. // 声明静态配置  
    2.   private static Configuration conf = null;  
    3.   static {  
    4.       conf = HBaseConfiguration.create();  
    5.       conf.set("hbase.zookeeper.quorum""localhost");  
    6.       conf.set("hbase.zookeeper.property.clientPort""2181");  
    7.   }  

    3 常见API的使用

    HBase的常用操作包括建表、插入表数据、删除表数据、获取一行数据、表扫描、删除列族、删除表等等,下面给出具体代码。

    3.1 创建数据库表

    [java] view plain copy
     
    1.     // 创建数据库表  
    2. public static void createTable(String tableName, String[] columnFamilys) throws IOException {  
    3.     // 建立一个数据库的连接  
    4.     Connection conn = ConnectionFactory.createConnection(conf);  
    5.     // 创建一个数据库管理员  
    6.     HBaseAdmin hAdmin = (HBaseAdmin) conn.getAdmin();  
    7.     if (hAdmin.tableExists(tableName)) {  
    8.         System.out.println(tableName + "表已存在");  
    9.         conn.close();  
    10.         System.exit(0);  
    11.     } else {  
    12.         // 新建一个表描述  
    13.         HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(tableName));  
    14.         // 在表描述里添加列族  
    15.         for (String columnFamily : columnFamilys) {  
    16.             tableDesc.addFamily(new HColumnDescriptor(columnFamily));  
    17.         }  
    18.         // 根据配置好的表描述建表  
    19.         hAdmin.createTable(tableDesc);  
    20.         System.out.println("创建" + tableName + "表成功");  
    21.     }  
    22.     conn.close();  
    23. }  

    3.2 添加一条数据

    [java] view plain copy
     
    1.  // 添加一条数据  
    2. public static void addRow(String tableName, String rowKey, String columnFamily, String column, String value)   
    3.         throws IOException {  
    4.     // 建立一个数据库的连接  
    5.     Connection conn = ConnectionFactory.createConnection(conf);  
    6.     // 获取表  
    7.     HTable table = (HTable) conn.getTable(TableName.valueOf(tableName));  
    8.     // 通过rowkey创建一个put对象  
    9.     Put put = new Put(Bytes.toBytes(rowKey));  
    10.     // 在put对象中设置列族、列、值  
    11.     put.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(column), Bytes.toBytes(value));  
    12.     // 插入数据,可通过put(List<Put>)批量插入  
    13.     table.put(put);  
    14.     // 关闭资源  
    15.     table.close();  
    16.     conn.close();  
    17. }  

    3.3 获取一条数据

    [java] view plain copy
     
    1. // 通过rowkey获取一条数据  
    2. public static void getRow(String tableName, String rowKey) throws IOException {  
    3.     // 建立一个数据库的连接  
    4.     Connection conn = ConnectionFactory.createConnection(conf);  
    5.     // 获取表  
    6.     HTable table = (HTable) conn.getTable(TableName.valueOf(tableName));  
    7.     // 通过rowkey创建一个get对象  
    8.     Get get = new Get(Bytes.toBytes(rowKey));  
    9.     // 输出结果  
    10.     Result result = table.get(get);  
    11.     for (Cell cell : result.rawCells()) {  
    12.         System.out.println(  
    13.                 "行键:" + new String(CellUtil.cloneRow(cell)) + "\t" +  
    14.                 "列族:" + new String(CellUtil.cloneFamily(cell)) + "\t" +   
    15.                 "列名:" + new String(CellUtil.cloneQualifier(cell)) + "\t" +   
    16.                 "值:" + new String(CellUtil.cloneValue(cell)) + "\t" +  
    17.                 "时间戳:" + cell.getTimestamp());  
    18.     }  
    19.     // 关闭资源  
    20.     table.close();  
    21.     conn.close();  
    22. }  

    3.4 全表扫描

    [java] view plain copy
     
    1.     // 全表扫描  
    2.     public static void scanTable(String tableName) throws IOException {  
    3.         // 建立一个数据库的连接  
    4.         Connection conn = ConnectionFactory.createConnection(conf);  
    5.         // 获取表  
    6.         HTable table = (HTable) conn.getTable(TableName.valueOf(tableName));  
    7.         // 创建一个扫描对象  
    8.         Scan scan = new Scan();  
    9.         // 扫描全表输出结果  
    10.         ResultScanner results = table.getScanner(scan);  
    11.         for (Result result : results) {  
    12.             for (Cell cell : result.rawCells()) {  
    13.                 System.out.println(  
    14.                         "行键:" + new String(CellUtil.cloneRow(cell)) + "\t" +  
    15.                         "列族:" + new String(CellUtil.cloneFamily(cell)) + "\t" +   
    16.                         "列名:" + new String(CellUtil.cloneQualifier(cell)) + "\t" +   
    17.                         "值:" + new String(CellUtil.cloneValue(cell)) + "\t" +  
    18.                         "时间戳:" + cell.getTimestamp());  
    19.             }  
    20.         }  
    21.         // 关闭资源  
    22.         results.close();  
    23.         table.close();  
    24.         conn.close();  
    25. }  

    3.5 删除一条数据

    [java] view plain copy
     
    1. // 删除一条数据  
    2. public static void delRow(String tableName, String rowKey) throws IOException {  
    3.     // 建立一个数据库的连接  
    4.     Connection conn = ConnectionFactory.createConnection(conf);  
    5.     // 获取表  
    6.     HTable table = (HTable) conn.getTable(TableName.valueOf(tableName));  
    7.     // 删除数据  
    8.     Delete delete = new Delete(Bytes.toBytes(rowKey));  
    9.     table.delete(delete);  
    10.     // 关闭资源  
    11.     table.close();  
    12.     conn.close();  
    13. }  

    3.6 删除多条数据

    [java] view plain copy
     
    1. // 删除多条数据  
    2. public static void delRows(String tableName, String[] rows) throws IOException {  
    3.     // 建立一个数据库的连接  
    4.     Connection conn = ConnectionFactory.createConnection(conf);  
    5.     // 获取表  
    6.     HTable table = (HTable) conn.getTable(TableName.valueOf(tableName));  
    7.     // 删除多条数据  
    8.     List<Delete> list = new ArrayList<Delete>();  
    9.     for (String row : rows) {  
    10.         Delete delete = new Delete(Bytes.toBytes(row));  
    11.         list.add(delete);  
    12.     }  
    13.     table.delete(list);  
    14.     // 关闭资源  
    15.     table.close();  
    16.     conn.close();  
    17. }  

    3.7 删除列族

    [java] view plain copy
     
    1. // 删除列族  
    2. public static void delColumnFamily(String tableName, String columnFamily) throws IOException {  
    3.     // 建立一个数据库的连接  
    4.     Connection conn = ConnectionFactory.createConnection(conf);  
    5.     // 创建一个数据库管理员  
    6.     HBaseAdmin hAdmin = (HBaseAdmin) conn.getAdmin();  
    7.     // 删除一个表的指定列族  
    8.     hAdmin.deleteColumn(tableName, columnFamily);  
    9.     // 关闭资源  
    10.     conn.close();  
    11. }  

    3.8 删除数据库表

    [java] view plain copy
     
    1. // 删除数据库表  
    2. public static void deleteTable(String tableName) throws IOException {  
    3.     // 建立一个数据库的连接  
    4.     Connection conn = ConnectionFactory.createConnection(conf);  
    5.     // 创建一个数据库管理员  
    6.     HBaseAdmin hAdmin = (HBaseAdmin) conn.getAdmin();  
    7.     if (hAdmin.tableExists(tableName)) {  
    8.         // 失效表  
    9.         hAdmin.disableTable(tableName);  
    10.         // 删除表  
    11.         hAdmin.deleteTable(tableName);  
    12.         System.out.println("删除" + tableName + "表成功");  
    13.         conn.close();  
    14.     } else {  
    15.         System.out.println("需要删除的" + tableName + "表不存在");  
    16.         conn.close();  
    17.         System.exit(0);  
    18.     }  
    19. }  

    3.9 追加插入

    [java] view plain copy
     
    1. // 追加插入(将原有value的后面追加新的value,如原有value=a追加value=bc则最后的value=abc)  
    2. public static void appendData(String tableName, String rowKey, String columnFamily, String column, String value)   
    3.         throws IOException {  
    4.     // 建立一个数据库的连接  
    5.     Connection conn = ConnectionFactory.createConnection(conf);  
    6.     // 获取表  
    7.     HTable table = (HTable) conn.getTable(TableName.valueOf(tableName));  
    8.     // 通过rowkey创建一个append对象  
    9.     Append append = new Append(Bytes.toBytes(rowKey));  
    10.     // 在append对象中设置列族、列、值  
    11.     append.add(Bytes.toBytes(columnFamily), Bytes.toBytes(column), Bytes.toBytes(value));  
    12.     // 追加数据  
    13.     table.append(append);  
    14.     // 关闭资源  
    15.     table.close();  
    16.     conn.close();  
    17. }  

    3.10 符合条件后添加数据

    [java] view plain copy
     
    1. // 符合条件后添加数据(只能针对某一个rowkey进行原子操作)  
    2. public static boolean checkAndPut(String tableName, String rowKey, String columnFamilyCheck, String columnCheck, String valueCheck, String columnFamily, String column, String value) throws IOException {  
    3.     // 建立一个数据库的连接  
    4.     Connection conn = ConnectionFactory.createConnection(conf);  
    5.     // 获取表  
    6.     HTable table = (HTable) conn.getTable(TableName.valueOf(tableName));  
    7.     // 设置需要添加的数据  
    8.     Put put = new Put(Bytes.toBytes(rowKey));  
    9.     put.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(column), Bytes.toBytes(value));  
    10.     // 当判断条件为真时添加数据  
    11.     boolean result = table.checkAndPut(Bytes.toBytes(rowKey), Bytes.toBytes(columnFamilyCheck),   
    12.             Bytes.toBytes(columnCheck), Bytes.toBytes(valueCheck), put);  
    13.     // 关闭资源  
    14.     table.close();  
    15.     conn.close();  
    16.       
    17.     return result;  
    18. }  

    3.11 符合条件后删除数据

    [java] view plain copy
     
    1. // 符合条件后刪除数据(只能针对某一个rowkey进行原子操作)  
    2. public static boolean checkAndDelete(String tableName, String rowKey, String columnFamilyCheck, String columnCheck,   
    3.         String valueCheck, String columnFamily, String column) throws IOException {  
    4.     // 建立一个数据库的连接  
    5.     Connection conn = ConnectionFactory.createConnection(conf);  
    6.     // 获取表  
    7.     HTable table = (HTable) conn.getTable(TableName.valueOf(tableName));  
    8.     // 设置需要刪除的delete对象  
    9.     Delete delete = new Delete(Bytes.toBytes(rowKey));  
    10.     delete.addColumn(Bytes.toBytes(columnFamilyCheck), Bytes.toBytes(columnCheck));  
    11.     // 当判断条件为真时添加数据  
    12.     boolean result = table.checkAndDelete(Bytes.toBytes(rowKey), Bytes.toBytes(columnFamilyCheck), Bytes.toBytes(columnCheck),   
    13.             Bytes.toBytes(valueCheck), delete);  
    14.     // 关闭资源  
    15.     table.close();  
    16.     conn.close();  
    17.   
    18.     return result;  
    19. }  

    3.12 计数器

    [java] view plain copy
     
    1. // 计数器(amount为正数则计数器加,为负数则计数器减,为0则获取当前计数器的值)  
    2. public static long incrementColumnValue(String tableName, String rowKey, String columnFamily, String column, long amount)   
    3.         throws IOException {  
    4.     // 建立一个数据库的连接  
    5.     Connection conn = ConnectionFactory.createConnection(conf);  
    6.     // 获取表  
    7.     HTable table = (HTable) conn.getTable(TableName.valueOf(tableName));  
    8.     // 计数器  
    9.     long result = table.incrementColumnValue(Bytes.toBytes(rowKey), Bytes.toBytes(columnFamily), Bytes.toBytes(column), amount);  
    10.     // 关闭资源  
    11.     table.close();  
    12.     conn.close();  
    13.       
    14.     return result;  
    15. }  

    4 内置过滤器的使用

    HBase为筛选数据提供了一组过滤器,通过这个过滤器可以在HBase中数据的多个维度(行、列、数据版本)上进行对数据的筛选操作,也就是说过滤器最终能够筛选的数据能够细化到具体的一个存储单元格上(由行键、列名、时间戳定位)。通常来说,通过行键、值来筛选数据的应用场景较多。需要说明的是,过滤器会极大地影响查询效率。所以,在数据量较大的数据表中,应尽量避免使用过滤器。

    下面介绍一些常用的HBase内置过滤器的用法:

    1、RowFilter:筛选出匹配的所有的行。使用BinaryComparator可以筛选出具有某个行键的行,或者通过改变比较运算符(下面的例子中是CompareFilter.CompareOp.EQUAL)来筛选出符合某一条件的多条数据,如下示例就是筛选出行键为row1的一行数据。

    [java] view plain copy
     
    1. // 筛选出匹配的所有的行  
    2. Filter rf = new RowFilter(CompareFilter.CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes("row1")));    

    2、PrefixFilter:筛选出具有特定前缀的行键的数据。这个过滤器所实现的功能其实也可以由RowFilter结合RegexComparator来实现,不过这里提供了一种简便的使用方法,如下示例就是筛选出行键以row为前缀的所有的行。

    [java] view plain copy
     
    1. // 筛选匹配行键的前缀成功的行  
    2. Filter pf = new PrefixFilter(Bytes.toBytes("row"));  

    3、KeyOnlyFilter:这个过滤器唯一的功能就是只返回每行的行键,值全部为空,这对于只关注于行键的应用场景来说非常合适,这样忽略掉其值就可以减少传递到客户端的数据量,能起到一定的优化作用。

     

    [java] view plain copy
     
    1. // 返回所有的行键,但值全是空  
    2. Filter kof = new KeyOnlyFilter();  

     

    4、RandomRowFilter:按照一定的几率(<=0会过滤掉所有的行,>=1会包含所有的行)来返回随机的结果集,对于同样的数据集,多次使用同一个RandomRowFilter会返回不同的结果集,对于需要随机抽取一部分数据的应用场景,可以使用此过滤器。

    [java] view plain copy
     
    1. // 随机选出一部分的行  
    2. Filter rrf = new RandomRowFilter((float0.8);     

    5、InclusiveStopFilter:扫描的时候,我们可以设置一个开始行键和一个终止行键,默认情况下,这个行键的返回是前闭后开区间,即包含起始行,但不包含终止行。如果我们想要同时包含起始行和终止行,那么可以使用此过滤器。

    [java] view plain copy
     
    1. // 包含了扫描的上限在结果之内  
    2. Filter isf = new InclusiveStopFilter(Bytes.toBytes("row1"));    

    6、FirstKeyOnlyFilter:如果想要返回的结果集中只包含第一列的数据,那么这个过滤器能够满足要求。它在找到每行的第一列之后会停止扫描,从而使扫描的性能也得到了一定的提升。

    [java] view plain copy
     
    1. // 筛选出每行的第一个单元格  
    2. Filter fkof = new FirstKeyOnlyFilter();     

    7、ColumnPrefixFilter:它按照列名的前缀来筛选单元格,如果我们想要对返回的列的前缀加以限制的话,可以使用这个过滤器。

    [java] view plain copy
     
    1. // 筛选出前缀匹配的列  
    2. Filter cpf = new ColumnPrefixFilter(Bytes.toBytes("qual1"));     

    8、ValueFilter:按照具体的值来筛选单元格的过滤器,这会把一行中值不能满足的单元格过滤掉,如下面的构造器,对于每一行的一个列,如果其对应的值不包含ROW2_QUAL1,那么这个列就不会返回给客户端。

    [java] view plain copy
     
    1. // 筛选某个(值的条件满足的)特定的单元格  
    2. Filter vf = new ValueFilter(CompareFilter.CompareOp.EQUAL, new SubstringComparator("ROW2_QUAL1"));  

    9、ColumnCountGetFilter:这个过滤器在遇到一行的列数超过我们所设置的限制值的时候,结束扫描操作。

    [java] view plain copy
     
    1. // 如果突然发现一行中的列数超过设定的最大值时,整个扫描操作会停止  
    2. Filter ccf = new ColumnCountGetFilter(2);    

    10、SingleColumnValueFilter:用一列的值决定这一行的数据是否被过滤,可对它的对象调用setFilterIfMissing方法,默认的参数是false。其作用是,对于咱们要使用作为条件的列,如果参数为true,这样的行将会被过滤掉,如果参数为false,这样的行会包含在结果集中。

    [java] view plain copy
     
    1. // 将满足条件的列所在的行过滤掉  
    2. SingleColumnValueFilter scvf = new SingleColumnValueFilter(    
    3. •          Bytes.toBytes("colfam1"),     
    4. •          Bytes.toBytes("qual2"),     
    5. •          CompareFilter.CompareOp.NOT_EQUAL,     
    6. •          new SubstringComparator("BOGUS"));    
    7. scvf.setFilterIfMissing(true);  

    11、SingleColumnValueExcludeFilter:这个过滤器与第10种过滤器唯一的区别就是,作为筛选条件的列,其行不会包含在返回的结果中。

    12、SkipFilter:这是一种附加过滤器,其与ValueFilter结合使用,如果发现一行中的某一列不符合条件,那么整行就会被过滤掉。

    [java] view plain copy
     
    1. // 发现某一行中的一列需要过滤时,整个行就会被过滤掉  
    2. Filter skf = new SkipFilter(vf);  

    13、WhileMatchFilter:使用这个过滤器,当遇到不符合设定条件的数据的时候,整个扫描结束。

    [java] view plain copy
     
    1. // 当遇到不符合过滤器rf设置的条件时,整个扫描结束  
    2. Filter wmf = new WhileMatchFilter(rf);     

    14. FilterList:可以用于综合使用多个过滤器。其有两种关系: Operator.MUST_PASS_ONE表示关系AND,Operator.MUST_PASS_ALL表示关系OR,并且FilterList可以嵌套使用,使得我们能够表达更多的需求。

    [java] view plain copy
     
    1. // 综合使用多个过滤器,AND和OR两种关系  
    2. List<Filter> filters = new ArrayList<Filter>();    
    3. filters.add(rf);    
    4. filters.add(vf);    
    5. FilterList fl = new FilterList(FilterList.Operator.MUST_PASS_ALL,filters);  

    下面给出一个使用RowFilter过滤器的完整示例:

    [java] view plain copy
     
    1. public class HBaseFilter {  
    2.       
    3.     private static final String TABLE_NAME = "table1";  
    4.   
    5.     public static void main(String[] args) throws IOException {  
    6.         // 设置配置  
    7.         Configuration conf = HBaseConfiguration.create();  
    8.         conf.set("hbase.zookeeper.quorum""localhost");  
    9.         conf.set("hbase.zookeeper.property.clientPort""2181");  
    10.         // 建立一个数据库的连接  
    11.         Connection conn = ConnectionFactory.createConnection(conf);  
    12.         // 获取表  
    13.         HTable table = (HTable) conn.getTable(TableName.valueOf(TABLE_NAME));  
    14.         // 创建一个扫描对象  
    15.         Scan scan = new Scan();  
    16.         // 创建一个RowFilter过滤器  
    17.         Filter filter = new RowFilter(CompareFilter.CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes("abc")));  
    18.         // 将过滤器加入扫描对象  
    19.         scan.setFilter(filter);  
    20.         // 输出结果  
    21.         ResultScanner results = table.getScanner(scan);  
    22.         for (Result result : results) {  
    23.             for (Cell cell : result.rawCells()) {  
    24.                 System.out.println(  
    25.                         "行键:" + new String(CellUtil.cloneRow(cell)) + "\t" +  
    26.                         "列族:" + new String(CellUtil.cloneFamily(cell)) + "\t" +   
    27.                         "列名:" + new String(CellUtil.cloneQualifier(cell)) + "\t" +   
    28.                         "值:" + new String(CellUtil.cloneValue(cell)) + "\t" +  
    29.                         "时间戳:" + cell.getTimestamp());  
    30.             }  
    31.         }  
    32.         // 关闭资源  
    33.         results.close();  
    34.         table.close();  
    35.         conn.close();  
    36.           
    37.     }  
    38.   
    39. }  

    5 HBase与MapReduce

    我们知道,在伪分布式模式和完全分布式模式下的HBase是架构在HDFS之上的,因此完全可以将MapReduce编程框架和HBase结合起来使用。也就是说,将HBase作为底层存储结构,MapReduce调用HBase进行特殊的处理,这样能够充分结合HBase分布式大型数据库和MapReduce并行计算的优点。

    HBase实现了TableInputFormatBase类,该类提供了对表数据的大部分操作,其子类TableInputFormat则提供了完整的实现,用于处理表数据并生成键值对。TableInputFormat类将数据表按照Region分割成split,即有多少个Regions就有多个splits,然后将Region按行键分成<key,value>对,key值对应与行键,value值为该行所包含的数据。

    HBase实现了MapReduce计算框架对应的TableMapper类和TableReducer类。其中,TableMapper类并没有具体的功能,只是将输入的<key,value>对的类型分别限定为Result和ImmutableBytesWritable。IdentityTableMapper类和IdentityTableReducer类则是上述两个类的具体实现,其和Mapper类和Reducer类一样,只是简单地将<key,value>对输出到下一个阶段。

    HBase实现的TableOutputFormat将输出的<key,value>对写到指定的HBase表中,该类不会对WAL(Write-Ahead Log)进行操作,即如果服务器发生故障将面临丢失数据的风险。可以使用MultipleTableOutputFormat类解决这个问题,该类可以对是否写入WAL进行设置。

    为了能使Hadoop集群上运行HBase程序,还需要把相关的类文件引入Hadoop集群上,不然会出现ClassNotFoundException错误。其具体方法是可在hadoop的环境配置文件hadoop-env.sh中引入HBASE_HOME和HBase的相关jar包,或者直接将HBase的jar包打包到应用程序文件中。

    下面这个例子是将MapReduce和HBase结合起来的WordCount程序,它首先从指定文件中搜集数据,进行统计计算,最后将结果存储到HBase中:

     

    [java] view plain copy
     
    1. package com.hbase.demo;  
    2.   
    3. import java.io.IOException;  
    4.   
    5. import org.apache.hadoop.conf.Configuration;  
    6. import org.apache.hadoop.fs.Path;  
    7. import org.apache.hadoop.hbase.HBaseConfiguration;  
    8. import org.apache.hadoop.hbase.HColumnDescriptor;  
    9. import org.apache.hadoop.hbase.HTableDescriptor;  
    10. import org.apache.hadoop.hbase.TableName;  
    11. import org.apache.hadoop.hbase.client.Connection;  
    12. import org.apache.hadoop.hbase.client.ConnectionFactory;  
    13. import org.apache.hadoop.hbase.client.HBaseAdmin;  
    14. import org.apache.hadoop.hbase.client.Put;  
    15. import org.apache.hadoop.hbase.mapreduce.TableOutputFormat;  
    16. import org.apache.hadoop.hbase.mapreduce.TableReducer;  
    17. import org.apache.hadoop.io.IntWritable;  
    18. import org.apache.hadoop.io.LongWritable;  
    19. import org.apache.hadoop.io.NullWritable;  
    20. import org.apache.hadoop.io.Text;  
    21. import org.apache.hadoop.mapreduce.Job;  
    22. import org.apache.hadoop.mapreduce.Mapper;  
    23. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;  
    24. import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;  
    25.   
    26. public class HBaseWordCount {  
    27.       
    28.     public static class hBaseMapper extends Mapper<LongWritable, Text, Text, IntWritable> {  
    29.   
    30.         private final static IntWritable ONE = new IntWritable(1);  
    31.         private Text word = new Text();  
    32.   
    33.         @Override  
    34.         protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {  
    35.             String[] words = value.toString().split(" ");  
    36.             for ( String w : words) {  
    37.                 word.set(w);  
    38.                 context.write(word, ONE);  
    39.             }  
    40.         }  
    41.     }  
    42.       
    43.     public static class hBaseReducer extends TableReducer<Text, IntWritable, NullWritable> {  
    44.   
    45.         @Override  
    46.         protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {  
    47.             int sum = 0;  
    48.             for (IntWritable value : values) {  
    49.                 sum += value.get();  
    50.             }  
    51.               
    52.             // Put实例化,每个词存一行  
    53.             Put put = new Put(key.getBytes());  
    54.             // 列族为content,列名为count,列值为单词的数目  
    55.             put.addColumn("content".getBytes(), "count".getBytes(), String.valueOf(sum).getBytes());  
    56.               
    57.             context.write(NullWritable.get(), put);  
    58.         }  
    59.           
    60.     }  
    61.       
    62.     // 创建HBase数据表  
    63.     public static void createHBaseTable(String tableName) throws IOException {  
    64.         // 配置HBse  
    65.         Configuration conf = HBaseConfiguration.create();  
    66.         conf.set("hbase.zookeeper.quorum""localhost");  
    67.         conf.set("hbase.zookeeper.property.clientPort""2181");  
    68.         // 建立一个数据库的连接  
    69.         Connection conn = ConnectionFactory.createConnection(conf);  
    70.         // 创建一个数据库管理员  
    71.         HBaseAdmin hAdmin = (HBaseAdmin) conn.getAdmin();  
    72.         // 判断表是否存在  
    73.         if (hAdmin.tableExists(tableName)) {  
    74.             System.out.println("该数据表已存在,正在重新创建");  
    75.             hAdmin.disableTable(tableName);  
    76.             hAdmin.deleteTable(tableName);  
    77.         }  
    78.         // 创建表描述  
    79.         HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(tableName));  
    80.         // 在表描述里添加列族  
    81.         tableDesc.addFamily(new HColumnDescriptor("content"));  
    82.         // 创建表  
    83.         hAdmin.createTable(tableDesc);  
    84.         System.out.println("创建" + tableName + "表成功");  
    85.     }  
    86.       
    87.     public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {  
    88.           
    89.         if (args.length != 3) {  
    90.             System.out.println("args error");  
    91.             System.exit(0);  
    92.         }  
    93.           
    94.         String input = args[0];  
    95.         String jobName = args[1];  
    96.         String tableName = args[2];  
    97.           
    98.         // 创建数据表  
    99.         HBaseWordCount.createHBaseTable(tableName);  
    100.           
    101.         // 配置MapReduce(或者将hadoop和hbase的相关配置文件引入项目)  
    102.         Configuration conf = new Configuration();  
    103.         conf.set("fs.defaultFS""localhost:9000");  
    104.        conf.set("mapred.job.tracker""localhost:9001");  
    105.         conf.set("hbase.zookeeper.quorum""localhost");  
    106.         conf.set("hbase.zookeeper.property.clientPort""2181");  
    107.         conf.set(TableOutputFormat.OUTPUT_TABLE, tableName);  
    108.           
    109.         // 配置任务  
    110.         Job job = Job.getInstance(conf, jobName);  
    111.         job.setJarByClass(HBaseWordCount.class);  
    112.         job.setMapperClass(hBaseMapper.class);  
    113.         job.setReducerClass(hBaseReducer.class);  
    114.         job.setMapOutputKeyClass(Text.class);  
    115.         job.setMapOutputValueClass(IntWritable.class);  
    116.         job.setInputFormatClass(TextInputFormat.class);  
    117.         job.setOutputFormatClass(TableOutputFormat.class);  
    118.         FileInputFormat.addInputPath(job, new Path(input));  
    119.           
    120.         //执行MR任务  
    121.         boolean result = job.waitForCompletion(true);  
    122.         System.exit(result ? 0 : 1);  
    123.     }  
    124.   
    125. }  

    6 HBase的Bulkload

    HBase可以让我们随机的、实时的访问大数据,但是怎样有效的将数据导入到HBase呢?HBase有多种导入数据的方法,最直接的方法就是在MapReduce作业中使用TableOutputFormat作为输出,或者使用标准的客户端API,但是这些都不是非常有效的方法。

    如果HDFS中有海量数据要导入HBase,可以先将这些数据生成HFile文件,然后批量导入HBase的数据表中,这样可以极大地提升数据导入HBase的效率。这就是HBase的Bulkload,即利用MapReduce作业输出HBase内部数据格式的表数据,然后将生成的StoreFiles直接导入到集群中。与使用HBase API相比,使用Bulkload导入数据占用更少的CPU和网络资源。两个表之间的数据迁移也可以使用这种方法。下面给出具体示例:

     

    [java] view plain copy
     
    1. package com.hbase.demo;  
    2.   
    3. import java.io.IOException;  
    4.   
    5. import org.apache.hadoop.conf.Configuration;  
    6. import org.apache.hadoop.fs.Path;  
    7. import org.apache.hadoop.hbase.HBaseConfiguration;  
    8. import org.apache.hadoop.hbase.TableName;  
    9. import org.apache.hadoop.hbase.client.Connection;  
    10. import org.apache.hadoop.hbase.client.ConnectionFactory;  
    11. import org.apache.hadoop.hbase.client.HTable;  
    12. import org.apache.hadoop.hbase.client.Put;  
    13. import org.apache.hadoop.hbase.io.ImmutableBytesWritable;  
    14. import org.apache.hadoop.hbase.mapreduce.HFileOutputFormat2;  
    15. import org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles;  
    16. import org.apache.hadoop.hbase.mapreduce.PutSortReducer;  
    17. import org.apache.hadoop.hbase.util.Bytes;  
    18. import org.apache.hadoop.io.LongWritable;  
    19. import org.apache.hadoop.io.Text;  
    20. import org.apache.hadoop.mapreduce.Job;  
    21. import org.apache.hadoop.mapreduce.Mapper;  
    22. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;  
    23. import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;  
    24. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;  
    25.   
    26.   
    27. public class HBaseBulk {  
    28.       
    29.     public static class bulkMapper extends Mapper<LongWritable, Text, ImmutableBytesWritable, Put> {  
    30.   
    31.         @Override  
    32.         protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {  
    33.             // 将输入数据用tab键分词  
    34.             String[] values = value.toString().split("\t");  
    35.             if (values.length == 2) {  
    36.                 // 设置行键、列族、列名和值  
    37.                 byte[] rowKey = Bytes.toBytes(values[0]);  
    38.                 byte[] family = Bytes.toBytes("content");  
    39.                 byte[] column = Bytes.toBytes("number");  
    40.                 byte[] colValue = Bytes.toBytes(values[1]);  
    41.                 // 将行键序列化作为mapper输出的key  
    42.                 ImmutableBytesWritable rowKeyWritable = new ImmutableBytesWritable(rowKey);  
    43.                 // 将put对象作为mapper输出的value  
    44.                 Put put = new Put(rowKey);  
    45.                 put.addColumn(family, column, colValue);  
    46.                 context.write(rowKeyWritable, put);  
    47.             }  
    48.         }  
    49.     }  
    50.     
    51.     @SuppressWarnings("deprecation")  
    52.     public static void main(String[] args) throws Exception {  
    53.           
    54.         if (args.length != 3) {  
    55.             System.out.println("args error");  
    56.             System.exit(0);  
    57.         }  
    58.           
    59.         String input = args[0];  
    60.         String output = args[1];  
    61.         String jobName = args[2];  
    62.         String tableName = args[3];  
    63.           
    64.         // 配置MapReduce(或者将hadoop的相关配置文件引入项目)  
    65.         Configuration hadoopConf = new Configuration();  
    66.         hadoopConf.set("fs.defaultFS""localhost:9000");  
    67.         hadoopConf.set("mapred.job.tracker""localhost:9001");  
    68.         Job job = Job.getInstance(hadoopConf, jobName);  
    69.         job.setJarByClass(HBaseBulk.class);  
    70.         job.setMapperClass(bulkMapper.class);  
    71.         job.setReducerClass(PutSortReducer.class);  
    72.         job.setMapOutputKeyClass(ImmutableBytesWritable.class);  
    73.         job.setMapOutputValueClass(Put.class);  
    74.         job.setInputFormatClass(TextInputFormat.class);  
    75.         job.setOutputFormatClass(HFileOutputFormat2.class);  
    76.         FileInputFormat.addInputPath(job, new Path(input));  
    77.         FileOutputFormat.setOutputPath(job, new Path(output));  
    78.           
    79.         // 配置HBase(或者将hbase的相关配置文件引入项目)  
    80.         Configuration hbaseConf = HBaseConfiguration.create();  
    81.         hbaseConf.set("hbase.zookeeper.quorum""localhost");  
    82.         hbaseConf.set("hbase.zookeeper.property.clientPort""2181");  
    83.           
    84.         // 生成HFile  
    85.         Connection conn = ConnectionFactory.createConnection(hbaseConf);  
    86.         HTable table = (HTable) conn.getTable(TableName.valueOf(tableName));  
    87.         HFileOutputFormat2.configureIncrementalLoad(job, table);  
    88.           
    89.         // 执行任务  
    90.         job.waitForCompletion(true);  
    91.           
    92.         // 将HFile文件导入HBase  
    93.         LoadIncrementalHFiles loader = new LoadIncrementalHFiles(hbaseConf);  
    94.         loader.doBulkLoad(new Path(output), table);  
    95.     }  
    96. }  

    上述代码首先将HDFS中的数据文件通过MapReduce任务生成HFile文件,然后将HFile文件导入HBase数据表(该数据表已存在)。HDFS中的数据文件和导入HBase后的数据表分别如下图所示:

     

     

    展开全文
  • 大数据从入门到实战 - HBase 开发:使用Java操作HBase 一、关于此次实践 1、实战简介 2、全部任务 二、实践详解 1、第1关:创建表 2、第2关:添加数据 3、第3关:获取数据 4、第4关:删除表 叮嘟!这里是小啊呜的...


    叮嘟!这里是小啊呜的学习课程资料整理。好记性不如烂笔头,今天也是努力进步的一天。一起加油进阶吧!
    在这里插入图片描述

    一、关于此次实践

    1、实战简介

    HBase和Hadoop一样,都是用Java进行开发的,本次实训我们就来学习如何使用Java编写代码来操作HBase数据库。

    实验环境:
    hadoop-2.7
    JDK8.0
    HBase2.1.1
    

    2、全部任务

    在这里插入图片描述

    二、实践详解

    1、第1关:创建表

    package step1;
    import java.io.IOException;
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.hbase.HBaseConfiguration;
    import org.apache.hadoop.hbase.HColumnDescriptor;
    import org.apache.hadoop.hbase.HTableDescriptor;
    import org.apache.hadoop.hbase.TableName;
    import org.apache.hadoop.hbase.client.Admin;
    import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;
    import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;
    import org.apache.hadoop.hbase.client.Connection;
    import org.apache.hadoop.hbase.client.ConnectionFactory;
    import org.apache.hadoop.hbase.client.Get;
    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.client.Table;
    import org.apache.hadoop.hbase.client.TableDescriptor;
    import org.apache.hadoop.hbase.client.TableDescriptorBuilder;
    import org.apache.hadoop.hbase.util.Bytes;
    /**
    * HBase 1.0 version of ExampleClient that uses {@code Connection},
    * {@code Admin} and {@code Table}.
    */
    public class Task{
    public void createTable()throws Exception{
    /********* Begin *********/
    Configuration config = HBaseConfiguration.create();
    Connection connection = ConnectionFactory.createConnection(config);
    try {
    // Create table
    Admin admin = connection.getAdmin();
    try {
    TableName tableName = TableName.valueOf("dept");
    // 新 API 构建表
    // TableDescriptor 对象通过 TableDescriptorBuilder 构建;
    TableDescriptorBuilder tableDescriptor =
    TableDescriptorBuilder.newBuilder(tableName);
    ColumnFamilyDescriptor family =
    ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes("data")).build();// 构建列族对象
    tableDescriptor.setColumnFamily(family); // 设置列族
    admin.createTable(tableDescriptor.build()); // 创建表
    
    
    TableName emp = TableName.valueOf("emp");
    // 新 API 构建表
    // TableDescriptor 对象通过 TableDescriptorBuilder 构建;
    TableDescriptorBuilder empDescriptor =
    TableDescriptorBuilder.newBuilder(emp);
    ColumnFamilyDescriptor empfamily =
    ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes("emp")).build();// 构建列族对象
    empDescriptor.setColumnFamily(empfamily); // 设置列族
    admin.createTable(empDescriptor.build()); // 创建表
    } finally {
    admin.close();
    }
    } finally {
    connection.close();
    }
    /********* End *********/
    }
    }
    
    命令行:
    
    start-dfs.sh ( Hadoop 启动)
    回车
    start-hbase.sh ( hbase 启动)
    

    测评
    在这里插入图片描述

    2、第2关:添加数据

    package step2;
    import java.io.IOException;
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.hbase.HBaseConfiguration;
    import org.apache.hadoop.hbase.HColumnDescriptor;
    import org.apache.hadoop.hbase.HTableDescriptor;
    import org.apache.hadoop.hbase.TableName;
    import org.apache.hadoop.hbase.client.Admin;
    import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;
    import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;
    import org.apache.hadoop.hbase.client.Connection;
    import org.apache.hadoop.hbase.client.ConnectionFactory;
    import org.apache.hadoop.hbase.client.Get;
    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.client.Table;
    import org.apache.hadoop.hbase.client.TableDescriptor;
    import org.apache.hadoop.hbase.client.TableDescriptorBuilder;
    import org.apache.hadoop.hbase.util.Bytes;
    public class Task {
     public void insertInfo()throws Exception{
     /********* Begin *********/
     Configuration config = HBaseConfiguration.create();
     Connection connection = ConnectionFactory.createConnection(config);
     Admin admin = connection.getAdmin();
     TableName tableName = TableName.valueOf("tb_step2");
     TableDescriptorBuilder tableDescriptor = TableDescriptorBuilder.newBuilder(tableName);
     ColumnFamilyDescriptor family = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes("data")).build();//  构建列族对象
     tableDescriptor.setColumnFamily(family); //  设置列族
     admin.createTable(tableDescriptor.build()); //  创建表
     // 添加数据
     byte[] row1 = Bytes.toBytes("row1");
     Put put1 = new Put(row1); 
     byte[] columnFamily1 = Bytes.toBytes("data"); // 列
     byte[] qualifier1 = Bytes.toBytes(String.valueOf(1)); // 列族修饰词
     byte[] value1 = Bytes.toBytes("张三丰"); // 值
     put1.addColumn(columnFamily1, qualifier1, value1);
     byte[] row2 = Bytes.toBytes("row2");
     Put put2 = new Put(row2); 
     byte[] columnFamily2 = Bytes.toBytes("data"); // 列
     byte[] qualifier2 = Bytes.toBytes(String.valueOf(2)); // 列族修饰词
     byte[] value2 = Bytes.toBytes("张无忌"); // 值
     put2.addColumn(columnFamily2, qualifier2, value2);
     Table table = connection.getTable(tableName);
     table.put(put1);
     table.put(put2);
     /********* End *********/
     }
    }
    

    测评
    在这里插入图片描述

    3、第3关:获取数据

    package step3;
    import java.io.IOException;
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.hbase.HBaseConfiguration;
    import org.apache.hadoop.hbase.HColumnDescriptor;
    import org.apache.hadoop.hbase.HTableDescriptor;
    import org.apache.hadoop.hbase.TableName;
    import org.apache.hadoop.hbase.client.Admin;
    import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;
    import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;
    import org.apache.hadoop.hbase.client.Connection;
    import org.apache.hadoop.hbase.client.ConnectionFactory;
    import org.apache.hadoop.hbase.client.Get;
    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.client.Table;
    import org.apache.hadoop.hbase.client.TableDescriptor;
    import org.apache.hadoop.hbase.client.TableDescriptorBuilder;
    import org.apache.hadoop.hbase.util.Bytes;
    public class Task {
     public void queryTableInfo()throws Exception{
     /********* Begin *********/
     Configuration config = HBaseConfiguration.create();
     Connection connection = ConnectionFactory.createConnection(config);
     Admin admin = connection.getAdmin();
     TableName tableName = TableName.valueOf("t_step3");
     Table table = connection.getTable(tableName);
     // 获取数据
     Get get = new Get(Bytes.toBytes("row1")); // 定义 get 对象
     Result result = table.get(get); // 通过 table 对象获取数据
     //System.out.println("Result: " + result);
     // 很多时候我们只需要获取“值”   这里表示获取  data:1  列族的值
     byte[] valueBytes = result.getValue(Bytes.toBytes("data"), Bytes.toBytes("1")); // 获取到的是字节数组
     // 将字节转成字符串
     String valueStr = new String(valueBytes,"utf-8");
     System.out.println("value:" + valueStr);
     TableName tableStep3Name = TableName.valueOf("table_step3");
     Table step3Table = connection.getTable(tableStep3Name);
     // 批量查询
     Scan scan = new Scan();
     ResultScanner scanner = step3Table.getScanner(scan);
     try {
     int i = 0;
     for (Result scannerResult: scanner) {
     //byte[] value = scannerResult.getValue(Bytes.toBytes("data"), Bytes.toBytes(1));
     // System.out.println("Scan: " + scannerResult);
     byte[] row = scannerResult.getRow();
     System.out.println("rowName:" + new String(row,"utf-8"));
     }
     } finally {
     scanner.close();
     }
     /********* End *********/
     }
    }
    

    测评
    在这里插入图片描述

    4、第4关:删除表

    package step4;
    import java.io.IOException;
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.hbase.HBaseConfiguration;
    import org.apache.hadoop.hbase.HColumnDescriptor;
    import org.apache.hadoop.hbase.HTableDescriptor;
    import org.apache.hadoop.hbase.TableName;
    import org.apache.hadoop.hbase.client.Admin;
    import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;
    import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;
    import org.apache.hadoop.hbase.client.Connection;
    import org.apache.hadoop.hbase.client.ConnectionFactory;
    import org.apache.hadoop.hbase.client.Get;
    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.client.Table;
    import org.apache.hadoop.hbase.client.TableDescriptor;
    import org.apache.hadoop.hbase.client.TableDescriptorBuilder;
    import org.apache.hadoop.hbase.util.Bytes;
    public class Task {
     public void deleteTable()throws Exception{
     /********* Begin *********/
     Configuration config = HBaseConfiguration.create();
     Connection connection = ConnectionFactory.createConnection(config);
     Admin admin = connection.getAdmin();
     TableName tableName = TableName.valueOf("t_step4");
     admin.disableTable(tableName);
     admin.deleteTable(tableName);
     /********* End *********/
     }
    }
    

    测评
    在这里插入图片描述

    Ending!
    更多课程知识学习记录随后再来吧!

    就酱,嘎啦!
    

    在这里插入图片描述

    注:
    人生在勤,不索何获。

    展开全文
  • hbase开发环境搭建及运行hbase小实例

    千次阅读 2016-04-25 15:21:40
    转载请注明:云帆大数据学院 » hbase开发环境搭建及运行hbase小实例 我们采用的是添加包的方式。  首先需要下载安装包: 1.安装包下载 可以通过官网下载: ...如上图
  • 本使用kafka,spark,hbase开发日志分析系统。 ![architecture](/docs/images/architecture.png "architecture") ### 软件模块 * Kafka:作为日志事件的消息系统,具有分布式,可分区,可冗余的消息服务功能。...
  • NoSql视频教程 Redis数据库管理/Memcached技术/MongoDB/HBase开发
  • 18、大数据之HBase开发

    2018-06-09 18:27:11
    1. hbase开发1.1. 配置HBaseConfiguration包:org.apache.hadoop.hbase.HBaseConfiguration作用:通过此类可以对HBase进行配置用法实例:Configuration config = HBaseConfiguration.create();说明: ...
  • Windows系统搭建Hbase开发环境

    千次阅读 2019-05-16 15:52:45
    继Windows系统搭建Hadoop,Spark开发环境 文章之后,接下来搭建Windows环境下Hbase开发环境,环境搭建均为单机使用模式,仅供学习。因在Linux系统上搭建流程较为繁琐,实在没必要浪费太多精力在搭建环境上面,所以...
  • HBase开发总结

    2020-07-14 16:10:34
    开发过程记录 1. 宏观的一个框架 Java端对HBase的操作基本其实就是: 1. 获取Configuration,基本两个:HBase的节点以及ZooKeeper端口号 2. 获取Connection 3. 获取Admin进行DDL操作/获取Table进行DML操作。...
  • 97 hbase开发

    2019-08-12 11:50:59
    包:org.apache.hadoop.hbase.HBaseConfiguration 作用:通过此类可以对HBase进行配置 用法实例: Configuration config = HBaseConfiguration.create(); 说明: HBaseConfiguration.create() 默认会从classpath 中...
  • java-hbase开发

    2017-03-22 14:01:52
    java-hbase-1.2.X开发包,
  • Hbase开发笔记

    2016-10-23 16:18:27
    用eclipse编程实现对hbase中表的数据的增加 先启动hadoop,之后启动hbase 创建一个新的java project,命名为hbase_study,创建一个com.study.hbase的包,在里面添加了EduAppend的类 程序如下 package ...
  • 大数据从入门到实战 - HBase 开发:批量操作 一、关于此次实践 1、实战简介 2、全部任务 二、实践详解 1、第 1 关:批量获取数据 2、第 2 关:批量删除数据 3、第 3 关:批量导入数据至 HBase 叮嘟!这里是小啊呜的...
  • HBase开发实践

    千次阅读 2015-02-26 09:53:04
    前言 HBase是一个分布式的、面向列的开源数据库.HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式。...在调控层的开发过程中,调控文件可以录入
  • Linux搭建Hbase开发环境

    2019-04-24 01:11:18
    NULL 博文链接:https://mazhilin.iteye.com/blog/2421557
  • storm+hbase开发

    2019-08-10 17:53:13
    1、、maven依赖导入 ...--storm-hbase到数据到hbase添加--> <dependency> <groupId>org.apache.storm</groupId> <artifactId>storm-hbase</artifactId> <ver...
  • hbase开发实例

    2016-12-11 01:11:00
    1、put/checkAndPut 1 package com.testdata; 2 3 import java.io.IOException;... 4 import org.apache.hadoop.conf.Configuration;... 5 import org.apache.hadoop.hbase.HBaseConfiguration; 6 import or...
  • Hbase开发异常记录

    2018-05-24 19:33:58
    一、java.lang.IllegalAccessError: tried to access method com.google.common.base.Stopwatch.()V from class org.apache.hadoop.hbase.zookeeper....hbase put时,出现以下异常: java.lang.IllegalAccess...
  • 本文详细讲解了在WIN7环境下用Myeclipse搭建Hbase开发环境的步骤,以及要注意的几个问题。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,339
精华内容 1,735
关键字:

hbase开发