• HTable和HTablePool使用注意事项


    HTable和HTablePool都是HBase客户端API的一部分,可以使用它们对HBase表进行CRUD操作。下面结合在项目中的应用情况,对二者使用过程中的注意事项做一下概括总结。

    HTable

    HTable是HBase客户端与HBase服务端通讯的Java API对象,客户端可以通过HTable对象与服务端进行CRUD操作(增删改查)。它的创建很简单:

    复制代码
    Configuration conf = HBaseConfiguration.create();
    HTable table = new HTable(conf, "tablename");
    //TODO CRUD Operation…
    复制代码

    HTable使用时的一些注意事项:

    1.   规避HTable对象的创建开销

    因为客户端创建HTable对象后,需要进行一系列的操作:检查.META.表确认指定名称的HBase表是否存在,表是否有效等等,整个时间开销比较重,可能会耗时几秒钟之长,因此最好在程序启动时一次性创建完成需要的HTable对象,如果使用Java API,一般来说是在构造函数中进行创建,程序启动后直接重用。

    2.   HTable对象不是线程安全的

    HTable对象对于客户端读写数据来说不是线程安全的,因此多线程时,要为每个线程单独创建复用一个HTable对象,不同对象间不要共享HTable对象使用,特别是在客户端auto flash被置为false时,由于存在本地write buffer,可能导致数据不一致。

    3.   HTable对象之间共享Configuration

    HTable对象共享Configuration对象,这样的好处在于:

    • 共享ZooKeeper的连接:每个客户端需要与ZooKeeper建立连接,查询用户的table regions位置,这些信息可以在连接建立后缓存起来共享使用;
    • 共享公共的资源:客户端需要通过ZooKeeper查找-ROOT-和.META.表,这个需要网络传输开销,客户端缓存这些公共资源后能够减少后续的网络传输开销,加快查找过程速度。

    因此,与以下这种方式相比:

    复制代码
    HTable table1 = new HTable("table1");
    HTable table2 = new HTable("table2");
    复制代码

    下面的方式更有效些:

    复制代码
    Configuration conf = HBaseConfiguration.create();
    HTable table1 = new HTable(conf, "table1");
    HTable table2 = new HTable(conf, "table2");
    复制代码

    备注:即使是高负载的多线程程序,也并没有发现因为共享Configuration而导致的性能问题;如果你的实际情况中不是如此,那么可以尝试不共享Configuration。

    HTablePool

    HTablePool可以解决HTable存在的线程不安全问题,同时通过维护固定数量的HTable对象,能够在程序运行期间复用这些HTable资源对象。

    复制代码
    Configuration conf = HBaseConfiguration.create();
    HTablePool pool = new HTablePool(conf, 10);
    复制代码

    1.   HTablePool可以自动创建HTable对象,而且对客户端来说使用上是完全透明的,可以避免多线程间数据并发修改问题。

    2.   HTablePool中的HTable对象之间是公用Configuration连接的,能够可以减少网络开销。

    HTablePool的使用很简单:每次进行操作前,通过HTablePool的getTable方法取得一个HTable对象,然后进行put/get/scan/delete等操作,最后通过HTablePool的putTable方法将HTable对象放回到HTablePool中。

    下面是个使用HTablePool的简单例子:

    复制代码
    public void createUser(String username, String firstName, String lastName, String email, String password, String roles) throws IOException {
      HTable table = rm.getTable(UserTable.NAME);
      Put put = new Put(Bytes.toBytes(username));
      put.add(UserTable.DATA_FAMILY, UserTable.FIRSTNAME,
      Bytes.toBytes(firstName));
      put.add(UserTable.DATA_FAMILY, UserTable.LASTNAME,
        Bytes.toBytes(lastName));
      put.add(UserTable.DATA_FAMILY, UserTable.EMAIL, Bytes.toBytes(email));
      put.add(UserTable.DATA_FAMILY, UserTable.CREDENTIALS,
        Bytes.toBytes(password));
      put.add(UserTable.DATA_FAMILY, UserTable.ROLES, Bytes.toBytes(roles));
      table.put(put);
      table.flushCommits();
      rm.putTable(table);
    }
    复制代码

    至于多线程使用HTablePool的真实性能情况,需要通过实际的测试工作得到。

  • 相关阅读:
    基元线程同步构造之用户模式易变构造volatile
    C# 基元线程同步构造
    idea 的Low Memory问题
    python工具——xmind
    VSCODE 远程开发树莓派
    firefox临时文件位置及修改方法
    Veeam Backup & Replication 9.5 备份方式详解
    Windows下登录凭证密码获取工具
    VMProtect虚拟机保护分析入门
    Applescrip
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2586734.html
Copyright © 2020-2023  润新知