3.1 Historia de la aparición del término BigData

El término Big Data apareció hace relativamente poco tiempo. Google Trends muestra el comienzo de un crecimiento activo en el uso de la frase desde 2011:

Al mismo tiempo, solo el perezoso no usa el término ahora. Especialmente a menudo, los especialistas en marketing utilizan el término de manera inapropiada. Entonces, ¿qué es realmente Big Data? Dado que decidí enunciar y resaltar sistemáticamente el tema, es necesario definir el concepto.

En mi práctica, me encontré con diferentes definiciones:

  • Big Data es cuando hay más de 100 GB de datos (500 GB, 1 TB, lo que quieras).
  • Big Data son datos que no se pueden procesar en Excel.
  • Big Data son datos que no se pueden procesar en una sola computadora.

E incluso estos:

  • Big Data es generalmente cualquier dato.
  • El Big Data no existe, lo inventaron los mercadólogos.

Me ceñiré a la definición de wikipedia:

Big data es una serie de enfoques, herramientas y métodos para procesar datos estructurados y no estructurados de grandes volúmenes y una diversidad significativa para obtener resultados perceptibles por humanos que sean efectivos en condiciones de crecimiento continuo, distribución en numerosos nodos de una red informática, formada a finales de la década de 2000, alternativa a los sistemas tradicionales de gestión de bases de datos y soluciones de clase de inteligencia empresarial.

Así, por Big Data entenderé no una cantidad específica de datos y ni siquiera los datos en sí, sino métodos de procesamiento de los mismos, que permiten el procesamiento distribuido de la información. Estos métodos se pueden aplicar a grandes conjuntos de datos (como el contenido de todas las páginas de Internet) así como a pequeños conjuntos de datos (como el contenido de esta lección).

Estos son algunos ejemplos de lo que podría ser una fuente de datos que requiere técnicas de big data:

  • Registros del comportamiento de los usuarios en Internet
  • Señales GPS de los coches para una empresa de transporte
  • Datos tomados de sensores en el Gran Colisionador de Hadrones
  • Libros digitalizados en la Biblioteca Estatal Rusa
  • Información sobre las transacciones de todos los clientes del banco
  • Información sobre todas las compras en una gran cadena minorista, etc.

El número de fuentes de datos está creciendo rápidamente, lo que significa que las tecnologías de procesamiento de datos tienen cada vez más demanda.

3.2 Principios de los grandes datos

Con base en la definición de Big Data, podemos formular los principios básicos para trabajar con dichos datos:

1. Escalabilidad horizontal. Dado que puede haber una cantidad arbitrariamente grande de datos, cualquier sistema que involucre el procesamiento de grandes datos debe ser extensible. El volumen de datos aumentó 2 veces: la cantidad de hierro en el grupo aumentó 2 veces y todo siguió funcionando.

2. Tolerancia a fallas. El principio de escalabilidad horizontal implica que puede haber muchas máquinas en un clúster. Por ejemplo, el clúster de Hadoop de Yahoo tiene más de 42 000 máquinas (puede ver los tamaños de los clústeres en todas las organizaciones en este enlace). Esto significa que se garantizará que algunas de estas máquinas fallarán. Las prácticas de big data deben ser conscientes de estas interrupciones y sobrevivir a ellas sin consecuencias significativas.

3. Localidad de los datos. En grandes sistemas distribuidos, los datos se distribuyen entre una gran cantidad de máquinas. Si los datos se ubican físicamente en un servidor y se procesan en otro, los costos de transferencia de datos pueden exceder los costos del procesamiento en sí. Por lo tanto, uno de los principios más importantes para diseñar soluciones de BigData es el principio de localidad de los datos: si es posible, procesamos los datos en la misma máquina en la que los almacenamos.

Todas las herramientas modernas de big data siguen estos tres principios de una forma u otra. Para seguirlos, es necesario idear algunos métodos, métodos y paradigmas para desarrollar herramientas de desarrollo de datos. Uno de los métodos más clásicos que analizaré en la conferencia de hoy.

3.3 MapReducir

MapReduce es un modelo de procesamiento de datos distribuido propuesto por Google para procesar grandes cantidades de datos en clústeres de computadoras. MapReduce está bien ilustrado por la siguiente imagen:

MapReduce asume que los datos están organizados en algunos registros. El procesamiento de datos ocurre en 3 etapas:

1. Etapa del mapa . En esta etapa, los datos se preprocesan mediante la función map(), que define el usuario. El trabajo de esta etapa es preprocesar y filtrar los datos. La operación es muy similar a la operación de mapa en los lenguajes de programación funcionales: se aplica una función personalizada a cada registro de entrada.

La función map() aplicada a un solo registro de entrada produce muchos pares clave-valor. Conjunto: es decir, puede devolver solo un registro, puede que no devuelva nada o puede devolver varios pares clave-valor. Lo que estará en la clave y en el valor depende del usuario, pero la clave es una cosa muy importante, ya que los datos con una clave en el futuro caerán en una instancia de la función de reducción.

2. Reproducción aleatoria de escenarios. Pasa desapercibido para el usuario. En esta etapa, la salida de la función de mapa se "agrupa": cada contenedor corresponde a una clave de salida de la etapa de mapa. En el futuro, estas canastas servirán como insumo para reducir.

3. Etapa Reducir. Cada "canasta" con valores generados en la etapa de reproducción aleatoria llega a la entrada de la función reduce().

La función de reducción la da el usuario y calcula el resultado final para una sola "canasta" . El conjunto de todos los valores devueltos por la función reduce() es el resultado final de la tarea MapReduce.

Algunos datos adicionales sobre MapReduce:

  1. Todas las ejecuciones de la función de mapa funcionan de forma independiente y pueden ejecutarse en paralelo, incluso en diferentes máquinas de clúster.
  2. Todas las ejecuciones de la función de reducción funcionan de forma independiente y pueden ejecutarse en paralelo, incluso en diferentes máquinas de clúster.
  3. Shuffle representa internamente una clasificación paralela, por lo que también puede funcionar en diferentes máquinas de clúster. Los puntos 1-3 le permiten implementar el principio de escalabilidad horizontal .
  4. La función de mapa generalmente se usa en la misma máquina donde se almacenan los datos; esto reduce la transmisión de datos a través de la red (el principio de localidad de datos).
  5. MapReduce es siempre un escaneo de datos completo, no hay índices. Esto significa que MapReduce es poco aplicable cuando se requiere una respuesta muy rápida.

3.4 Ejemplos de tareas resueltas efectivamente con MapReduce

El recuento de palabras

Comencemos con la tarea clásica: Word Count. La tarea se formula de la siguiente manera: hay un gran corpus de documentos. La tarea es calcular el número total de veces que ocurre en el corpus por cada palabra que ocurre al menos una vez en el corpus.

Solución:

Dado que tenemos un gran corpus de documentos, permita que un documento sea un registro de entrada para la tarea MapRreduce. En MapReduce, solo podemos definir funciones definidas por el usuario, lo cual haremos (usaremos un pseudocódigo similar a Python):

def map(doc): 
for word in doc: 
yield word, 1 
def reduce(word, values): 
yield word, sum(values) 

La función map convierte el documento de entrada en un conjunto de pares (palabra, 1), barajar de forma transparente para nosotros lo convierte en pares (palabra, [1,1,1,1,1,1]), reduce las sumas de estos, devolviendo la respuesta final para la palabra .

Procesamiento de registros del sistema de publicidad

El segundo ejemplo está tomado de la práctica real de Data-Centric Alliance.

Tarea: hay un csv-log del sistema de publicidad del formulario:

<user_id>,<country>,<city>,<campaign_id>,<creative_id>,<payment></p> 
 
11111,RU,Moscow,2,4,0.3 
22222,RU,Voronezh,2,3,0.2 
13413,UA,Kyiv,4,11,0.7 
… 

Es necesario calcular el costo promedio de mostrar publicidad en las ciudades de Rusia.

Solución:

def map(record): 
user_id, country, city, campaign_id, creative_id, payment = record.split(",") 
payment=float(payment) 
if country == "RU": 
yield city, payment 
def reduce(city, payments): 
yield city, sum(payments)/len(payments) 

La función de mapa comprueba si necesitamos esta entrada, y si la necesitamos, deja solo la información necesaria (ciudad y monto del pago). La función reduce calcula la respuesta final para una ciudad dada una lista de todos los pagos en esa ciudad.