Ecosistema Hadoop: Thrift

Ecosistema Hadoop: Thrift

Es un lenguaje de definición de interfaces y un protocolo de comunicación binaria utilizado para crear servicios en varios tipos de lenguajes. Originalmente Apache Thrift fue desarrollado por Facebook para poder obtener escalabilidad (adaptabilidad) en el desarrollo de servicios (web) entre distintos lenguajes sin perder la compatibilidad. Finalmente fue donado a Apache estando ahora disponible como Open Source.

Apache Thrift es un framework para desarrollar servicios eficientes e interoperables en diferentes lenguajes. Los lenguajes soportados en cualquier combinación de cliente y servidor son C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, OCaml y Delphi y alguno más. Para generar el código del servidor o cliente lo primero que debemos hacer es definir la interfaz del servicio en la que estén incluidas las operaciones, parámetros y retornos junto con sus tipos. A partir de esta interfaz Apache Thrift generará el cliente o servidor en el lenguaje que deseemos.

Una vez publicada una versión de la interfaz podremos modificarla sin provocar problemas de compatibilidad en los clientes como ocurría en RMI. Una desventaja de Apache Thrift es que obliga a usar esta tecnología para consumir los servicios, en este sentido una API REST es más agnóstica en la que basta con el protocolo HTTP y JSON. Se puede optar por un modelo en el que de cara al exterior se ofrece una API REST pero internamente se usan APIs RPC. Veamos un ejemplo con Apache Thrift.

Básicamente es una herramienta de desarrollo de software que permite la creación de servicios web de una manera bastante sencilla (con pocas instrucciones) utilizando un comando de terminal. Consiste en crear el servicio web con las funciones que utilizaremos, estas funciones devolverán los valores que indicamos o simplemente serán métodos (que no devuelven valores).

Arquitectura Thrift

Fuente: https://bit.ly/2JgZwjx

Thrift incluye una pila completa para crear clientes y servidores. La parte superior se genera el código de la definición de ahorro. Desde este archivo, los servicios generan código de cliente y procesador. A diferencia de los tipos incorporados, las estructuras de datos creadas se envían como resultado en el código generado. El protocolo y la capa de transporte son parte de la biblioteca de tiempo de ejecución. Con Thrift, es posible definir un servicio y cambiar el protocolo y el transporte sin volver a compilar el código. Además de la parte del cliente, Thrift incluye una infraestructura de servidor para vincular protocolos y transportes, como el bloqueo, el no bloqueo y los servidores multihebra. La parte de E / S subyacente de la pila se implementa de manera diferente para diferentes idiomas.

Thrift soporta varios protocolos:

  • TBinaryProtocol: un formato binario sencillo, simple, pero no optimizado para la eficiencia del espacio. Más rápido de procesar que el protocolo de texto, pero más difícil de depurar.
  • TCompactProtocol – Formato binario más compacto; Típicamente más eficiente para procesar también.
  • TJSONProtocol: utiliza JSON para la codificación de datos.
  • TSimpleJSONProtocol: un protocolo de solo escritura que Thrift no puede analizar porque elimina los metadatos utilizando JSON. Adecuado para el análisis mediante lenguajes de secuencias de comandos.

Los transportes soportados son:

  • TSimpleFileTransport: este transporte se escribe en un archivo.
  • TFramedTransport: este transporte es necesario cuando se utiliza un servidor no bloqueante. Envía datos en marcos, donde cada marco está precedido por información de longitud.
  • TMemoryTransport: utiliza la memoria para E / S. La implementación de Java utiliza internamente un ByteArrayOutputStream simple.
  • TSocket – Utiliza el bloqueo de socket I / O para el transporte.
  • TZlibTransport: realiza la compresión utilizando zlib. Utilizado en conjunto con otro transporte.

Thrift también proporciona una serie de servidores, que son:

  • TNonblockingServer: un servidor multihebra que utiliza E / S sin bloqueo (la implementación de Java utiliza canales NIO).
  • TFramedTransport se debe utilizar con este servidor.
  • TSimpleServer: un servidor de una sola hebra que utiliza E / S de bloqueo estándar. Útil para la prueba.
  • TThreadedServer: un servidor de subprocesos múltiples que utiliza un subproceso por modelo de conexión y E / S de bloqueo estándar.
  • TThreadPoolServer: un servidor de subprocesos múltiples que utiliza un grupo de subprocesos y un bloqueo de E / S estándar.

Beneficios – Algunos beneficios declarados de Thrift incluyen:

  • Serialización en varios idiomas con menos sobrecarga que las alternativas como SOAP debido al uso de formato binario.
  • Una biblioteca magra y limpia. No hay marco para codificar. No hay archivos de configuración XML.
  • Las ligaduras del lenguaje se sienten naturales. Por ejemplo, Java usa ArrayList . C ++ usa std :: vector .
  • El formato de cable de nivel de aplicación y el formato de cable de nivel de serialización están claramente separados. Se pueden modificar de forma independiente.
  • Los estilos de serialización predefinidos incluyen: binario, binario compatible con HTTP y binario compacto.
  • Se dobla como serialización de archivos en varios idiomas.
  • Soft versioning del protocolo. Thrift no requiere un mecanismo centralizado y explícito como major-version / minor-version. Los equipos acoplados libremente pueden evolucionar libremente las llamadas RPC.
  • Sin dependencias de compilación o software no estándar. Ninguna mezcla de licencias de software incompatibles.

Referencias:

Leave a Reply