sql >> Base de Datos >  >> NoSQL >> HBase

Procedimiento:utilizar la interfaz REST de Apache HBase, parte 1

Hay varias formas de acceder e interactuar con Apache HBase. La API de Java proporciona la mayor funcionalidad, pero muchas personas quieren usar HBase sin Java.

Hay dos enfoques principales para hacerlo: uno es la interfaz Thrift, que es la más rápida y ligera de las dos opciones. La otra forma de acceder a HBase es mediante la interfaz REST, que utiliza verbos HTTP para realizar una acción, lo que brinda a los desarrolladores una amplia variedad de lenguajes y programas para usar.

Esta serie de procedimientos analizará la interfaz REST y proporcionará muestras de código de Python para acceder a ella. La primera publicación cubrirá HBase REST, algunas advertencias de Python y la administración de tablas. La segunda publicación explicará cómo insertar varias filas a la vez usando XML y JSON. La tercera publicación mostrará cómo obtener múltiples filas usando XML y JSON. Los ejemplos de código completos se pueden encontrar en mi cuenta de GitHub.

Conceptos básicos de HBase REST

Para que tanto Thrift como REST funcionen, se debe ejecutar otro demonio HBase para manejar estas solicitudes. Estos demonios se pueden instalar en los paquetes hbase-thrift y hbase-rest. El siguiente diagrama ilustra dónde se colocan Thrift y REST en el clúster. Tenga en cuenta que los clientes Thrift y REST generalmente no ejecutan ningún otro servicio como DataNode o RegionServers para mantener la carga baja y la capacidad de respuesta alta para las interacciones REST.

Asegúrese de instalar e iniciar estos demonios en nodos que tengan acceso tanto al clúster de Hadoop como al servidor de aplicaciones web. La interfaz REST no tiene ningún equilibrio de carga incorporado; eso tendrá que hacerse con hardware o en código. Cloudera Manager hace que sea realmente fácil instalar y administrar los servicios HBase REST y Thrift. (¡Puedes descargarlo y probarlo gratis!) La desventaja de REST es que es mucho más pesado que Thrift o Java.

Una interfaz REST puede usar varios formatos de datos:XML, JSON y protobuf. Especificando el Accept y Content-Type encabezados, puede elegir el formato que desea pasar o recibir de vuelta.

Para comenzar a usar la interfaz REST, debe averiguar en qué puerto se está ejecutando. El puerto predeterminado para CDH es el puerto 8070. Para esta publicación, verá el baseurl variable utilizada, y aquí está el valor que usaré::

baseurl = "http://localhost:8070"

La interfaz REST se puede configurar para usar una credencial de Kerberos para aumentar la seguridad.

Para su código, deberá usar la dirección IP o el nombre de dominio completo DNS del nodo que ejecuta el demonio REST. Además, confirme que el puerto es correcto. Recomiendo encarecidamente hacer de esta URL una variable, ya que podría cambiar con los cambios en la red.

Soluciones de errores de Python y HBase

Hay dos errores y soluciones que deben abordarse. El primer error es que los módulos integrados de Python no admiten todos los verbos HTTP. El segundo es un error HBase REST cuando se trabaja con JSON.

Los módulos integrados de Python para la interacción REST no admiten fácilmente todos los verbos HTTP necesarios para HBase REST. Deberá instalar el módulo de solicitudes de Python. El módulo de solicitudes también limpia el código y facilita mucho todas las interacciones.

La interfaz HBase REST tiene un error al agregar datos vía JSON:se requiere que los campos mantengan su orden exacto. El dict integrado de Python type no es compatible con esta función, por lo que para mantener el orden, necesitaremos usar el OrderedDict clase. (Aquellos con Python 2.6 y versiones anteriores necesitarán instalar el módulo orderdict). También cubriré el error y la solución más adelante en la publicación.

También fue difícil usar la codificación y decodificación de números enteros en base64, así que escribí un código para hacerlo:

# Method for encoding ints with base64 encoding
def encode(n):
     data = struct.pack("i", n)
     s = base64.b64encode(data)
     return s

# Method for decoding ints with base64 encoding
def decode(s):
     data = base64.b64decode(s)
     n = struct.unpack("i", data)
     return n[0]

Para facilitar aún más las cosas, escribí un método para confirmar que las respuestas HTTP regresan en los 200, lo que indica que la operación funcionó. El código de muestra usa este método para verificar el éxito de una llamada antes de continuar. Este es el método:

# Checks the request object to see if the call was successful
def issuccessful(request):
	if 200

Trabajar con tablas

Usando la interfaz REST, puede crear o eliminar tablas. Echemos un vistazo al código para crear una tabla.

content =  ''
content += ''
content += '  '
content += ''

request = requests.post(baseurl + "/" + tablename + "/schema", data=content, headers={"Content-Type" : "text/xml", "Accept" : "text/xml"})

En este fragmento, creamos un pequeño documento XML que define el esquema de la tabla en la variable de contenido. Necesitamos proporcionar el nombre de la tabla y el nombre de familia de la columna. Si hay varias familias de columnas, cree algunas más ColumnSchema nodos.

A continuación, usamos el módulo de solicitudes para POST el XML a la URL que creamos. Esta URL debe incluir el nombre de la nueva tabla. Además, tenga en cuenta que estamos configurando los encabezados para este POST llamar. Estamos mostrando que estamos enviando en XML con el Content-Type establecido en "text/xml" y que queremos recuperar XML con Accept establecido en "texto/xml".

Usando el request.status_code , puede comprobar que la creación de la tabla se ha realizado correctamente. La interfaz REST usa los mismos códigos de error HTTP para detectar si una llamada fue exitosa o fallida. Un código de estado en los años 200 significa que las cosas funcionaron correctamente.

Podemos verificar fácilmente si existe una tabla usando el siguiente código:

request = requests.get(baseurl + "/" + tablename + "/schema")

Las llamadas usan el GET verbo para decirle a la interfaz REST que queremos obtener la información del esquema sobre la tabla en la URL. Una vez más, podemos usar el código de estado para ver si la tabla existe. Un código de estado entre 200 y 200 significa que existe y cualquier otro número significa que no.

Usando el curl comando, podemos verificar el éxito de una operación REST sin escribir código. El siguiente comando devolverá un 200 que muestra el éxito de la llamada porque messagestable la tabla existe en HBase. Aquí está la llamada y su salida:

[user@localhost]$ curl -I -H "Accept: text/xml" http://localhost:8070/messagestable/schema
HTTP/1.1 200 OK
Content-Length: 0
Cache-Control: no-cache
Content-Type: text/xml

Esta llamada REST generará un error porque tablenotthere la tabla no existe en HBase. Aquí está la llamada y su salida:

[user@localhost]$ curl -I -H "Accept: text/xml" http://localhost:8070/tablenotthere/schema
HTTP/1.1 500 org.apache.hadoop.hbase.TableNotFoundException: tablenotthere
Content-Type: text/html; charset=iso-8859-1
Cache-Control: must-revalidate,no-cache,no-store
Content-Length: 10767

Podemos eliminar una tabla usando el siguiente código:

request = requests.delete(baseurl + "/" + tablename + "/schema")

Esta llamada usa el DELETE verbo para decirle a la interfaz REST que queremos eliminar la tabla. Eliminar una tabla a través de la interfaz REST no requiere que la desactive primero. Como de costumbre, podemos confirmar el éxito mirando el código de estado.

En la próxima publicación de esta serie, cubriremos la inserción de filas.

Jesse Anderson es instructor en la Universidad de Cloudera.

Si está interesado en HBase, asegúrese de registrarse en HBaseCon 2013 (13 de junio, San Francisco):EL evento comunitario para colaboradores, desarrolladores, administradores y usuarios de HBase. La inscripción anticipada está abierta hasta el 23 de abril.