Sawzall
# Sawzall

Sawzall es un lenguaje específico de dominio de programación nativo de Google y creado en 2003 con la intención de procesar y analizar gran cantidad de registros individuales generados por sus propios servidores. El entorno de ejecución es Szl y el desarrollo de su implementación es de código abierto con licencia apache. El modelo que utiliza para el procesamiento de datos será MapReduce donde el trabajo se dividirá en máquinas distribuidas y se especificará el trabajo de cada una. Esto permitirá dividir los datos complejos en más simples y, por lo tanto, facilitar el trabajo. Utilizará Protocol Buffers para obtener un formato común , poder definir mensajes con los que se comunicarán los servidores de Google y para almacenar los registros permanentes en disco (Propósito similar a XML). GFS será el sistema de archivos que proporcionará un almacenamiento distribuido confiable y escalable almacenado en discos repartidos en miles de máquinas. Sawzall ha sido reemplazado por Go (programming language) para la mayoría de propósitos dentro de Google.

Sawzall tuvo un gran éxito, ya que permitió que gran cantidad de analistas crearan con facilidad programas de análisis rápidamente y muy potentes. Quizá la prueba definitiva del sistema fue la escalabilidad, ya que crecería con un rendimiento lineal a medida que se sumaban más máquinas. Fue necesario para ello, migrar gran cantidad de código a Sawzall. Pero surgieron problemas a la hora de crecer y adaptarse a las necesidades de los usuarios. A pesar de añadir funciones, a medida que el tiempo avanzaba, los programadores optaban por utilizar un lenguaje de propósito general en vez de usar un lenguaje específico de dominio como era Sawzall. Gran cantidad de bibliotecas de Sawzall se han introducido en el lenguaje Go por lo que se siguen manteniendo las ventajas de Sawzall mientras se sigue utilizando un lenguaje de uso general.

## Inicios

Gran cantidad de datos como llamadas de teléfono, imágenes de satélites, contenidos web no eran fáciles de analizar, ya que podían ser demasiado grandes, crecer de una manera no deseada o no encajar con el esquema de base de datos. Antes de la creación de Sawzall los cálculos relacionados con los registros se realizaban mediante MapReduce, pero el tiempo de compilación y el detalle de programa hacía que analizar los registros llevara demasiado tiempo. Para ello fue necesario crear una alternativa que permitiera una programación procedural donde se dividiera el trabajo. Esta forma de programación permitía el trabajo en paralelo en cientos de ordenadores y realizar un modelo útil y escalable.

Para facilitar la escritura de programas Rob Pike desarrolló Sawzall. Un programa de Sawzall realizará una fase de filtrado en diferentes máquinas de datos que le emitamos para reducir en datos de los que queremos tener información o nos sean de utilizada. Una vez realizado este proceso de filtrado en cada ordenador. Una vez realizado este filtrado se almacenará esta información en tablas las cuales deberemos unir para poder obtener obtener el resultado final deseado.

Los primeros diseños de Sawzall no incluían la capacidad de definir funciones pero, vista la necesidad y deseos de los usuarios, esta capacidad terminó por incluirse dentro del código.

## Ventajas

Sawzall permite la creación de programas más pequeños debido a los filtros ya definidos que ofrece y que permiten realizar tareas como construcción de colecciones de valores emitidos o realizar sumas sin necesidad de especificar los pasos de estas. Esta facilidad nos permite escribir códigos de análisis cortos y rápidos para lograr una mejor comprensión de los datos.

Si se pueden distribuir los cálculos en varias máquinas y lograr rendimientos muy altos se necesitará una fase de agregación que nos permita juntar el trabajo realizado de estas. Sawzall dividirá sus cálculos en dos fases: la primera evaluará el análisis en cada registro individualmente y en la segunda fase agregará los resultados. El cálculo debe ser distribuido en las máquinas manteniendo el cálculo lo más cerca posible de los datos para evitar cuellos de botella en la red.

Cuantos más equipos se utilicen para realizar los cálculos, más altas serán las probabilidades de que alguno de estos falle. Gracias a la infraestructura que Google utiliza para el manejo de datos con Global File System y MapReduce el sistema es fiable y tolerante a fallos.

Otra de las fortalezas de Sawzall es el control de acceso y auditoría. La entrada a los trabajos de análisis a menudo incluye información personal como direcciones IP y existen reglas estricta que limitan que los analistas puedan hacer con estos datos. Sawzall mantendrá datos confidenciales como direcciones IP de los usuarios alejadas de los analistas. Para ello, se lanzó un servicio centralizado llamado Sawmill que administraba todos los análisis de Sawzall. Este servicio aseguraba que los usuarios que accedían a datos que deseaban analizar tuvieran acceso a ellos.

## Problemas

Pasaba el tiempo y la comunidad se hizo más grande y diversa. Los problemas y limitaciones del lenguaje específico de dominio se volvieron más y más importantes. Los usuarios empezaron a demandar análisis más complejos y estos requerían una infraestructura más grande. Sawzall no es adecuado para crear grandes tuberías de filtrado con pruebas y administración de versiones. Sawzall pudo continuar como un lenguaje pequeño pero fue tan útil que la gente esperaba más de él y las necesidades crecieron más de lo que el propio sistema podía proporcionar.

Sawzall permite a los usuarios llamar a funciones creadas en otros idiomas para que pueda integrarse con otros sistemas y su control de permisos se basa en Sandbox (seguridad informática) . Esto, puede generar problemas porque pueden utilizarse funciones que puedan omitir esta Sandbox y leer información no deseado. Por ello, cada función debía ser revisada cuidadosamente. Para evitar que los analistas accedieran a información confidencial debieron imponer restricciones más estrictas en las tareas analizadas. Con estas restricciones consiguieron mantener alejados los datos sensibles de los usuarios pero dañaron enormemente la flexibilidad del análisis de los datos. El trabajo se volvía más complicada cuando cada vez más y más personas empezaron a utilizar Sawzall.

## Código

La sintaxis de Sawzall será heredada de lenguajes como C, Pascal o Algol. Utilizará, por ejemplo, estructuras de control como for, while, if para realizar los bucles o int y float para declarar variables igual que en los lenguajes mencionados anteriormente.

Las conversiones de operadores también están presentes en Sawzall pudiendo convertir número almacenados como cadenas a número decimales.

El siguiente programa leerá la entrada y producirá tres resultados: el número de registros, la suma de los valores y la suma de los cuadrados de los valores:

La palabra reservada "table" presenta un tipo de agregador. Los agregadores son llamadas tablas en Sawzall. Estas tablas llevarán "sum" que realizará la suma de los valores introducidos y los transformará a enteros o enteros con punto flotante. Para cada valor de entrada Sawzall inicializará una variable input que llamará x para obtener el valor. Estos valores serán añadidos al agregador mediante los "emit" donde tendremos almacenados los valores de salida deseados.

## Agregadores

La agregación se realizará fuera del idioma para permitir un grado alto de paralelismo, ya que si las máquinas encargan de realizar el trabajo de filtrado y centran todo su trabajo en ello y no en el proceso de agregación. Esto permitirá crear estadísticas diferentes con un gran valor para el análisis.

* Estos son unos ejemplos de agregadores que podremos encontrar dentro del código de programas:
   * collection devuelve todos los valores recibidos.
   * sum(n) devuelve la suma de todos los valores recibidos.
   * maximun(n) devuelve el mayor valor obtenido.
* También existirán otros tipos de agregadores de naturaleza estadística como:
   * top(n) estima cuál es el valor que se repite más.
   * quantile(n) calcula la probabilidad acumulativa de distribución de los números recibidos.
   * unique(n) estima el número de valores únicos recibidos.
