Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Mineria Masiva de Datos 2
Mineria Masiva de Datos 2
com
20
Capitulo 2
Las aplicaciones modernas de minería de datos, a menudo llamadas análisis de “big data”, requieren
que administremos inmensas cantidades de datos rápidamente. En muchas de estas aplicaciones, los
datos son extremadamente regulares y existe una amplia oportunidad de explotar el paralelismo.
Algunos ejemplos importantes son:
1. La clasificación de las páginas web por importancia, que implica una multiplicación
repetida de matriz-vector donde la dimensión es de muchos miles de millones. Esta
aplicación, llamada “PageRank”, es el tema del Capítulo 5.
Para hacer frente a aplicaciones como estas, ha evolucionado una nueva pila de software.
Estos sistemas de programación están diseñados para obtener su paralelismo no de una
"supercomputadora", sino de "clústeres informáticos": grandes colecciones de hardware básico,
incluidos procesadores convencionales ("nodos informáticos") conectados por cables Ethernet o
conmutadores económicos. La pila de software comienza con una nueva forma de sistema de
archivos, llamado “sistema de archivos distribuido”, que presenta unidades mucho más grandes
que los bloques de disco en un sistema operativo convencional. Los sistemas de archivos
distribuidos también brindan replicación de datos o redundancia para proteger contra las fallas
frecuentes de los medios que ocurren cuando los datos se distribuyen en miles de nodos de
cómputo de bajo costo.
Además de estos sistemas de archivos, se han desarrollado muchos sistemas de
programación de alto nivel diferentes. El elemento central de la nueva pila de software es
un sistema de programación llamado Mapa reducido. Las implementaciones de
MapReduce permiten que muchos de los cálculos más comunes sobre datos a gran escala
se realicen en clústeres de computación de manera eficiente y tolerante a fallas de
hardware durante el cálculo.
21
22 CAPÍTULO 2. MAPREDUCE Y LA NUEVA PILA DE SOFTWARE
el ancho de banda puede ser esencial. La figura 2.1 sugiere la arquitectura de un sistema
informático a gran escala. Sin embargo, puede haber muchos más racks y muchos más
nodos de cómputo por rack.
Cambiar
Figura 2.1: Los nodos de cómputo están organizados en racks y los racks están interconectados
por un conmutador
2. Los cálculos deben dividirse en tareas, de modo que si alguna de las tareas no se
ejecuta hasta su finalización, se pueda reiniciar sin afectar a otras tareas. Esta
estrategia es seguida por el sistema de programación MapReduce que presentamos
en la Sección 2.2.
24 CAPÍTULO 2. MAPREDUCE Y LA NUEVA PILA DE SOFTWARE
Implementaciones DFS
Hay varios sistemas de archivos distribuidos del tipo que hemos descrito.
ese se utilizan en la práctica. Entre estos:
3. Coloso es una versión mejorada de GFS, sobre la que se ha publicado poco. Sin
embargo, un objetivo de Colossus es proporcionar un servicio de archivos en
tiempo real.
Para explotar la computación en clúster, los archivos deben verse y comportarse de manera algo diferente a los
sistemas de archivos convencionales que se encuentran en computadoras individuales. Este nuevo sistema de
archivos, a menudo llamado sistema de archivos distribuido o DFS ( aunque este término ha tenido otros
significados en el pasado), se usa típicamente de la siguiente manera.
• Los archivos pueden ser enormes, posiblemente de un terabyte de tamaño. Si solo tiene
archivos pequeños, no tiene sentido usar un DFS para ellos.
• Los archivos rara vez se actualizan. Más bien, se leen como datos para algunos
cálculos y, de vez en cuando, se añaden datos adicionales a los archivos. Por
ejemplo, un sistema de reservas de aerolíneas no sería adecuado para un DFS,
incluso si los datos fueran muy grandes, porque los datos se cambian con mucha
frecuencia.
Los archivos se dividen en trozos que suelen tener un tamaño de 64 megabytes. Los
fragmentos se replican, quizás tres veces, en tres nodos informáticos diferentes. Además,
los nodos que contienen copias de un fragmento deben estar ubicados en diferentes
racks, para que no perdamos todas las copias debido a una falla en el rack. Por lo general,
un bastidor "falla" porque falla la interconexión entre los nodos de cómputo en el bastidor,
y el bastidor ya no puede comunicarse con nada fuera de sí mismo. Normalmente, el
usuario puede decidir tanto el tamaño del fragmento como el grado de replicación.
Para encontrar los fragmentos de un archivo, hay otro archivo pequeño llamado nodo maestro
o nodo de nombre para ese archivo. El nodo maestro se replica en sí mismo y un directorio para
el sistema de archivos en su conjunto sabe dónde encontrar sus copias. El directorio en sí se
puede replicar y todos los participantes que utilizan el DFS saben dónde están las copias del
directorio.
2.2. MAPA REDUCIDO 25
2.2 MapReduce
Mapa reducido es un estilo de computación que se ha implementado en varios sistemas,
incluida la implementación interna de Google (simplemente llamada MapReduce) y la
popular implementación de código abierto Hadoop que se puede obtener, junto con el
sistema de archivos HDFS de la Fundación Apache. Puede utilizar una implementación de
MapReduce para administrar muchos cálculos paralelos a gran escala de una manera que
sea tolerante con las fallas de hardware. Todo lo que necesita escribir son dos funciones,
llamadas Mapa y Reducir. El sistema gestiona la ejecución paralela y la coordinación de las
tareas que ejecutan Map o Reduce. El sistema también se ocupa de la posibilidad de que
una de estas tareas no se ejecute. En resumen, un cálculo de MapReduce se ejecuta de la
siguiente manera:
1. A cada una de las tareas de mapa se les asigna uno o más fragmentos de un sistema de
archivos distribuido. Estas tareas de mapa convierten el fragmento en una secuencia de
valor clave pares. La forma en que se producen los pares clave-valor a partir de los datos
de entrada está determinada por el código escrito por el usuario para la función Mapa.
3. Las tareas de Reducir funcionan en una clave a la vez y combinan todos los
valores asociados con esa clave de alguna manera. La forma de combinación
de valores está determinada por el código escrito por el usuario para la función
Reducir.
Conjunto
producción
Mapa Grupo
Tareas por llaves
Reducir
Tareas
para cada palabra en una colección de documentos. En este ejemplo, el archivo de entrada
es un depósito de documentos y cada documento es un elemento. La función Map para
este ejemplo usa claves que son de tipo String (las palabras) y valores que son números
enteros. La tarea Mapa lee un documento y lo divide en su secuencia.
de palabras w 1, w 2,. . . , w norte. Luego emite una secuencia de pares clave-valor donde el
valor es siempre 1. Es decir, el resultado de la tarea Mapa para este documento es el
secuencia de pares clave-valor:
Tenga en cuenta que una sola tarea de Mapa normalmente procesará muchos documentos: todos
los documentos en uno o más fragmentos. Por lo tanto, su resultado será más que la secuencia del
único documento sugerido anteriormente. Tenga en cuenta también que si una palabra w
aparece metro veces entre todos los documentos asignados a esa tarea, entonces
habrá metro pares clave-valor ( w 1) entre su salida. Una opción, que discutimos en la
Sección 2.2.4, es que esta tarea de Mapa combine estos metro pares en un solo par
w, m), pero solo podemos hacer eso porque, como veremos, las tareas Reducir
aplican una operación asociativa y conmutativa, suma, a los valores. ✷
de lo que hacen las tareas Mapa y Reducir. El proceso del controlador maestro sabe
cuántas tareas de Reducir habrá, digamos r tales tareas. El usuario normalmente le dice al
sistema MapReduce lo que r debiera ser. Luego, el controlador maestro elige una función
hash que toma una clave como argumento y produce un número de depósito de 0 a r - 1.
Cada clave generada por una tarea de mapa tiene un hash y su par clave-valor se coloca en
uno de r archivos locales. Cada archivo está destinado a uno de los r Reducir tareas. 1
Ejemplo 2.2: Continuemos con el ejemplo del recuento de palabras del ejemplo 2.1. La
función Reducir simplemente suma todos los valores. La salida de un reductor consta de la
palabra y la suma. Por lo tanto, el resultado de todas las tareas de Reducir es una
secuencia de ( w, m) pares, donde w es una palabra que aparece al menos una vez entre
todos los documentos de entrada y metro es el número total de apariciones de w entre
esos documentos. ✷
2.2.4 Combinadores
A veces, una función Reducir es asociativa y conmutativa. Es decir, los valores a
combinar se pueden combinar en cualquier orden, con el mismo resultado. La suma
realizada en el ejemplo 2.2 es un ejemplo de una operación asociativa y conmutativa.
No importa cómo ordenemos o agrupamos una lista de
números v 1, v 2,. . . , v norte; la suma será la misma.
Cuando la función Reducir es asociativa y conmutativa, podemos presionar
algo de lo que hacen los reductores con las tareas del mapa. Por ejemplo, en lugar de cada
1 Opcionalmente, los usuarios pueden especificar su propia función hash u otro método para asignar claves
para Reducir tareas. Sin embargo, sea cual sea el algoritmo que se utilice, cada tecla se asigna a una y solo una
tarea de Reducir.
28 CAPÍTULO 2. MAPREDUCE Y LA NUEVA PILA DE SOFTWARE
Si queremos el máximo paralelismo, entonces podríamos usar una tarea Reducir para
ejecutar cada reductor, es decir, una sola tecla y su lista de valores asociada. Además,
podríamos ejecutar cada tarea de Reducir en un nodo de cálculo diferente, por lo que
todas se ejecutarían en paralelo. Este plan no suele ser el mejor. Un problema es que hay
una sobrecarga asociada con cada tarea que creamos, por lo que es posible que
deseemos mantener el número de tareas de Reducir más bajo que el número de claves
diferentes. Además, a menudo hay muchas más claves que nodos de cómputo
disponibles, por lo que no obtendríamos ningún beneficio de una gran cantidad de tareas
de Reducir.
En segundo lugar, a menudo hay una variación significativa en las longitudes de las
listas de valores para diferentes claves, por lo que los diferentes reductores toman
diferentes cantidades de tiempo. Si hacemos de cada reductor una tarea de Reducir
separada, entonces las tareas mismas exhibirán sesgar - una diferencia significativa en la
cantidad de tiempo que toma cada uno. Podemos reducir el impacto del sesgo utilizando
menos tareas de Reducir que reductores. Si las claves se envían al azar a las tareas de
Reducir, podemos esperar que haya un promedio del tiempo total requerido por las
diferentes tareas de Reducir. Podemos reducir aún más el sesgo utilizando más tareas
Reducir que nodos de cálculo. De esa manera, las tareas de Reducir largas pueden ocupar
un nodo de cómputo por completo, mientras que varias tareas de Reducir más cortas
pueden ejecutarse secuencialmente en un solo nodo de cómputo.
La tarea de mapeo del ejemplo 2.1 produce muchos pares ( w 1), ( w 1),. . ., podríamos
aplicar la función Reducir dentro de cada tarea de Mapa, antes de que los resultados
de las tareas de Mapa estén sujetos a agrupación y agregación. Estos pares clave-
valor serían reemplazados por un par con clave w y valor igual a la suma de todos los
1 en todos esos pares. Es decir, los pares con clave w generado por una sola tarea de
mapa sería reemplazado por un par ( w, m), dónde metro es el número de veces que
w aparece entre los documentos manejados por esta tarea de Mapa. Tenga en
cuenta que todavía es necesario agrupar y agregar y pasar el resultado a las tareas
de Reducir, ya que normalmente habrá un par clave-valor con clave w
provenientes de cada una de las tareas del Mapa.
Usuario
Programa
tenedor
tenedor tenedor
Maestría
asignar
asignar
Mapa
Reducir
Trabajador
Trabajador
Trabajador
Trabajador
Aporte Trabajador
Datos Producción
Intermedio Expediente
Archivos
Mapear tareas y algunas tareas de Reducir, estos números son seleccionados por el
programa de usuario. Estas tareas serán asignadas a los procesos Worker por el Maestro.
Es razonable crear una tarea de Mapa para cada fragmento de los archivos de entrada,
pero es posible que deseemos crear menos tareas de Reducir. La razón para limitar el
número de tareas de Reducir es que es necesario que cada tarea de Mapa cree un archivo
intermedio para cada tarea de Reducir, y si hay demasiadas tareas de Reducir, el número
de archivos intermedios aumenta.
El maestro realiza un seguimiento del estado de cada tarea de mapa y reducción (inactiva,
en ejecución en un trabajador en particular o completada). Un proceso de trabajador informa al
maestro cuando finaliza una tarea, y el maestro programa una nueva tarea para ese proceso de
trabajador.
A cada tarea de Mapa se le asigna uno o más fragmentos de los archivos de entrada y
ejecuta en él el código escrito por el usuario. La tarea Mapa crea un archivo para cada
tarea Reducir en el disco local del Trabajador que ejecuta la tarea Mapa. Se informa al
Maestro de la ubicación y tamaño de cada uno de estos archivos, y la tarea Reducir para la
que está destinado cada uno. Cuando el maestro asigna una tarea de reducción a un
proceso de trabajador, a esa tarea se le asignan todos los archivos que forman su entrada.
La tarea Reducir ejecuta código escrito por el usuario y escribe su salida en un archivo que
es parte del sistema de archivos distribuido circundante.
30 CAPÍTULO 2. MAPREDUCE Y LA NUEVA PILA DE SOFTWARE
(a) Suponga que no usamos un combinador en las tareas de Mapa. ¿Espera que haya un sesgo
significativo en los tiempos que tardan los distintos reductores en procesar su lista de
valores? ¿Por qué o por qué no?
! ( c) Suponga que usamos un combinador en las 100 tareas del Mapa. ¿Espera que el sesgo sea
significativo? ¿Por qué o por qué no?
para productos, registro de ventas, etc., procesos que implican relativamente pocos
cálculos y que modifican la base de datos. 2 Por otro lado, Amazon podría usar MapReduce
para realizar ciertas consultas analíticas en grandes cantidades de datos, como encontrar
para cada usuario aquellos usuarios cuyos patrones de compra fueran más similares.
X yo = metro ij v j
j=1
por lo tanto, estar disponible para todas las tareas del Mapa.
La matriz METRO y el vector v cada uno se almacenará en un archivo del DFS.
Suponemos que las coordenadas fila-columna de cada elemento de la matriz serán
detectables, ya sea desde su posición en el archivo, o porque está almacenado con explícita
coordenadas, como un triple ( yo, j, m ij). También asumimos la posición de elemento v
j en
el vector v será detectable de forma análoga.
La función del mapa: La función Mapa está escrita para aplicarse a un elemento de
METRO. Sin embargo, si v aún no se lee en la memoria principal en el nodo de cálculo que
ejecuta una tarea de mapa, entonces v se lee por primera vez, en su totalidad, y posteriormente
estará disponible para todas las aplicaciones de la función de Mapa realizadas en esta tarea de
Mapa. Cada tarea de mapa operará en una parte de la matriz METRO. De cada matriz
elemento metro ij produce el par clave-valor ( soy ij v j). Por lo tanto, todos los términos del
suma que componen el componente X I del producto matriz-vector obtendrá la
misma clave, I.
2 Recuerde que incluso mirar un producto que no compra hace que Amazon recuerde que lo miró.
3 La matriz es escasa, con un promedio de 10 a 15 elementos distintos de cero por fila, ya que
matriz representa los enlaces en la Web, con metro ij distinto de cero si y solo si hay un enlace desde la página j
a la página I. Tenga en cuenta que no hay forma de que podamos almacenar una matriz densa cuyo lado sea
10 12, ya que tendría 10 24 elementos.
32 CAPÍTULO 2. MAPREDUCE Y LA NUEVA PILA DE SOFTWARE
Sin embargo, es posible que el vector v es tan grande que no cabe en su totalidad en
la memoria principal. No es necesario que v caben en la memoria principal en un
nodo de cálculo, pero si no es así, habrá una gran cantidad de accesos al disco a
medida que movamos partes del vector a la memoria principal para multiplicar
componentes por elementos de la matriz. Por tanto, como alternativa, podemos
dividir la matriz en vertical rayas de igual ancho y divida el vector en un número igual
de franjas horizontales, de la misma altura. Nuestro objetivo es utilizar suficientes
franjas para que la parte del vector en una franja pueda caber cómodamente en la
memoria principal de un nodo de cálculo. La figura 2.4 sugiere cómo se ve la
partición si la matriz y el vector se dividen cada uno en cinco franjas.
los I La franja de la matriz multiplica solo los componentes del I th raya del vector. Por
tanto, podemos dividir la matriz en un archivo para cada franja y hacer lo mismo con el
vector. A cada tarea de Mapa se le asigna un fragmento de una de las franjas de la matriz y
obtiene toda la franja correspondiente del vector. Las tareas de Mapa y Reducción pueden
actuar exactamente como se describe en la Sección 2.3.1 para el caso en el que las tareas
de Mapa obtienen el vector completo.
Retomaremos la multiplicación matriz-vector usando MapReduce nuevamente en
la Sección 5.2. Allí, debido a la aplicación particular (cálculo de PageRank), tenemos
una restricción adicional de que el vector de resultado debe dividirse de la misma
manera que el vector de entrada, por lo que la salida puede convertirse en la entrada
para otra iteración de la multiplicación matriz-vector. Veremos allí que la mejor
estrategia consiste en dividir la matriz METRO en bloques cuadrados, en lugar de
rayas.
2.3. ALGORITMOS QUE UTILIZAN MAPREDUCE 33
De Para
url1 url2
url1 url3
url2 url3
url2 url4
··· ···
Figura 2.5: Relación Enlaces Consiste en el conjunto de pares de URL, de modo que la
primera tiene uno o más enlaces a la segunda.
Ejemplo 2.3: En la figura 2.5 vemos parte de la relación Enlaces que describe la
estructura de la Web. Hay dos atributos, De y Para. Una fila, o tupla, de la relación es
un par de URL de modo que hay al menos un enlace desde la primera URL a la
segunda. Por ejemplo, la primera fila de la figura 2.5 es el par ( url 1, url 2). Esta tupla
dice la página web url 1 tiene un enlace a la página url 2. Si bien hemos mostrado
solo cuatro tuplas, la relación real de la Web, o la parte de ella que sería almacenada
por un motor de búsqueda típico, tiene billones de tuplas. ✷
Una relación, por grande que sea, se puede almacenar como un archivo en un sistema de archivos
distribuido. Los elementos de este archivo son las tuplas de la relación.
Hay varias operaciones estándar sobre relaciones, a menudo denominadas álgebra
relacional, que se utilizan para implementar consultas. Las consultas en sí mismas suelen
estar escritas en SQL. Las operaciones de álgebra relacional que discutiremos son:
4. Unión natural: Dadas dos relaciones, compare cada par de tuplas, una de cada
relación. Si las tuplas concuerdan en todos los atributos que son comunes a los dos
esquemas, entonces genere una tupla que tenga componentes para cada uno de
los atributos en cualquiera de los esquemas y concuerde con las dos tuplas en cada
atributo. Si las tuplas no están de acuerdo con uno o más atributos compartidos, no
produzca nada a partir de este par de tuplas. La unión natural de relaciones R
y S se denota R ⊲⊳ S. Si bien discutiremos la ejecución solo de la combinación
natural con MapReduce, todos equijoins Las combinaciones donde la condición de
acuerdo de tupla implica la igualdad de atributos de las dos relaciones que no
necesariamente tienen el mismo nombre) se pueden ejecutar de la misma manera.
Daremos una ilustración en el ejemplo 2.4.
(b) Una expresión θ (A), dónde θ es una de las cinco operaciones de agregación
como SUM, y A es un atributo que no se encuentra entre los atributos de
agrupación.
El resultado de esta operación es una tupla para cada grupo. Esa tupla tiene un
componente para cada uno de los atributos de agrupación, con el valor común
a las tuplas de ese grupo. También tiene un componente para cada
agregación, con el valor agregado para ese grupo. Veremos una ilustración en
el ejemplo 2.5.
4 Algunas descripciones del álgebra relacional no incluyen estas operaciones y, de hecho, no formaban
parte de la definición original de este álgebra. Sin embargo, estas operaciones son tan importantes en SQL que
los tratamientos modernos de álgebra relacional las incluyen.
2.3. ALGORITMOS QUE UTILIZAN MAPREDUCE 35
Ejemplo 2.4: Intentemos encontrar los caminos de longitud dos en la Web, usando la
relación Enlaces de la figura 2.5. Es decir, queremos encontrar los triples de las URL ( u, v,
w) tal que haya un enlace desde tu para v y un enlace de v para w. Básicamente, queremos
aprovechar la unión natural de Enlaces consigo mismo, pero primero debemos imaginar
que son dos relaciones, con diferentes esquemas, para poder describir la conexión
deseada como una unión natural. Por tanto, imagina que hay dos copias de Enlaces, a
saber L 1 ( U 1, U 2) y L 2 ( U 2, U 3). Ahora, si calculamos L 1 ⊲⊳ L 2, tendremos
exactamente lo que queremos. Es decir, para cada tupla t 1 de L 1 (es decir, cada tupla de
Enlaces) y cada tupla t 2 de L 2 (otra tupla de Enlaces, posiblemente incluso la misma
tupla), vea si su U 2 componentes son iguales. Tenga en cuenta que estos componentes
son el segundo componente de t 1 y el primer componente de
t 2. Si estos dos componentes concuerdan, genere una tupla para el resultado, con el
esquema ( U 1, U 2, U 3). Esta tupla consta del primer componente de t 1, el segundo
componente de t 1 (que debe ser igual al primer componente de t 2), y el segundo
componente de t 2.
Es posible que no queramos la ruta completa de longitud dos, sino solo los pares ( u,
w) de URL de modo que haya al menos una ruta desde tu para w de longitud dos. Si
entonces, podemos proyectar los componentes intermedios calculando π U 1, U 3 ( L 1 ⊲⊳ L 2).
✷
Ejemplo 2.5: Imagine que un sitio de redes sociales tiene una relación
Esta relación tiene tuplas que son pares ( a, b) tal que B es amigo de una. Es posible
que el sitio desee desarrollar estadísticas sobre la cantidad de amigos que tienen los
miembros. Su primer paso sería calcular el número de amigos de cada usuario. Esta
operación se puede realizar agrupando y agregando, específicamente
Esta operación agrupa todas las tuplas por el valor de su primer componente, por lo
que hay un grupo para cada usuario. Luego, para cada grupo se realiza el conteo del
número de amigos de ese usuario. El resultado será una tupla para cada grupo, y una
tupla típica se vería como (Sally, 300), si el usuario "Sally" tiene 300 amigos. ✷
Tenga en cuenta que la salida no es exactamente una relación, porque tiene pares clave-
valor. Sin embargo, se puede obtener una relación utilizando solo los componentes de valor (o
solo los componentes clave) de la salida.
La función de reducción: Para cada clave t ′ producido por cualquiera de las tareas del
Mapa, habrá uno o más pares clave-valor ( t ′, t ′). Una vez que el sistema agrupa los pares de
valores clave por clave, la función Reducir cambia ( t ′, [ t ′, t ′,. . . , t ′]) dentro ( t ′, t ′), por lo que
produce exactamente un par ( t ′, t ′) para esta llave t ′.
Para calcular la intersección, podemos usar la misma función de Mapa. Sin embargo, la
función Reducir debe producir una tupla solo si ambas relaciones tienen la tupla. Si la llave
t tiene una lista de dos valores [ t, t] asociado con él, luego la tarea Reducir para t debería
producir t, t). Sin embargo, si la lista de valores asociada con la clave
t es solo [ t], luego uno de R y S Está perdido t, por lo que no queremos producir una
tupla para la intersección.
La función del mapa: Gire cada tupla t en un par clave-valor ( t, t).
La función de reducción: Si clave t tiene lista de valores [ t, t], luego producir t, t). De lo
contrario, no produzca nada.
2.3. ALGORITMOS QUE UTILIZAN MAPREDUCE 37
La diferencia R - S requiere un poco más de reflexión. La única forma en que una tupla
t puede aparecer en la salida es si está en R pero no en S. La función Mapa puede
pasar tuplas desde R y S a través, pero debe informar a la función Reducir si la tupla
proviene de R o S. Por tanto, usaremos la relación como el valor asociado con la clave
t. Aquí hay una especificación para las dos funciones.
La función del mapa: Para una tupla t en R, producir par clave-valor ( t, R), y para una
tupla t en S, producir par clave-valor ( t, S). Tenga en cuenta que la intención es que el
valor sea el nombre de R o S ( o mejor, un solo bit que indica si la relación es R o S),
no toda la relación.
La función de reducción: Para cada clave t, si la lista de valores asociada es [ R], luego
producir t, t). De lo contrario, no produzca nada.
par de elementos de la matriz metro ij, norte jk). En cambio, lo que queremos es el producto
de estos elementos, es decir, la tupla de cuatro componentes ( yo, j, k, v × w), por eso
representa el producto metro ij norte jk. Una vez que tenemos esta relación como resultado
de una operación MapReduce, podemos realizar agrupaciones y agregaciones, con I y
K como los atributos de agrupación y la suma de V × W como la agregación. Es decir,
podemos implementar la multiplicación de matrices como la cascada de dos operaciones
MapReduce, como sigue. Primero:
La función del mapa: Para cada elemento de la matriz metro ij, producir el par clave-valor
j, (M, yo, m ij). Asimismo, para cada elemento de la matriz norte jk, producir el valor clave
par j, (N, k, n jk). Tenga en cuenta que METRO y norte en los valores no están las matrices en
sí mismas. Más bien son nombres de las matrices o, más precisamente, un solo
bit que indica si el elemento proviene de METRO o N ( como mencionamos con
respecto a la función Map similar que usamos para la unión natural) :.
La función de reducción: Para cada clave j, examine su lista de valores asociados.
Por cada valor que proviene de METRO, decir ( M, yo, m ij), y cada valor que viene de
NORTE, decir ( N, k, n jk), producir un par clave-valor con clave igual a ( yo, k) y valor
igual al producto de estos elementos, metro ij norte jk.
Ahora, realizamos una agrupación y agregación mediante otra operación MapReduce
aplicada a la salida de la primera operación MapReduce.
La función del mapa: Esta función es solo la identidad. Es decir, para cada elemento de
entrada con clave ( yo, k) y valor v, producir exactamente este par clave-valor.
La función de reducción: Para cada tecla ( yo, k), producir la suma de la lista de
valores asociados con esta clave. El resultado es un par ( yo, k), v, dónde v es el valor
del elemento en fila I y columna k de la matriz P = MN.
La función de reducción: Cada tecla ( yo, k) tendrá una lista asociada con todos
Los valores ( M, j, m ij) y ( N, j, n jk), para todos los valores posibles de j. La función
Reducir necesita conectar los dos valores de la lista que tienen el mismo valor de
j, para cada j. Una forma sencilla de realizar este paso es ordenar por j los valores que comienzan con
METRO y ordenar por j los valores que comienzan con NORTE, en listas separadas. los j th
los valores de cada lista deben tener sus terceros componentes, metro ij y norte jk extraído
y multiplicado. Luego, estos productos se suman y el resultado se empareja con
( yo, k) en la salida de la función Reducir.
Puede notar que si una fila de la matriz METRO o una columna de la matriz norte
es tan grande que no cabe en la memoria principal, entonces las tareas de Reducir se verán
obligadas a usar una ordenación externa para ordenar los valores asociados con una clave
determinada ( yo, k). Sin embargo, en ese caso, las matrices mismas son tan grandes, tal vez 10 20
elementos, que es poco probable que intentemos este cálculo si las matrices fueran
densas. Si son escasos, esperaríamos que se asociaran muchos menos valores con
cualquier clave, y sería factible hacer la suma de productos en la memoria principal.
(c) El mismo conjunto de números enteros, pero cada número entero aparece solo una vez.
En cada parte, puede asumir que la clave de cada par de salida será ignorada o
descartada.
(a) Unión de Bolsa, definido como la bolsa de tuplas en la que tupla t aparece la
suma del número de veces que aparece en R y S.
(B) Intersección de bolsa, definido como la bolsa de tuplas en la que tupla t aparece
el mínimo de veces que aparece en R y S.
2.4. EXTENSIONES A MAPREDUCE 41
! Ejercicio 2.3.4: La selección también se puede realizar en bolsas. Proporcione una implementación
de MapReduce que produzca el número adecuado de copias de cada tupla t que pasa la
condición de selección. Es decir, producir pares clave-valor a partir de los cuales se pueda
obtener fácilmente el resultado correcto de la selección a partir de los valores.
3. Incorporan un método para hacer frente a la mayoría de las fallas que ocurren
durante la ejecución de un trabajo grande, sin tener que reiniciar ese trabajo
desde el principio.
Comenzamos esta sección con una discusión de los sistemas de "flujo de trabajo", que
amplían MapReduce al admitir redes acíclicas de funciones, cada función implementada por una
colección de tareas. Si bien se han implementado muchos de estos sistemas (consulte las notas
bibliográficas de este capítulo), una opción cada vez más popular es Spark de UC Berkeley.
También está ganando importancia TensorFlow de Google. Este último, aunque generalmente
no se reconoce como un sistema de flujo de trabajo debido a su orientación muy específica a las
aplicaciones de aprendizaje automático, de hecho tiene una arquitectura de flujo de trabajo en el
fondo.
Otra familia de sistemas utiliza un modelo gráfico de datos. El cálculo ocurre en los
nodos del gráfico y los mensajes se envían desde cualquier nodo a cualquier nodo
adyacente. El sistema original de este tipo fue Pregel de Google, que tiene su propia forma
única de lidiar con las fallas. Pero ahora se ha vuelto común implementar una función de
modelo de gráfico sobre un sistema de flujo de trabajo y utilizar el sistema de archivos y la
función de gestión de fallas de este último.
42 CAPÍTULO 2. MAPREDUCE Y LA NUEVA PILA DE SOFTWARE
Sistemas de flujo de trabajo extienda MapReduce desde el flujo de trabajo simple de dos pasos
(la función Map alimenta la función Reducir) a cualquier colección de funciones, con un gráfico
acíclico que representa el flujo de trabajo entre las funciones. Es decir, hay un acíclico gráfico de
flujo cuyos arcos a → B representar el hecho de que la función a La salida es una entrada para
funcionar. B.
Los datos que se pasan de una función a la siguiente son un archivo de elementos de
un tipo. Si una función tiene una sola entrada, esa función se aplica a cada entrada de
forma independiente, al igual que las funciones Mapa y Reducir se aplican a sus elementos
de entrada individualmente. La salida de la función es un archivo recopilado del resultado
de aplicar la función a cada entrada. Si una función tiene entradas de más de un archivo,
los elementos de cada uno de los archivos se pueden combinar de varias formas. Pero la
función en sí se aplica a combinaciones de elementos de entrada, como máximo uno de
cada archivo de entrada. Veremos ejemplos de tales combinaciones cuando analicemos la
implementación de la unión y la unión relacional en la Sección 2.4.2.
F gramo
h I
Figura 2.6: Un ejemplo de un flujo de trabajo que es más complejo que la alimentación de mapas
Reducir
Ejemplo 2.6: En la figura 2.6 se muestra una sugerencia de cómo se vería un flujo de
trabajo. Allí, cinco funciones, F mediante j, pasar datos de izquierda a derecha de formas
específicas, por lo que el flujo de datos es acíclico y ninguna tarea necesita proporcionar
datos antes de que toda la entrada esté disponible. Por ejemplo, función h toma su
entrada de un archivo preexistente del sistema de archivos distribuidos. Cada uno de h Los
elementos de salida se pasan a las funciones. I y j, tiempo I toma las salidas de ambos F y h
como entradas. La salida de j se almacena en el sistema de archivos distribuidos o se pasa
a una aplicación que invocó este flujo de datos. ✷
De manera análoga a las funciones Map y Reduce, cada función de un flujo de trabajo puede ser
ejecutada por muchas tareas, a cada una de las cuales se le asigna una parte de la entrada a la función.
Un controlador maestro es responsable de dividir el trabajo entre las tareas que implementan una
función, posiblemente mediante el hash de los elementos de entrada para decidir la tarea adecuada
para recibir un elemento. Por lo tanto, al igual que las tareas de mapa, cada tarea que implementa una
función F tiene un archivo de salida de datos destinados a cada una de las tareas que implementan la
función o funciones sucesoras de F. Estos archivos se entregan
2.4. EXTENSIONES A MAPREDUCE 43
por el controlador maestro en el momento apropiado, después de que la tarea haya completado su
trabajo.
Las funciones de un flujo de trabajo, y por lo tanto las tareas, comparten con las tareas
de MapReduce una propiedad importante: la propiedad de bloqueo, en el sentido de que
solo entregan la salida después de que se completan. Como resultado, si una tarea falla,
no ha entregado salida a ninguno de sus sucesores en el gráfico de flujo. 7 Por lo tanto, un
controlador maestro puede reiniciar la tarea fallida en otro nodo de cálculo, sin
preocuparse de que la salida de la tarea reiniciada duplique la salida que anteriormente se
pasó a otra tarea.
Algunas aplicaciones de los sistemas de flujo de trabajo son efectivamente cascadas de
trabajos de MapReduce. Un ejemplo sería la unión de tres relaciones, donde un trabajo
MapReduce une las dos primeras relaciones y un segundo trabajo MapReduce une la
tercera relación con el resultado de unir las dos primeras relaciones. Ambos trabajos
usarían un algoritmo como el de la Sección 2.3.7.
Hay una ventaja en implementar tales cascadas como un solo flujo de trabajo. Por
ejemplo, el controlador maestro puede administrar el flujo de datos entre tareas y su
replicación, sin necesidad de almacenar el archivo temporal que es la salida de un trabajo
MapReduce en el sistema de archivos distribuidos. Al ubicar las tareas en los nodos de
cómputo que tienen una copia de su entrada, podemos evitar gran parte de la
comunicación que sería necesaria si almacenamos el resultado de un trabajo de
MapReduce y luego iniciamos un segundo trabajo de MapReduce (aunque Hadoop y otros
sistemas MapReduce también intentan para ubicar las tareas del mapa donde ya hay una
copia de su entrada).
2.4.2 Chispa
Spark es, en esencia, un sistema de flujo de trabajo. Sin embargo, es un avance sobre los primeros
sistemas de flujo de trabajo en varias formas, que incluyen:
2. Una forma más eficiente de agrupar tareas entre nodos de cómputo y programar la
ejecución de funciones.
los sistemas que soportan la recursividad no pueden usarla para manejar fallas.
44 CAPÍTULO 2. MAPREDUCE Y LA NUEVA PILA DE SOFTWARE
La transformación de mapa toma un parámetro que es una función y aplica esa función a
cada elemento de un RDD, produciendo otro RDD. Esta operación debería recordarnos el
Mapa de MapReduce, pero no es exactamente lo mismo. En primer lugar, en MapReduce,
una función de mapa solo se puede aplicar a un par clave-valor. En segundo lugar, en
MapReduce, una función Map produce un conjunto de pares clave-valor, y cada par clave-
valor se considera un elemento independiente de la salida de la función Map. En Spark,
una función de mapa se puede aplicar a cualquier tipo de objeto, pero produce
exactamente un objeto como resultado. El tipo del objeto resultante puede ser un
conjunto, pero eso no es lo mismo que producir muchos objetos a partir de un objeto de
entrada. Si desea producir un conjunto de objetos a partir de un solo objeto, Spark le
proporciona otra transformación llamada Mapa plano, que es análogo a Map of
MapReduce, pero sin el requisito de que todos los tipos sean pares clave-valor.
Ejemplo 2.7: Suponga que nuestro RDD de entrada es un archivo de documentos, como en el
"recuento de palabras" del ejemplo 2.1. Podríamos escribir una función Spark Map que tome un
documento y produzca un conjunto de pares, con cada par del formulario ( w 1), donde
w es una de las palabras del documento. Sin embargo, si lo hacemos, entonces el RDD de
salida es una lista de conjuntos, cada conjunto consta de todas las palabras de un
documento, cada palabra emparejada con el entero 1. Si queremos duplicar la función
Map descrita en el Ejemplo 2.1, entonces necesitamos usar la transformación Flatmap de
Spark. Esa operación aplicada al RDD de documentos producirá otro RDD, cada uno de
cuyos elementos es un solo par ( w 1). ✷
Spark también proporciona una operación similar a una forma limitada de Map, llamada
Filtrar. En lugar de una función como parámetro, la transformación de filtro toma un
predicado que se aplica al tipo de objetos en el RDD de entrada. El predicado
2.4. EXTENSIONES A MAPREDUCE 45
devuelve verdadero o falso para cada objeto, y el RDD de salida de una transformación de
filtro consta solo de aquellos objetos en el RDD de entrada para los que la función de filtro
devuelve verdadero.
Ejemplo 2.8: Continuando con el ejemplo 2.7, suponga que queremos evitar contar las
palabras vacías: las palabras más comunes como "el" o "y". Podríamos escribir una función
de filtro que tenga incorporada la lista de palabras que queremos eliminar. Cuando se
aplica a un par ( w 1), esta función devuelve verdadero si y solo si w no está en la lista.
Luego podemos escribir un programa Spark que primero aplique Flatmap a
el RDD de documentos, produciendo un RDD R 1 que consta de un par w 1) por cada
aparición de la palabra w en cualquiera de los documentos. El programa entonces
aplica el filtro de eliminación de palabras vacías a R 1, producir otro RDD, R 2.
El último RDD consta de un par ( w 1) por cada aparición de palabra w en cualquier
de los documentos, pero solo si w no es una palabra de parada. ✷
Reducir
Hay una serie de operaciones Spark integradas que se comportan como operadores de
álgebra relacional en relaciones que están representadas por RDD. Es decir, piense en los
elementos de los RDD como tuplas de una relación. La transformación Join toma dos RDD,
cada uno de los cuales representa una de las relaciones. El tipo de cada RDD debe ser un
par clave-valor y los tipos de clave de ambas relaciones deben ser iguales. La
transformación de unión luego busca dos objetos, uno de cada uno de sus RDD de
entrada, de modo que los valores clave sean los mismos, digamos ( k, x) y ( k, y). Para cada
par encontrado, Join produce el par clave-valor k, (x, y), y el RDD de salida consta de todos
esos objetos.
La operación group-by de SQL también se implementa en Spark mediante la
transformación GroupByKey. Esta transformación toma como entrada un RDD cuyo tipo
son pares clave-valor. El RDD de salida también es un conjunto de pares clave-valor con
46 CAPÍTULO 2. MAPREDUCE Y LA NUEVA PILA DE SOFTWARE
el mismo tipo de clave. El tipo de valor para la salida es una lista de valores del tipo de
entrada. GroupByKey ordena su RDD de entrada por clave y para cada clave k produce
el par ( k, [v 1, v 2,. . . , v norte]) tal que el v I son todos los valores asociados con la clave k
en el RDD de entrada. Observe que GroupByKey es exactamente la operación que
MapReduce realiza entre bastidores para agrupar la salida de la función Map por
tecla.
Evaluación perezosa
Como se mencionó en la Sección 2.4.1, es común que los sistemas de flujo de trabajo
exploten la propiedad de bloqueo para el manejo de errores. Para hacerlo, se aplica una
función a un solo archivo intermedio (análogo a un RDD) y la salida de esa función se pone
a disposición de los consumidores de esa salida sólo después de que se completa la
función. Sin embargo, Spark no aplica transformaciones a los RDD hasta que sea
necesario, normalmente porque debe aplicar alguna acción, por ejemplo, almacenar un
RDD calculado en el sistema de archivos circundante o devolver un resultado a una
aplicación.
El beneficio de esta estrategia de evaluación perezosa es que muchos RDD no se
construyen todos a la vez. Cuando se crea una división de un RDD en un nodo, se puede
usar inmediatamente en el mismo nodo de cálculo para aplicar otra transformación. El
beneficio de esta estrategia es que este RDD nunca se almacena en el disco y nunca se
transmite a otros nodos de cómputo, ahorrando así órdenes de magnitud en el tiempo de
ejecución en algunos casos.
Naturalmente, uno puede preguntarse qué sucede en el ejemplo 2.9 si falla un nodo de cálculo
después de crear una división de R 1 y antes de transformar esa escisión en una escisión de
R 2. Ya que R 1 no está respaldado en el sistema de archivos, ¿no se pierde para siempre? El sustituto de
Spark para el almacenamiento redundante de valores intermedios es registrar el linaje
de cada RDD que crea. El linaje le dice al sistema Spark cómo recrear el RDD, o una
división del RDD, si es necesario.
Como podemos ver en el Ejemplo 2.10, la recuperación de una falla de nodo puede ser más
compleja en Spark que en MapReduce o en sistemas de flujo de trabajo que almacenan valores
intermedios de manera redundante. Sin embargo, el intercambio de una recuperación más compleja
cuando las cosas van mal contra una mayor velocidad cuando las cosas van bien es generalmente
bueno. Cuanto más rápido se ejecuta un programa Spark, menos posibilidades hay de que falle un
nodo mientras se ejecuta.
48 CAPÍTULO 2. MAPREDUCE Y LA NUEVA PILA DE SOFTWARE
2.4.4 TensorFlow
TensorFlow es un sistema de código abierto desarrollado inicialmente en Google para admitir
aplicaciones de aprendizaje automático. Al igual que Spark, TensorFlow proporciona una interfaz
de programación en la que se escribe una secuencia de pasos. Los programas suelen ser
acíclicos, aunque, como Spark, es posible iterar bloques de código.
Una diferencia importante entre Spark y TensorFlow es el tipo de datos que se
pasan entre los pasos del programa. En lugar del RDD, TensorFlow usa tensores; un
tensor es simplemente una matriz multidimensional.
Ejemplo 2.11: Una constante, por ejemplo, 3,14159, se considera un tensor de dimensión
cero. Un vector es un tensor unidimensional. Por ejemplo, el vector (1, 2, 3) se puede
escribir en tensorFlow como [1., 2., 3.]. Una matriz es un tensor bidimensional. Para
ejemplo, la matriz
1 2 3 4
5 6 7 8
9 10 11 12
se expresa como [[1., 2., 3., 4.], [5., 6., 7., 8.], [9., 10., 11., 12.]].
También son posibles matrices de mayor dimensión. Por ejemplo, un cubo de ceros de
2 por 2 por 2 se representa como [[[0., 0.], [0., 0.]], [[0., 0.], [0. , 0.]]]. ✷
Aunque los tensores son de hecho una forma restringida de RDD, el poder de
TensorFlow proviene de su selección de operaciones integradas. Las operaciones de
álgebra lineal están disponibles como funciones. Por ejemplo, si desea una matriz C ser el
producto de matrices A y B, puedes escribir
C = tensorflow.matmul (A, B)
Aún más poderosos son los enfoques comunes del aprendizaje automático que se integran
como operaciones. una sola declaración en el lenguaje TensorFlow puede hacer que un modelo
que es un tensor se construya a partir de datos de entrenamiento, que también se representa
como un tensor, usando un método como el descenso de gradiente. (Discutimos el descenso de
gradiente en las Secciones 9.4.5 y 12.3.4).
2.4. EXTENSIONES A MAPREDUCE 49
Ejemplo 2.12: Supongamos que tenemos una gráfica dirigida cuyos arcos están representados
por la relación E (X, Y), lo que significa que hay un arco desde el nodo X al nodo Y.
Deseamos calcular la relación de caminos P (X, Y), lo que significa que hay una ruta de
longitud 1 o más desde el nodo X al nodo Y. Es decir, PAG es el clausura transitiva
de MI. Un algoritmo recursivo simple para hacerlo es:
2. Mientras cambia la relación PAG ocurrir, agregar a PAG todas las tuplas en
π X, Y P (X, Z) ⊲⊳ P (Z, Y)
Es decir, encontrar pares de nodos X y Y tal que para algún nodo Z se sabe que hay
un camino desde X para Z y también un camino conocido desde Z para Y.
La figura 2.7 sugiere cómo podríamos organizar tareas recursivas para realizar
este cálculo. Hay dos tipos de tareas: Unir tareas y Tareas duplicadas.
Existen norte Unir tareas, para algunos norte, y cada uno corresponde a un cubo de una función
hash h. Una tupla de ruta P (a, b), cuando se descubre, se convierte en entrada para dos tareas
de Join: las numeradas decir ah) y media pensión). El trabajo del I th Unirse a la tarea, cuando
recibe la tupla de entrada P (a, b), es encontrar algunas otras tuplas vistas anteriormente (y
almacenadas localmente por esa tarea).
Entrar Dup-elim
tarea tarea
0 0
tarea tarea
1 1
.
.
.
.
.
.
P (c, d) si Dup-elim
g (c, d) = j tarea
P (c, d) si nunca
j
(a, b) si Entrar visto antes
(a) = yo o tarea
.
(b) = yo I
.
.
.
.
.
Figura 2.7: Implementación del cierre transitivo mediante una colección de tareas
recursivas
2. Si h (a) = yo luego busca tuplas P (x, a) y producir una tupla de salida P (x, b).
3. Si h (b) = yo luego busca tuplas P (b, y) y producir una tupla de salida Pagar).
Tenga en cuenta que, en raras ocasiones, tenemos h (a) = h (b), por lo que se ejecutan tanto (2) como
(3). Pero generalmente, solo uno de estos debe ejecutarse para una tupla determinada.
Tambien hay metro Tareas de eliminación duplicada, y cada una corresponde a un
grupo de una función hash gramo eso requiere dos argumentos. Si P (c, d) es una salida de
alguna tarea Join, luego se envía a la tarea Dup-elim j = g (c, d). Al recibir esta tupla, el
j La tarea Dup-elim comprueba que no haya recibido esta tupla antes, ya que su trabajo es
la eliminación de duplicados. Si se recibió anteriormente, la tupla se ignora. Pero si esta
tupla es nueva, se almacena localmente y se envía a dos tareas Join, las numeradas
h (c) y h (d).
Cada tarea de unión tiene metro archivos de salida, uno para cada tarea Dup-elim, y
cada tarea Dup-elim tiene norte archivos de salida: uno para cada tarea Unir. Estos
archivos pueden distribuirse de acuerdo con varias estrategias. Inicialmente, el E (a, b) Las
tuplas que representan los arcos del gráfico se distribuyen a las tareas Dup-elim, con
E (a, b) siendo enviado como P (a, b) a la tarea Dup-Elim g (a, b). El controlador maestro
2.4. EXTENSIONES A MAPREDUCE 51
espera hasta que cada tarea Unir haya procesado toda su entrada para una ronda. Luego,
todos los archivos de salida se distribuyen a las tareas Dup-elim, que crean su propia
salida. Esa salida se distribuye a las tareas Unirse y se convierte en su entrada para la
siguiente ronda. ✷
En el ejemplo 2.12 no es esencial tener dos tipos de tareas. Más bien, las tareas de unión
podrían eliminar los duplicados a medida que se reciben, ya que de todos modos deben
almacenar sus entradas recibidas anteriormente. Sin embargo, esta disposición tiene una
ventaja cuando debemos recuperarnos de una tarea fallida. Si cada tarea almacena todos los
archivos de salida que ha creado, y colocamos las tareas de unión en diferentes racks de las
tareas Dup-elim, entonces podemos tratar con cualquier nodo de cálculo o falla de un solo rack.
Es decir, una tarea de unión que deba reiniciarse puede obtener todas las entradas generadas
previamente que necesita de las tareas de eliminación duplicada, y viceversa.
Hay al menos tres enfoques diferentes que se han utilizado para tratar las fallas
durante la ejecución de un programa recursivo.
Sistema sincrónico masivo basado en gráficos para procesar cantidades masivas de datos.
Tal sistema ve sus datos como un gráfico. Cada nodo del gráfico corresponde
aproximadamente a una tarea (aunque en la práctica muchos nodos de un gráfico grande
se agruparían en una sola tarea, como en las tareas Unir del ejemplo 2.12). Cada nodo del
gráfico genera mensajes de salida que están destinados a otros nodos del gráfico, y cada
nodo del gráfico procesa las entradas que recibe de otros nodos.
Ejemplo 2.13: Suponga que nuestros datos son una colección de arcos ponderados de un gráfico
y queremos encontrar, para cada nodo del gráfico, la longitud del camino más corto a cada uno
de los otros nodos. A medida que se ejecuta el algoritmo, cada nodo a almacenará un conjunto
de pares b, w), dónde w es la longitud de la ruta más corta desde el nodo a al nodo B que se
conoce actualmente.
Inicialmente, cada nodo del gráfico a almacena el conjunto de pares ( b, w) tal
que hay un arco desde a para B de peso w. Estos hechos se envían a todos los demás
nodos, como triples ( a, b, w), con el significado pretendido de que el nodo a sabe de
un camino largo w al nodo B. 8 Cuando el nodo a recibe un triple c, d, w), debe decidir
si este hecho implica un camino más corto que a ya sabe de sí mismo al nodo D.
Nodo a busca su distancia actual a C; es decir, encuentra el par ( CV) almacenados
localmente, si hay uno. También encuentra el par ( d, u) si hay uno. Si w + v <u, luego
el par d, u) es reemplazado por ( d, w + v), y si no hubiera pareja d, u), luego el par d,
w + v) se almacena en el nodo una. Además, a los otros nodos se les envía el mensaje (
a, d, w + v) en cualquiera de estos dos casos. ✷
En caso de una falla en el nodo de cómputo, no se intenta reiniciar las tareas fallidas en
ese nodo de cómputo. Más bien, Pregel puestos de control todo su cálculo después
8 Este algoritmo usa demasiada comunicación, pero servirá como un ejemplo simple del modelo de cálculo
de Pregel.
2.5. EL MODELO DE COSTOS DE COMUNICACIÓN 53
algunos de los superpasos. Un punto de control consiste en realizar una copia del estado
completo de cada tarea, para que se pueda reiniciar desde ese punto si es necesario. Si falla
algún nodo de cálculo, todo el trabajo se reinicia desde el punto de control más reciente.
Aunque esta estrategia de recuperación provoca muchas tareas que no han dejado de
rehacer su trabajo, resulta satisfactoria en muchas situaciones. Recuerde que la razón por
la que los sistemas MapReduce admiten el reinicio solo de las tareas fallidas es que
queremos tener la seguridad de que el tiempo esperado para completar todo el trabajo
ante fallas no es mucho mayor que el tiempo para ejecutar el trabajo sin fallas. Cualquier
sistema de gestión de fallas tendrá esa propiedad siempre que el tiempo para recuperarse
de una falla sea mucho menor que el tiempo promedio entre fallas. Por lo tanto, solo es
necesario que Pregel controle su cálculo después de una serie de superpasos de modo
que la probabilidad de falla durante esa cantidad de superpasos sea baja.
! Ejercicio 2.4.2: Suponga que un trabajo de Pregel tiene una probabilidad pag de una falla durante
cualquier superpaso. Suponga también que el tiempo de ejecución (sumado en todos los nodos de
cálculo) de tomar un punto de control es C multiplicado por el tiempo que se tarda en ejecutar un
superpaso. Para minimizar el tiempo de ejecución esperado del trabajo, ¿cuántos superpasos
deberían transcurrir entre los puestos de control?
estructura del flujo de trabajo, como una colección de tareas, cada una de las cuales implementa
el flujo de trabajo de la figura 2.6. 9 los costo de comunicación de una tarea es el tamaño de la
entrada a la tarea. Este tamaño se puede medir en bytes. Sin embargo, dado que usaremos
operaciones de bases de datos relacionales como ejemplos, a menudo usaremos el número de
tuplas como medida de tamaño.
los costo de comunicación de un algoritmo es la suma del costo de comunicación de
todas las tareas que implementan ese algoritmo. Nos centraremos en el coste de la
comunicación como forma de medir la eficiencia de un algoritmo. En particular, no
consideramos la cantidad de tiempo que tarda cada tarea en ejecutarse al estimar el
tiempo de ejecución de un algoritmo. Si bien hay excepciones, en las que predomina el
tiempo de ejecución de las tareas, estas excepciones son raras en la práctica. Podemos
explicar y justificar la importancia del costo de la comunicación de la siguiente manera.
• El algoritmo ejecutado por cada tarea tiende a ser muy simple, a menudo lineal en
el tamaño de su entrada.
• Incluso si una tarea se ejecuta en un nodo de cálculo que tiene una copia de los fragmentos en
los que opera la tarea, ese fragmento normalmente se almacenará en el disco y el tiempo
necesario para mover los datos a la memoria principal puede exceder el tiempo necesario. para
operar con los datos una vez que estén disponibles en la memoria.
Suponiendo que el costo de comunicación es el costo dominante, aún podríamos preguntarnos por
qué contamos solo el tamaño de entrada y no el tamaño de salida. La respuesta a esta pregunta
involucra dos puntos:
El tiempo de reloj de pared de tal algoritmo sería bastante alto. Los algoritmos que sugerimos, o que
hemos sugerido hasta ahora, tienen la propiedad de que el trabajo se divide equitativamente entre las
tareas. Por lo tanto, el tiempo del reloj de pared sería aproximadamente tan pequeño como podría ser,
dado el número de nodos de cálculo disponibles.
Para ver cómo el análisis del costo de la comunicación puede ayudarnos a elegir un algoritmo en el
entorno de computación en clúster, examinaremos cuidadosamente el caso de una combinación de
múltiples vías. Existe una teoría general en la que nosotros:
3. Identifique cada uno de los k reductores con un vector de números de cubo. Estos vectores
tienen un componente para cada uno de los atributos seleccionados en el paso (1).
4. Envíe tuplas de cada relación a todos aquellos reductores donde pueda encontrar tuplas
con las que unirse. Es decir, la tupla dada t tendrá valores para algunos de los atributos
seleccionados en el paso (1), por lo que podemos aplicar la función o funciones hash a
esos valores para determinar ciertos componentes del vector que identifica a los
reductores. Se desconocen otros componentes del vector, por lo que t debe enviarse a los
reductores para todos los vectores que tengan algún valor en estos componentes
desconocidos.
Algunos ejemplos de esta técnica general aparecen en los ejercicios. Aquí, solo
veremos la unión R (A, B) ⊲⊳ S (B, C) ⊲⊳ T (C, D) como ejemplo. Supongamos que las
relaciones R, S, y T tener tamaños r, s, y t, respectivamente, y por simplicidad,
supongamos pag es la probabilidad de que
trabajo. Elegir números B y C que representa el número de cubos en los que haremos
hash B- y C- valores, respectivamente. Dejar h ser una función hash que envía
B- valores en B cubos y dejar gramo ser otra función hash que envíe C- valores en C
cubos. Requerimos que bc = k; es decir, cada reductor corresponde a un par de
cubos, uno para el B- valor y uno para el C- valor. El reductor correspondiente al par
de cangilones ( yo, j) es responsable de unir las tuplas R (u, v), S (v, w), y T (ancho, x)
cuando sea h (v) = yo y g (w) = j.
Como resultado, las tareas del mapa que envían tuplas de R, S, y T a los
reductores que los necesitan deben enviar R- y T - tuplas a más de un reductor. Por un
S- tupla S (v, w), conocemos el B- y C- valores, por lo que podemos enviar esta tupla solo al
reductor para h (v), g (w). Sin embargo, considere una R- tupla R (u, v). Sabemos
solo necesita ir a reductores que correspondan a h (v), y, para algunos y. Pero no sabemos
y; El valor de C podría ser cualquier cosa que sepamos. Por lo tanto, debemos enviar R (u,
v) para C reductores, ya que y podría ser cualquiera de los C cubos para
C- valores. Del mismo modo, debemos enviar el T - tupla T (ancho, x) a cada uno de los reductores
z, g (w) para cualquier z. Existen B tales reductores.
g (TC) = 1
1
h (B) =
2
h (RB) = 2
3
Ejemplo 2.15: Suponer que b = c = 4, entonces k = 16. Se puede pensar que los
dieciséis reductores están dispuestos en un rectángulo, como sugiere la figura 2.8.
Allí, vemos un hipotético S- tupla S (v, w) para cual h (v) = 2 y g (w) = 1. Esta tupla es
enviada por su tarea Mapa solo al reductor para la clave (2, 1). También vemos un R-
tupla R (u, v). Ya que h (v) = 2, esta tupla se envía a todos los reductores (2, y), por
y = 1, 2, 3, 4. Finalmente, vemos un T - tupla T (ancho, x). Ya que g (w) = 1, esta tupla se
envía a todos los reductores ( z, 1) para z = 1, 2, 3, 4. Observe que estas tres tuplas se unen
y se encuentran exactamente en un reductor, el reductor de la tecla (2, 1). ✷
Ahora, suponga que los tamaños de R, S, y T son diferentes; recuerda que usamos r,
s, y t, respectivamente, para esos tamaños. Si hacemos hash B- valores a B cubos y
58 CAPÍTULO 2. MAPREDUCE Y LA NUEVA PILA DE SOFTWARE
Cada uno de los reductores debe calcular la unión de partes de las tres relaciones, y es
razonable preguntarse si esta unión se puede tomar en un tiempo lo más pequeño
posible: lineal en la suma de los tamaños de la entrada y la salida para ese Reducir la
tarea. Si bien es posible que las combinaciones más complejas no se puedan calcular en
tiempo lineal, la combinación de nuestro ejemplo en ejecución se puede ejecutar en cada
proceso de Reducir de manera eficiente. Primero, cree un índice en RB, para organizar el R-
tuplas recibidas. Del mismo modo, cree un índice en TC Para el T - tuplas. Luego,
considere cada uno recibido S- tupla S (v, w). Utilice el índice en RB para encontrar todo R-
tuplas con RB = v y usa el índice en TC para encontrar todo
T - tuplas con TC = w.
2. cr para enviar cada tupla R (u, v) al C reductores h (v), y para cada uno de los C
posibles valores de y.
3. bt para enviar cada tupla T (ancho, x) al B reductores z, g (w) para cada uno de los B
posibles valores de z.
También hay un costo r + s + t para hacer que cada tupla de cada relación se ingrese en una de
las tareas del Mapa. Este costo es fijo, independiente de antes de Cristo, y k.
Debemos seleccionar B y C, sujeto a la restricción bc = k, minimizar
s + cr + bt. Usaremos la técnica de los multiplicadores de Lagrange para encontrar el
lugar donde la función s + cr + bt - λ (antes de Cristo - k) tiene sus derivados con
respecto a B y C igual a 0. Es decir, debemos resolver las ecuaciones r - λb = 0 y
t - λc = 0. Desde r = λb y t = λc, podemos multiplicar los correspondientes s pagides de
estas ecuaciones para obtener rt = λ 2 antes de Cristo. Ya que bc = k, obtenemos rt = λ 2 k, o λ = pag rt / k.
aproximadamente mil millones de suscriptores en Facebook, con un promedio de 300 amigos cada uno,
por lo que la relación R tiene r = 3 × 10 11 tuplas. Supongamos que queremos calcular R ⊲⊳ R ⊲⊳ R,
quizás como parte de un cálculo para encontrar el número de amigos o amigos de
amigos que tiene cada suscriptor, o quizás solo la persona con el mayor número
de amigos de amigos o √ f amigos. 10 El costo de comunicación de la combinación de 3 vías √ de R
consigo mismo es 4 r + 2 rk; 3 r representa el costo de las tareas del Mapa, y r + 2 kr 2
es el costo de la Re √ duce tareas. Dado que asumimos r = 3 × 10 11, este costo es
1.2 × 10 12 + 6 × 10 11 k.
Ahora considere el costo de comunicación de unirse R consigo mismo, y luego
uniendo el resultado con R de nuevo. Las tareas Mapa y Reducir para la primera se unen a cada
tiene un costo de 2 r, por lo que la primera unión solo tiene un costo de comunicación 4 r = 1.2 × 10 12.
Pero el tamaño de R ⊲⊳ R es largo. No podemos decir exactamente qué tan grande, ya que
los amigos tienden a caer en pandillas y, por lo tanto, una persona con 300 amigos tendrá
muchos menos que el número máximo posible de amigos de amigos, que es 90.000.
Estimemos de forma conservadora que el tamaño de R ⊲⊳ R no es 300 r, pero solo 30 r, o 9
× 10 12. El costo de comunicación para la segunda unión de ( R ⊲⊳ R) ⊲⊳ R
es entonces 1.8 × 10 13 + 6 × 10 11. Por tanto, el coste total de las dos combinaciones es
1.2 × 10 12 + 1.8 × 10 13 + 6 × 10 11 = 1,98 × 10 13.
Debemos preguntarnos si el costo de la combinación de 3 vías, que es
√
1.2 × 10 12 + 6 × 10 11 k
√
Is√menor que 1,98 × 10 13. Eso es así, siempre que 6 × 10 11 k < 1,86 × 10 13, o
k < 31. Es decir, la combinación de 3 vías será preferible siempre que no usemos más
de 31 2 = 961 reductores. ✷
Star se une
Una estructura común para la minería de datos de datos comerciales es la estrella unirse.
Por ejemplo, una cadena de tiendas como Walmart mantiene una tabla de hechos cuyo tu-
Cada uno de los ples representa una sola venta. Esta relación parece FA 1, A 2,. . .),
donde cada atributo A I es una clave que representa uno de los componentes
importantes de la venta, como el comprador, el artículo comprado, la tienda
rama o la fecha. Para cada atributo clave hay un tabla de dimensiones
dando información sobre el participante. Por ejemplo, la dimensión ta-
ble D (A 1, B 11, B 12,. . .) podría representar compradores. A 1 es el comprador
ID, la clave de esta relación. los B 1 I Es posible que proporcione el nombre, la dirección, el
teléfono, etc. del comprador. Normalmente, la tabla de hechos es mucho más grande que
las tablas de dimensiones. Por ejemplo, podría haber una tabla de hechos de mil millones de
tuplas y diez tablas de dimensiones de un millón de tuplas cada una.
Los analistas extraen estos datos preguntando consultas analíticas que
normalmente unen la tabla de hechos con varias de las tablas de dimensiones (una "unión
en estrella") y luego agregan el resultado en una forma útil. Por ejemplo, un analista
podría preguntar "dame una tabla de ventas de pantalones, desglosada por región y color,
para cada mes de 2016". Bajo el modelo de costos de comunicación de esta sección, es
casi seguro que unir la tabla de hechos y las tablas de dimensiones mediante una
combinación de múltiples vías será más eficiente que unir las relaciones en pares. De
hecho, puede tener sentido almacenar la tabla de hechos sobre la cantidad de nodos de
cálculo disponibles, y replicar las tablas de dimensiones de forma permanente
exactamente de la misma manera en que las replicaríamos si tomáramos la combinación
de la tabla de hechos y todas las tablas de dimensiones. . En este caso especial, solo los
atributos clave (el A 's arriba) se han convertido en cubos, y el número de cubos para cada
atributo clave es proporcional al tamaño de su tabla de dimensiones.
de cubos, uno para cada una de las tres funciones hash. Encuentre, en función de r, s,
t, y k, los valores de a, b, y C que minimizan el costo de comunicación del algoritmo.
! Ejercicio 2.5.3: Supongamos que tomamos una combinación en estrella de una tabla de hechos FA 1, A 2,. . . , A metro)
con tablas de dimensiones D I( A I, B I) por yo = 1, 2,. . . , metro. Dejalo ser k reductores, cada
uno asociado con un vector de cubos, uno para cada uno de los atributos clave
A 1, A 2,. . . , A metro. Supongamos la cantidad de cubos en los que hacemos hash A I es a I.
Naturalmente, a 1 a 2 · · · a m = k. Finalmente, suponga que cada tabla de dimensiones D I tiene tamaño
D I, y el tamaño de la tabla de hechos es mucho mayor que cualquiera de estos tamaños. Encontrar
los valores de la a I que minimizan el costo de tomar la unión en estrella como una
operación de MapReduce.
2.6. TEORÍA DE LA COMPLEJIDAD PARA MAPREDUCE 61
1. Al hacer que el tamaño del reductor sea pequeño, podemos forzar que haya muchos reductores,
es decir, muchas claves diferentes según las cuales la entrada del problema se
divide por las tareas del mapa. Si también creamos muchas tareas de Reducir,
incluso una para cada reductor, habrá un alto grado de paralelismo y podemos
esperar un tiempo de reloj de pared bajo.
la forma ( yo, k), para 1 ≤ k ≤ norte. Asimismo, para cada elemento de la otra matriz,
decir norte jk, nosotros producimos norte pares clave-valor, cada uno con una de las claves ( yo,
k), para 1 ≤ I ≤ norte. En este caso, no solo es norte el número medio de pares clave-valor
producido para un elemento de entrada, pero cada entrada produce exactamente este número de
pares.
También vemos que q, el tamaño del reductor requerido es 2 norte. Es decir, para cada clave
( yo, k), existen norte pares clave-valor que representan elementos metro ij de la primera matriz
y otro norte pares clave-valor derivados de los elementos norte jk de la segunda
matriz. Si bien este par de valores representa solo un algoritmo particular para
multiplicación de matrices de un paso, veremos que es parte de un espectro de
algoritmos, y de hecho representa un punto extremo, donde q es tan pequeño como
puede ser, y r está en su máximo. De manera más general, existe un tradeo ff entre r y
q, que se puede expresar como qr ≥ 2 norte 2. ✷
La función del mapa: Tome un elemento de entrada ( yo, P I) y generar gramo - 1 pares de valores
clave. Para cada uno, la clave es uno de los conjuntos { u, v}, dónde tu es el grupo a
cuál Foto I pertenece, y v es uno de los otros grupos. El valor asociado es el par ( yo, P
I).
Podemos calcular la tasa de replicación y el tamaño del reductor en función del número de grupos
gramo. Cada elemento de entrada se convierte en gramo - 1 pares clave-valor. Es decir, la tasa de
replicación es gramo - 1, o aproximadamente r = g, ya que suponemos que el número de grupos sigue
siendo bastante grande. El tamaño del reductor es 2 × 10 6 / gramo, ya que ese es el número de valores
en la lista para cada reductor. Cada valor es de aproximadamente un megabyte, por lo que la cantidad
de bytes necesarios para almacenar la entrada es 2 × 10 12 / gramo.
todavía alrededor de medio millón de reductores. Dado que es poco probable que tengamos
disponibles tantos nodos de cómputo, podemos dividir todos los reductores en un número menor de
tareas de Reducir y seguir manteniendo ocupados todos los nodos de cómputo; es decir, podemos
obtener tanto paralelismo como nuestro clúster informático nos ofrece. ✷
1. Un conjunto de entradas.
2. Un conjunto de salidas.
3. Una relación de muchos-muchos entre las entradas y las salidas, que describe
qué entradas son necesarias para producir qué salidas.
Ejemplo 2.19: La figura 2.9 muestra el gráfico para el problema de unión de similitudes
discutido en la sección 2.6.2, si hubiera cuatro imágenes en lugar de un millón. Las
entradas son las imágenes y las salidas son los seis posibles pares de imágenes. Cada
salida está relacionada con las dos entradas que son miembros de su par. Esta forma de
problema, donde las salidas son todos los pares de entradas, es común y nos referiremos
a él como el todos-pares problema. ✷
Ejemplo 2.20: La multiplicación de matrices presenta una gráfica más compleja. Si multiplicamos norte ×
norte matrices METRO y norte para obtener matriz PAG , entonces hay 2 norte 2 entradas,
metro ij y norte jk, y aquí están norte 2 salidas pag ik. Cada salida pag ik está relacionado con 2 norte
entradas: metro I 1, metro I 2,. . . , metro en y norte 1 k, norte 2 k,. . . , norte nk. Además, cada entrada está relacionada
para norte salidas. Por ejemplo, metro ij está relacionado con pag I 1, pag I 2,. . . , pag en. La figura
2.10 muestra la relación entrada-salida para la multiplicación de matrices para el caso simple de
2 × 2 matrices, específicamente
a B mi F I j
=
C D h
gramo k l
✷
2.6. TEORÍA DE LA COMPLEJIDAD PARA MAPREDUCE sesenta y cinco
{ PAG 1, PAG 2}
{ PAG 1, PAG 3}
2
{ PAG 1, PAG 4}
3 { PAG 2, PAG 3}
{ PAG 2, PAG 4}
{ PAG 3, PAG 4}
En los problemas de los ejemplos 2.19 y 2.20, las entradas y salidas fueron
claramente todos los presentes. Sin embargo, existen otros problemas en los que las
entradas y / o salidas pueden no estar todas presentes en cualquier instancia del
problema. Un ejemplo de tal problema es la unión natural de R (A, B) y S (B, C)
discutido en la Sección 2.3.7. Asumimos los atributos A, B, y C cada uno tiene un
dominio finito, por lo que sólo hay un número finito de posibles entradas y salidas.
Todas las entradas son posibles R- tuplas, aquellas que consisten en un valor del
dominio de A emparejado con un valor del dominio de B, y todo lo posible S- tuplas:
pares de los dominios de B y C. Las salidas son todas posibles triples, con
componentes de los dominios de A, B, y C en ese orden. La salida ( a B C) está
conectado a dos entradas, a saber R (a, b) y S (b, c).
Pero en una instancia del cálculo de unión, solo estarán presentes algunas de las
posibles entradas y, por lo tanto, solo se producirán algunas de las posibles salidas. Ese
hecho no influye en la gráfica del problema. Todavía necesitamos saber cómo se relaciona
cada salida posible con las entradas, ya sea que esa salida se produzca o no en una
instancia determinada.
2. Para cada salida del problema, hay al menos un reductor al que se le asignan todas
las entradas que están relacionadas con esa salida. Decimos este reductor
cubre La salida.
El punto (1) es simplemente la definición de "tamaño del reductor". El punto (2) se justifica
por el hecho de que los reductores solo pueden ver las entradas que reciben. Si ningún reductor
ve todas las entradas de las que depende una salida, entonces ningún reductor puede producir
correctamente esa salida y, por lo tanto, el supuesto algoritmo no funcionará. Se puede
argumentar que la existencia de un esquema de mapeo para cualquier tamaño de reductor es lo
que distingue los problemas que pueden resolverse con un solo trabajo de MapReduce de los
que no.
PAG . Por lo tanto, a ningún reductor se le asigna más de 2 p / g insumos; de hecho, a cada
reductor se le asigna exactamente ese número. Además, cada salida está cubierta por
algún reductor. Específicamente, si la salida es un par de dos grupos diferentes tu y v,
entonces esta salida está cubierta por el reductor para el par de grupos { u, v}. Si la salida
corresponde a entradas de un solo grupo u, entonces la salida está cubierta por varios
reductores, los correspondientes al conjunto de grupos { u, v} para cualquier
v 6 = u. Tenga en cuenta que el algoritmo que describimos tiene solo uno de estos
reductores que calcula la salida, pero cualquiera de ellos podría calcularlo. ✷
El hecho de que una salida dependa de una determinada entrada significa que
cuando esa entrada se procesa en la tarea Mapa, habrá al menos un par clave-valor
generado para ser utilizado al calcular esa salida. Es posible que el valor no sea
exactamente la entrada (como fue el caso en el ejemplo 2.21), pero se deriva de esa
entrada. Lo importante es que para cada entrada y salida relacionada hay un par
clave-valor que debe comunicarse. Tenga en cuenta que técnicamente nunca es
necesario más de un par clave-valor para una entrada y salida determinadas, porque
la entrada podría transmitirse al reductor como sí mismo, y las transformaciones en
la entrada aplicadas por la función Map podrían en su lugar ser aplicada por la
función Reducir en el reductor para esa salida.
Ejemplo 2.22: Suponga que sabemos que podemos ejecutar la función Reducir en la memoria
principal en una tecla y su lista asociada de q valores. Sin embargo, también sabemos que solo el
5% de las posibles entradas están realmente presentes en el conjunto de datos. Luego, un
esquema de mapeo para el tamaño del reductor q realmente enviará sobre q / 20 de las
entradas que existen para cada reductor. Dicho de otra manera, podríamos usar el algoritmo
68 CAPÍTULO 2. MAPREDUCE Y LA NUEVA PILA DE SOFTWARE
para reductor tamaño 20 q y esperar que un promedio de q las entradas aparecerán en la lista
para cada reductor. Por tanto, podemos elegir 20 q como el tamaño del reductor, o dado que
habrá cierta aleatoriedad en el número de entradas que realmente aparecen en cada reductor,
es posible que deseemos elegir un valor ligeramente menor del tamaño del reductor, como 18 q.
✷
1. Demuestre un límite superior de cuántas salidas tiene un reductor q las entradas pueden
cubrir. Llame a este límite g (q). Este paso puede ser difícil, pero para ejemplos como el
problema de todos los pares, en realidad es bastante simple.
Ejemplo 2.23: Esta secuencia de pasos puede parecer misteriosa, pero consideremos
el problema de todos los pares como un ejemplo que esperamos aclare las cosas.
Recuerde que en el ejemplo 2.21 dimos un límite superior en la tasa de replicación
r de r ≤ 2 p / q, dónde pag fue el número de entradas y q era el tamaño del reductor.
Mostraremos un límite inferior en r eso es la mitad de esa cantidad, lo que implica que,
aunque son posibles mejoras en el algoritmo, 12 cualquier reducción en la comunicación
para un tamaño de reductor dado será por un factor de 2 como máximo.
Para el paso (1), observe que si un reductor se q entradas, no puede cubrir más
que q 2, o aproximadamente q 2 / 2 salidas. Para el paso (2), sabemos que hay un
12 De hecho, un algoritmo con r Muy cerca de p / q existe, para al menos algunos valores de pag.
2.6. CO TEORÍA DE LA PLLEXIDAD PARA MAPREDUCE 69
pag
Total de 2, o aproximadamente pag 2 / 2 salidas que deben cubrirse cada una. los
la desigualdad construida en el paso (3) es así
Xk
qI 2/ 2 ≥ pag 2 / 2
yo = 1
Xk
qI 2≥ pag 2 ( 2.1)
yo = 1
Ahora, debemos hacer la manipulación del paso (4). Siguiendo la pista, notamos
que hay dos factores de q I en cada término a la izquierda de la Ecuación (2.1), entonces
reemplazamos un factor por q y deja el otro como q I. Ya que q ≥ q I, solo podemos
aumentar el lado izquierdo al hacerlo y, por lo tanto, la desigualdad se mantiene:
Xk
q q I ≥ pag 2
yo = 1
o dividiendo por q:
Xk
qI ≥ p2/ q (2,2)
yo = 1
El paso final, que es el paso (5), es dividir ambos lados PAG k de ecuación 2.2 por
pag, el número de entradas. Como resultado, el lado izquierdo, que es ( yo = 1 q I)/ pag es igual a la
tasa de replicación, y el lado derecho se convierte en p / q. Es decir, hemos probado
el límite inferior en r:
r≥p/q
Como se afirma, esto muestra que la familia de algoritmos del ejemplo 2.21 tiene una tasa de
replicación que es como mucho el doble de la tasa de replicación más baja posible. ✷
Con más detalle, suponga que queremos calcular MN = P, y las tres matrices son norte ×
norte. Agrupa las filas de METRO dentro gramo bandas de n / g filas cada una, y agrupar las
columnas de norte dentro gramo bandas de n / g columnas cada una. Esta agrupación es como
sugiere la figura 2.11. Las claves corresponden a dos grupos (bandas), uno de METRO y uno de
NORTE.
La función del mapa: Para cada elemento de METRO, la función Mapa genera gramo
pares clave-valor. El valor en cada caso es el propio elemento, junto con su número de fila
y columna para que pueda ser identificado por la función Reducir. La clave es el grupo al
que pertenece el elemento, emparejado con cualquiera de los grupos de la matriz NORTE.
Del mismo modo, para cada elemento de NORTE, la función Mapa genera
gramo pares clave-valor. La clave es el grupo de ese elemento emparejado con cualquiera
de los grupos de METRO, y el valor es el elemento en sí más su fila y columna.
La función de reducción: El reductor correspondiente a la llave ( yo, j), dónde I
es un grupo de METRO y j es un grupo de NORTE, obtiene una lista de valores que consta de
todos los elementos de la I th banda de METRO y el j th banda de NORTE. Por tanto, tiene todos
los valores que necesita para calcular los elementos de PAG cuya fila es una de esas filas que
comprenden el I th banda de METRO y cuya columna es una de las que componen el
j th banda de NORTE. Por ejemplo, la figura 2.11 sugiere el tercer grupo de METRO y el
cuarto grupo de NORTE, combinar para calcular un cuadrado de PAG en el reductor (3, 4).
Cada reductor obtiene n (n / g) elementos de cada una de las dos matrices, por lo que q =
2 norte 2 / gramo. La tasa de replicación es gramo, ya que cada elemento de cada matriz se envía a
gramo reductores. Es decir, r = g. Combinatorio r = g con q = 2 norte 2 / gramo podemos concluir que r =
2 norte 2 / q. Es decir, al igual que para la combinación de similitud, la tasa de replicación varía
inversamente con el tamaño del reductor.
Resulta que este límite superior de la tasa de replicación también es un límite inferior.
Es decir, no podemos hacerlo mejor que la familia de algoritmos que describimos
anteriormente en una sola ronda de MapReduce. Curiosamente, veremos que podemos
obtener una comunicación total menor para el mismo tamaño de reductor, si usamos dos
pasadas de MapReduce como discutimos en la Sección 2.3.9. No daremos la prueba
completa del límite inferior, pero sugeriremos los elementos importantes.
2.6. TEORÍA DE LA COMPLEJIDAD PARA MAPREDUCE 71
Para el paso (1) necesitamos obtener un límite superior de cuántas salidas tiene un reductor de
tamaño q puede cubrir. Primero, observe que si un reductor obtiene algunos de los elementos en una
fila de METRO, pero no todos, entonces los elementos de esa fila son inútiles; el reductor no puede
producir ninguna salida en esa fila de PAG . De manera similar, si un reductor recibe una parte, pero no
la totalidad, de una columna de NORTE, estas entradas también son inútiles. Por lo tanto, podemos
suponer que el mejor esquema de mapeo enviará a cada reductor un número de filas completas de
METRO y algunas columnas completas de NORTE. Este reductor
entonces es capaz de producir el elemento de salida pag ik si y solo si ha recibido la
totalidad I la fila de METRO y todo k a columna de NORTE. El resto del
El argumento del paso (1) es demostrar que se cubre el mayor número de salidas
cuando el reductor recibe el mismo número de filas que de columnas. Dejamos esta
parte como ejercicio.
Sin embargo, asumiendo que un reductor recibe k filas de METRO y k columnas de NORTE,
luego q = 2 nk, y k 2 las salidas están cubiertas. Es decir, g (q), el número máximo de salidas
cubiertas por un reductor que recibe q entradas, es q 2 / 4 norte 2.
Para el paso (2), sabemos que el número de salidas es norte 2. En el paso (3)
observamos que si hay k reductores, con el I reductor recibiendo q ≤ qI entradas, entonces
Xk
q 24 norte
I/ 2≥ norte 2
yo = 1
o
Xk
qI ≥2 4 norte 4
yo = 1
r ≥ 2 norte 2 / q
jInJ
2.6. TEORÍA DE LA COMPLEJIDAD PARA MAPREDUCE 73
para todos I en I y k en K.
Observe que la tasa de replicación para el primer trabajo de MapReduce es gramo, y la
comunicación total es por tanto 2 gn 2. También n pag otice que cada reductor obtiene 2 norte 2 / gramo 2
entradas, entonces q = 2 norte 2 / gramo 2. Equivalentemente, g = n √ 2 / q. √ Así, la comunicación total 2
gn 2 se puede escribir en términos de q como 2 2 norte 3 / q.
El segundo trabajo de MapReduce es simple; resume el X iJk ha terminado todos los conjuntos J.
La función del mapa: Suponemos que las tareas de mapa se ejecutan en los nodos de
cálculo que ejecutaron las tareas de reducción del trabajo anterior. Por lo tanto, no se
necesita comunicación entre los trabajos. La función Mapa toma como entrada uno
elemento X iJk, que suponemos que los reductores anteriores han dejado etiquetados con I
y k para que sepamos a qué elemento de la matriz PAG este término contribuye. Uno
Se genera el par clave-valor. La clave es ( yo, k) y el valor es X iJk.
La función de reducción: La función Reducir simplemente suma los valores asociados con
la clave ( yo, k) para calcular el elemento de salida PAG ik.
Ahora, recuerde que el costo de comunicación que calculamos para el algoritmo de una
pasada es 4 norte 4 / q. Bien podemos asumir q es menos que norte 2, o de lo contrario podemos
solo usa como √ erial en un nodo de cálculo y no utilizar MapReduce en absoluto. Por lo
tanto, norte 3 / q es más pequeña que norte 4 / q, y si q está cerca de su mínimo posible
3 entonces el algoritmo de dos pasadas supera al algoritmo de una pasada por un
valor de 2 norte, 1 √
Factor de Sobre) en comunicación. Además, podemos esperar que la diferencia en la
comunicación sea la diferencia de costos significativa. Ambos algoritmos hacen lo mismo
Sobre 3) operaciones aritmeticas. El método de dos pasadas naturalmente tiene más tareas
de administración de gastos generales que el método de un trabajo. Por otro lado, el
segundo paso del algoritmo de dos pasos aplica una función Reducir que es asociativa y
conmutativa. Por lo tanto, podría ser posible ahorrar algunos costos de comunicación
utilizando un combinador en esa pasada.
(a) La prueba de que, para un reductor de tamaño fijo, el número máximo de salidas está
cubierto por un reductor cuando ese reductor recibe un número igual de filas de
METRO y columnas de NORTE.
PAG
k
(b) La manipulación algebraica necesaria, comenzando con yo = 1 q 2
I≥ 4 norte 4.
!! Ejercicio 2.6.3: Supongamos que nuestras entradas son cadenas de bits de longitud B, y las salidas
corresponden a pares de cuerdas a una distancia de Hamming 1. 14
(a) Demuestre que un reductor de tamaño q puede cubrir como máximo q / 2) registro 2 q salidas.
(b) Utilice el inciso a) para mostrar el límite inferior de la tasa de replicación: r ≥ B/ Iniciar sesión 2 q.
(c) Demuestre que existen algoritmos con la tasa de replicación dada por el inciso
(b) para los casos q = 2, q = 2 B, y q = 2 B/ 2.
!! Ejercicio 2.6.4: Para pag que es el cuadrado de un primo, muestra que hay un
esquema de mapeo para el problema de todos los pares que ha r ≤ 1 + p / q.
✦ Sistemas de archivos distribuidos: Una arquitectura para sistemas de archivos a gran escala
tems se ha desarrollado recientemente. Los archivos se componen de fragmentos de
aproximadamente 64 megabytes, y cada fragmento se replica varias veces, en diferentes nodos
informáticos o racks.
14 Las cadenas de bits tienen Distancia de Hamming 1 si difieren en exactamente una posición de bit. Puede
consultar la Sección 3.5.6 para conocer la definición general.
2.7. RESUMEN DEL CAPITULO 2 75
✦ Chispa - chispear: Este popular sistema de flujo de trabajo presenta Resilient, Distributed
Conjuntos de datos (RDD) y un lenguaje en el que se pueden escribir muchas operaciones
comunes en RDD. Spark tiene una serie de eficiencias, incluida la evaluación perezosa de
los RDD para evitar el almacenamiento secundario de resultados intermedios.
76 CAPÍTULO 2. MAPREDUCE Y LA NUEVA PILA DE SOFTWARE
y el registro del linaje de los RDD para que puedan reconstruirse según sea
necesario.
✦ TensorFlow: Este sistema de flujo de trabajo está específicamente diseñado para respaldar
aprendizaje automático. Los datos se representan como matrices multidimensionales, o
tensores, y las operaciones integradas realizan muchas operaciones poderosas, como el álgebra
lineal y el entrenamiento de modelos.
✦ Estrella se une: Las consultas analíticas a menudo implican una tabla de hechos muy grande unida
con tablas de dimensiones más pequeñas. Estas uniones siempre se pueden realizar de forma
eficiente mediante la técnica de unión de múltiples vías. Una alternativa es distribuir la tabla de
hechos y replicar las tablas de dimensiones de forma permanente, usando la misma estrategia
que se usaría si estuviéramos tomando la combinación de múltiples vías de la tabla de hechos y
cada tabla de dimensiones.
de modo que a ningún reductor se le asignen más entradas de las que permite el tamaño
del reductor y, sin embargo, para cada salida hay algún reductor que obtiene todas las
entradas necesarias para calcular esa salida. El requisito de que haya un esquema de
mapeo para cualquier algoritmo de MapReduce es una buena expresión de lo que hace
que los algoritmos de MapReduce sean diferentes de los cálculos paralelos generales.
24. www.tensorflow.org.