HBase 协处理器 (二)

Hbase 的三个应用 上述代码利用了 Hbase 的 checkAndMutate 功能,先检查 cust 是否存在,如果存在则返回 true ,用户需要被屏蔽,如果不存在,则返回 false ,并将用户插入到 Hbase table 中,整个过程是原子性的。在多个节点同时运行这段代码时,每个节点都可以生成一个唯一的序列号,以确保生成的序列号在整个分布式系统中是唯一的。在获取到锁之后,执行用户指定的函数,然后通过用户输入来释放锁的状态。它通过自旋操作来等待锁的释放,并尝试获取锁,以保证共享资源的访问的一致性和正确性。 阅读详情

继  HBase 协处理器 (一)
 

3.7 The RegionObserver Class


用于 region level, 注意,这个类的所有调用方法的第一个参数为 ObserverContext<RegionCoprocessorEnvironment> ctx8, 提供访问 context 实例。


操作可以被划分为两组: region 生命周期变化和客户端 API 调用。两种类型都有通用的回调操作:

    enum Operation {
        ANY, GET, PUT, DELETE, SCAN, APPEND, INCREMENT, SPLIT_REGION,
        MERGE_REGION, BATCH_MUTATE, REPLAY_BATCH_MUTATE, COMPACT_REGION
    }
    postStartRegionOperation(..., Operation operation)
    postCloseRegionOperation(..., Operation operation)

RegionObserver 中的这些方法在任何可能的 Operation 发生时被调用。


3.7.1 处理 region 生命周期事件 (Handling Region Life-Cycle Events)
-----------------------------------------------------------------------------------------------------------------------------------------
observer 可以钩入到 pending open, open, 和 pending close 状态变化。每一个钩子被框架隐式调用。


    ● State: pending open
    -------------------------------------------------------------------------------------------------------------------------------------
    region 要被打开时,处于这个状态。监听的协处理器可以搭载这个过程,或者使这个过程失效。为此,下列回调按次序调用:
    
        postLogReplay(...)
        
        preOpen(...)
        preStoreFileReaderOpen(...)
        postStoreFileReaderOpen(...)
        preWALRestore(...) / postWALRestore(...)
        postOpen(...)
    
    这些方法只在 region 打开之前被调用,在存储文件打开之前和之后调用,WAL 准备重放时调用,以及在打开 region 之后调用。用户自己的协处理器
    实现可以利用这些回调,例如,指示框架在 preOpen() 中,终止打开过程。或者钩入到 postOpen() 调用来触发一个缓存准备操作。
    
    第一个事件,postLogReplay() 的触发取决于 WAL 恢复模式(WAL recovery mode)的配置:分布式日志切分(distributed log splitting),或者日志重
    放(log replay),由 hbase.master.distributed.log.replay 属性配置。前者运行于一个 region 打开之前,因此会首先触发这个调用。后者打开一个
    region ,然后重放编辑日志,在 region 打开事件之后,触发该回调。

    在这两种模式中,但取决于哪一种模式是活动的, region server 从 write-ahead-log (WAL) 应用记录。因此按次序调用监听者的 preWALRestore()
    或 postWALRestore() 方法。在使用分布式日志切分模式下(distributed log splitting), 这会发生在 pending open 之后,但在 open state 之前。
    否则,该调用在 open 事件之后,因为日志被重放。钩入到 WAL 调用可以控制在日志重放过程中应用了什么数据操作(mutation).可以访问编辑日志(
    edit record), 可以用来观察应用了什么操作。

    
    ● State: open
    -------------------------------------------------------------------------------------------------------------------------------------
    当一个 region 被部署到一个 region 服务器上并且可以正常工作时,这个 region 被认为处于 open 状态。例如,region 的内存存储可以刷写到磁盘
    上,或者在 region 变得太大时可以被拆分。可能的钩子如下:
    
        preFlushScannerOpen(...)
        preFlush(...) / postFlush(...)
        preCompactSelection(...) / postCompactSelection(...)
        preCompactScannerOpen(...)
        preCompact(...) / postCompact(...)
        preSplit(...)
        preSplitBeforePONR(...)
        preSplitAfterPONR(...)
        postSplit(...)
        postCompleteSplit(...) / preRollBackSplit(...) / postRollBackSplit(...)

    这些方法名称上看都非常直接:pre 调用在各自的操作之前调用,而 post 调用在操作之后调用。例如,利用 preSplit() 钩子,可以有效地禁止内置
    的 region 拆分过程,并手动执行这些操作。有些调用只有 pre 钩子,有些则只有 post 钩子。
    
    flush, compact, 和 split 这三种类型的钩子直接连接到匹配 region 内部处理函数。也有一些更特殊的钩子,作为这三种函数的部分调用。例如,
    preFlushScannerOpen() 钩子在 memstore 设置的时候被调用,这只在刷写实际发生之前调用。

    类似地,对于压缩(compaction),首先服务器选择包含的文件,该功能被封装到协处理器回调中。之后存储扫描器打开,最后,实际的压缩发生。
    
    对于 split, 有几个回调反应当前的状态,通过一个状态之间特定的 point-of-no-return (PONR) 概念。这发生在 split process 开始之后,但在最后
    的动作发生之前。拆分的处理类似于一个内部的事务,当事务要提交时,preSplitBeforePONR() 被调用,而之后 preSplitAfterPONR() 被调用。也有
    对最终的 completed 或 rollback 的调用,通知用户 split 事务的结果。
    
    
    ● State: pending close
    -------------------------------------------------------------------------------------------------------------------------------------
    对于观察者的最后一组钩子是在 region 在进入 pending close 状态时调用的。这组调用在 region 从 open 变为 close 时发生。只是在 region 关闭
    之前和之后,执行如下钩子:
    
        preClose(..., boolean abortRequested)
        postClose(..., boolean abortRequested)

    abortRequested 参数指出一个 region 关闭的原因。通常情况下,region 正常操作关闭,如,由于负载均衡的原因,该 region 移动到一个不同的region
    server 上。但也有可能由于某个 region server 出了问题而终止这个 region 以避免影响任何一端的处理结果。当这类情况发生时,所有存储在该服务器
    上的 region 都会终止,用户可以通过这个给定的参数判断发生了什么情况。
    
除此之外,这个类也继承了 start() 和 stop() 方法,允许分配、释放生命周期资源。    


3.7.2 处理客户端 API 事件 (Handling Client API Events)
-----------------------------------------------------------------------------------------------------------------------------------------
与生命周期事件相对,所有客户端 API 调用显式地从客户端应用发送到 region 服务器。用户可以钩入到这些调用,在应用之前或之后回调。下表列出可用
的 API 调用和相关的回调方法:

    Callbacks for client API functions
    +-------------------------------+-------------------------------------------+--------------------------------------------
    | API Call                        | Pre-Hook                                    | Post-Hook
    +-------------------------------+-------------------------------------------+--------------------------------------------
    | Table.put()                    | prePut(...)                                | postPut(...)
    +-------------------------------+-------------------------------------------+--------------------------------------------
    | Table.checkAndPut()            | preCheckAndPut(...)                        | postPut(...)
    |                                | preCheckAndPutAfterRowLock(...)            | postCheckAndPut(...)
    |                                | prePut(...)                                |
    +-------------------------------+-------------------------------------------+--------------------------------------------
    | Table.get()                    | preGetOp(...)                                | postGetOp(...)
    +-------------------------------+-------------------------------------------+--------------------------------------------
    | Table.delete()                | preDelete(...)                            | postDelete(...)
    | Table.batch()                    | prePrepareTimeStampForDeleteVersion(...)    |
    +-------------------------------+-------------------------------------------+--------------------------------------------
    | Table.checkAndDelete()        | preCheckAndDelete(...)                    | postDelete(...)
    |                                | preCheckAndDeleteAfterRowLock(...)        | postCheckAndDelete(...)
    |                                | preDelete(...)                            |
    +-------------------------------+-------------------------------------------+--------------------------------------------
    | Table.mutateRow()                | preBatchMutate(...)                        | postBatchMutate(...)
    |                                | prePut(...)/preGetOp(...)                    | postPut(...)/postGetOp(...)
    |                                |                                            | postBatchMutateIndispensably()
    +-------------------------------+-------------------------------------------+--------------------------------------------
    | Table.append()                | preAppend(...)                            | postMutationBeforeWAL(...)
    |                                | preAppendAfterRowLock()                    | postAppend(...)
    +-------------------------------+-------------------------------------------+--------------------------------------------
    | Table.batch()                    | preBatchMutate(...)                        | postPut(...)/postGetOp(...)
    |                                | prePut(...)/preGetOp(...)/preDelete(...)    | postBatchMutate(...)
    |                                | prePrepareTimeStampForDeleteVersion(...)    |
    +-------------------------------+-------------------------------------------+--------------------------------------------
    | Table.checkAndMutate()        | preBatchMutate(...)                        | postBatchMutate(...)
    +-------------------------------+-------------------------------------------+--------------------------------------------
    | Table.getScanner()            | preScannerOpen(...)                        | postInstantiateDeleteTracker(...)        
    |                                | preStoreScannerOpen(...)                    | postScannerOpen(...)
    +-------------------------------+-------------------------------------------+--------------------------------------------
    | ResultScanner.next()            | preScannerNext(...)                        | postScannerFilterRow(...)
    |                                |                                            | postScannerNext(...)
    +-------------------------------+-------------------------------------------+--------------------------------------------
    | ResultScanner.close()            | preScannerClose(...)                        | postScannerClose(...)
    +-------------------------------+-------------------------------------------+--------------------------------------------
    | Table.increment(),            | preIncrement(...)                            | postMutationBeforeWAL(...)
    | Table.batch()                    | preIncrementAfterRowLock(...)                | postIncrement(...)
    +-------------------------------+-------------------------------------------+--------------------------------------------
    | Table.incrementColumnValue()    | preIncrementColumnValue(...)                | postIncrementColumnValue(...)
    +-------------------------------+-------------------------------------------+--------------------------------------------
    | Table.getClosestRowBefore()    | preGetClosestRowBefore(...)                | postGetClosestRowBefore(...)
    +-------------------------------+-------------------------------------------+--------------------------------------------
    | Table.exists()                | preExists(...)                            | postExists(...)
    +-------------------------------+-------------------------------------------+--------------------------------------------
    | completebulkload (tool)        | preBulkLoadHFile(...)                        | postBulkLoadHFile(...)
    +-------------------------------+-------------------------------------------+--------------------------------------------


上表中列出的事件是有顺序的,如果有多个事件发生,发生的顺序从上至下。斜线 "/" 表示可能发生的事件为多个事件中的一个,具体会是哪个事件,
取决于调用中具体包含的操作。各个事件回调方法的详细信息参考 API 文档或源代码。

示例: Observer collecting invocation statistics

@SuppressWarnings("deprecation") // because of API usage
public class ObserverStatisticsEndpoint
extends ObserverStatisticsProtos.ObserverStatisticsService
implements Coprocessor, CoprocessorService, RegionObserver {

    private RegionCoprocessorEnvironment env;
    private Map<String, Integer> stats = new LinkedHashMap<>();
    
    // Lifecycle methods
    @Override
    public void start(CoprocessorEnvironment env) throws IOException {
        if (env instanceof RegionCoprocessorEnvironment) {
            this.env = (RegionCoprocessorEnvironment) env;
        } else {
            throw new CoprocessorException("Must be loaded on a table region!");
        }
    }
    ...
    
    // Endpoint methods
    @Override
    public void getStatistics(RpcController controller,
    ObserverStatisticsProtos.StatisticsRequest request,
    RpcCallback<ObserverStatisticsProtos.StatisticsResponse> done) {
        
        ObserverStatisticsProtos.StatisticsResponse response = null;
        try {
            ObserverStatisticsProtos.StatisticsResponse.Builder builder =
            ObserverStatisticsProtos.StatisticsResponse.newBuilder();
            ObserverStatisticsProtos.NameInt32Pair.Builder pair =
            ObserverStatisticsProtos.NameInt32Pair.newBuilder();
            for (Map.Entry<String, Integer> entry : stats.entrySet()) {
                pair.setName(entry.getKey());
                pair.setValue(entry.getValue().intValue());
                builder.addAttribute(pair.build());
            }
            response = builder.build();
            // optionally clear out stats
            if (request.hasClear() && request.getClear()) {
                synchronized (stats) {
                    stats.clear();
                }
            }
        } catch (Exception e) {
            ResponseConverter.setControllerException(controller, new IOException(e));
        }
        done.run(response);
    }
    
    /**
    * Internal helper to keep track of call counts.
    *
    * @param call The name of the call.
    */
    private void addCallCount(String call) {
        synchronized (stats) {
            Integer count = stats.get(call);
            if (count == null) count = new Integer(1);
            else count = new Integer(count + 1);
            stats.put(call, count);
        }
    }
    
    // All Observer callbacks follow here
    @Override
    public void preOpen(ObserverContext<RegionCoprocessorEnvironment> observerContext) throws IOException {
        addCallCount("preOpen");
    }
    
    @Override
    public void postOpen(ObserverContext<RegionCoprocessorEnvironment> observerContext) {
        addCallCount("postOpen");
    }
    ...
}



3.7.3 The RegionCoprocessorEnvironment Class
-----------------------------------------------------------------------------------------------------------------------------------------
提供给实现 RegionObserver 接口的协处理器的环境实例基于 RegionCoprocessorEnvironment 类,该类实现 CoprocessorEnvironment 接口。除了已提供的
方法,RegionCoprocessorEnvironment 还提供了一些特殊的,面向 region 子类的方法,如下表所示:

    Specific methods provided by the RegionCoprocessor Environment class
    +---------------------------+---------------------------------------------------------------------------------------+
    | Method                    | Description                                                                            |
    +---------------------------+---------------------------------------------------------------------------------------+
    | getRegion()                | Returns a reference to the region the current observer is associated with.            |
    +---------------------------+---------------------------------------------------------------------------------------+
    | getRegionInfo()            | Get information about the region associated with the current coprocessor instance.    |
    +---------------------------+---------------------------------------------------------------------------------------+
    | getRegionServerServices()    | Provides access to the shared RegionServerServices instance.                            |
    +---------------------------+---------------------------------------------------------------------------------------+
    | getSharedData()            | All the shared data between the instances of this coprocessor                            |
    +---------------------------+---------------------------------------------------------------------------------------+

getRegion() 调用可用于获取存本机上的 HRegion 实例的引用,并可以调用 HRegion 类提供的方法。如果需要有关该 region 的信息,可以调用
getRegionInfo() 来获取 HRegionInfo 实例。此类有非常有用的方法可以获取所包含的 key 的访问,region 的名称,以及状态标志:

    byte[] getStartKey()
    byte[] getEndKey()
    byte[] getRegionName()
    boolean isSystemTable()
    int getReplicaId()
    ...
        
另外,用户代码可以访问共享的 region server 服务实例,通过调用 getRegionServerServices() 方法并返回 RegionServerServices 实例。该类提供了
很多高级方法,如下表所示:    
    
    Methods provided by the RegionServerServices class
    +-------------------------------+-----------------------------------------------------------------------------------------
    | Method                        | Description
    +-------------------------------+-----------------------------------------------------------------------------------------
    | abort()                        | Allows aborting the entire server process, shutting down the instance with the given reason.
    +-------------------------------+-----------------------------------------------------------------------------------------
    | addToOnlineRegions()            | Adds a given region to the list of online regions. This is used for internal bookkeeping.
    +-------------------------------+-----------------------------------------------------------------------------------------
    | getCompactionRequester()        | Provides access to the shared CompactionRequestor instance. This can be used to initiate
    |                                | compactions from within the coprocessor.
    +-------------------------------+-----------------------------------------------------------------------------------------
    | getConfiguration()            | Returns the current server configuration.
    +-------------------------------+-----------------------------------------------------------------------------------------
    | getConnection()                | Provides access to the shared connection instance.
    +-------------------------------+-----------------------------------------------------------------------------------------
    | getCoordinatedStateManager()    | Access to the shared state manager, gives access to the TableStateManager, which in turn can
    |                                | be used to check on the state of a table
    +-------------------------------+-----------------------------------------------------------------------------------------
    | getExecutorService()            | Used by the master to schedule system-wide events.
    +-------------------------------+-----------------------------------------------------------------------------------------
    | getFileSystem()                | Used by the master to schedule system-wide events.
    +-------------------------------+-----------------------------------------------------------------------------------------
    | getFlushRequester()            | Provides access to the shared FlushRequester instance. This can be used to initiate memstore flushes.
    +-------------------------------+-----------------------------------------------------------------------------------------
    | getFromOnlineRegions()        | Returns a HRegion instance for a given region, must be hosted by same server
    +-------------------------------+-----------------------------------------------------------------------------------------
    | getHeapMemoryManager()        | Provides access to a manager instance, gives access to heap related information, such as occupancy.
    +-------------------------------+-----------------------------------------------------------------------------------------
    | getLeases()                    | Returns the list of leases, as acquired for example by client side scanners.
    +-------------------------------+-----------------------------------------------------------------------------------------
    | getMetaTableLocator()            | The method returns a class providing system table related functionality.
    +-------------------------------+-----------------------------------------------------------------------------------------
    | getNonceManager()                | Gives access to the nonce manager, which is used to generate unique IDs.
    +-------------------------------+-----------------------------------------------------------------------------------------
    | getOnlineRegions()            | Lists all online regions on the current server for a given table.
    +-------------------------------+-----------------------------------------------------------------------------------------
    | getRecoveringRegions()        | Lists all regions that are currently in the process of replaying WAL entries.
    +-------------------------------+-----------------------------------------------------------------------------------------
    | getRegionServerAccounting()    | Provides access to the shared RegionServerAccounting instance. It allows you to check on what
    |                                | the server currently has allocated—for example, the global memstore size.
    +-------------------------------+-----------------------------------------------------------------------------------------
    | getRegionsInTransitionInRS()    | List of regions that are currently in-transition.
    +-------------------------------+-----------------------------------------------------------------------------------------
    | getRpcServer()                | Returns a reference to the low-level RPC implementation instance
    +-------------------------------+-----------------------------------------------------------------------------------------
    | getServerName()                | The server name, which is unique for every region server process.
    +-------------------------------+-----------------------------------------------------------------------------------------
    | getTableLockManager()            | Gives access to the lock manager. Can be used to acquire read and write locks for the entire table.
    +-------------------------------+-----------------------------------------------------------------------------------------
    | getWAL()                        | Provides access to the write-ahead log instance.
    +-------------------------------+-----------------------------------------------------------------------------------------
    | getZooKeeper()                | Returns a reference to the ZooKeeper watcher instance.
    +-------------------------------+-----------------------------------------------------------------------------------------
    | isAborted()                    | Flag is true when abort() was called previously
    +-------------------------------+-----------------------------------------------------------------------------------------
    | isStopped()                    | Returns true when stop() (inherited from Stoppable) was called beforehand
    +-------------------------------+-----------------------------------------------------------------------------------------
    | isStopping()                    | Returns true when the region server is stopping.
    +-------------------------------+-----------------------------------------------------------------------------------------
    | postOpenDeployTasks()            | Called by the region server after opening a region, does internal housekeeping work.
    +-------------------------------+-----------------------------------------------------------------------------------------
    | registerService()                | Registers a new custom service. Called when server starts and coprocessors are loaded.
    +-------------------------------+-----------------------------------------------------------------------------------------
    | removeFromOnlineRegions()        | Removes a given region from the internal list of online regions.
    +-------------------------------+-----------------------------------------------------------------------------------------
    | reportRegionStateTransition()    | Triggers a report chain when a state change is needed for a region. Sent to the Master
    +-------------------------------+-----------------------------------------------------------------------------------------
    | stop()                        | Stops the server gracefully
    +-------------------------------+-----------------------------------------------------------------------------------------


没有必要自己实现 RegionObserver 接口,基于这个接口,可以利用 BaseRegionObserver 类来只实现所需要回调方法。


3.7.4 The BaseRegionObserver Class
-----------------------------------------------------------------------------------------------------------------------------------------
这个类可用作观察者类型协处理器的基类。它有 RegionObserver 接口要求的所有方法的空实现,因此默认什么有不做。必须重写所有感兴趣的回调来添加
自己的功能。

示例: Example region observer checking for special get requests

    public static final byte[] FIXED_ROW = Bytes.toBytes("@@@GETTIME@@@");
    
    @Override
    public void preGetOp(ObserverContext<RegionCoprocessorEnvironment> e, Get get, List<Cell> results) throws IOException {
        //Check if the request row key matches a well known one.
        if (Bytes.equals(get.getRow(), FIXED_ROW)) {
                Put put = new Put(get.getRow());
                put.addColumn(FIXED_ROW, FIXED_ROW,
                Bytes.toBytes(System.currentTimeMillis()));
                CellScanner scanner = put.cellScanner();
                scanner.advance();
                Cell cell = scanner.current();
                results.add(cell);
            }
        }
    }

    
    NOTE
    -------------------------------------------------------------------------------------------------------------------------------------
    将如下属性添加到 hbase-site.xml 配置文件以启用这个协处理器

        <property>
            <name>hbase.coprocessor.user.region.classes</name>
            <value>coprocessor.RegionObserverExample</value>
        </property>

    


3.8 The MasterObserver Class
-----------------------------------------------------------------------------------------------------------------------------------------
讨论 Coprocessor 的第二个子类是为了处理 master server 启动的所有回调方法。它们被划归为数据定义操作(data-manipulation operations), 类似于
关系数据库系统中的 DDL。MasterObserver 类提供如下钩子:

    Callbacks for master API functions
    +-------------------------------+-----------------------+-----------------------------------+-------------------------------
    | API Call                        | Shell Call            | Pre-Hook                            | Post-Hook
    +-------------------------------+-----------------------+-----------------------------------+-------------------------------
    | createTable()                    | create                | preCreateTable(...)                | postCreateTable(...)
    |                                |                        | preCreateTableHandler(...)        |
    +-------------------------------+-----------------------+-----------------------------------+-------------------------------
    | deleteTable()                    | drop                    | preDeleteTable(...)                | postDeleteTableHandler(...),
    | deleteTables()                |                        | preDeleteTableHandler(...)        | postDeleteTable(...)
    +-------------------------------+-----------------------+-----------------------------------+-------------------------------
    | modifyTable()                    | alter                    | preModifyTable(...)                | postModifyTableHandler(...),
    |                                |                        | preModifyTableHandler(...)        | postModifyTable(...)
    +-------------------------------+-----------------------+-----------------------------------+-------------------------------
    | modifyTable()                    | alter                    | preAddColumn(...)                    | postAddColumnHandler(...),
    |                                |                        | preAddColumnHandler(...)            | postAddColumn(...)
    +-------------------------------+-----------------------+-----------------------------------+-------------------------------
    | modifyTable()                    | alter                    | preDeleteColumn(...)                | postDeleteColumnHandler(...),
    |                                |                        | preDeleteColumnHandler(...)        | postDeleteColumn(...)
    +-------------------------------+-----------------------+-----------------------------------+-------------------------------
    | modifyTable()                    | alter                    | preModifyColumn(...)                | postModifyColumnHandler(...),
    |                                |                        | preModifyColumnHandler(...)        | postModifyColumn(...)
    +-------------------------------+-----------------------+-----------------------------------+-------------------------------
    | enableTable()                    | enable                | preEnableTable(...)                | postEnableTableHandler(...),
    | enableTables()                |                        | preEnableTableHandler(...)        | postEnableTable(...)
    +-------------------------------+-----------------------+-----------------------------------+-------------------------------
    | disableTable()                | disable                | preDisableTable(...),                | postDisableTableHandler(...),
    | disableTables()                |                        | preDisableTableHandler(...)        | postDisableTable(...)
    +-------------------------------+-----------------------+-----------------------------------+-------------------------------
    | flush()                        | flush                    | preTableFlush(...)                | postTableFlush(...)
    +-------------------------------+-----------------------+-----------------------------------+-------------------------------
    | truncateTable()                | truncate                | preTruncateTable(...)                | postTruncateTableHandler(...),
    |                                |                        | preTruncateTableHandler(...)        | postTruncateTable(...)
    +-------------------------------+-----------------------+-----------------------------------+-------------------------------
    | move()                        | move                    | preMove(...)                        | postMove(...)
    +-------------------------------+-----------------------+-----------------------------------+-------------------------------
    | assign()                        | assign                | preAssign(...)                    | postAssign(...)
    +-------------------------------+-----------------------+-----------------------------------+-------------------------------
    | unassign()                    | unassign                | preUnassign(...)                    | postUnassign(...)
    +-------------------------------+-----------------------+-----------------------------------+-------------------------------
    | offline()                        | n/a                    | preRegionOffline(...)                | postRegionOffline(...)
    +-------------------------------+-----------------------+-----------------------------------+-------------------------------
    | balancer()                    | balancer                | preBalance(...)                    | postBalance(...)
    +-------------------------------+-----------------------+-----------------------------------+-------------------------------
    | setBalancerRunning()            | balance_switch        | preBalanceSwitch(...)                | postBalanceSwitch(...)
    +-------------------------------+-----------------------+-----------------------------------+-------------------------------
    | listTableNames()                | list                    | preGetTableNames(...)                | postGetTableNames(...)
    +-------------------------------+-----------------------+-----------------------------------+-------------------------------
    | getTableDescriptors()         | list                    | preGetTableDescriptors(...)        | postGetTableDescriptors(...)
    | listTables()                    |                        |                                    |
    +-------------------------------+-----------------------+-----------------------------------+-------------------------------
    | createNamespace()                | create_namespace        | preCreateNamespace(...)            | postCreateNamespace(...)
    +-------------------------------+-----------------------+-----------------------------------+-------------------------------
    | deleteNamespace()                | drop_namespace        | preDeleteNamespace(...)            | postDeleteNamespace(...)
    +-------------------------------+-----------------------+-----------------------------------+-------------------------------
    | getNamespaceDescriptor()        | describe_namespace    | preGetNamespaceDescriptor(...)    | postGetNamespaceDescriptor(...)
    +-------------------------------+-----------------------+-----------------------------------+-------------------------------
    | listNamespaceDescriptors()    | list_namespace        | preListNamespaceDescriptors(...)    | postListNamespaceDescriptors(...)
    +-------------------------------+-----------------------+-----------------------------------+-------------------------------
    | modifyNamespace()                | alter_namespace        | preModifyNamespace(...)            | postModifyNamespace(...)
    +-------------------------------+-----------------------+-----------------------------------+-------------------------------
    | cloneSnapshot()                | clone_snapshot        | preCloneSnapshot(...)                | postCloneSnapshot(...)
    +-------------------------------+-----------------------+-----------------------------------+-------------------------------
    | deleteSnapshot(),             | delete_snapshot        | preDeleteSnapshot(...)            | postDeleteSnapshot(...)
    | deleteSnapshots()                | delete_all_snapshot    |                                    |
    +-------------------------------+-----------------------+-----------------------------------+-------------------------------
    | restoreSnapshot()                | restore_snapshot        | preRestoreSnapshot(...)            | postRestoreSnapshot(...)
    +-------------------------------+-----------------------+-----------------------------------+-------------------------------
    | snapshot()                    | snapshot                | preSnapshot(...)                    | postSnapshot(...)
    +-------------------------------+-----------------------+-----------------------------------+-------------------------------
    | shutdown()                    | n/a                    | preShutdown(...)                    | n/a
    +-------------------------------+-----------------------+-----------------------------------+-------------------------------
    | stopMaster()                    | n/a                    | preStopMaster(...)                | n/a
    +-------------------------------+-----------------------+-----------------------------------+-------------------------------
    | n/a                            | n/a                    | preMasterInitialization(...)        | postStartMaster(...)
    +-------------------------------+-----------------------+-----------------------------------+------------------------------



3.8.1 The MasterCoprocessorEnvironment Class
-----------------------------------------------------------------------------------------------------------------------------------------
类似于 RegionCoprocessorEnvironment, 与 RegionObserver 协处理器紧紧关联,MasterCoprocessorEnvironment 封装到 MasterObserver 实例中。它也
实现 CoprocessorEnvironment 接口,如此,例如可以在自己的实现中通过 getTable() 调用访问数据。除了 CoprocessorEnvironment 接口提供的方法,也
提供了一些特殊的,面向 master 子类的方法,如下表所示:

    Specific method provided by the MasterCoprocessorEnvironment class
    +---------------------------+---------------------------------------------------------------------------------------+
    | Method                    | Description                                                                            |
    +---------------------------+---------------------------------------------------------------------------------------+
    | getMasterServices()        | Provides access to the shared MasterServices instance                                    |
    +---------------------------+---------------------------------------------------------------------------------------+

用户代码中可以访问共享的 master services 实例,该服务类公开了很多 Master admin API, 大致分类如下:
    
table 相关的方法:
    createTable(HTableDescriptor, byte[][])
    deleteTable(TableName)
    modifyTable(TableName, HTableDescriptor)
    enableTable(TableName)
    disableTable(TableName)
    getTableDescriptors()
    truncateTable(TableName, boolean)
    addColumn(TableName, HColumnDescriptor)
    deleteColumn(TableName, byte[])
    modifyColumn(TableName, HColumnDescriptor)
 
namespace 相关的方法:
    createNamespace(NamespaceDescriptor)
    deleteNamespace(String)
    modifyNamespace(NamespaceDescriptor)
    getNamespaceDescriptor(String)
    listNamespaceDescriptors()
    listTableDescriptorsByNamespace(String)
    listTableNamesByNamespace(String)

下表列出更特定的方法及其简短描述:

    Methods provided by the MasterServices class
    +-----------------------------------+-------------------------------------------------------------------------------------
    | Method                            | Description
    +-----------------------------------+-------------------------------------------------------------------------------------
    | abort()                            | Allows aborting the entire server process, shutting down the instance with the given reason.
    +-----------------------------------+-------------------------------------------------------------------------------------
    | checkTableModifiable()            | Convenient to check if a table exists and is offline so that it can be altered.
    +-----------------------------------+-------------------------------------------------------------------------------------
    | dispatchMergingRegions()            | Flags two regions to be merged, which is performed on the region servers.
    +-----------------------------------+-------------------------------------------------------------------------------------
    | getAssignmentManager()            | Gives you access to the assignment manager instance. It is responsible for all region
    |                                    | assignment operations, such as assign, unassign, balance, and so on
    +-----------------------------------+-------------------------------------------------------------------------------------
    | getConfiguration()                | Returns the current server configuration.
    +-----------------------------------+-------------------------------------------------------------------------------------
    | getConnection()                    | Provides access to the shared connection instance.
    +-----------------------------------+-------------------------------------------------------------------------------------
    | getCoordinatedStateManager()        | Access to the shared state manager, gives access to the TableStateManager, which in turn
    |                                    | can be used to check on the state of a table
    +-----------------------------------+-------------------------------------------------------------------------------------
    | getExecutorService()                | Used by the master to schedule system-wide events
    +-----------------------------------+-------------------------------------------------------------------------------------
    | getMasterCoprocessorHost()        | Returns the enclosing host instance.
    +-----------------------------------+-------------------------------------------------------------------------------------
    | getMasterFileSystem()                | Provides you with an abstraction layer for all filesystem-related operations the master is
    |                                    | involved in—for example, creating directories for table files and logfiles.
    +-----------------------------------+-------------------------------------------------------------------------------------
    | getMetaTableLocator()                | The method returns a class providing system table related functionality.
    +-----------------------------------+-------------------------------------------------------------------------------------
    | getServerManager()                | Returns the server manager instance. With it you have access to the list of servers, live or
    |                                    | considered dead, and more
    +-----------------------------------+-------------------------------------------------------------------------------------
    | getServerName()                    | The server name, which is unique for every region server process
    +-----------------------------------+-------------------------------------------------------------------------------------
    | getTableLockManager()                | Gives access to the lock manager. Can be used to acquire read and write locks for the entire table.
    +-----------------------------------+-------------------------------------------------------------------------------------
    | getZooKeeper()                    | Returns a reference to the ZooKeeper watcher instance
    +-----------------------------------+-------------------------------------------------------------------------------------
    | isAborted()                        | Flag is true when abort() was called previously
    +-----------------------------------+-------------------------------------------------------------------------------------
    | isInitialized()                    | After the server process is operational, this call will return true.
    +-----------------------------------+-------------------------------------------------------------------------------------
    | isServerShutdownHandlerEnabled()    | When an optional shutdown handler was set, this check returns true.
    +-----------------------------------+-------------------------------------------------------------------------------------
    | isStopped()                        | Returns true when stop() (inherited from Stoppable) was called beforehand.
    +-----------------------------------+-------------------------------------------------------------------------------------
    | registerService()                    | Registers a new custom service. Called when server starts and coprocessors are loaded
    +-----------------------------------+-------------------------------------------------------------------------------------
    | stop()                            | Stops the server gracefully
    +-----------------------------------+-------------------------------------------------------------------------------------


3.8.2 The BaseMasterObserver Class
-----------------------------------------------------------------------------------------------------------------------------------------
用户可以凭自己的能力直接实现 MasterObserver 接口,或继承 BaseMasterObserver 类来实现。BaseMasterObserver 实现了 MasterObserver 接口,只是
所有的回调都为空实现。如果直接使用这个类,不会有任何实际的交互反应。

通过重写适当的事件回调方法,可以添加其它功能。可以将自己的代码钩入到 pre 或 post 回调方法中。下面示例利用 post 钩子在一个 table 创建之后
执行额外的任务。

示例: Example master observer that creates a separate directory on the file system when a table is created.

public class MasterObserverExample extends BaseMasterObserver {
    
    @Override
    public void postCreateTable(ObserverContext<MasterCoprocessorEnvironment> ctx, HTableDescriptor desc, HRegionInfo[] regions)
        throws IOException {
        
        TableName tableName = desc.getTableName();
        MasterServices services = ctx.getEnvironment().getMasterServices();
        MasterFileSystem masterFileSystem = services.getMasterFileSystem();
        FileSystem fileSystem = masterFileSystem.getFileSystem();
        Path blobPath = new Path(tableName.getQualifierAsString() + "-
        blobs");
        fileSystem.mkdirs(blobPath);
    }
}

    NOTE
    -------------------------------------------------------------------------------------------------------------------------------------
    将如下属性添加到 hbase-site.xml 配置文件以在 master 进程启动时载入这个协处理器
        <property>
            <name>hbase.coprocessor.master.classes</name>
            <value>coprocessor.MasterObserverExample</value>
        </property
    
    修改后,重启 HBase 以使配置生效。

一旦激活了这个协处理器,它会在关注的事件上监听,并自动触发用户代码的执行。

可以使用如下 shell 命令触发事件:
    hbase(main):001:0> create 'testtable3', 'colfam1'
    0 row(s) in 0.6740 seconds

创建了一个表,随后会调用协处理器的 postCreateTable() 方法,通过 Hadoop 命令行工具验证结果:

    $ bin/hadoop dfs -ls
    Found 1 items
    drwxr-xr-x - larsgeorge supergroup 0 ... testtable3-
    blobs


3.8.3 The BaseMasterAndRegionObserver Class
-----------------------------------------------------------------------------------------------------------------------------------------
HBase 还提供了另外一个相关的基类,BaseMasterAndRegionObserver. 它联合了 BaseRegionObserver 类 和 MasterObserver 接口。

    public abstract class BaseMasterAndRegionObserver
        extends BaseRegionObserver implements MasterObserver {
    ...
    }

在效果上,它像是组合了 BaseRegionObserver 和 BaseRegionObserver 为一个类。由于这个类提供了一个 region server 和 master server 实现,因此
只用于运行在 HBase Master 上。这对将系统表直接放在 master 上有用。


3.9 The RegionServerObserver Class
-----------------------------------------------------------------------------------------------------------------------------------------
这个类是 region 服务器级别的,它公开了与服务器功能相关联的定义良好的钩子方法,也就是说,它们是跨多个 region 和 table 的。钩子方法如下:


    ● postCreateReplicationEndPoint(...)
    -------------------------------------------------------------------------------------------------------------------------------------
    在服务器创建了一个 replication endpoint (不要与 coprocessor endpoint 混淆)之后调用。


    ● preMerge(...), postMerge(...)
    -------------------------------------------------------------------------------------------------------------------------------------
    两个 region 合并时调用


    ● preMergeCommit(...), postMergeCommit(...)
    -------------------------------------------------------------------------------------------------------------------------------------
    与上面的相同,但更小的作用域。在 preMerge() 之后和 postMerge() 之前调用。


    ● preRollBackMerge(...), postRollBackMerge(...)
    -------------------------------------------------------------------------------------------------------------------------------------
    这两个方法在一个 region 合并失败,并且合并事务回滚时被调用。


    ● preReplicateLogEntries(...), postReplicateLogEntries(...)
    -------------------------------------------------------------------------------------------------------------------------------------
    关联到 WAL 项重放过程,可以对每一个日志项进行特殊的处理。


    ● preRollWALWriterRequest(...), postRollWALWriterRequest(...)
    -------------------------------------------------------------------------------------------------------------------------------------
    关联到 WAL 文件回滚,基于文件大小,时间,或手工请求时调用



    ● preStopRegionServer(...)
    -------------------------------------------------------------------------------------------------------------------------------------
    这是个 pre-only 的钩子,当继承自 Stoppable 接口的 stop() 方法调用时被调用。



3.9.1 The RegionServerCoprocessorEnvironment Class
-----------------------------------------------------------------------------------------------------------------------------------------
也实现 CoprocessorEnvironment 接口,因此可以在自己的实现中访问 getTable() 调用以访问数据。除 CoprocessorEnvironment 提供的方法,也提供了
面向 server 的方法:

    Specific method provided by the RegionServerCoprocessorEnvironment class
    +-----------------------------------+-------------------------------------------------------------------------------------
    | Method                            | Description
    +-----------------------------------+-------------------------------------------------------------------------------------
    | getRegionServerServices()            | Provides access to the shared RegionServerServices instance.
    +-----------------------------------+-------------------------------------------------------------------------------------


3.9.2 The BaseRegionServerObserver Class
-----------------------------------------------------------------------------------------------------------------------------------------
RegionServerObserver 接口的空实现,继承该类,可以将精力集中在真正需要处理的问题上,只重写必要的方法,简化实现。




3.10 The WALObserver Class
-----------------------------------------------------------------------------------------------------------------------------------------
与 write-ahead log(WAL for short) 相关的观察者类。它提供了易于处理的回调,如下:

    preWALWrite(...), postWALWrite(...)
    
封装了正在写入到 WAL 的 log  entry, 允许访问全部编辑记录。因为可以在这两个方法上接收到整个日志记录,因此用户代码可以影响写入日志的内容。
例如,在一些高级应用场景,可以向日志编辑记录添加额外的 cell, 这样在日志重放时,这个额外的 cell 可以帮助微调数据重建过程。


3.10.1 The WALCoprocessorEnvironment Class
-----------------------------------------------------------------------------------------------------------------------------------------
作为回调的一部分提供的环境,这里是 WALCoprocessorEnvironment 实例,它也扩展自 CoprocessorEnvironment,因此也可以在自己的实现代码中通过
getTable() 方法访问数据。

    Specific method provided by the WALCoprocessorEnvironment class
    +-----------------------------------+-------------------------------------------------------------------------------------
    | Method                            | Description
    +-----------------------------------+-------------------------------------------------------------------------------------
    | getWAL()                            | Provides access to the shared WAL instance.
    +-----------------------------------+-------------------------------------------------------------------------------------

利用 WAL 的引用,可以滚动当前的写入器,换句话说,关闭当前的日志文件,并创建一个新的日志文件。也可以调用 sync() 方法来强制编辑
日志写入到持久层。下面是 WAL 接口提供的方法:

    void registerWALActionsListener(final WALActionsListener listener)
    boolean unregisterWALActionsListener(final WALActionsListener listener)
    byte[][] rollWriter() throws FailedLogCloseException, IOException
    byte[][] rollWriter(boolean force) throws FailedLogCloseException, IOException
    void shutdown() throws IOException
    void close() throws IOException
    long append(HTableDescriptor htd, HRegionInfo info, WALKey key, WALEdit edits,
    AtomicLong sequenceId, boolean inMemstore, List<Cell> memstoreKVs)throws IOException
    void sync() throws IOException
    void sync(long txid) throws IOException
    boolean startCacheFlush(final byte[] encodedRegionName)
    void completeCacheFlush(final byte[] encodedRegionName)
    void abortCacheFlush(byte[] encodedRegionName)
    WALCoprocessorHost getCoprocessorHost()
    long getEarliestMemstoreSeqNum(byte[] encodedRegionName)

这些都是非常底层的方法,详细信息参考 API 文档


3.10.2 The BaseWALObserver Class
-----------------------------------------------------------------------------------------------------------------------------------------
BaseWALObserver 类实现 WALObserver 接口,用户可以继承这个类,或者直接实现接口。




3.11 The BulkLoadObserver Class
-----------------------------------------------------------------------------------------------------------------------------------------
这个观察者类用于在 bulk loading 操作期间,由 HBase 提供的 completebulkload 工具触发。包含在服务器 JAR 文件中。使用 Hadoop JAR 支持,可以
查看工具列表:

    bin/hadoop jar /usr/local/hbase-1.0.0-bin/lib/hbaseserver-1.0.0.jar
    An example program must be given as the first argument.
    Valid program names are:
    CellCounter: Count cells in HBase table
    completebulkload: Complete a bulk data load.
    copytable: Export a table from local cluster to peer cluster
    export: Write table data to HDFS.
    import: Import data written by Export.
    importtsv: Import data in TSV format.
    rowcounter: Count rows in HBase table
    verifyrep: Compare the data from tables in two different clusters.
    WARNING: It doesn't work for incrementColumnValues'd cells since the timestamp is changed after being appended to the log.

一旦 completebulkload 工具运行,它会尝试将所有分阶段的 bulk 载入。在此操作期间,触发可用的回调:

    
    prePrepareBulkLoad(...)
    -------------------------------------------------------------------------------------------------------------------------------------
    在 bulk load 操作发生之前调用.

    
    preCleanupBulkLoad(...)
    -------------------------------------------------------------------------------------------------------------------------------------
    当 bulk load 完成并且执行清除任务时调用。



3.12 The EndPointObserver Class
-----------------------------------------------------------------------------------------------------------------------------------------
这个类没有自己的环境,使用共享的 RegionCoprocessorEnvironment, 这很容易理解,因为 endpoint 运行在一个 region 的 context 中。

可用的回调方法如下:

    preEndpointInvocation(...), postEndpointInvocation(...)
    
当一个 endpoint 方法从客户端调用时触发,这些回调封装了客户端的执行。

客户端可以替换(对于 pre 钩子) 或修改 (对于 post 钩子)给定的 Message 实例来修改 endpoint 方法的输出结果。如果在 pre 钩子调用期间发生了异常,
那么服务器端的调用完全终止。
 

(本篇完)

 

系列目录:

    HBase 协处理器 (一)

    HBase 协处理器 (二)
 

参考:

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

HBase的协处理器编码实战 简要介绍HBase协处理器的用途及分类,并通过代码实例演示了HBase协处理器的基本使用方法。 阅读详情

相关推荐

2023年5月青少年软件编程Python等级考试四级真题(含答案和解析)

电子学会,2023年5月,青少年软件编程,Python等级考试,四级真题(含答案和解析)

m0_37554648的博客 905

【HBase高级】4. HBase协处理器(Coprocessor)

本文先对Bulk load 银行转账记录海量冷数据存储案例做个结尾,而后介绍第三部分:HBase协处理器(Coprocessor)。

优快云GuoYuying的博客 822

【学习体会】Lighttools8.4.0:简单光学系统实例

添加球型光源(SphereSource)和表面接收器: 对光线模拟的参数进行设置: 光线追踪-模拟输入 要追踪的光线总数,决定模拟的准确度,总数越多,准确度越高,当然耗时更多 预览光线数量是模拟之后可以看到的示意光线(黑线),一般是100~1000,随意设置 点击,开始模拟: (模拟结果) 如果光线太多,则会出现,可以看到剩余时间 照度分析: 分析-照度显示-光栅图表 ...

LeonJin的博客 1万+

Hbase 协处理器

介绍了Hbase 协处理器,并使用代码进行了演示

凉茶铺的博客 897

(论文加源码)基于CNN和LSTM的脑电情绪识别(数据集为DEAP和seed)

论文及源码见个人主页:https://download.csdn.net/download/qq_45874683/84118637?spm=1001.2014.3001.5503 (论文加源码)基于CNN和LSTM的脑电情绪识别(数据集为DEAP和seed)4D-CRNN 目录 目录: 运行过程: 1. 运行1D文件(没有什么bug): 2. 再运行3D文件(没有出现bug): 3. 最后运行main文件(出现了两个bug)(前提需要配置好tensorflow的框架): 第一个bug是..

qq_45874683的博客 6366

【数据集】CAMS 全球生物质燃烧排放 GFAS(基于火灾辐射功率)

CAMS 全球生物质燃烧排放 GFAS(基于火灾辐射功率)

WW、forever的博客 402

HBase客户端的批量写缓存BufferedMutator

BufferedMutator是什么?又应该如何实现呢?

five小点心的博客 2268

2025 提高电力交易价格预测的疾风大模型方法综述

电力现货市场价格预测正转向大模型驱动的新范式。传统方法在极端波动、政策突变等场景下表现不佳,而Transformer、预训练时序模型(如Chronos-Bolt)和LLM混合框架展现出显著优势。关键技术包括多模态数据融合、两段式预训练微调、MoE架构和LLM-RAG增强解释性。案例显示,澳大利亚NSW市场误差降低43%,但混合模型路由仍必要。未来趋势涵盖数字孪生电网和多智能体竞价,需平衡模型创新与行业合规要求。大模型通过跨域学习与业务耦合提升预测,但需持续优化数据隐私、算力消耗和极端事件应对能力。

专注AI大模型,软件混淆,授权 1055

Hbase缓存读写优化

Hbase二级缓存

momo898821的博客 1645

EndNote导入文献出现带有大括号{}乱码的解决办法

进入word中的Endnote工具栏——Bibliography Preferences(位于Bibliography区块的右下角),就是那个输入杂志名的小三角形,在Temporary citation delimiters处修改变量的默认符号。将默认的大括号{}修改为文章中不回使用到的符号。原因:因为Endnote插入的参考文献在Word中的代码就是以大括号隔开的,当文章中出现了该符号,endnote就会自动比对Library中的书目,而此时endnote出现错误。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 4万+

YoloV8优化:感受野注意力卷积运算(RFAConv),效果秒杀CBAM和CA等 | 即插即用系列

感受野注意力卷积运算(RFAConv),解决卷积块注意力模块(CBAM)和协调注意力模块(CA)只关注空间特征,不能完全解决卷积核参数共享的问题

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 4266

hbase 2.1.5利用协处理器同步新增数据到ES填坑记录

1.hbase-site.xml配置文件必须添加<property> <name>hbase.coprocessor.abortonerror</name> <value>false</value> </property>,防止因协处理器启动失败,导致regionServer挂掉,从而导致hbase崩溃。 2.一定要实现R...

lieying411 618

皮肤病识别 - 使用DenseNet或EfficientNet模型在ISIC数据集上进行皮肤病识别任务

在本篇博客中,我们探讨了如何使用 DenseNet 和 EfficientNet 模型在 ISIC 数据集上进行皮肤病识别任务。我们加载了数据集,并进行了预处理。然后我们使用 Keras 构建了两个不同的模型,并训练和评估了它们。最后,我们使用训练好的模型对新的皮肤病图像进行了预测。

斌擎科技 1307

HBase 协处理器统计行数

环境:cdh5.1.0 启用协处理器方法1. 启用协处理器 Aggregation(Enable Coprocessor Aggregation) 我们有两个方法:1.启动全局aggregation,能过操纵所有的表上的数据。通过修改hbase-site.xml这个文件来实现,只需要添加如下代码: <property> <name>hb...

weixin_30907523的博客 373

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Hbase--协处理器

协处理器1、协处理器:Coprocessor2、应用需求1:构建协处理器实现:当往proc1表中插入数据时,自动往proc2中插入一份相同的数据需求2:构建协处理器实现:当往proc3原表中插入数据时,自动往索引表proc4中插入原表的rowkey 1、协处理器:Coprocessor 本质:类似于Hive中的udf或者MySQL的触发器 本身Hbase没有提供这个功能 但是提供了 这个开发的接口 你可以自定义开发这个功能,集成在Hbase的服务端 分类 observer:观察者的协处理器,类似于

qq_46893497的博客 842

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Hbase取数据问题Bug

问题描述: hbase表中有数据,而使用hbase的Client取数据的条数小于hbase实际的条数。并且在客户端是没有报错信息。 Bug1: 使用的是协处理器进行取数据的,说下协处理器的作用,在客户端对所取的数据进行处理后,再返回给客户端。这样可以减少数据的传输,提高查询速度。 客户端没有报错,找了下服务器端,报错信息如下: 2019-03-01 14:46:04,924 ERRO...

weixin_30765505的博客 253

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Hbase二级索引,索引海量数据实现方案

方案1:使用开源的hbase-indexer,是借助于hbase的WAL实现,不会影响hbase性能            https://blog.csdn.net/xiahoujie_90/article/details/53400044方案2:基于ES自己实现,利用habse的协处理器实现,会影响hbase性能关键注意点:因为数据是存在Hbase中,ES充当的是索引角色,所以在创建ES的ma...

join_null的博客 3018

hbase的协处理器

一、产生背景 Hbase作为列族数据库最经常被人诟病的特性包括:无法轻易建立“二级索引”,难以执行求和、计数、排序等操作。比如,在旧版本的(<0.92)Hbase 中,统计数据表的总行数,需要使用 Counter 方法,执行一次 MapReduce Job 才能得到。虽然 HBase在数据存储层中集成了 MapReduce,能够有效用于数据表的分布式计算。然而在很多情况下,做一些简单的相加...

墨殇 5070

【HBase】HBase 协处理器

文章目录一、协处理器的产生二、协处理器的类型2.1、Observer2.1.1、适用场景2.1.2、Observer 类型2.1.3、执行流程2.2.4、Observer Example2.2、Endpoint2.2.1、适用场景2.2.2、执行流程2.2.3、Endpoint Example三、协处理的加载方式3.1、静态加载与卸载3.1.1、静态加载3.1.2、静态卸载3.2、动态加载与卸载3...

w1992wishes的博客 1776

hbase 协处理器、二级索引、Phoenix

摘要 原文:https://blog.csdn.net/alphags/article/details/53786777 本文主要内容是通过合理hbase 行键(rowkey)设计实现快速的多条件查询,所采用的方法将所有要用于查询中的列经过一些处理后存储在rowkey中,查询时通过rowkey进行查询,提高rowkey的利用率,加快查询速度。行键(rowkey)并不是简单的把所有要查询的列的值...

. 2496

HBase的协处理器

文章目录起源协处理器有两种: observer 和 endpointobserver协处理器endpoint协处理器总结协处理器加载方式静态加载动态加载协处理器卸载 起源 Hbase 作为列族数据库最经常被人诟病的特性包括: 无法轻易建立“二级索引” 难以执 行求和、计数、排序等操作 比如,在旧版本的(<0.92)Hbase 中,统计数据表的总行数,需要使用 Counter 方法,执行一次 MapReduce Job 才能得到。虽然 HBase 在数据存储层中集成了 MapReduce,能.

batman 1529

Hbase Coprocessors 协处理器

目录 Hbase 协处理器的概述 与其他协处理器的比较 Triggers and Stored Procedure MapReduce AOP 协处理器如何实现 Coprocessors类型 观察者协处理器 Observer Coprocessor 使用样例 Observer Coprocessor 的类型 端点协处理器 如何加载协处理器 静态加载 静态卸载 动态加载 动态卸载 使用样例 观察者样例 端点样例 其他协处理器的使用手册 目前的限制 Hbase 协处理

主要写大数据集群一线运维和学习工作经验 993

HBase的两种协处理器

1.起因(Why HBase  Coprocessor) HBase作为列族数据库最经常被人诟病的特性包括:无法轻易建立“二级索引”,难以执行求和、计数、排序等操作。比如,在旧版本的( 2.灵感来源( Source of Inspration) HBase协处理器的灵感来自于Jeff Dean 09年的演讲( P66-67)。它根据该演讲实现了类似于bigtable的协处理器,包

bbaiggey_bigdata的博客 1642
上一篇: HBase 协处理器 (一)
下一篇: HBase 模式定义 (Schema Definition)
devalone
博客等级 码龄17年 108粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值