El origen de Map y Reduce
Publicado el Junio 23, 2010 por Jose María Rey
Archivado bajo Tecnologías
A principios de este año se concedió a Google la patente de MapReduce, un método de procesamiento que, según Google, permite tratar gandes cantidades de información en entornos masivamente paralelos. El método se presta también a ser ejecutado en entornos de alta disponibilidad, donde una unidad de procesamiento puede ser reemplazada por otra en caso de fallo.
En esencia, el método consiste en distribuir la carga de trabajo entre un cierto numero de procesadores (los workers), cada uno de los cuales puede ejecutar una de estas tareas:
- Map: Las tareas tipo map aplican una función a su entrada para obtener los datos transformados. En el entorno MapReduce, a cada dato de salida se le asocia una etiqueta que se usa en las tareas Reduce.
- Reduce: Las tareas tipo reduce toman los datos que llegan de los workers ejecutando tareas map y generan una salida que se obtiene de aplicar una función a todos aquellos pares recibidos que contengan la misma etiqueta. La salida puede contener uno o más registros.
El aspecto que probablemente sea más relevante del entorno MapReduce es su alta configurabilidad:
- Por un lado, se puede organizar los workers en la estructura de malla que se desee (es decir, se puede por ejemplo asignar a una tarea M nodos map que alimentan a R nodos reduce que a su vez vuelven a otro conjunto de nodos map…). Tampoco debemos olvidar que el criterio de partición del conjunto de datos entre los nodos map puede ser también adaptado a una tarea particular.
- Por otro lado, tanto los nodos map como los nodos reduce aplican funciones que no son fijas sino que pueden ser programadas para cada tarea específica.
Ambos pasos de procesamiento (map y reduce) están inspirados, como reconocen implícitamente los autores de la patente, en funciones que la programación funcional lleva usando desde hace mucho tiempo.
La programación funcional basa su modelo de funcionamiento casi exclusivamente en la composición de funciones y no hay casi estructuras de control (tales como bucles, propios de los lenguajes imperativos) por lo que el tratamiento de funciones debe ser necesariamente muy potente. Parte de esta potencia viene del hecho de que en programación funcional las funciones son un tipo de objetos como cualquier otro y por tanto pueden ser pasadas como argumento a otras funciones. Es verdad que ciertos lenguajes imperativos como C++ importaron esta característica pero la integración conseguida no es tan perfecta como en programación funcional.
En programación funcional, la función map realiza lo siguiente:
map(f,[a1,a2,...,an]) = [f(a1), f(a2), ..., f(an)]
Es decir, map recibe dos un argumentos: Una función unaria (f) una lista de datos sobre los que operar (los ai). La función map aplica f a cada uno de los elementos de la lista y retorna una lista con todos los valores resultantes. La potencia de map está precisamente en este argumento puesto que sin cambiar la definición de map se pueden hacer infinidad de cosas con una lista, simplemente definiendo una f adecuada.
El paralelismo entre el map funcional y el primero de los dos pasos de procesamiento de MapReduce resulta claro (se debe tener en cuenta que no hay problema en que la función f devuelva pares (etiqueta, valor)). La lista de valores recibida por map estaría compuesta por todos los elementos pertenecientes a una misma partición definida por el paso inicial de particionamiento.
El paso reduce resulta algo más complejo. En programación funcional, reduce (también conocida como fold) aplica una función binaria a los elementos de una lista pero en lugar de devolver un valor por cada valor de entrada, reduce acumula todas las aplicaciones para generar un único valor:
reduce(f,z, [a1, a2, ..., an])=f(f(…f(f(z, a1), a2), a3),…, an)
En la expresión anterior se ha presentado el caso del reduce que acumula a izquierdas (conocido como foldl) pero, por supuesto, se puede definir su versión que acumula a derechas (foldr). En Haskell, la función reduce a izquierdas se puede escribir como sigue:
reduce f z [] = z
reduce f z (x:xs) = reduce f (f z x) xs
La definición permite apreciar que z es una especie de elemento neutro que se devuelve cuando se recibe una lista de elementos vacía. La versatilidad de reduce es mucho mayor de lo que pueda parecer a primera vista. Por ejemplo:
- Sumar todos los elementos de una lista: reduce (+) 0 [a1, ... ,an]
- Multiplicar todos los elementos de una lista: reduce (*) 1 [a1, ... ,an]
donde (+) y (*) representan respectivante las funciones binarias que suman o multplican sus dos argumentos. Usando valores más complejos de f se pueden conseguir efectos tales como definir map en función de reduce.
En este caso, la correspondencia entre el reduce funcional y el segundo paso del entorno MapReduce no es tan cercana ya que en el entorno de Google la salida de un paso de reducción puede tener más de un valor mientras que la versión funcional devuelve un único valor y en el esquema MapReduce probablemente se puedan definir otros esquemas de uso de f pero en cualquier caso, la relación es clara.
Tags: Google, lenguajes de programacion
Tendencias en lenguajes de programación 2009
Publicado el Marzo 3, 2009 por Alonso Alvarez
Archivado bajo Tecnologías, Tendencias
Un año más, O’Reilly publica un pequeño estudio sobre el estado de la publicación de libros técnicos, lo que sirve para identificar también tendencias en cuanto a la popularidad y uso de determinadas tecnologías y lenguajes de programación.
Aunque en los últimos años ha permanecido relativamente estable (incluso con ligeros incrementos) el número de libros vendidos, al menos en Estados Unidos, y dentro de una evolución estacional parecida, con picos en Navidad y el inicio del curso, el último cuarto del año 2008 ha visto una reducción en el número de títulos vendidos, quizá como consecuencia de la crisis. Esto hace que al comparar las cifras entre 2007 y 2008 haya distorsiones en cuanto a la evolución que conviene tener en cuenta.
El siguiente gráfico muestra la evolución del mercado de libros sobre lenguajes de programación comparando 2007 con 2008:
El tamaño de cada caja se refiere al número de ejemplares vendido, y el color a la tendencia (verde creciente, rojo decreciente, negro neutro). Según este gráfico, y teniendo en cuenta la evolución final de 2008, se puede ver que:
- Los lenguajes dominantes son: C#, Java, PHP, Javascript y C/C++. No obstante hay una tendica a la estabilidad o a la baja, nunca al crecimiento. En el caso de Javascript y C/C++ las caídas son muy acusadas (por encima del 20%).
- Destaca el espectacular crecimiento de Objective C.
Lógicamente, hay que tener presente que estos valores se refieren a libros vendidos, lo que excluye el acceso a información en formato electrónico sobre lenguajes de programación. No obstante, es un buen indicador de tendencias.
El estudio incluye también otros análisis, como el interés en tecnologías, examinando la venta de libros. Así, en Sistemas Operativos se destaca el crecimiento de Mac OS, el crecimiento de libros relacionados con blogs, o los relacionados con medios digitales.
Las fuentes de este análisis están en:
- State of the Computer Book Market 2008, Part 1: The Market
- State of the Computer Book Market 2008, Part 2: The Technologies
- State of the Computer Book Market 2008, Part 3: The Publishers
- State of the Computer Book Market 2008, part 4 — The Languages
Además, se puede comparar con los datos anteriores en:
Tags: lenguajes de programacion, libros, medios digitales, Tendencias
Tendencias en lenguajes de programación en 2008
Publicado el Marzo 20, 2008 por Alonso Alvarez
Archivado bajo Tecnologías, Tendencias
Como cada año, en O’Reilly hacen un estudio del estado de la publicación de libros técnicos, lo que sirve para identificar también tendencias en cuanto a la popularidad y uso de determinadas tecnologías y lenguajes de programación.
Este gráfico muestra la evolución del mercado de libros sobre lenguajes de programación que, por cierto, ha caído ligeramente en el último año:
(en la imagen, el área representa la cantidad de libros vendidos, y el color la tendencia, siendo el verde creciente y el rojo decreciente)
Lo más destacado del estudio es el crecimiento moderado de lenguajes muy difundidos como C#, Ruby y Python, y el rápido crecimiento de otros menos conocidos como powershell, y actionscript. En el lado negativo, se constata el declive de Visual Basic, .NET y Perl. Por último, hay un fuerte estancamiento en la mayoría de los lenguajes más asentados como Java (que en realidad sigue una clara tendencia a la baja), Javascript, C/C++, PHP o SQL.
El estudio analiza también libros referidos a otras tecnologías, no sólo lenguajes. Aquí se puede destacar el fuerte crecimiento de todo lo relacionado con Windows Vista (esperable), “colaboración” (con Microsoft SharePoint como máximo exponente), Office (especialmente la versión 2007), y Cisco. En el otro extremo, los descensos más acusados están en libros sobre creación de páginas web, fotografía digital y programación Web.
Citando a:
- La Cofa (“Tendencias en lenguajes de programación“)
- O’Reilly Radar (“State of the Computer Book Market, Part 1: The Market“, y resto de artículos de la serie)
Tags: ingenieria software, lenguajes de programacion, libro, tecnología, Tendencias
CLR III: vaciando la lista de referencias
Publicado el Octubre 2, 2007 por Alonso Alvarez
Archivado bajo Banda ancha, Futuro de Internet, Innovación, Movilidad, Tecnologías, Tendencias
Periódico saneamiento de memoria. Una lista de artículos interesantes que corren el peligro de caer en el olvido:
- Web semántica: una reflexión (Followup on Semantic Web approach versus Web 2.0) y dos interesantes artículos sobre sus fundamentos y la diferencia entre abordarla con estrategias bottom-up (“Semantic Web: Difficulties with the Classic Approach“) y top-down (“Top-Down: A New Approach to the Semantic Web“). Hay quien no encuentra una respuesta satisfactoria a la pregunta “¿Por qué necesitamos que los ordenadores entiendan la semántica?”
- La escalabilidad es uno de los rasgos distintivos de la Web 2.0. El blog “High Scalability” está dedicado prioritariamente a estos temas.
- Un repaso a las soluciones de convergencia de Motorola en “Motorola, del Femtocell a la nueva generación de televisión“
- Mobile 2.0. Se ha celebrado recientemente la Mobile Web 2.0 Conference en Londres, y Read/Write Web ha publicado una presentación (“Mobile 2.0 Startup Ecosystem“) en la que se exponen las distintas categorías de startups en la web móvil.
- La impresión 3D más cerca: “Ya se puede reservar la impresora 3D de Desktop Factory“, por 4.995$.
- El anuncio de una plataforma de pago móvil de Google, GPay, generó bastantes comentarios: “PayForIt, Google’s Gpay suggest mobile e-commerce is hot“, “Algo más del sistema de pago SMS de Google… GPay“, “¿Podemos pagar con móvil ya por favor?“, y “Mobiles to become digital wallets“.
- Lenguajes: “Free Pascal 2.2…listo para descarga” en NoticiasTech. Aún le queda mucha vida al venerable PASCAL.
- Web 2.0: por si alguno aún tiene dudas, existe una presentación muy completa.
- Movimientos de Google en el mundo de los servicios móviles: el penúltimo ha sido la muy comentada adquisición de Zingku (“Google compra Zingku, una plataforma para móviles (¿preparando terreno?)“, “Google Acquires Mobile Communication Company Zingku“, y “Google Acquires Mobile Platform Operator Zingku“).

Tags: Google, impresión 3D, lenguajes de programacion, servicios moviles, Web 2.0, web semantica
Tendencias en lenguajes de programación
Publicado el Septiembre 24, 2007 por Alonso Alvarez
Archivado bajo Tecnologías, Tendencias
Encontrar fuentes de información fiables y objetivas sobre tendencias tecnológicas es siempre complicado. Cuando además se refieren a cuestiones como el uso de lenguajes de programación puede ser una tarea casi imposible. Hay fuentes parciales que pueden proporcionar una visión limitada para cada entorno como las descargas o las ventas, aunque no una comparativa general.
Una aproximación a la evolución del uso de lenguajes de programación puede extraerse de este gráfico contenido en un interesante informe de O’Reilly Radar:
La editorial O’Reilly está publicando periódicamente un estudio con datos obtenidos de las cifras de ventas de libros en Estados Unidos, y parte de la idea de que las ventas de libros pueden ser un indicador de las tendencias tecnológicas: aquellas emergentes o en proceso de adopción aumentarían sus ventas, mientras que las maduras estarían asociadas a un declive en la cantidad de libros vendidos sobre esa temática.
El estudio, mucho más amplio, cubre además de lenguajes, sistemas operativos o aplicaciones de ofimática entre otras.
En el caso concreto de la gráfica anterior, que compara el primer cuarto de este año y el pasado, el mercado de venta de libros técnicos muestra un gran interés del público hacia Ruby, que crece un 105% a pesar de tener ya un porcentaje significativo de mercado, y Transact SQL. Otros lenguajes tienen un importante crecimiento como Actionscript o VBScript, pero el porcentaje de mercado es mucho menor. Hay también un moderado crecimiento en ventas de Javascript y Python. Las mayores caídas se dan en Visual Basic, Perl, VBA, C/C++, PHP y Java, todos por encima del 10%.
El mercado de este tipo de libros decayó, en general, casi un 10% con respecto al año anterior, y en un periodo que es de los más significativos en ventas.
Vía: O’Reilly Radar
Tags: informe, lenguajes de programacion, RIA, Tendencias
Visualizar los paradigmas de programación
Publicado el Agosto 22, 2007 por Alonso Alvarez
Archivado bajo Tecnologías
Paradigmas que no lenguajes. El mapa está en “Lambda the ultimate“, un blog sobre lenguajes de programación, y muestra los distintos paradigmas (declarativa, imperativa, funcional, …), sus relaciones, y coloca los lenguajes de programación más representativos cerca del paradigma que mejor los representa:

Vía: Google Reader Blog
Tags: ingenieria software, lenguajes de programacion, mapas






