Table of Contents

Hbase 协处理器的概述

与其他协处理器的比较

Triggers and Stored Procedure

MapReduce

AOP

协处理器如何实现

Coprocessors类型

观察者协处理器

Observer Coprocessor 使用样例

Observer Coprocessor 的类型

端点协处理器

如何加载协处理器

静态加载

静态卸载

动态加载

Using HBase Shell

Using the Java API (all HBase versions)

Using the Java API (HBase 0.96+ only)

动态卸载

Using HBase Shell

Using the Java API

使用样例

观察者样例

端点样例

其他协处理器的使用手册

绑定 Coprocessors

自动化部署

更新 Coprocessor

Coprocessor 日志

Coprocessor 配置

目前的限制


Hbase 协处理器的概述

在 HBase 中,使用 Get 或 Scan 获取数据,而在 RDBMS 中使用 SQL 查询。为了只获取相关数据,可以使用 HBase 过滤器对其进行过滤,而在 RDBMS 中使用 WHERE 谓词。

在获取数据之后,将对其进行计算。这个范例对于只有几千行和几列的“小数据”非常有效。然而,当您将规模扩展到数十亿行和数百万列时,跨网络移动大量数据将在网络层造成瓶颈,客户端需要足够强大并有足够的内存来处理大量数据和计算。此外,客户端代码可能会变得又大又复杂。

在这种情况下,协处理器可能是最合适不过了。您可以将业务计算代码放入在与数据相同的位置上运行在 RegionServer 上的协处理器中,并将结果返回给客户端。

这只是使用协处理器可以带来好处的一种情况。下面是一些类比,它们可能有助于解释协处理器的一些好处。

与其他协处理器的比较

Triggers and Stored Procedure

  • 观察者协处理器类似于 RDBMS 中的触发器,因为它在特定事件(例如 Get 或 Put )发生之前或之后执行代码。
  • 端点协处理器类似于 RDBMS 中的存储过程,因为它允许您对 RegionServer 本身上的数据执行自定义计算,而不是在客户机上执行。

MapReduce

MapReduce 的工作原理是将计算移动到数据的位置。协处理器基于相同的原则进行操作。

AOP

如果您熟悉面向切面编程(AOP),那么可以将协处理器想象成应用通知,它拦截一个请求,然后运行一些定制代码,然后再将请求传递到它的最终目的地(甚至更改目的地)。

协处理器如何实现

  1. 您的类应该实现其中一个协处理器接口:Coprocessor、RegionObserver、CoprocessorService—等等。
  2. 使用 HBase Shell 静态地(从配置中)或动态地加载协处理器。
  3. 从客户端代码调用协处理器。HBase 透明地处理协处理器。

框架API是在协处理器包中提供的。

Coprocessors类型

观察者协处理器

观察者协处理器在特定事件发生之前或之后被触发。发生在事件之前的观察者使用以前缀开头的方法,例如 prePut。在以 post 前缀(如 postPut )开头的事件覆盖方法之后发生的观察者。

Observer Coprocessor 使用样例

Security

在执行 Get 或 Put 操作之前,可以使用 preGet 或 prePut 方法检查权限。

Referential Integrity

HBase 不直接支持 RDBMS 的引用完整性概念(也称为外键)。您可以使用协处理器来实现这种完整性。例如,如果您有一个业务规则,即对 users 表的每次插入都必须在 user_daily_attendance 中跟随一个相应的条目,那么您可以实现一个协处理器来使用user 上的 prePut 方法来将一条记录插入 user_daily_attendance 中。

Secondary

您可以使用协处理器来维护辅助索引。有关更多信息,请参见 Hbase 的二级索引。

Observer Coprocessor 的类型

RegionObserver

一个 RegionObserver 协处理器允许您观察一个区域上的事件,比如 Get 和 Put 操作。看到RegionObserver。

RegionServerObserver

RegionServerObserver 允许您观察与 RegionServer 操作相关的事件,例如启动、停止或执行合并、提交或回滚。看到RegionServerObserver。

MasterObserver

MasterObserver 允许您观察与 HBase 主节点相关的事件,比如表创建、删除或模式修改。看到MasterObserver。

WalObserver

WalObserver 允许您观察与写入提前写入日志(WAL)相关的事件。看到WALObserver。

下面的示例提供了观察者协处理器的工作示例。

端点协处理器

端点处理器允许您在数据的位置执行计算。看到协处理器的类比。例如,需要计算跨越数百个区域的整个表的运行平均值或总和。

与以透明方式运行代码的观察者协处理器不同,端点协处理器必须使用 Table 或 HTable 中可用的 CoprocessorService()方法显式地调用。

从 HBase 0.96 开始,使用谷歌协议缓冲区( protobuf )实现端点协处理器。有关 protobuf 的更多信息,请参见谷歌的协议缓冲区指南。在版本0.94中编写的端点协处理器与版本0.96或更高版本不兼容。请看 hbase - 5448)。要将HBase集群从0.94或更高版本升级到0.96或更高版本,需要重新实现协处理器。

协处理器端点不应该使用 HBase 内部机制,而应该只使用公共 api;理想情况下,CPEP 应该只依赖于接口和数据结构。这并不总是可能的,但是要注意,这样做会使端点变得脆弱,容易随着 HBase 内部的发展而崩溃。注释为私有或演进的 HBase 内部 api 在删除之前不需要遵守语义版本控制规则或一般的 java 弃用规则。虽然生成的 protobuf 文件没有 hbase audience 注释——它们是由 protobuf protoc 工具创建的,但它对 hbase 的工作原理一无所知——它们应该考虑 @InterfaceAudience,所以很容易改变。

下面的示例提供端点协处理器的工作示例。

如何加载协处理器

要使您的协处理器对 HBase 可用,必须静态(通过 HBase 配置)或动态(使用 HBase Shell 或 Java API )加载协处理器。

静态加载

按照以下步骤静态加载协处理器。请记住,必须重新启动 HBase 才能卸载静态加载的协处理器。

1、在 hbase-site 中定义协处理器。元素具有一个<property>元素和一个<name>和一个<value>子元素。<name>应该是以下内容之一:

  • hbase.coprocessor.region.classes for RegionObservers and Endpoints.

  • hbase.coprocessor.wal.classes for WALObservers.

  • hbase.coprocessor.master.classes for MasterObservers.

<value> 必须包含你的协处理器实现类的完全限定类名。

例如,要加载一个协处理器(在类SumEndPoint.java中实现),您必须在 RegionServer 的'hbase-site中创建以下条目。xml'文件(通常位于'conf'目录下):

<property><name>hbase.coprocessor.region.classes</name><value>org.myname.hbase.coprocessor.endpoint.SumEndPoint</value>
</property>

如果指定多个类用于加载,则类名必须以逗号分隔。框架尝试使用默认的类加载器加载所有配置的类。因此,jar 文件必须驻留在服务器端 HBase 类路径上。

以这种方式加载的协处理器将在所有表的所有区域上处于活动状态。这些也被称为系统协处理器。第一个列出的协处理器将被指定为优先级的 Coprocessor.Priority.SYSTEM。列表中的每个后续协处理器的优先级值都将增加1(这会降低其优先级,因为优先级具有整数的自然排序顺序)。

可以在 hbase-site.xml 中手动覆盖这些优先级值。如果您希望确保一个协处理器将在另一个协处理器之后执行,那么这将非常有用。例如,在下面的配置中,可以保证 SumEndPoint 是最后一个,除非它与另一个协处理器是并列的:

<property><name>hbase.coprocessor.region.classes</name><value>org.myname.hbase.coprocessor.endpoint.SumEndPoint|2147483647</value>
</property>

当调用已注册的观察者时,框架会按照它们的优先级排序执行它们的回调方法。
领带是任意断的。

2、将代码放在 HBase 的类路径中。一种简单的方法是将 jar (包含您的代码和所有依赖项)放到 HBase 安装中的 lib/目录中。

3、重启 Hbase

静态卸载

  1. 从 hbase-site.xml 中删除协处理器的<property>元素,包括子元素。
  2. 重启 HBase。
  3. 可选地,从类路径或 HBase 的 lib/目录中删除协处理器的 JAR 文件。

动态加载

还可以动态加载协处理器,而无需重新启动 HBase。这似乎比静态加载更可取,但是动态加载的协处理器是基于每个表加载的,并且只对加载它们的表可用。因此,动态加载的表有时被称为表协处理器。

此外,动态加载协处理器相当于对表进行模式更改,并且必须使表脱机才能加载协处理器。

有三种方法可以动态加载协处理器。

Using HBase Shell

1、使用如下命令加载协处理器:

hbase alter 'users', METHOD => 'table_att', 'Coprocessor'=>'hdfs://<namenode>:<port>/
user/<hadoop-user>/coprocessor.jar| org.myname.hbase.Coprocessor.RegionObserverExample|1073741823|
arg1=1,arg2=2'

协处理器框架将尝试从协处理器表属性值中读取类信息。该值包含由管道(|)字符分隔的四段信息。

  • File path: 包含协处理器实现的jar文件必须位于所有区域服务器都可以读取它的位置。
    您可以将文件复制到每个区域服务器上的本地磁盘上,但建议将其存储在HDFS中。
    HBASE-14548 允许指定包含jar或一些通配符的目录,例如:hdfs://<namenode>:<port>/user/<hadoop-user>/ or hdfs://<namenode>:<port>/user/<hadoop-user>/*.jar. 请注意,如果指定了一个目录,则会添加该目录中的所有 jar 文件(.jar)。它不搜索子目录中的文件。如果要指定目录,请不要使用通配符。这种增强也适用于通过 JAVA API 进行的使用。

  • Class name: 协处理器的完整类名。

  • Priority: An integer. 框架将使用优先级确定在同一个钩子上注册的所有配置观察者的执行顺序。该字段可以留空。在这种情况下,框架将分配一个默认的优先级值。

  • Arguments (Optional): 这个字段被传递给协处理器实现。这是可选的。

2、验证加载协处理器:

hbase(main):04:0> describe 'users'

协处理器应该列在 TABLE_ATTRIBUTES 中。

Using the Java API (all HBase versions)

下面的 Java 代码展示了如何使用 HTableDescriptor 的 setValue() 方法在 users 表上加载协处理器。

TableName tableName = TableName.valueOf("users");
String path = "hdfs://<namenode>:<port>/user/<hadoop-user>/coprocessor.jar";
Configuration conf = HBaseConfiguration.create();
Connection connection = ConnectionFactory.createConnection(conf);
Admin admin = connection.getAdmin();
HTableDescriptor hTableDescriptor = new HTableDescriptor(tableName);
HColumnDescriptor columnFamily1 = new HColumnDescriptor("personalDet");
columnFamily1.setMaxVersions(3);
hTableDescriptor.addFamily(columnFamily1);
HColumnDescriptor columnFamily2 = new HColumnDescriptor("salaryDet");
columnFamily2.setMaxVersions(3);
hTableDescriptor.addFamily(columnFamily2);
hTableDescriptor.setValue("COPROCESSOR$1", path + "|"
+ RegionObserverExample.class.getCanonicalName() + "|"
+ Coprocessor.PRIORITY_USER);
admin.modifyTable(tableName, hTableDescriptor);

Using the Java API (HBase 0.96+ only)

在 HBase 0.96 或更新版本中,HTableDescriptor 的 addCoprocessor() 方法提供了一种动态加载协处理器的更简单的方法。

TableName tableName = TableName.valueOf("users");
Path path = new Path("hdfs://<namenode>:<port>/user/<hadoop-user>/coprocessor.jar");
Configuration conf = HBaseConfiguration.create();
Connection connection = ConnectionFactory.createConnection(conf);
Admin admin = connection.getAdmin();
HTableDescriptor hTableDescriptor = new HTableDescriptor(tableName);
HColumnDescriptor columnFamily1 = new HColumnDescriptor("personalDet");
columnFamily1.setMaxVersions(3);
hTableDescriptor.addFamily(columnFamily1);
HColumnDescriptor columnFamily2 = new HColumnDescriptor("salaryDet");
columnFamily2.setMaxVersions(3);
hTableDescriptor.addFamily(columnFamily2);
hTableDescriptor.addCoprocessor(RegionObserverExample.class.getCanonicalName(), path,
Coprocessor.PRIORITY_USER, null);
admin.modifyTable(tableName, hTableDescriptor);

动态卸载

Using HBase Shell

更改表以删除协处理器。

hbase> alter 'users', METHOD => 'table_att_unset', NAME => 'coprocessor$1'

Using the Java API

使用 setValue() 或 addCoprocessor() 方法在不设置协处理器值的情况下重新加载表定义。这将删除附加到表的任何协处理器。

TableName tableName = TableName.valueOf("users");
String path = "hdfs://<namenode>:<port>/user/<hadoop-user>/coprocessor.jar";
Configuration conf = HBaseConfiguration.create();
Connection connection = ConnectionFactory.createConnection(conf);
Admin admin = connection.getAdmin();
HTableDescriptor hTableDescriptor = new HTableDescriptor(tableName);
HColumnDescriptor columnFamily1 = new HColumnDescriptor("personalDet");
columnFamily1.setMaxVersions(3);
hTableDescriptor.addFamily(columnFamily1);
HColumnDescriptor columnFamily2 = new HColumnDescriptor("salaryDet");
columnFamily2.setMaxVersions(3);
hTableDescriptor.addFamily(columnFamily2);
admin.modifyTable(tableName, hTableDescriptor);

在 HBase 0.96或更新版本中,您可以使用 HTableDescriptor 类的 removeCoprocessor() 方法。

使用样例

HBase 提供了用于观察者协处理器的例子。

下面给出了一个更详细的示例。

这些示例假设有一个名为 users 的表,其中有两个列 family personalDet 和 salaryDet,其中包含个人和薪水的详细信息。下面是用户表的图形表示。

  personalDet salaryDet

jverne

Jules

Verne

02/08/1828

12000

9000

3000

rowkey

name

lastname

dob

gross

net

allowances

admin

Admin

Admin

   

cdickens

Charles

Dickens

02/07/1812

10000

8000

2000

观察者样例

下面的观察者协处理器防止在用户表的 Get 或 Scan 中返回用户管理的详细信息。

  1. 编写一个实现 RegionCoprocessor、RegionObserver 类的类。
  2. 重写 preGetOp() 方法(不推荐使用 preGet()方法),以检查客户端是否查询了具有 admin 值的 rowkey。如果是,返回一个空结果。否则,按正常方式处理请求。
  3. 将代码和依赖项放在一个 JAR 文件中。
  4. 将 JAR 放在 HBase 可以找到它的 HDFS 中。
  5. 加载协处理器。
  6. 编写一个简单的程序来测试它。

以下是上述步骤的实施:

public class RegionObserverExample implements RegionCoprocessor, RegionObserver {private static final byte[] ADMIN = Bytes.toBytes("admin");private static final byte[] COLUMN_FAMILY = Bytes.toBytes("details");private static final byte[] COLUMN = Bytes.toBytes("Admin_det");private static final byte[] VALUE = Bytes.toBytes("You can't see Admin details");@Overridepublic Optional<RegionObserver> getRegionObserver() {return Optional.of(this);}@Overridepublic void preGetOp(final ObserverContext<RegionCoprocessorEnvironment> e, final Get get, final List<Cell> results)throws IOException {if (Bytes.equals(get.getRow(),ADMIN)) {Cell c = CellUtil.createCell(get.getRow(),COLUMN_FAMILY, COLUMN,System.currentTimeMillis(), (byte)4, VALUE);results.add(c);e.bypass();}}
}

重写 preGetOp()只适用于 Get 操作。您还需要重写 preScannerOpen() 方法来从扫描结果中过滤管理行。

@Override
public RegionScanner preScannerOpen(final ObserverContext<RegionCoprocessorEnvironment> e, final Scan scan,
final RegionScanner s) throws IOException {Filter filter = new RowFilter(CompareOp.NOT_EQUAL, new BinaryComparator(ADMIN));scan.setFilter(filter);return s;
}

这种方法有效,但有副作用。如果客户端在其扫描中使用了筛选器,则该筛选器将被此筛选器替换。相反,你可以显式地从扫描删除任何管理结果:

@Override
public boolean postScannerNext(final ObserverContext<RegionCoprocessorEnvironment> e, final InternalScanner s,
final List<Result> results, final int limit, final boolean hasMore) throws IOException {Result result = null;Iterator<Result> iterator = results.iterator();while (iterator.hasNext()) {result = iterator.next();if (Bytes.equals(result.getRow(), ROWKEY)) {iterator.remove();break;}}return hasMore;
}

端点样例

本例仍然使用 users 表,使用端点协处理器实现一个协处理器来计算所有员工工资的总和。

1、创建一个定义服务的  .proto 文件

option java_package = "org.myname.hbase.coprocessor.autogenerated";
option java_outer_classname = "Sum";
option java_generic_services = true;
option java_generate_equals_and_hash = true;
option optimize_for = SPEED;
message SumRequest {required string family = 1;required string column = 2;
}message SumResponse {required int64 sum = 1 [default = 0];
}service SumService {rpc getSum(SumRequest)returns (SumResponse);
}

2、 执行 protoc 命令,从上面的.proto 文件生成 Java 代码。

mkdir src
protoc --java_out=src ./sum.proto

这将生成一个类调用Sum.java。

3、编写一个扩展生成的服务类的类,实现 Coprocessor 和 CoprocessorService 类,并覆盖服务方法。

public class SumEndPoint extends Sum.SumService implements Coprocessor, CoprocessorService {private RegionCoprocessorEnvironment env;@Overridepublic Service getService() {return this;}@Overridepublic 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!");}}@Overridepublic void stop(CoprocessorEnvironment env) throws IOException {// do nothing}@Overridepublic void getSum(RpcController controller, Sum.SumRequest request, RpcCallback<Sum.SumResponse> done) {Scan scan = new Scan();scan.addFamily(Bytes.toBytes(request.getFamily()));scan.addColumn(Bytes.toBytes(request.getFamily()), Bytes.toBytes(request.getColumn()));Sum.SumResponse response = null;InternalScanner scanner = null;try {scanner = env.getRegion().getScanner(scan);List<Cell> results = new ArrayList<>();boolean hasMore = false;long sum = 0L;do {hasMore = scanner.next(results);for (Cell cell : results) {sum = sum + Bytes.toLong(CellUtil.cloneValue(cell));}results.clear();} while (hasMore);response = Sum.SumResponse.newBuilder().setSum(sum).build();} catch (IOException ioe) {ResponseConverter.setControllerException(controller, ioe);} finally {if (scanner != null) {try {scanner.close();} catch (IOException ignored) {}}}done.run(response);}
}
Configuration conf = HBaseConfiguration.create();
Connection connection = ConnectionFactory.createConnection(conf);
TableName tableName = TableName.valueOf("users");
Table table = connection.getTable(tableName);final Sum.SumRequest request = Sum.SumRequest.newBuilder().setFamily("salaryDet").setColumn("gross").build();
try {Map<byte[], Long> results = table.coprocessorService(Sum.SumService.class,null,  /* start key */null,  /* end   key */new Batch.Call<Sum.SumService, Long>() {@Overridepublic Long call(Sum.SumService aggregate) throws IOException {BlockingRpcCallback<Sum.SumResponse> rpcCallback = new BlockingRpcCallback<>();aggregate.getSum(null, request, rpcCallback);Sum.SumResponse response = rpcCallback.get();return response.hasSum() ? response.getSum() : 0L;}});for (Long sum : results.values()) {System.out.println("Sum = " + sum);}
} catch (ServiceException e) {e.printStackTrace();
} catch (Throwable e) {e.printStackTrace();
}

4、加载协处理器。

5、编写客户端代码来调用协处理器。

其他协处理器的使用手册

绑定 Coprocessors

您可以将协处理器的所有类捆绑到 RegionServer 类路径上的一个 JAR 中,以便于部署。否则,将所有依赖项放在 RegionServer的类路径上,以便在启动 RegionServer 时加载它们。RegionServer 的类路径是在 RegionServer 的 hbase-env.sh 文件中设置的。

自动化部署

您可以使用 Puppet、Chef 或 Ansible 等工具将协处理器的 JAR 发送到您的 RegionServer 文件系统上所需的位置,并重新启动每个 RegionServer,以自动化协处理器部署。此类设置的详细信息超出了本文档的范围。

更新 Coprocessor

部署给定协处理器的新版本并不像禁用它、替换 JAR 和重新启用协处理器那么简单。这是因为除非删除对 JVM 的所有当前引用,否则无法在 JVM 中重新加载类。由于当前 JVM 有对现有协处理器的引用,因此必须通过重新启动 RegionServer 来重新启动 JVM,以便替换它。这种行为预计不会改变。

Coprocessor 日志

除了标准的 Java 日志记录外,协处理器框架不提供用于日志记录的API。

Coprocessor 配置

如果不希望从 HBase Shell 加载协处理器,可以将它们的配置属性添加到 HBase -site.xml。在使用 HBase Shell 时,设置了两个参数:arg1=1,arg2=2。这些可以添加到 hbase-site.xml 中,如下所示:

<property><name>arg1</name><value>1</value>
</property>
<property><name>arg2</name><value>2</value>
</property>

然后你可以阅读配置使用代码如下:

Configuration conf = HBaseConfiguration.create();
Connection connection = ConnectionFactory.createConnection(conf);
TableName tableName = TableName.valueOf("users");
Table table = connection.getTable(tableName);Get get = new Get(Bytes.toBytes("admin"));
Result result = table.get(get);
for (Cell c : result.rawCells()) {System.out.println(Bytes.toString(CellUtil.cloneRow(c))+ "==> " + Bytes.toString(CellUtil.cloneFamily(c))+ "{" + Bytes.toString(CellUtil.cloneQualifier(c))+ ":" + Bytes.toLong(CellUtil.cloneValue(c)) + "}");
}
Scan scan = new Scan();
ResultScanner scanner = table.getScanner(scan);
for (Result res : scanner) {for (Cell c : res.rawCells()) {System.out.println(Bytes.toString(CellUtil.cloneRow(c))+ " ==> " + Bytes.toString(CellUtil.cloneFamily(c))+ " {" + Bytes.toString(CellUtil.cloneQualifier(c))+ ":" + Bytes.toLong(CellUtil.cloneValue(c))+ "}");}
}

目前的限制

在多租户环境中,限制任意用户的协处理器可能是一个大问题。HBase 提供了一系列选项,以确保只运行预期的协处理器:

  • hbase.coprocessor.enabled: 启用或禁用所有协处理器。这将限制 HBase 的功能,因为禁用所有协处理器将禁用某些安全提供程序。一个受此影响的示例协调器是: org.apache.hadoop.hbase.security.access.AccessController.

    • hbase.coprocessor.user.enabled: 启用或禁用在表上加载协处理器 (i.e. user coprocessors).

    • 可以通过以下可调参数静态加载协处理器,并可选地调整它们的优先级 hbase-site.xml:

      • hbase.coprocessor.regionserver.classes: 由区域服务器加载的以逗号分隔的协处理器列表

      • hbase.coprocessor.region.classes: 一个逗号分隔的 RegionObserver 和端点协处理器列表

      • hbase.coprocessor.user.region.classes: 由所有区域加载的以逗号分隔的协处理器列表

      • hbase.coprocessor.master.classes: 主处理器加载的以逗号分隔的协处理器列表( MasterObserver 协处理器)

      • hbase.coprocessor.wal.classes: 要加载的 WALObserver 协处理器的逗号分隔列表

    • hbase.coprocessor.abortonerror: 如果协处理器发生错误而不是 IOError,是否中止加载协处理器的守护进程。如果这个设置为 false,并且一个访问控制器协处理器应该有一个致命错误,协处理器将被绕过,这样在安全的安装中,这是建议为 true;但是,对于用户的协处理器,可以在每个表的基础上重写它,以确保它们不会中止正在运行的区域服务器,而是在出现错误时卸载它们。

    • hbase.coprocessor.region.whitelist.paths: 一个逗号分隔的列表可用于那些加载org.apache.hadoop.hbase.security.access.CoprocessorWhitelistMasterObserver 因此,可以使用以下选项来列出可能加载协处理器的白名单路径。

      • Coprocessors on the classpath are 隐式地那些列入“白名单”

      • * 通配符所有协处理器路径

      • 整个文件系统 (e.g. hdfs://my-cluster/)

      • 要计算的通配符路径 FilenameUtils.wildcardMatch

      • 注意:路径可以指定方案,也可以不指定 (e.g. file:///usr/hbase/lib/coprocessors or for all filesystems /usr/hbase/lib/coprocessors)

Hbase Coprocessors 协处理器相关推荐

  1. 2021年大数据HBase(十六):HBase的协处理器(Coprocessor)

    全网最详细的大数据HBase文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 HBase的协处理器(Coprocessor) 一.起源 二 ...

  2. HBase的协处理器(Coprocessor)、HBase如何使用二级索引、observer协处理器、 endpoint协处理器、Hbase 协处理器加载方式

    HBase的协处理器(Coprocessor).HBase不可以使用二级索引吗? 起源 Hbase 作为列族数据库最经常被人诟病的特性包括: 无法轻易建立"二级索引" 难以执 行求 ...

  3. 五十四、HBase的协处理器

    在旧版本的(<0.92)HBase中无法轻易建立"二级索引",难以执行求和.计数.排序等操作.例如统计数据表的总行数,需要使用Counter方法,执行一次MapReduce ...

  4. Hbase使用协处理器的注意点

    Hbase使用协处理器的注意点 1. 协处理器在使用时如果代码出错会使,hbase的节点死掉当节点死掉可以重启服务,删除挂载协处理器的表,或者是卸载协处理器2. 协处理器是在使用时对同一张表的操作是不 ...

  5. hbase使用协处理器同步es

    hbase同步到es hbase版本:1.1.2 es版本:6.3.2 一开始从网上找的也能用,但是发现运行一段时间发现报错,丢失数据,后来又从网上搜索加上自己整理的,终于成功了 不多说上代码 pub ...

  6. hbase自定义协处理器实现

    hbase自定义协处理器实现 首先编写代码,继承BaseRegionObserver,在代码中添加输出信息到/opt/apps/hbase_logs/hbase.log,如果协处理器生效,就会输出信息 ...

  7. 给hbase增加协处理器报ERROR: org.apache.hadoop.hbase.DoNotRetryIOException:错误

    刚开始,我输入协处理器的语法是这样子输入的(隔了好几天,我又用这个语法,又能行了,郁闷): alter 'publicDataset:comment',METHOD =>'table_att', ...

  8. HBase建表高级属性,hbase应用案例看行键设计,HBase和mapreduce结合,从Hbase中读取数据、分析,写入hdfs,从hdfs中读取数据写入Hbase,协处理器和二级索引

    1. Hbase高级应用 1.1建表高级属性 下面几个shell 命令在hbase操作中可以起到很到的作用,且主要体现在建表的过程中,看下面几个create 属性 1. BLOOMFILTER 默认是 ...

  9. 使用HBase Coprocessor协处理器

    原文: http://www.zhyea.com/2017/04/13/using-hbase-coprocessor.html HBase的Coprocessor是模仿谷歌BigTable的Copr ...

最新文章

  1. modulenotfounderror: no module 或modulenotfounderror: no module named 'matplotlib._path' 原因详解及解决办法
  2. CDOJ_327 BerOS file system
  3. chi660e电化学工作站软件_RuddlesdenPopper 型锰酸盐LaSr2Mn2O7的氧还原性能和作为电化学电容器电极材料的性能研究...
  4. 【深度学习】——梯度下降优化算法(批量梯度下降、随机梯度下降、小批量梯度下降、Momentum、Adam)
  5. HTML5概述、标签
  6. 常用的正则表达式方法1
  7. Linux之虚拟机配置双网卡
  8. 社区团购“九不得”:低价倾销、大数据“杀熟”被禁止
  9. leetcode--single number.
  10. python时间序列画图plot总结
  11. Kubernetes持久化方案(PV、PVC、StorageClass)
  12. matlab2013和2014,64位机器MATLAB2013b和MATLAB2014a没有LCC编译器,怎么安装它呢?
  13. 黑群晖drive套件的使用教程
  14. Word批量打印软件/工具
  15. Python 反编译:pycdc工具的使用
  16. Python爬虫实战,pytesseract模块,Python实现拉勾网岗位数据可视化
  17. Mybase7延长试用期
  18. 位运算实现加减乘除四则运算
  19. 坚果云(创建 删除 下载 上传)代码,基于autojs开发的脚本
  20. C1:Unity3D制作智能家居设计软件——前沿

热门文章

  1. 新建一个angular项目 菜鸟教程
  2. php result json,详解JsonResult的使用方法
  3. 第七课511遇见易语言大漠找色FindCloer游戏外挂实例
  4. 2022-03-23 OPC服务器安装和使用
  5. Matlab进阶绘图第6期—雷达图/蜘蛛图/星图
  6. imgcat使用心得
  7. C# 超市收银系统——面向对象学习的总结
  8. 软路由ftp服务器搭建网站,应用开源软件FileZilla Server架设FTP服务器
  9. 第二语言习得理论介绍
  10. 解析linux内核中makefile,.config以及Kconfig的作用