{"id":27968586,"url":"https://github.com/ging/netremor-data-lake","last_synced_at":"2025-05-07T21:05:06.779Z","repository":{"id":248512158,"uuid":"818161488","full_name":"ging/netremor-data-lake","owner":"ging","description":null,"archived":false,"fork":false,"pushed_at":"2024-06-24T09:47:26.000Z","size":919,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":8,"default_branch":"main","last_synced_at":"2025-05-07T21:05:02.813Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Jupyter Notebook","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ging.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-06-21T08:24:53.000Z","updated_at":"2024-07-15T09:58:38.000Z","dependencies_parsed_at":"2024-07-15T12:58:57.459Z","dependency_job_id":"9557e769-6849-44e5-86ea-1872dbb70b90","html_url":"https://github.com/ging/netremor-data-lake","commit_stats":null,"previous_names":["ging/netremor-data-lake"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ging%2Fnetremor-data-lake","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ging%2Fnetremor-data-lake/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ging%2Fnetremor-data-lake/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ging%2Fnetremor-data-lake/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ging","download_url":"https://codeload.github.com/ging/netremor-data-lake/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252954429,"owners_count":21830903,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-05-07T21:05:06.228Z","updated_at":"2025-05-07T21:05:06.766Z","avatar_url":"https://github.com/ging.png","language":"Jupyter Notebook","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n# netremor-data-lake\n=======\n## Gestión de la información en Data Lakes\nProyecto de Final de Máster de Redes y Servicios Telemáticos de la UPM.\nDurante este proyecto se ha estudiado la inclusión de un lago de datos en una arquitectura previamente diseñada, con el fin de sustituir varios microservicios con el lago de datos.\nSe ha usado Delta Lake por ser de código abierto y su gran integración con diferentes aplicaciones y servicios\n\nRealizado por Jaime Martínez Ramón\n\n### INTRUCCIONES PARA EL DESPLIGUE\n\nPara desplegar el proyecto, se debe tener instalado Maven, Docker y Docker Compose en la máquina donde se quiera desplegar.\nEn primer lugar, ejecute el comando git clone para clonar el repositorio en la máquina.\nAntes de desplegar el proyecto, se debe crear la carpeta `target`y el fichero `JAR`.\nPara ello, se han de ejecutar las siguientes instrucciones en la carpeta raíz:\n1. mvn clean install\n2. Borrar el fichero `JAR` de la carpeta `target` si ya existe. Si no existe, saltar este paso.\n3. Ejecutar un archivo. Esto generará los ficheros .class necesarios para la ejecución del proyecto.\n4. mvn compile\n5. mvn package\n\nTras la generación de la carpeta `target` y el fichero `JAR`, se deben realizar una serie de cambios en el fichero `docker-compose.yml`.\nLos cambios a realizar son simplemente actualizar la ruta de los volúmenes de los siguientes servicios:\n- `spark`\n- `spark-worker-1`\n- `spark-worker-2`\n- `spark-submit-kafkareaderwriter`\n- `spark-submit-bronzetosilver`\n- `spark-submit-historicaldbtransformer`\n- `jupyter`\n\nEstas rutas deben indicar la ubicación donde se desea almacenar los datos generados por el proyecto en la máquina host. Es decir, solo debe modificarse\nla parte local de la ruta, no la parte de la ruta en el contenedor. En caso de modificar la parte de la ruta en el contenedor, los ficheros .scala han\nser modificados.\n\n\n### ESTRUCTURA DEL PROYECTO\n\nDentro de la carpeta `src/main/scala/org/tfmupm` se encuentran los ficheros .scala que componen el proyecto. Dentro de esta carpeta, solo son relevantes\npara la ejecución en Docker aquellos ficheros que acaben con la palabra 'Docker'. Es en estos ficheros donde se encuentran las funciones que se ejecutarán.\nLos demás ficheros sirven para la ejecución en local y permiten una comprobación rápida del buen funcionamiento de las aplicaciones.\n\n#### SparkReadDocker.scala\nEste primer fichero es el encargado de convertir los registros históricos descargados de los repositorios a tablas Delta.\nSimplemente itera por las carpetas descargadas convirtiendo los ficheros CSV a tablas Delta.\n#### KafkaReaderWriterDocker.scala\nEste segundo fichero es el encargado de leer los mensajes de dos topics de Kafka y escribirlos en una tabla Delta.\nEstos dos topics son 'nifitopic' para los registros ambulatorios y 'nificontinuous' para los registros continuos. En caso de cambiar el nombre de los topics,\nse debe modificar el fichero `docker-compose.yml` para que los nombres coincidan.\nLos datos recibidos son guardados en las tablas 'bronze_ambulatory_docker' y 'bronze_continuous_docker'.\n#### BronzeToSilverDocker.scala\nEste fichero es el encargado de transformar los datos de las tablas 'bronze_ambulatory_docker' y 'bronze_continuous_docker' a tablas 'silver'.\nPara ello, se realiza un proceso de limpieza y transformación de los datos, eliminando duplicados y registros con valores nulos.\nAdemás, genera una serie de tablas nuevas con la información extraída de las tablas bronze. \n#### AmbulatoryReaderDocker.scala\nEste fichero es el encargado de leer los datos de todas las tablas Delta generadas. \nNo está desplegada en Docker puesto que está misma labor se puede realizar utilizando 'Jupyter'.\nSi se deseara desplegar valdría con añadir el siguiente contenido a `docker-compose.yml`:\n```\n  spark-submit-tablereader:\n    image: bitnami/spark:3.5\n    command: /opt/bitnami/spark/bin/spark-submit --class org.tfmupm.AmbulatoryReaderDocker --packages io.delta:delta-spark_2.12:3.1.0 --conf \"spark.sql.extensions=io.delta.sql.DeltaSparkSessionExtension\" --conf \"spark.sql.catalog.spark_catalog=org.apache.spark.sql.delta.catalog.DeltaCatalog\" /home/TFMDataLake-1.0-SNAPSHOT.jar\n    volumes:\n      - D:/Archivos_uni/TFM/TFMDataLake/src/main/scala/org/tfmupm:/home/datalake\n      - D:/Archivos_uni/TFM/TFMDataLake/target:/home\n```\n### FICHEROS COMPLEMENTARIOS\n\nAdemás de los ficheros .scala, se encuentran una serie de ficheros que complementan el proyecto. Estos son:\n#### ambulatorio.sh\nImita el envío de registros ambulatorios a través de NiFi. Para ello hace una petición HTTP a NiFi con un fichero JSON.\n#### continuo.sh\nImita el envío de registros continuos a través de NiFi. Para ello hace una petición HTTP a NiFi con un fichero JSON.\n#### Visualización.ipynb\nFichero de Jupyter que permite la visualización de las tablas Delta generadas. En este fichero se pueden consultar los datos de las tablas y generar gráficos con ellos.\n\n\n### ESTRUCTURA EN DOCKER\n\nEl proyecto se compone de varios servicios que se ejecutan en contenedores Docker. Estos servicios son:\n- `spark`: Inicia el clúster de Spark y coordina los recursos que se darán a los nodos workers.\n- `spark-worker-1`: Nodo trabajador que ejecutará las aplicaciones.\n- `spark-worker-2`: Nodo trabajador que ejecutará las aplicaciones.\n- `spark-submit-kafkareaderwriter`: Aplicación que lee los mensajes de Kafka y los escribe en tablas Delta.\n- `spark-submit-bronzetosilver`: Aplicación que transforma los datos de las tablas bronze a tablas silver.\n- `spark-submit-historicaldbtransformer`: Aplicación que transforma los datos de los repositorios a tablas Delta.\n- `nifi`: Contenedor con Apache NiFi para la descarga de los datos. Recibe la información de las peticiones HTTP y las manda a Kafka.\n- `zookeeper`: Contenedor con Zookeeper para la gestión de los brokers de Kafka.\n- `kafka`: Contenedor con Kafka para la gestión de los mensajes. Recibe la información de NiFi y la almacena en los topics. Apache Spark recibirá la información de estos topics.\n- `jupyter`: Contenedor con Jupyter para la visualización de los datos.\n\nEstos contenedores están conectados de la siguiente forma:\n\n![Estructura de los contenedores](/img/arquitectura.png)\n\n### EJECUCIÓN DEL PROYECTO\n\nAl tener iniciados todos los contenedores, dentro de la interfaz web de Spark ha de estar en estado RUNNING la aplicación KafkaReaderWriter.\nSi se está ejecutando cualquier otra aplicación, se deben parar los otros contenedores para no saturar la memoria del servidor u ordenador. \n\nUna vez esta aplicación esté en estado RUNNING, en NiFi importar el fichero `finalambcont.xml` como template. En este template están definidos todos los procesadores necesarios para recibir la información.\nUna vez esté importado y los controladores y procesadores iniciados, se pueden ejecutar los fichero `ambulatorio.sh` y `continuo.sh`.\nAl enviar los datos, serán recibidos por la aplicación KafkaReaderWriter y escritos en las tablas Delta.\n\nCuando se quiera transformar la información de las tablas bronze a las tablas silver, se debe iniciar la aplicación BronzeToSilver. \n\n### VISUALIZACIÓN EN JUPYTER \n\nPara visualizar los datos en Jupyter, se debe acceder a la interfaz web de Jupyter y abrir el fichero `Visualizacion.ipynb`.\nEn este fichero se encuentran las importaciones necesarias para poder consultar las tablas, estas son:\n- Pandas: Para la visualización de los datos.\n- DeltaLake: Para la lectura de las tablas Delta.\n- Matplotlib: Para la generación de gráficos.\n\n![Instalación e importación](/img/install_imports.png)\n\nUna vez se han instalado e importado las dependencias necesarias, para visualizar la tabla debe ejecutarse una celda con un contenido similar al siguiente:\n```\ndf_ejemplo = DeltaLake(\"%ruta_tabla%\").to_pandas()\ndf_bronze = DeltaLake(\"home/datalake/data/bronze_continuous_docker\").to_pandas()\n```\n![Ejemplo de visualización](/img/bronze_continuous.png)\nTambién se pueden consultar los metadatos de las tablas\n```\ndf_bronze.history()\n```\n![Ejemplo de visualización](/img/metadatos.png)\n\nGracias a Matplotlib también se pueden generar una serie de gráficos con los datos\n![Ejemplo de visualización](/img/grafica_lab_sequences.png)\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fging%2Fnetremor-data-lake","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fging%2Fnetremor-data-lake","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fging%2Fnetremor-data-lake/lists"}