Skip to content

Instantly share code, notes, and snippets.

@nicokosi
Last active October 8, 2019 08:09
Show Gist options
  • Save nicokosi/7e2d25a57dc263ea21d4b5a47319e3f3 to your computer and use it in GitHub Desktop.
Save nicokosi/7e2d25a57dc263ea21d4b5a47319e3f3 to your computer and use it in GitHub Desktop.
Un retour d'expérience sur Apache Spark après le "POC DataStorm" à Vidal

Apache Spark : retour d’expérience - décembre 2018

"POC DataStorm", quezako ?

But : analyser un an de sécurisation, via des fichiers CSV fournis à DataStorm

Comment : application Spark Java secu-replay, lancée via Jenkins sur le cluster "val"

Spark ?

pas nécessaire (facteur limitant : latence des API de sécurisation) 😇

on apprend (équipes dév / data / infra) et on renforce le socle technique 🤓

#1 Vue d’ensemble

schéma

Une appli s’exécutant dans un cluster Spark avec :

  • entrée : base de donnée SQL Server

  • traitements en parallèle :

    • appel d’API de sécurisation karadoc (cluster d’API)

    • sortie : fichiers CSV (HDFS)

Terminologie Spark :

  • cluster : contient n workers

  • worker Spark : m cœurs (cores)

cf. glossaire

#2 : Récupération des données via le module sql

Utilisé pour lire les données (équivalent à l’instruction SQL select) : DataSet User Guide

Montre moi le code ! 👓

Facile à utiliser (DSL façon SQL) 👍

Remarques :

#3 : parallélisation du traitement (transformation des données + appel des API + export CSV)

  1. d’abord dans le code (codé en dur 🤔) cf. DataSet#repartition(Int)

  2. dans les paramètres de l’appli 👍

exemple 2 👓 :

/usr/local/bin/spark-submit \
  --class com.vidal.SecuReplayApp \
  --deploy-mode cluster \
  --master spark://val-spark.vidal.net:7077 \
  --executor-memory 4g \
  --num-executors 6 \ # 6 EXECUTEURS...
  --executor-cores 3 \ # et 3 COEURS PAR EXECUTEUR => 18 EXECUTIONS PARALLELES MAX
  --conf spark.default.parallelism=1500 \ # 1500 FICHIERS CSV
  http://nexus.vidal.net/service/local/repositories/vidal-snapshots/content/com/vidal/secu-replay/1.1.0-SNAPSHOT/secu-replay-1.1.0-20181213.105335-29.jar \
  --api.url http://preprod-haproxy-secureplay.vidal.net \
  --input.sqlserver.criteria yearWeek >= 200003  AND yearWeek <= 201727 \
  --input.sqlserver.database VIGI2_DSA \
  --input.sqlserver.domain FRANCE \
  --input.sqlserver.password **** \
  --input.sqlserver.table dbo.v_UnifiedPrescription \
  --input.sqlserver.url jdbc:jtds:sqlserver://srv-vid-valbi01:1433;databaseName=VIGI2_DSA \
  --input.sqlserver.user **** \
  --output.csv file:///mnt/Datastorm/2018-12-14T12_08_01_00

#4 : use the framework, Luke!

Don’t: recoder la désérialisation/désérialisation pour les formats supportés nativement (JSON, CSV) cf. PrescriptionJsonDeserializer.java 💣

Pourquoi ? scalabilité (et ne pas perdre de temps)

Do: utiliser la API DataSet (exemple) 👍

⇒ moins de boulot

⇒ scalabilité "gratos"

#5 : tests

JUnit 5

😎

Tests d’intégration

Tests d’intégration avec Docker via testcontainers

Librairie facile à utiliser. 👍

Tests manuels

Docker + Spark + Jenkins = ?

Quelques problèmes avec les tests Spark avec Docker dans Jenkins. 💣

#6 : monitoring avec la console Spark

la console Spark web UI :

  • navigation WTF? (cluster 8080 / worker 8081 driver 4040 etc.) cause : mauvaise configuration ? 💣

  • logs : sortie standard avec logs applicatif et Spark mélangés 🤔

#8 : exécution

facteur limitant

API de sécurisation car :

  • 1 ordonnance à la fois

  • 100 ms mini par requête

En augmentant le nombre d’appels aux API (+ de cœurs Spark sur le cluster) le débit d’appel/secondes n’augmentait pas ⇒ hypothèse confirmée

On a donc ajouté des instances karadoc au cluster d’API (load balancer haproxy)

#9 : devops rulez!

infra + data + dev = ♥

#10 : regrets ?

Infra pas cloisonnée 😢

temps de réponse non prédictibles → incompréhensions / doutes (ex : filtrage des alertes via l’API de sécurisation)

"Petits clusters" 😢

Cluster d’API avec 1 puis 2, 3…​ et finalement 5 instances On aurait aimé tester avec 100 instances pour aller vite !

@nicokosi
Copy link
Author

L'évolution du débit des API (requêtes par seconde) durant un mois :
image

@nicokosi
Copy link
Author

Schéma de secu-replay :
schema-secu-replay

@nicokosi
Copy link
Author

nicokosi commented Jan 8, 2019

Version PDF générée avec docker-asciidoctor. 🤓 (les emojis ne passent pas 😭)
Le PDF n'est pas à jour mais ça peut toujours dépanner...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment