Capítulo 1: Introducción
1.1 Motivación
1.2 Objetivos
1.3 Resultados esperados
1.4 Estructura de la tesina
Capítulo 2: Big Data y Paradigmas de Programación
2.1 Explicación de Big Data
2.2 Tecnologías que posibilitan trabajar con Big Data
2.2.1 Hadoop Ecosystem
2.2.2 Apache Spark
2.2.3 Apache Flume y Apache Kafka
2.2.4 NoSQL Databases
2.2.5 Data Warehousing and Analytics
2.2.6 Herramientas de Machine Learning
Capítulo 3: Ecosistema Hadoop y MapReduce
3.1 El Paradigma MapReduce
3.1.1 Historia y Evolución
3.2 Componentes del ecosistema Apache Hadoop
3.2.1 HDFS (Hadoop Distributed File System)
3.2.2 Job Tracker
3.2.3 Task Tracker
3.2.4 YARN (Yet Another Resource Negotiator)
3.2.5 Apache Hive
3.2.6 Apache Pig
3.2.7 Apache HBase
3.3 Etapas del Paradigma MapReduce
3.3.1 Map
3.3.2 Shuffle
3.3.3 Sort
3.3.4 Reduce
3.3.5 Combine
3.4 Ejemplo de Conteo de Palabras con MapReduce
3.5 Conclusión
Capítulo 4: Sistemas Distribuidos y Comunicación en Tiempo Real
4.1 Explicación de Sistemas Distribuidos
4.1.1 Clasificación
4.2 Mecanismos de Comunicación en Tiempo Real para la Web
4.2.1 WebSockets
4.2.2 WebRTC
4.2.3 Integración de WebSockets y WebRTC en la Aplicación Propuesta
Capítulo 5: Investigación previa y Soluciones Actuales
5.1 Soluciones Actuales para la Ejecución de Jobs MapReduce
5.1.1 Herramienta Utilizada en el Dictado de la Asignatura
5.1.2 Otras Soluciones Existentes
5.1.2.1 Implementación de Hadoop con un Clúster de Computadoras
5.1.2.2 Soluciones Basadas en la Nube
5.1.2.3 Soluciones Híbridas y Alternativas
5.2 Ejecutar Python en el Navegador
5.2.1 Pyodide
5.2.2 Brython
5.2.3 Skulpt
5.2.4 Transcrypt
5.3 Análisis y Aplicación de Código Base para Funciones Map, Combine y Reduce
5.3.1 Necesidad de un Código Base
5.3.2 Implementación del Código Base
5.3.3 Integración con React
Capítulo 6: Implementación de la Aplicación
6.1 Arquitectura de la Aplicación
6.1.1 Frontend (Next.js)
6.1.2 Backend (Node.js y Express.js)
6.1.3 Servidor NGINX
6.1.4 Cert-Generator
6.1.5 Docker y Redes
6.2 Flujo de Comunicación de la Aplicación
6.2.1 Frontend y Backend
6.2.2 Comunicación entre peers (frontend)
6.3 Explicación del Funcionamiento de la Aplicación
6.3.1 Dos Tipos de Nodos: Master y Slaves
6.3.2 Funciones del Master
6.3.2.1 Definición de funciones
6.3.2.2 Monitoreo de Estado y Gestión de Conexiones
6.3.2.3 Asignación y Distribución de Tareas
6.3.2.4 Manejo de Resultados y Finalización de Tareas
6.3.3 Funciones del Slave
6.3.3.1 Ejecución de Tareas Asignadas
6.3.3.2 Monitoreo y Reporte de Estado
6.3.3.3 Manejo de Errores
6.3.3.4 Visualización de estadísticas
6.3.4 Subida de Archivos
6.3.5 Circuito de Mensajes
6.3.5.1 Inicio de Conexión y Señalización
6.3.5.2 Distribución de Tareas y Sincronización
6.3.5.3 Ejecución y Reporte de Resultados
6.3.5.4 Finalización de Tareas y Desconexión
6.3.5.5 Sincronización para la Ejecución del Job MapReduce
6.3.6 Gestión de Sesiones
6.3.6.1 Gestión de Sesiones en el Backend
6.3.6.2 Gestión de Sesiones en el Frontend
6.3.6.3 Coordinación Integral
6.3.6.4 Persistencia y Reconexión
6.3.6.5 Desconexiones Involuntarias y Manejo de Estados
6.3.7 Estadísticas
6.3.7.1 Tiempo de ejecución
6.3.7.2 Uso de recursos
6.3.7.3 Resultados de ejecución
6.4 Limitaciones actuales de la App
6.4.1 Restricción en el Tamaño de Archivos
6.4.2 Ausencia de Restricciones en la Cantidad de Archivos
6.4.3 Limitaciones de Conectividad y Redes
6.4.4 Consideraciones sobre la Escalabilidad
6.4.5 Conclusiones y Recomendaciones
Capítulo 7: Pruebas funcionales de la aplicación
7.1 Problema de Proyección
7.2 Problema de Contador
7.3 Problema de Agregación
7.4 Problema de Join
7.5 Problema de Clustering (k-means)
7.6 Conclusiones
Capítulo 8: Problemas y Soluciones en el Desarrollo
8.1 NAT Simétrico y Asimétrico
8.2 Servidores STUN y TURN
8.3 Implementación de HTTPS en Red Local
8.4 Particionado de Mensajes por la Red WebRTC en Chunks
8.4.1 Implementación de la Transmisión de Chunks
8.4.2 Desafíos y Soluciones
Capítulo 9: Conclusiones y Trabajo Futuro
9.1 Resumen de los Hallazgos
9.2 Posibles Mejoras y Futuras Investigaciones
9.2.1 Implementación de las Etapas Shuffle y Sort
9.2.2 Soluciones Iterativas
9.2.3 Configuración de Funciones Map para Diferentes Conjuntos de Datos
9.2.4 Administración de Parámetros y Variables Globales
9.2.5 Integración de IntelliSense en el Editor de Código
9.2.6 Implementación de la Aplicación para Funcionamiento Global
9.2.7 Mejora del Poder Computacional de los Nodos
9.2.8 Optimizar el algoritmo de distribución de claves
9.2.9 Conclusión
Referencias bibliográficas
Anexos