Skip to content

Commit b29934d

Browse files
committed
Added and translated map-reduce README.md to Spanish.
1 parent 511f008 commit b29934d

File tree

1 file changed

+256
-0
lines changed

1 file changed

+256
-0
lines changed

Diff for: localization/es/map-reduce/README.md

+256
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,256 @@
1+
---
2+
title: "Patrón de Diseño MapReduce en Java"
3+
shortTitle: MapReduce
4+
description: "Aprende el patrón de diseño MapReduce en Java con ejemplos de la vida real, diagramas de clases y tutoriales. Entiende su intención, aplicación, beneficios y usos conocidos para mejorar tu conocimiento sobre patrones de diseño."
5+
category: Optimización de Rendimiento
6+
language: es
7+
tag:
8+
- Data processing
9+
- Code simplification
10+
- Delegation
11+
- Performance
12+
- Procesamiento de datos
13+
- Simplificación de coódigo
14+
- Delegación
15+
- Rendimiento
16+
---
17+
18+
## También conocido como:
19+
20+
- Estrategia Separa-Aplica-Combina (Split-Apply-Combine Strategy)
21+
- Patrón Dispersa-Recolecta (Scatter-Gather Pattern)
22+
23+
## Intención del Patrón de Diseño Map Reduce
24+
25+
MapReduce pretende procesar y generar grandes conjuntos de datos con un algoritmo en paralelo y distribuido en un grupo. Divide la carga de trabajo en dos fases principales: Mapear (Map) y Reducir (Reduce), permitiendo así una mayor eficiencia en procesamiento de datos en paralelo.
26+
27+
## Explicación Detallada del Patrón de Diseño Map Reduce con Ejemplos del Mundo Real
28+
29+
Ejemplo Práctico
30+
31+
> Imagina una compañía de comercio en línea (e-commerce) que quiere analizar sus datos de ventas a lo largo de múltplies regiones. Tienen terabytes de datos de transacciones almacenados en cientos de servidores. Usando MapReduce, pueden procesar estos datos eficientemente para calcular las ventas totales por categoría de producto. La función Map procesaría registros de ventas individuales, regresando pares clave-valor de (categoría, cantidad de venta). La función Reduce entonces sumaría todas las cantidades de ventas por cada categoría, produciendo el resultado final.
32+
33+
En palabras sencillas
34+
35+
> MapReduce divide un gran problema en partes más pequeñas, las procesa en paralelo y después combina los resultados.
36+
37+
En Wikipedia dice:
38+
39+
> "MapReduce es un modelo de programación e implementación asociada para procesar y generar grandes conjuntos de información con un algoritmo en paralelo y distribuido en un grupo".
40+
> MapReduce consiste de dos funciones principales:
41+
> El nodo principal toma la entrada de información, la divide en problemas más pequeños (sub-problemas) y los distribuye a los nodos restantes (de trabajo). Un nodo de trabajo puede repetir este proceso llevando a una estructura de árbol multinivel. El nodo de trabajo procesa el sub-problema y le regresa la respuesta al nodo principal.
42+
> El nodo principal recolecta todas las respuestas de todos los sub-problemas y las combina de cierta manera para regresar la salida de información - la respuesta del principal problema que estaba resolviendo.
43+
> Este acercamiento permite un procesamiento eficiente de grandes cantidades de datos através de múltiples máquinas, convirtiéndola en una técnica fundamental en análisis de cantidades enormes de datos y computo distribuido.
44+
45+
## Ejemplo Programático de Map Reduce en Java
46+
47+
### 1. Fase de Map (Mapeador; División & Procesamiento de Datos)
48+
49+
- El Mapper toma una entrada de texto (string), lo divide en palabras y cuenta las ocurrencias.
50+
- Salida: Un mapa {palabra → conteo} por cada línea de entrada.
51+
52+
#### `Mapper.java`
53+
54+
```java
55+
public class Mapper {
56+
public static Map<String, Integer> map(String input) {
57+
Map<String, Integer> wordCount = new HashMap<>();
58+
String[] words = input.split("\\s+");
59+
for (String word : words) {
60+
word = word.toLowerCase().replaceAll("[^a-z]", "");
61+
if (!word.isEmpty()) {
62+
wordCount.put(word, wordCount.getOrDefault(word, 0) + 1);
63+
}
64+
}
65+
return wordCount;
66+
}
67+
}
68+
```
69+
70+
Ejemplo de Entrada: `"Hello world hello"`
71+
Salida: `{hello=2, world=1}`
72+
73+
### 2. Fase de Shuffle (Combinación; Agrupar Datos por Clave)
74+
75+
- La Combinación recolecta pares clave-valor de múltiples mapeadores (mappers) y valores de grupo por clave.
76+
77+
#### `Shuffler.java`
78+
79+
```java
80+
public class Shuffler {
81+
public static Map<String, List<Integer>> shuffleAndSort(List<Map<String, Integer>> mapped) {
82+
Map<String, List<Integer>> grouped = new HashMap<>();
83+
for (Map<String, Integer> map : mapped) {
84+
for (Map.Entry<String, Integer> entry : map.entrySet()) {
85+
grouped.putIfAbsent(entry.getKey(), new ArrayList<>());
86+
grouped.get(entry.getKey()).add(entry.getValue());
87+
}
88+
}
89+
return grouped;
90+
}
91+
}
92+
```
93+
94+
Ejemplo de Entrada:
95+
96+
```
97+
[
98+
{"hello": 2, "world": 1},
99+
{"hello": 1, "java": 1}
100+
]
101+
```
102+
103+
Salida:
104+
105+
```
106+
{
107+
"hello": [2, 1],
108+
"world": [1],
109+
"java": [1]
110+
}
111+
```
112+
113+
### 3. Fase de Reduce (Reductor; Agregar Resultados)
114+
115+
- El Reductor suma todas las ocurrencias de cada palabra.
116+
117+
#### `Reducer.java`
118+
119+
```java
120+
public class Reducer {
121+
public static List<Map.Entry<String, Integer>> reduce(Map<String, List<Integer>> grouped) {
122+
Map<String, Integer> reduced = new HashMap<>();
123+
for (Map.Entry<String, List<Integer>> entry : grouped.entrySet()) {
124+
reduced.put(entry.getKey(), entry.getValue().stream().mapToInt(Integer::intValue).sum());
125+
}
126+
127+
List<Map.Entry<String, Integer>> result = new ArrayList<>(reduced.entrySet());
128+
result.sort(Map.Entry.comparingByValue(Comparator.reverseOrder()));
129+
return result;
130+
}
131+
}
132+
```
133+
134+
Ejemplo de Entrada:
135+
136+
```
137+
{
138+
"hello": [2, 1],
139+
"world": [1],
140+
"java": [1]
141+
}
142+
```
143+
144+
Salida:
145+
146+
```
147+
[
148+
{"hello": 3},
149+
{"world": 1},
150+
{"java": 1}
151+
]
152+
```
153+
154+
### 4. Ejecutar el Proceso Completo de MapReduce
155+
156+
- La clase MapReduce coordina los tres pasos.
157+
158+
#### `MapReduce.java`
159+
160+
```java
161+
public class MapReduce {
162+
public static List<Map.Entry<String, Integer>> mapReduce(List<String> inputs) {
163+
List<Map<String, Integer>> mapped = new ArrayList<>();
164+
for (String input : inputs) {
165+
mapped.add(Mapper.map(input));
166+
}
167+
168+
Map<String, List<Integer>> grouped = Shuffler.shuffleAndSort(mapped);
169+
170+
return Reducer.reduce(grouped);
171+
}
172+
}
173+
```
174+
175+
### 5. Ejecución Principal (Llamar a MapReduce)
176+
177+
- La clase Main ejecuta el "pipeline" de MapReduce y regresa el conteo final de palabras.
178+
179+
#### `Main.java`
180+
181+
```java
182+
public static void main(String[] args) {
183+
List<String> inputs = Arrays.asList(
184+
"Hello world hello",
185+
"MapReduce is fun",
186+
"Hello from the other side",
187+
"Hello world"
188+
);
189+
List<Map.Entry<String, Integer>> result = MapReduce.mapReduce(inputs);
190+
for (Map.Entry<String, Integer> entry : result) {
191+
System.out.println(entry.getKey() + ": " + entry.getValue());
192+
}
193+
}
194+
```
195+
196+
Salida:
197+
198+
```
199+
hello: 4
200+
world: 2
201+
the: 1
202+
other: 1
203+
side: 1
204+
mapreduce: 1
205+
is: 1
206+
from: 1
207+
fun: 1
208+
```
209+
210+
## Cuándo Usar el Patrón de Diseño MapReduce en Java
211+
212+
Usa MapReduce cuando se están:
213+
214+
- Procesando grandes conjuntos de información que no quepa en la memoria de una sola máquina.
215+
- Realizando cálculos que se puedan desarrollar en paralelo.
216+
- Trabajando en escenarios tolerante a fallos y computación distribuida.
217+
- Analizando archivos de registro, datos de rastreo web o datos científicos.
218+
219+
## Tutoriales del Patrón de Diseño MapReduce en Java
220+
221+
- [Tutorial MapReduce (Apache Hadoop)](https://hadoop.apache.org/docs/stable/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html)
222+
- [Ejemplo MapReduce (Simplilearn)](https://www.youtube.com/watch?v=l2clwKnrtO8)
223+
224+
## Ventajas y Desventajas del Patrón de Diseño MapReduce
225+
226+
Ventajas:
227+
228+
- Escalabilidad: Puede procesar grandes cantidades de datos através de múltiples máquinas
229+
- Tolerancia a Fallos: Maneja los fallos elegantemente
230+
- Simplicidad: Resume detalles complejos de distribución computacional
231+
232+
Desventajas:
233+
234+
- Costo-Beneficio: Ineficiente para conjuntos de datos chicos por la preparación y coordinación necesaria
235+
- Flexibilidad Limitada: Inadecuado para todos los tipos de computación o algoritmos
236+
- Latencia: En relación a lotes de información podría ser inadecaudo para necesidades de procesamiento en tiempo real
237+
238+
## Aplicaciones Reales para el Patrón de Diseño MapReduce en Java
239+
240+
- Implementación original de Google para indexar páginas web
241+
- Hadoop MapReduce para procesamiento de información extensa
242+
- Sistemas de análisis de registros a gran escala
243+
- Secuencia genómica en análisis de bio-informática
244+
245+
## Patrones de Diseño relacionados a Java
246+
247+
- Patrón de Encadenamiento (Chaining Pattern)
248+
- Patrón de Maestro-Trabajador (Master-Worker Pattern)
249+
- Patrón de Tubería (Pipeline Pattern)
250+
251+
## Referencias y Creditos
252+
253+
- [¿Qué es MapReduce?](https://www.ibm.com/think/topics/mapreduce)
254+
- [¿Por qué MapReduce no ha muerto?](https://www.codemotion.com/magazine/ai-ml/big-data/mapreduce-not-dead-heres-why-its-still-ruling-in-the-cloud/)
255+
- [Soluciones Escalables de Procesamiento de Datos Distribuidos](https://tcpp.cs.gsu.edu/curriculum/?q=system%2Ffiles%2Fch07.pdf)
256+
- [Patrones de Diseño en Java: Experiencia Práctica con Ejemplos del Mundo Real](https://amzn.to/3HWNf4U)

0 commit comments

Comments
 (0)