zoukankan      html  css  js  c++  java
  • Java代码通过API操作HBase的最佳实践

    HBase提供了丰富的API。这使得用Java连接HBase非常方便。

    有时候大家会使用HTable table=new HTable(config,tablename);的方式来实例化一个HTable对象,实际上这并不是最好的实例化HTable的办法。最好的办法是使用HTablePool,并且每个线程都使用独立的HTable(参见《HBase The Definitive Guide》 4.4 HtablePool 和3.1 客户端API 概述)。因为HTable实例的创建非常耗时,需要扫描.META表确认表是否存在,是否可用等,还需要做其他的一些操作,所以,最好在系统启动的时候创建实例,如果需要多个HTable,考虑使用HTablePool。

    比如我在webservice中,需要对HTable进行查询,并将数据返回,我是这么做的:

    可以在提供服务的类的构造函数里完成HTablePool的初始化,弃用下面的方法。

    先在静态代码块中把系统中需要用到的表都获取一遍,获取完之后立即关闭该表,以期增加真正的服务的代码中,第一次实例化HTable对象的效率。

    //这是我对外提供服务的类
    public class HBaseQu
    {
    
        // SignHBase.getConfiguration()是从配置文件中获取
        //org.apache.hadoop.conf.Configuration的一个对象
        // 定义一个全局的HTablePool
        public static HTablePool hTablePool = new HTablePool(
                SignHBase.getConfiguration(), Integer.MAX_VALUE);
        // 初始化所用到的HTablePool,从pool中get一个需要用到的表,get完毕,立即关闭,
        // 以后每增加一个接口,如果需要用到一个新表的话,就在此处增加一次获取表,然后关闭它的代码。
        static
        {
               HTable table = null;
               //从池里获取一个表,然后关闭它(类似于充血) try {
                table = (HTable) hTablePool.getTable(tableName);
                if (null != table)
                {
                    table.close();
                }
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
    
            //获取另外一个表
            try
            {

               table = (HTable) hTablePool.getTable(tableName2);
               if (null != table) 
    {
    table.close();
    }
    }
    catch (IOException e)
    {
    e.printStackTrace();
    }
    }
    }

    在真正的服务的代码中,直接使用pool.getTable(tableName)即可快速实例化该表。如下所示:

            HTable table = null;//定义HTable
            ResultScanner rs = null;//定义接收结果的ResultScanner对象
            try
            {
                //实例化HTable对象
                table = (HTable) HBaseQu.hTablePool.getTable(tablename);
                Scan s = new Scan();//实例化Scan对象
                s.setFilter(new PrefixFilter(rowPrifix.getBytes()));//添加过滤器
                s.addColumn(Bytes.toBytes(family), Bytes.toBytes(qualifier));          
                rs = table.getScanner(s);//获取结果
                for (Result r : rs)
                {//循环处理行
                    KeyValue[] kv = r.raw();
                    for (int i = 0; i < kv.length; i++)
                    {
                        value.add(new String(kv[i].getRow(), "UTF-8") + ":---:"
                                + new String(kv[i].getFamily()) + ":"
                                + new String(kv[i].getQualifier()) + ":---:"
                                + new String(kv[i].getValue()));
    
                    }
                }
            }
            catch (Exception e)
            {
                e.printStackTrace();
                return null;
            }
            finally
            {
                //关闭打开的资源
                if (null != rs)
                {
                    rs.close();
                }
                try
                {
                    if (null != table)
                    {
                        table.close();
                    }
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
            }
        

     本文已同步至大数据技术http://cloudera.org.cn ),文章地址:http://cloudera.org.cn/?p=43

  • 相关阅读:
    cad.net DeepCloneObjects WasErased
    cad.net 更改高版本填充交互方式为低版本样子
    日志篇 VS Gitee码云
    测试篇 c#遍历所有安装程序 获取所有已经安装的程序
    cad.net 设置Acad2008默认启动 win10设置默认cad2008默认启动 20190923修改
    cad.net cad启动慢? cad2008启动慢? cad启动延迟? cad卡住? cad98%卡? 默认打印机!!
    测试篇 c#多线程实现ping 制作一个备份器
    cad.net 利用win32api实现不重复打开dwg路径的文件夹(资源管理器)
    cad.net 利用win32api实现一个命令开关参照面板 20190910修改浩辰部分问题,完美.
    cad.net 在cad2008引用了错误的com接口的dll导致出现了
  • 原文地址:https://www.cnblogs.com/sixiweb/p/3669069.html
Copyright © 2011-2022 走看看