HBase CRUD 操作指南 (一)

Elasticsearch+hbase 实现hbase中数据的快速查询(二) 接下来是Elasticsearch (版本5.x)中数据的CRUD 操作,为此,根据ES官网上的资料总结了一个工具类. 具体如下: (1)maven 添加依赖 (2)工具类代码: public class ESClientUtils { protected static Logger logger = Logger.getLogger(ESClientUtils.class); ... 阅读详情

1 概述 (General Notes)


HBase 的主要客户端入口点是 org.apache.hadoop.hbase.client 包的 Table interface. 该接口为用户提供了向 HBase 存储和获取数据全部必须的功能,
以及删除无效数据之类的操作。它通过 Connection 实例建立与 HBase 服务器连接。不过,在讨论这些类提供的各种方法之前,让我们了解一些这些用法的
总体方面。


所有修改数据的操作都保证了行级别的原子性(guaranteed to be atomic on a per-row basis), 这会影响到这一行数据所有的并发读写操作。换句话说,
其它客户端或线程对同一行的读写操作都不会影响改行的原子性:要么读到最新的一致性数据,要么必须等待系统允许写入该行。

在常规操作和正常负载情况下,客户端的读操作不会受到其它修改该行数据的客户端的影响,因为它们之间的竞争可以忽略不计。但是,当很多客户端需要
同时修改同一行数据时就会产生问题。因此,用户应当尽量使用批处理 (batch) 更新来减少单独操作同一行数据的次数。

也不用担心对于一个特定的行可以写入多少的列,所有的列都由这个行原子性保证。

最后,创建一个到 HBase 的初始连接不是没有代价的。每个实例化包括扫描 hbase:meta 表以检查该表是否存在,和是否启用,以及其它操作,使得该调用
非常繁重。因此建议仅创建一次 Connection 实例,然后在客户端应用中重用该实例。

一旦有了一个连接实例就可以获取实际的 table. 理想情况下,每个线程获取一个 table, 因为 Table 底层实现不保证线程安全。确保关闭所有得到的资源。



2 数据类型和层次结构 (Data Types and Hierarchy)
-----------------------------------------------------------------------------------------------------------------------------------------
在深入研究实际的操作和 API 类之前,首先看一下这些类如何关联。有一些低级别的类提供非常基本的功能,表现为大多数以数据为中心的类 (the
data-centric classes), 如 Put, Get, 或 Scan, 下表列出本章介绍的所有基本的数据相关的类型:

    
    List of basic data-centric types
    +---------------+-----------+-----------------------------------------------------------------------------
    | Type            | Kind        |    Description
    +---------------+-----------+-----------------------------------------------------------------------------
    | Get            | Query        | Retrieve previously stored data from a single row.
    +---------------+-----------+-----------------------------------------------------------------------------
    | Scan            | Query        | Iterate over all or specific rows and return their data.
    +---------------+-----------+-----------------------------------------------------------------------------
    | Put            | Mutation    | Create or update one or more columns in a single row.
    +---------------+-----------+-----------------------------------------------------------------------------
    | Delete        | Mutation    | Remove a specific cell, column, row, etc.
    +---------------+-----------+-----------------------------------------------------------------------------
    | Increment        | Mutation    | Treat a column as a counter and increment its value.
    +---------------+-----------+-----------------------------------------------------------------------------
    | Append        | Mutation    | Attach the given data to one or more columns in a single row.
    +---------------+-----------+-----------------------------------------------------------------------------



2.1 通用属性 (Generic Attributes)
-----------------------------------------------------------------------------------------------------------------------------------------
Attributes 是基础接口之一,提供如下方法:

    Attributes setAttribute(String name, byte[] value)
    byte[] getAttribute(String name)
    Map<String, byte[]> getAttributesMap()


All Known Implementing Classes:
    Append, Delete, Get, Increment, Mutation, OperationWithAttributes, Put, Query, Scan

它提供了一个通用的机制以属性(attribute)的形式向 data-centric 类添加任何类型的信息。默认情况下,没有任何属性集,开发人员可以在需要的时候通过
setAttribute() 方法添加自定义属性。因为多数时候一个数据类型的构造,例如 Put, 会立即跟一个 API 调用,把它发送到服务器上,一个问题是:能在什么
地方使用属性呢(attribute)?

要注意的一件事是 attribute 是被序列化的,并被发送到服务器端,意味着可以使用它们获取其中的值,例如,在一个协处理器上(a coprocessor). 另一个
使用 attribute 的场景是 Append 类,在 call 到服务器之后,利用 attribute 向用户返回信息。



2.2 操作 (Operations: Fingerprint and ID)
-----------------------------------------------------------------------------------------------------------------------------------------
另一个基础类型是抽象类 Operation, 它向所有数据类型添加如下方法:

        abstract Map<String, Object> getFingerprint()
        abstract Map<String, Object> toMap(int maxCols)
        Map<String, Object> toMap()
        String toJSON(int maxCols) throws IOException
        String toJSON() throws IOException
        String toString(int maxCols)
        String toString()


Direct Known Subclasses:
    OperationWithAttributes
    
Superclass for any type that maps to a potentially application-level query. (e.g. Put, Get, Delete, Scan, Next, etc.) Contains methods for
exposure to logging and debugging tools.

这些方法由 HBase 0.92 引入,并帮助生成日志和通用调试信息的有用的信息集合。所有后面的方法依赖于 toMap(int maxCols) 方法的实现,Operation 中的
抽象方法。Mutation 类为所有继承的数据类型实现了该方法。如果没有明确指定,默认包含在输出中的列的数量为 5.

另外,中间类 OperationWithAttributes 扩展了上述的 Operation 类,实现了 Attributes 接口,并添加了如下方法:

        OperationWithAttributes setId(String id)
        String getId()

ID 是一个客户端提供的值,用于记录日志时识别 operation.

    
        The various methods to retrieve instance information
        +-----------------------+---------------------------------------------------------------------------------------+
        | Method                | Description                                                                            |
        +-----------------------+---------------------------------------------------------------------------------------+
        | getId()                | Returns what was set by the setId() method.                                            |
        +-----------------------+---------------------------------------------------------------------------------------+
        | getFingerprint()        | Returns the list of column families included in the instance.                            |
        +-----------------------+---------------------------------------------------------------------------------------+
        | toMap(int maxCols)    | Compiles a list including fingerprint, column families with all columns and their        |
        |                        | data, total column count, row key, and—if set—the ID and cell-level TTL.                |
        +-----------------------+---------------------------------------------------------------------------------------+
        | toMap()                | Same as above, but only for 5 columns.                                                |
        +-----------------------+---------------------------------------------------------------------------------------+
        | toJSON(int maxCols)    | Same as toMap(maxCols) but converted to JSON. Might fail due to encoding issues.        |
        +-----------------------+---------------------------------------------------------------------------------------+
        | toJSON()                | Same as above, but only for 5 columns.                                                |
        +-----------------------+---------------------------------------------------------------------------------------+
        | toString(int maxCols)    | Attempts to call toJSON(maxCols), but when it fails, falls back to toMap(maxCols).    |
        +-----------------------+---------------------------------------------------------------------------------------+
        | toString()            | Same as above, but only for 5 columns                                                    |
        +-----------------------+---------------------------------------------------------------------------------------+



2.3 查询和数据修改操作 (Query versus Mutation)
-----------------------------------------------------------------------------------------------------------------------------------------
Row 接口,提供如下方法:

    byte[] getRow()

该方法简单地返回一个给定行的 row key 实例。Get 类实现了该方法,因其正好处理一个行。Mutation 超类也实现了该方法,作为修改数据所需类型的基类
另外,Mutation 也实现了 CellScannable interface, 它提供如下方法:

    CellScanner cellScanner()
    
通过该接口,客户端可以迭代返回的单元格(cell). Mutation 还有些其它方法由所有继承类共享。下面是它的一个常用方法列表:


        Methods provided by the Mutation superclass
        +-----------------------+---------------------------------------------------------------------------------------+
        | Method                | Description                                                                            |
        +-----------------------+---------------------------------------------------------------------------------------+
        | getACL()/setACL()        | The Access Control List (ACL) for this operation                                        |
        +-----------------------+---------------------------------------------------------------------------------------+
        | getCellVisibility()    | The cell level visibility for all included cells.                                        |
        | setCellVisibility()     |                                                                                        |
        +-----------------------+---------------------------------------------------------------------------------------+
        | getClusterIds()        | The cluster ID as needed for replication purposes.                                    |
        | setClusterIds()        |                                                                                        |
        +-----------------------+---------------------------------------------------------------------------------------+
        | getDurability()        | The durability settings for the mutation.                                                |
        | setDurability()        |                                                                                        |
        +-----------------------+---------------------------------------------------------------------------------------+
        | getFamilyCellMap()    | The list of all cells per column family available in this instance.                    |
        | setFamilyCellMap()    |                                                                                        |
        +-----------------------+---------------------------------------------------------------------------------------+
        | getTimeStamp()        | Retrieves the associated timestamp of the Put instance. Can be optionally set using     |
        |                        | the constructor’s ts parameter. If not set, may return Long.MAX_VALUE (also defined as|
        |                        | HConstants.LATEST_TIMESTAMP).                                                            |
        +-----------------------+---------------------------------------------------------------------------------------+
        | getTTL()                | Sets the cell level TTL value, which is being applied to all included Cell instances    |
        | setTTL()                 | before being persisted.                                                                |
        +-----------------------+---------------------------------------------------------------------------------------+
        | heapSize()            | Computes the heap space required for the current Put instance. This includes all        |
        |                        | contained data and space needed for internal structures.                                |
        +-----------------------+---------------------------------------------------------------------------------------+
        | isEmpty()                | Checks if the family map contains any Cell instances.                                    |
        +-----------------------+---------------------------------------------------------------------------------------+
        | numFamilies()            | Convenience method to retrieve the size of the family map, containing all Cell instances.
        +-----------------------+---------------------------------------------------------------------------------------+
        | size()                | Returns the number of Cell instances that will be added with this Put.                |
        +-----------------------+---------------------------------------------------------------------------------------+


另一个在获取方面较大的超级类是 Query, 为从 HBase 表读取数据相关的所有数据类型提供一个通用层。下表展示了其提供的方法:

        Methods provided by the Query superclass
        +-----------------------+---------------------------------------------------------------------------------------+
        | Method                | Description                                                                            |
        +-----------------------+---------------------------------------------------------------------------------------+
        | getAuthorizations()    | Visibility labels for the operation.                                                    |
        | setAuthorizations()    |                                                                                        |
        +-----------------------+---------------------------------------------------------------------------------------+
        | getACL()/setACL()        | The Access Control List (ACL) for this operation.                                        |
        +-----------------------+---------------------------------------------------------------------------------------+
        | getFilter()/setFilter() The filters that apply to the retrieval operation.                                    |
        +-----------------------+---------------------------------------------------------------------------------------+
        | getConsistency()        | The consistency level that applies to the current query instance.                        |
        | setConsistency()        |                                                                                         |
        +-----------------------+---------------------------------------------------------------------------------------+
        | getIsolationLevel()    | Specifies the read isolation level for the operation.                                    |
        | setIsolationLevel()    |                                                                                        |
        +-----------------------+---------------------------------------------------------------------------------------+
        | getReplicaId()        | Gives access to the replica ID that served the data.                                    |
        | setReplicaId()        |                                                                                        |
        +-----------------------+---------------------------------------------------------------------------------------+
        


2.4 Durability, Consistency, and Isolation
-----------------------------------------------------------------------------------------------------------------------------------------
Durability, 如 Mutation 类的 setDurability() method 涉及的概念,写操作过程的一部分,durabilty 涉及到服务器如何处理客户端发过来的更新。下表
列出 Durability enumeration 提供的选项:

        Durability levels
        +-----------------------+---------------------------------------------------------------------------------------+
        | Method                | Description                                                                            |
        +-----------------------+---------------------------------------------------------------------------------------+
        | USE_DEFAULT            | For tables use the global default setting, which is SYNC_WAL. For a mutation use the    |
        |                        | table’s default value.                                                                |
        +-----------------------+---------------------------------------------------------------------------------------+
        | SKIP_WAL                | Do not write the mutation to the WAL.                                                    |
        +-----------------------+---------------------------------------------------------------------------------------+
        | ASYNC_WAL                | Write the mutation asynchronously to the WAL.                                            |
        +-----------------------+---------------------------------------------------------------------------------------+
        | SYNC_WAL                | Write the mutation synchronously to the WAL.                                            |
        +-----------------------+---------------------------------------------------------------------------------------+
        | FSYNC_WAL                | Write the Mutation to the WAL synchronously and force the entries to disk.            |
        +---------------------------------------------------------------------------------------------------------------+
        
        注:WAL 表示预写日志(write-ahead log, WAL), 是保护数据安全的核心机制。
    

读方面,由两个设置控制,首先是一致性级别(consistency level), 由 Query 基类的 setConsistency() 和 getConsistency() 方法使用。由 Consistency
enumeration 提供:


        Consistency Levels
        +-----------------------+---------------------------------------------------------------------------------------+
        | Method                | Description                                                                            |
        +-----------------------+---------------------------------------------------------------------------------------+
        | STRONG                | Strong consistency as per the default of HBase. Data is always current.                |
        +-----------------------+---------------------------------------------------------------------------------------+
        | TIMELINE                | Replicas may not be consistent with each other, but updates are guaranteed to be         |
        |                        | applied in the same order at all replicas. Data might be stale!                        |
        +---------------------------------------------------------------------------------------------------------------+


处置读方面的最后的级别是隔离级别(isolation level),  用于 Query 超类的 setIsolationLevel() 和 getIsolationLevel() 方法:


        Isolation Levels
        +-----------------------+---------------------------------------------------------------------------------------+
        | Method                | Description                                                                            |
        +-----------------------+---------------------------------------------------------------------------------------+
        | READ_COMMITTED        | Read only data that has been committed by the authoritative server                    |
        +-----------------------+---------------------------------------------------------------------------------------+
        | READ_UNCOMMITTED        | Allow reads of data that is in flight, i.e. not committed yet.                        |
        +-----------------------+---------------------------------------------------------------------------------------+

通常,客户端读取数据期望看到只提交的数据,但服务也有选项可以读取任何服务器上已存在的数据。应用 READ_UNCOMMITTED 设置时要小心谨慎,其结果
完全依赖于写入的模式。



2.5 单元格 (The Cell)
-----------------------------------------------------------------------------------------------------------------------------------------
客户端代码可能必须直接与 Cell 实例一起工作。Cell 实例包含数据,及特定 Cell 的坐标(coordinates). 坐标是 row key, 列族名称,列修饰符(
qualifier) 以及时间戳(timestamp). 此接口提供了访问低级别的细节:

        getRowArray(), getRowOffset(), getRowLength()
        getFamilyArray(), getFamilyOffset(), getFamilyLength()
        getQualifierArray(), getQualifierOffset(), getQualifierLength()
        getValueArray(), getValueOffset(), getValueLength()
        getTagsArray(), getTagsOffset(), getTagsLength()
        getTimestamp()
        getTypeByte()
        getSequenceId()

因为 Cell 仅仅是一个接口,不能简单创建其实例。其实现类为 KeyValue, 是一个私有的类,也不能实例化。CellUtil 类,为我们提供了必要的方法创建
Cell 实例:

        static Cell createCell(final byte[] row, final byte[] family,
        final byte[] qualifier, final long timestamp, final byte type,
        final byte[] value)
        
        static Cell createCell(final byte[] rowArray, final int rowOffset,
        final int rowLength, final byte[] familyArray, final int family‐
        Offset,final int familyLength, final byte[] qualifierArray,
        final int qualifierOffset, final int qualifierLength)
        
        static Cell createCell(final byte[] row, final byte[] family,
        final byte[] qualifier, final long timestamp, final byte type,
        final byte[] value, final long memstoreTS)
        
        static Cell createCell(final byte[] row, final byte[] family,
        final byte[] qualifier, final long timestamp, final byte type,
        final byte[] value, byte[] tags, final long memstoreTS)
        
        static Cell createCell(final byte[] row, final byte[] family,
        final byte[] qualifier, final long timestamp, Type type,
        final byte[] value, byte[] tags)
        
        static Cell createCell(final byte[] row)
        static Cell createCell(final byte[] row, final byte[] value)
        static Cell createCell(final byte[] row, final byte[] family,
        final byte[] qualifier)

通常,根本不需要显示创建 Cell, 当添加 column 时系统会为我们创建,如 Put 或 Delete 实例。可以之后再次获取它们,如利用下面的 Query 和 Mutation
方法:

    CellScanner cellScanner()
    NavigableMap<byte[], List<Cell>> getFamilyCellMap()

数据及其坐标信息存储在 Java 的 byte[] 中,一个字节数组。如此设计的背后是,低级别存储的类型允许任意数据,能有效存储必要的字节,保持内部数据结构
的开销最小。这也是每个数组参数有一个 Offset 和 Length 参数的原因。它们允许在进行非常快速的字节级别操作时传递现有的字节数组。并且,对于每个成员
坐标, Cell 接口都有一个 getter 方法来获取字节数组,及它们给出的 offset 和 length.

CellUtil 类有很多有用的方法,帮助 HBase 客户端开发者更轻松地处理 Cell. 例如可以 clone cell 的各个部分,如,行或值。


        The possible type values for a given Cell instance
        +-----------------------+---------------------------------------------------------------------------------------+
        | Type                    | Description                                                                            |
        +-----------------------+---------------------------------------------------------------------------------------+
        | Put                    | The Cell instance represents a normal Put operation.                                    |
        +-----------------------+---------------------------------------------------------------------------------------+
        | Delete                | This instance of Cell represents a Delete operation, also known as a tombstone marker.|
        +-----------------------+---------------------------------------------------------------------------------------+
        | DeleteFamilyVersion    | This is the same as Delete, but more broadly deletes all columns of a column family    |
        |                        | matching a specific timestamp.                                                        |
        +-----------------------+---------------------------------------------------------------------------------------+
        | DeleteColumn            | This is the same as Delete, but more broadly deletes an entire column.                |
        +-----------------------+---------------------------------------------------------------------------------------+
        | DeleteFamily            | This is the same as Delete, but more broadly deletes an entire column family,         |
        |                        | including all contained columns.                                                        |
        +---------------------------------------------------------------------------------------------------------------+


可以查看 Cell 实例的类型,如利用 getTypeByte() 方法,或者使用 CellUtil.isDeleteFamily(cell) 以及其它类似的方法。
可以联合使用 cellScanner() 和 Cell.toString() 方法以人类可读的方式查看 cell 类型,如下示例:


    //Shows how to use the cell scanner
    Put put = new Put(Bytes.toBytes("testrow"));
    put.addColumn(Bytes.toBytes("fam-1"), Bytes.toBytes("qual-1"),
    Bytes.toBytes("val-1"));
    put.addColumn(Bytes.toBytes("fam-1"), Bytes.toBytes("qual-2"),
    Bytes.toBytes("val-2"));
    put.addColumn(Bytes.toBytes("fam-2"), Bytes.toBytes("qual-3"),
    Bytes.toBytes("val-3"));
    CellScanner scanner = put.cellScanner();
    while (scanner.advance()) {
        Cell cell = scanner.current();
        System.out.println("Cell: " + cell);
    }


输出:
    Cell: testrow/fam-1:qual-1/LATEST_TIMESTAMP/Put/vlen=5/seqid=0
    Cell: testrow/fam-1:qual-2/LATEST_TIMESTAMP/Put/vlen=5/seqid=0
    Cell: testrow/fam-2:qual-3/LATEST_TIMESTAMP/Put/vlen=5/seqid=0

示例打印出当前 Cell 实例的元数据信息,以如下格式:
    
    <row-key>/<family>:<qualifier>/<version>/<type>/<value-length>/<sequence-id>



    ■ 数据的版本化 (Versioning of Data)
    -------------------------------------------------------------------------------------------------------------------------------------
    HBase 的一个特殊的特性是具有为每个 cell 存储多个版本的能力。这是通过每个版本的时间戳实现的,并将它们按降序排序。每个时间戳是一个长整型
    值代表毫秒数。它记录了从 UTC 1970 年 1 月 1 日午夜 0 点到现在经历的时间 —— 也称为 Unix time, 或 Unix 纪元(epoch). 大多数操作系统提供了
    计时器,从编程语言可以读取。 Java 中,可以使用 System.currentTimeMillis() 读取计时器的值。
    
    当向 HBase 中放置 (put) 一个值时,有机会显式地向其提供一个时间戳,或者忽略该值,在之后的 put 操作执行时由 Region server 填充。
    
    正如之前 “Requirements” 章节提示的那样,必须确保集群中的服务器有正确的时间并且彼此同步。客户端有可能失去用户的控制,因此会有不同的时间
    可能使几个小时,也有可能会是几年。
    
    只要在客户端 API 调用中没有指定时间,服务器的时间就会应用。
    
    大多数应用从不担心版本化问题,并且依赖于 HBase 内置的时间戳处理,如果使用自己显式的方式处理,需要了解一些问题。
    下面是一个示例:
    
        hbase(main):001:0> create 'test', { NAME => 'cf1', VERSIONS => 3 }
        0 row(s) in 0.1540 seconds
        => Hbase::Table - test
        hbase(main):002:0> put 'test', 'row1', 'cf1', 'val1'
        0 row(s) in 0.0230 seconds
        hbase(main):003:0> put 'test', 'row1', 'cf1', 'val2'
        0 row(s) in 0.0170 seconds
        hbase(main):004:0> scan 'test'
        ROW COLUMN+CELL
        row1 column=cf1:, timestamp=1426248821749, value=
        val2
        1 row(s) in 0.0200 seconds
        hbase(main):005:0> scan 'test', { VERSIONS => 3 }
        ROW COLUMN+CELL
        row1 column=cf1:, timestamp=1426248821749, value=val2
        row1 column=cf1:, timestamp=1426248816949, value=val1
        1 row(s) in 0.0230 seconds

    示例中创建了一个表 test, 带有一个列族 cf1, 并指示 HBase 每个 cell 保留三个版本(默认为 1 )。然后向同一行、同一列发出两个 put command,
    但是两个不同的值:分别为 val1 和 val2。 然后执行 scan 操作来查看表的整个内容,没有像想象的那样只显示 val2, 可能只是想通过第二个 put
    调用替换掉 val1 值。结果显示了两个版本的值 val2, val1.
    
    
最后,有一个 CellComparator 类,形成利用 Java  Comparator 模式比较给定 cell 实例的类的基础。CellComparator 类有一个内部类 RowComparator
公开可用。可用利用这个类仅仅通过它们的 row 组件比较 cell, 换句话说,给定的 row key.




2.6 API 构建 (API Building Blocks)
-----------------------------------------------------------------------------------------------------------------------------------------
介绍完底层 API 类和它们的功能之后,再来看下基本的客户端 API. 通常需要通过以下的代码过程连接到 HBase 实例,可以是单机模式的本地实例,伪分
布式的实例,或者远程集群上的完全分布式实例。客户端连接和 API 调用的基本流程类似如下代码:

    Configuration conf = HBaseConfiguration.create();
    Connection connection = ConnectionFactory.createConnection(conf);
    TableName tableName = TableName.valueOf("testtable");
    Table table = connection.getTable(tableName);
    ...
    Result result = table.get(get);
    ...
    table.close();
    connection.close();

    
有几个类需要简单介绍下:

    ● Configuration
    -------------------------------------------------------------------------------------------------------------------------------------
    这个来来自 Hadoop, 由 HBase 共享过来,为客户端应用载入并提供配置信息。它从配置文件 hbase-site.xml 和 hbase-default.xml 载入详细信息。


    ● ConnectionFactory
    -------------------------------------------------------------------------------------------------------------------------------------
    提供了工厂方法来获取 Connection 实例,由给定的 Configuration 提供配置信息。


    ● Connection
    -------------------------------------------------------------------------------------------------------------------------------------
    实际的连接对象。每个应用程序只需创建一个 Connection 实例,并在运行期间共享该实例。不再需要时应关闭 Connection 实例以释放资源。


    ● TableName
    -------------------------------------------------------------------------------------------------------------------------------------
    表示为一个带有名称空间的表名称。
    Immutable POJO class for representing a table name. Which is of the form: <table namespace>:<table qualifier> Two special namespaces:
    
    1. hbase - system namespace, used to contain hbase internal tables
    2. default - tables with no explicit specified namespace will automatically fall into this namespace.
    
    示例:
        a) foo:bar, means namespace=foo and qualifier=bar
        b) bar, means namespace=default and qualifier=bar
        c) default:bar, means namespace=default and qualifier=bar



    ● Table
    -------------------------------------------------------------------------------------------------------------------------------------
    客户端 API  中轻型的、非线程安全的数据表的表现形式。按每个线程来创建一个实例,并且在不再需要时,关闭它以释放资源。
    
    
在实践中,应小心仔细地以一种可靠的形式分配和释放 HBase 客户端资源。示例代码 GetTryWithResourcesExample.java 演示了以 Java 7 的新特性
try-with-resources 获取并释放资源。


    ■ Accessing Configuration Files from Client Code
    -------------------------------------------------------------------------------------------------------------------------------------
    "Client Configuration" 一节介绍了 HBase 客户端应用使用的配置文件。需要访问 hbase-site.xml 以获取集群所在的位置信息 —— 或者,需要在
    代码中指定该位置信息。
    
    不管采用哪种方法,都需要在代码中通过 HBaseConfiguration 类来处理配置属性。这由该类提供的两个静态方法来完成:
    
        static Configuration create()
        static Configuration create(Configuration that)

    调用这两个方法时,其底层的代码会在当前 Java 类路径内载入两个配置文件:hbase-default.xml 和 hbase-site.xml

    如果指定一个现有的配置(an existing configuration), 使用第二个方法 create(Configuration that), that 参数指定的配置信息会拥有最高的优先级

    HBaseConfiguration 实际上扩展自 Hadoop Configuration 类,但仍与之兼容:可以在 Hadoop Configuration 实例中配置信息,然后会很好地合并到
    HBaseConfiguration 实例中。
    
    获取到一个 HBaseConfiguration 实例之后,就有了一个合并的配置信息,由默认值(hbase-default.xml 中的配置值),被 hbase-site.xml 覆盖的配置,
    和可选的已存在的配置信息组成。可以随意修改此配置信息,然后利用该配置创建 Connection 实例。例如,可以覆盖掉 ZooKeeper quorum 的地址信息,
    以指向另一个集群:
    
        Configuration config = HBaseConfiguration.create();
        config.set("hbase.zookeeper.quorum","zk1.foo.com,zk2.foo.com");

    换句话说,可以简单地在代码中设置属性来忽略掉外部的客户端配置文件中指定的配置信息。这种方法,不需要额外的配置就可以创建一个客户端程序。



    ■ 资源共享 (Resource Sharing)
    -------------------------------------------------------------------------------------------------------------------------------------
    每个 Table 实例要求一个与远程服务器的连接。这是通过 ConnectionFactory 获取的 Connection 的实现实例处理的。但为什么在应用中不给每个
    Table 实例创建一个连接呢?为什么在应用中只创建一个连接实例并在整个应用中共享该实例?因为每个连接要做很多的内部资源处理:

    
        ● 共享 ZooKeeper 连接 (Share ZooKeeper Connections)
        ---------------------------------------------------------------------------------------------------------------------------------
        由于每个客户端实际上需要一个到 ZooKeeper 集合体(ZooKeeper ensemble) 的连接来初始化查找用户表分区的位置,建立这个连接然后与之后的
        客户端实例共享该实例是明智的。


        ● 缓存通用资源 (Cache Common Resources)
        ---------------------------------------------------------------------------------------------------------------------------------
        每次用户表分区位置信息的查找都通过 ZooKeeper, 或者目录表(catalog tables)执行,这需要多次的网络往返操作。将位置信息缓存到客户端
        有利于降低网络流量,并提升查找过程的速度。这与每个本地客户端连接到一个远程集群实际上是相同的,因此,在同一进程中的多个客户端间共
        享连接有同等的好处。这是通过共享 Connection 实例实现的。
        
        另外,当一个查找失败时,例如,当一个分区拆分时,连接有其内置的重试机制可以刷新过时的缓存信息。之后新的信息可以立刻被同一连接内的
        其它共享线程使用,从而继续降低由客户端发起的网络流量。

        
    共享连接资源的缺点是清理:如果没有显式关闭一个连接,该连接会一直打开直到客户端进程退出。这可能会导致多个连接保留打开 ZooKeeper, 特别是
    是繁重的分布式应用,如与 HBase 对话的 MapReduce 作业。最坏的情况下,会耗尽可用的连接,并收到 IOException 异常。
    
    避免这种问题出现的办法是在使用完共享连接之后显式地关闭该连接。可用通过 Connection 提供的 Close() method 完成。该调用会降低其内部的引用

    计数器并最终关闭所有的共享资源,如到 ZooKeeper 集合体的连接,并从其内部列表中移除该连接的引用。

 

 

系列目录:      

HBase CRUD 操作指南 (一)

HBase CRUD 操作指南 (二)

HBase CRUD 操作指南 (三)

 

参考:

    《HBase - The Definitive Guide - 2nd Edition》Early release —— 2015.7 Lars George

 

 

 

HBase Java API 实现数据CRUD操作(一) HBase是一个开源的非关系型分布式数据库(NoSQL),基于Google的Bigtable模型构建,适用于存储海量数据的场景。HBase主要解决的是大规模存储问题,其最大的特点是列式存储,提供了高可靠性、高性能、可伸缩性和面向列的存储模型。适用于处理大量读/写请求的场景,比如日志数据、社交网络数据、推荐系统数据等。HBase Java客户端类库主要由以下几部分组成:HBaseAdmin:用于管理HBase的表、命名空间以及集群配置等高级操作。HTable。 阅读详情

相关推荐

Java API操作HBase通用CRUD教程

本文还有配套的精品资源,点击获取 简介:Java环境下,本指南介绍如何通过Java API执行HBase数据库的通用CRUD操作。文章首先介绍了设置HBase依赖的步骤,然后详细讲解了创建表、插入数据、读取数据、更新数据、删除数据以及扫描查询的操作方法,并提供了相应的Java代码示例。 1. HBase数据库介绍与应用领域 HBase是一个开源的非关系型分布...

weixin_33628677的博客 1636

HBase学习之路(二):Java客户端的CRUD操作详讲

内容简介一、概述二、操作前的准备三、put操作四、get操作五、delete操作六、总结 一、概述 HBase作为一个数据库最常见的交互方式是使用JavaAPI与其交互,HBase提供给客户端非常丰富的JavaAPI对数据库进行增删改查等操作。事实上,HBase的主要客户端接口是由org.apache.hadoop.hbase.client包中的HTable提供,我们可以通过这个类向HBase读...

萧邦主的城邦 839

HBaseClient:HBase客户端数据管理软件

HBaseClient HBase客户端数据管理软件 概要说明 类似PL/SQL,是一个HBase数据库的客户端数据管理软件。是免费开源的软件。 基于XJava,使用xml配置文件绘制可视化界面。 可视化界面操作 表 表的定义、编辑、删除; 数据 数据的添加、编辑、删除; 数据的全部清空、多条删除、多条复制; 查询 主键的精确; 关键字的模糊查询 关键字的模糊查询过滤显示; 数据查询结果的分页显示操作,并且对查询关键字高亮显示; 导出 表结构的导出; 表结构及数据的导出; 导入 文件批量put命令导入(支持中文) 批量put命令执行(支持中文) 非可视化界面的命令操作 HBase命令的执行 导入 文件批量put命令导入(支持中文) 批量put命令执行(支持中文) 下载 date version size support 2018-05-24 65.9M 支持HBase 1.x 2018-0

基本操作:如何在HBase中进行基本的CRUD操作

1.背景介绍 在HBase中进行基本的CRUD操作是一项重要的技能。在本文中,我们将深入了解HBase的核心概念和算法原理,并通过具体的代码实例来展示如何进行基本的CRUD操作。 1. 背景介绍 HBase是一个分布式、可扩展、高性能的列式存储系统,基于Google的Bigtable设计。HBase可以存储大量数据,并提供快速的随机读写访问。HBase的核心特点是支持大规模数据的存储和查询,...

AI天才研究院 1179

HBaseClient-Download:HBaseClient 编译后的版本库

HBaseClient-Download HBaseClient 编译后的版本库 详见

Xcelium XRUN实用指南:从入门到高效仿真

本文是Xcelium XRUN仿真工具的实用指南,从基础入门到高效应用全面解析。XRUN作为Cadence Xcelium的统一命令行入口,能自动化编译、精细和仿真流程,大幅提升数字芯片与FPGA验证效率。文章详细介绍了最简命令、波形调试、增量编译、多核并行仿真等核心功能,并提供了管理复杂项目、性能调优与深度调试的进阶技巧,帮助工程师快速上手并精通这一高效仿真工具。

weixin_29238147的博客 742

Hadoop 客户端 CRUD

package cn.itning.testimport org.apache.commons.io.IOUtils import org.apache.hadoop.conf.Configuration import org.apache.hadoop.fs.FileSystem import org.apache.hadoop.fs.Path import org.junit.Before im

我们始终是路人 528

Imputation Methods for scRNA Sequencing Data

越来越多的研究者使用单细胞RNA测序(scRNA-seq)技术来表征单细胞水平的转录图谱。他们用它来研究复杂组织的异质性、转录组动力学和未知生物的多样性。然而,在基因表达模式随机性的scRNA-seq数据中普遍存在许多技术和生物学上的噪音。这些数据通常具有高维、稀疏和大量“dropout”值的特点,并且受批处理效应的影响。scRNA-seq数据中大量的“dropout”值严重掩盖了基因之间的重要关系,阻碍了下游分析。因此,scRNA-seq数据dropout值的估算就显得尤为重要。

qq_34179307的博客 543

HBase基本操作与CRUD

1.背景介绍 HBase是一个分布式、可扩展、高性能的列式存储系统,基于Google的Bigtable设计。它是Hadoop生态系统的一部分,可以与HDFS、MapReduce、ZooKeeper等组件集成。HBase适用于大规模数据存储和实时数据访问场景,如日志记录、实时数据分析、实时数据处理等。 HBase的核心特点是提供了高性能的随机读写操作,支持数据的自动分区和负载均衡,同时具有高可用...

AI天才研究院 1194

Kerberos基础及KDC服务(理论知识)

kerberos基础理论讲解+KDC服务

Siobhan_Mxin的博客 9715

C# 【WebService编写调用】

😹 觉得博主文章写的不错的话,希望大家三连(✌关注,✌点赞,✌评论),多多支持一下!!!

只有登上山顶,才能看到那边的风光 1175

搭建Hadoop集群 并实现hdfs上的crud操作

在每个节点上配置Hadoop的相关配置文件(core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml、hadoop-env.sh等文件)。在每个节点上配置Hadoop的相关配置文件(core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml、hadoop-env.sh等文件);使用Hadoop fs命令在HDFS上删除文件。使用Hadoop fs命令在HDFS上删除文件。

小趴菜的小蛋泡 378

化学科学催化反应产率预测之Transformer建模SMILES(Datawhale AI 夏令营)

循环神经网络:由于所有的前文信息都蕴含在一个隐向量中,随着序列长度的增加,早期的上下文信息会逐渐被遗忘。卷积神经网络:受限的上下文窗口在建模长文本时存在天然不足。需要多层卷积操作才能处理长文本。在本篇文章中,我们学习了Transformer的基本架构及其在化学反应产率预测中的应用。通过利用Transformer的Encoder部分对SMILES进行建模,我们能够更有效地捕捉序列数据的特征,从而提高模型的预测性能。

不想宅的冷同学 1096

HBase_HBase2.0 Java API 操作指南 (一)CRUD

由于网上的HBase Java API 大多都是基于 Hbase 1.0 + 的,故写了这篇文章。 参考了以下文章: https://blog.youkuaiyun.com/u012893747/article/details/84753988 本篇文章只讲解下 基本的 CURD 操作,更为复杂的操作,我们放到后面讲解。 目录 依赖包 建立连接 创建表 删除列族 删除表 插入数据 ...

迎难而上 1476

Veritas NetBackup 10.1 Windows安装指南:从账户配置到完整部署

本文详细介绍了Veritas NetBackup 10.1在Windows系统上的完整安装流程,从账户配置到部署验证。重点讲解了创建专用服务账户、安装组件选择、许可证输入等关键步骤,并提供了常见问题排查和进阶配置建议,帮助用户顺利完成企业级备份解决方案的部署。

weixin_26765287的博客 454

华为OD机试 - 战士技能规划设计 - 数组(Python/JS/C/C++ 新系统 100分)

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。你为一款动作游戏设计战士角色的技能:战士每个技能会消耗不同能量,释放技能有 2 个约束:连续释放技能数量不能超过 m 个,技能能量总和不能超过能量上限 k;如果超过则必须中断当前技能,进入调息状态(即分段)。战士有一项爆发技巧:在单次战斗中有一次

学Java,找哪吒 237

《HBase权威指南》一3.2 CRUD操作

本节书摘来异步社区《HBase权威指南》一书中的第3章,第3.2节,作者: 【美】Lars George 译者: 代志远 , 刘佳 , 蒋杰 责编: 杨海玲,更多章节内容可以访问云栖社区“异步社区”公众号查看。 3.2 CRUD操作 数据库的初始基本操作通常被称为CRUD(Create,Read,Update,Delete),具体指增、查、改、删。HBa...

weixin_34405332的博客 335

Xilinx平台SRIO介绍(五)示例工程Example Design介绍

理解IP的使用,少不了Example Design的学习。

数字IC/FPGA杂货铺,找一找,或许有你想要的~ 1万+

数据从mysql迁移到hbase的一些思考及设计

mysql数据库中联合索引在迁移hbase的时候如何进行设计

molong1208的专栏 5570

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

hbase集群错误集合

1.主节点运行良好,两个regionserver连不上,查看regionserver的log后发现问题是:2017-03-17 14:42:12,581 FATAL [regionserver/node3/192.168.11.96:16020] regionserver.HRegionServer: Master rejected startup because clock is out of s

Mr.Cai 1009

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

使用Java API对HBase进行CRUD操作

package test;   import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry;   import org.apache.

bingjie1217的专栏 1667

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

第二十二章:HBase的CRUD操作

1.背景介绍 1. 背景介绍 HBase是一个分布式、可扩展、高性能的列式存储系统,基于Google的Bigtable设计。它是Hadoop生态系统的一部分,可以与HDFS、MapReduce、ZooKeeper等组件集成。HBase具有高可靠性、高性能和高可扩展性,适用于大规模数据存储和实时数据访问场景。 在HBase中,数据以行为单位存储,每行数据由一个行键(row key)和一组列族(...

AI天才研究院 1220

使用Java对HBase进行操作(一)

这里不再使用HBase命令行对表进行操作,而是通过Java API接口对HBase进行处理,包括对表的增删改查操作 一、判断表是否存在 设置配置信息 Configuration cfg = HBaseConfiguration.create(); cfg.set("hbase.zookeeper.quorum", "centos01"); cfg.set("hbase.zookeeper.property.clientPort", "2181"); 根据配置信息取得与数据库的连接 Conne...

YKQCC的博客 7223

JavaAPI如何操作HBase完成CRUD

精选30+云产品,助力企业轻松上云!>>> 1.只需...

3918

HBase CRUD 操作指南 (二)

继  HBase CRUD 操作指南 (一)   3. CRUD 操作 (CRUD Operations) 数据库的初始基本操作通常称为 CRUD (create, read, update, and delete), 指的是 增、查、改、删四种操作。HBase 中有与之对应的的一组操作,由 Table interface 接口提供。     public interface Table ...

devalone 的专栏 2694

HBase DDL操作代码汇总(namespace+table CRUD操作)

注:如果出现无法连接到zookeeper等的相关错误,可以将以下代码打jar包,在HMaster节点上执行。具体效果可以通过web端进行查看,端口为60010,ip替换即可。将代码打包部署于HMaster的节点上,运行jar文件即可。2.hbase-site.xml(请参考自己的配置文件)DDL操作主要是关于命名空间和表格的内容增删改查。

wusuoweiieq的博客 1465
上一篇: HBase 安装 (Installation)
下一篇: HBase CRUD 操作指南 (二)
devalone
博客等级 码龄17年 108粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值