HBase REST API接口介绍
MRS1.6之后,支持采用REST的方式来对HBASE进行相应的业务操作,REST API支持curl命令和Java client来操作HBase,有关curl命令的详细使用方法与Apache HBase保持一致,具体请参见https://hbase.apache.org/book.html#_rest。
由于当前默认使用 SSL protocols 为 TLSv1.1,TLSv1.2,所以在启用CURL调用 REST 时需判断当前环境支持的 SSL protocols。
使用curl命令
- 未开启Kerberos认证集群
在未开启Kerberos认证的集群中执行curl命令时增加以下参数。例如,
curl -vi -k POST -H "Accept: text/xml" -H "Content-Type: text/xml" -d '<?xml version="1.0" encoding="UTF-8"?> <TableSchema name="users"><ColumnSchema name="cf" /> </TableSchema>' "https://<HBase安装RESTServer服务的节点Ip>:21309/users/schema"
- 开启Kerberos认证的安全集群
- 进行kerberos认证。例如,
例如:kinit hbaseuser
机机用户:kinit -kt 认证凭据路径 MRS集群用户
例如:kinit -kt /opt/user.keytab hbaseuser
- 在curl命令中需在请求类型之前添加--negotiate -u:参数。例如,
curl -vi -k --negotiate -u: POST -H "Accept: text/xml" -H "Content-Type: text/xml" -d '<?xml version="1.0" encoding="UTF-8"?> <TableSchema name="users"><ColumnSchema name="cf" /> </TableSchema>' "https://<HBase安装RESTServer服务的节点Ip>:21309/users/schema"
- 进行kerberos认证。例如,
使用Java Client
使用Java调用REST API,请按照以下步骤。(可参见样例代码中RestExample部分代码)。
- 进行kerberos认证(未开启Kerberos认证集群可以跳过此步骤)
- 创建一个org.apache.hadoop.hbase.rest.client.Cluster类的集群对象,通过调用集群类的add方法和REST server的集群IP和端口来添加集群。
Cluster cluster = new Cluster(); cluster.add("10.10.10.10:21309");
- 使用在步骤2中添加的集群初始化类“org.apache.hadoop.hbase.rest.client.Client”的客户端对象,调用doAs来操作HBase。
Client client = new Client(cluster, true);
UserGroupInformation.getLoginUser().doAs(new PrivilegedAction() { public Object run() { // Rest client code /* Sample code to list all the tables client.get("/") */ return null; } });
- 可以参考如下的使用方式来了解如何调用不同的Rest API。
- 使用纯文本的方式获取命名空间
- 以包含命名空间的路径作为参数,使用client去调用get方法获取命名空间。响应将被“org.apache.hadoop.hbase.rest.client.Response”类的对象捕获。例如 :
Response response; String namespacePath = "/namespaces/" + "nameSpaceName"; response = client.get(namespacePath); System.out.println(Bytes.toString(response.getBody()));
- 创建或修改命名空间
- 在创建或修改命名空间时,都是使用NamespacesInstanceModel创建模型并使用buildTestModel()方法构建模型,如下所示。这里创建模型,使模型包含要创建的命名空间的属性信息。
Map<String, String> NAMESPACE1_PROPS = new HashMap<String, String>(); NAMESPACE1_PROPS.put("key1", "value1"); NamespacesInstanceModel model = buildTestModel(NAMESPACE1,NAMESPACE1_PROPS); private static NamespacesInstanceModel buildTestModel(String namespace, Map<String, String> properties) { NamespacesInstanceModel model = new NamespacesInstanceModel(); for (String key : properties.keySet()) { model.addProperty(key, properties.get(key)); } return model; }
在使用POST/PUT请求创建/修改表时,TableSchemaModel是用来创建模型的类。
- 检查以下步骤以了解如何使用不同的方式创建和修改命名空间。
- 使用xml的方式创建命名空间
- 在使用NamespacesInstanceModel创建模型后,以包含命名空间的路径,内容类型(调用类为'org.apache.hadoop.hbase.rest.Constants',这里调用的参数为Constants.MIMETYPE_XML)和内容(在这里需要将内容转换为xml,使用下面显示的toXML()方法)作为参数,使用client去调用post方法创建命名空间。响应将被'org.apache.hadoop.hbase.rest.client.Response'类的对象捕获。例如 :
Response response; String namespacePath = "/namespaces/" + "nameSpaceName"; response = client.post(namespacePath, Constants.MIMETYPE_XML, toXML(model)); private static byte[] toXML(NamespacesInstanceModel model) throws JAXBException { StringWriter writer = new StringWriter(); context.createMarshaller().marshal(model, writer); return Bytes.toBytes(writer.toString()); }
- 在使用xml方式进行Get请求时,可使用如下所示的fromXML()方法,从响应中获取模型,并从模型中获取创建的命名空间的名称。
private static <T> T fromXML(byte[] content) throws JAXBException { return (T) context.createUnmarshaller().unmarshal(new ByteArrayInputStream(content)); }
- 使用json的方式修改命名空间
- 在使用NamespacesInstanceModel创建模型后,调用客户端类的put方法来创建命名空间,参数包含命名空间的路径,内容类型(调用类为org.apache.hadoop.hbase.rest.Constants,这里调用的参数为Constants.MIMETYPE_JSON)和内容(在这里需要转换内容到json,使用jsonMapper作为参数)。响应被'org.apache.hadoop.hbase.rest.client.Response'类的对象捕获。例如 :
ObjectMapper jsonMapper = new JacksonProvider().locateMapper(NamespacesInstanceModel.class, MediaType.APPLICATION_JSON_TYPE); Response response; String namespacePath = "/namespaces/" + "nameSpaceName"; String jsonString = jsonMapper.writeValueAsString(model); response = client.put(namespacePath, Constants.MIMETYPE_JSON, Bytes.toBytes(jsonString));
- 在使用json方式进行Get请求时,jsonMapper具有如下所示的readValue()方法,用于从响应中获取模型,并能从模型中获取创建的命名空间。
jsonMapper.readValue(response.getBody(), NamespacesInstanceModel.class); /*Here second argument should be according to API, if its **related to table it should be TableSchemaModel.class*/
- 使用protobuf的方式修改命名空间
- 在使用NamespacesInstanceModel创建模型后,调用客户端类的put方法来创建命名空间,其参数包含命名空间路径,内容类型(调用类为org.apache.hadoop.hbase.rest.Constants',这里调用的参数为Constants.MIMETYPE_PROTOBUF)和内容(需要转换的内容如下所示,使用createProtobufOutput来创建protobuf)。响应将被'org.apache.hadoop.hbase.rest.client.Response'类的对象捕获。例如 :
Response response; String namespacePath = "/namespaces/" + "nameSpaceName"; response = client.put(namespacePath, Constants.MIMETYPE_PROTOBUF, model.createProtobufOutput()); model.getObjectFromMessage(response.getBody());
- 在使用protobuf的方式进行Get请求时,可使用如下所示的 getObjectFromMessage 方法,用于从响应中获取模型,并从模型中获取创建的命名空间。
model.getObjectFromMessage(response.getBody());