Slide 1

Slide 1 text

Gearman big data without hadoop 2014

Slide 2

Slide 2 text

Guillaume Cavana DCTO @ lafourchette Github: https://github.com/eljam Twitter: https://twitter.com/eljam_sad

Slide 3

Slide 3 text

+20 millions de réservations Créée en 2007 ! Cahier de réservation électronique Site internet &! applications mobiles ▪ LaFourchette est un service de réservation de tables, en ligne et sur mobile dans plus de 12 500 restaurants! ! ▪ Le service permet aux internautes de trouver et réserver un restaurant en moins de 30s! ! ▪ LaFourchette développe des solutions pour les restaurateurs afin de :! ⁞ Gérer efficacement leur activité grâce à la solution MyFourchette : gestion des réservations centralisée et optimisation du taux de remplissage ! ⁞ Développer leur visibilité sur internet

Slide 4

Slide 4 text

Big Data ?

Slide 5

Slide 5 text

Les big data, littéralement les grosses données, parfois appelées données massives, est une expression anglophone utilisée pour désigner des ensembles de données qui deviennent tellement volumineux qu'ils en deviennent difficiles à travailler avec des outils classiques de gestion de base de données ou de gestion de l'information

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

Big Data ? Avoir beaucoup de données en base (100 Go, 1To, 1Po) ?

Slide 8

Slide 8 text

Big Data ? Avoir un « messaging system » (rabbitmq, hornetq…) ?

Slide 9

Slide 9 text

Big Data ? Avoir un traffic de plus en plus dense (4000, 10000 utilisateurs simultanés) ?

Slide 10

Slide 10 text

Big Data ? Lors d’un pic d’audience, comment je fais pour Envoyer des emails Cropper une image Chauffer des caches Mettre à jour mon moteur de recherche

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

Solutions ?

Slide 14

Slide 14 text

Gearman ? Open Source Multi-langage - clients codés dans un langage différent des workers Design applicatif flexible Persistance

Slide 15

Slide 15 text

Langages ?

Slide 16

Slide 16 text

2005 http://brad.livejournal.com/2106943.html Implémenté en Perl Créer par Danga Interactive (Memcache et MogileFS)

Slide 17

Slide 17 text

2008 Réécrit en C par Brian Aker Extension php créé par James Luedke C

Slide 18

Slide 18 text

Qui utilise ?

Slide 19

Slide 19 text

Les bases Utilise TCP, port 4730 Client - Crée un job à démarrer et l’envoi au job server Worker - s’enregistre auprès d’un job server et récupère des jobs au fur et à mesure Job server - coordonne l’assignation des jobs entre les clients et les workers et gère le redémarrage des jobs si un worker disparait

Slide 20

Slide 20 text

La Stack Your Client Application Code Gearman Client API (C, PHP, Perl, MySQL UDF,…) Gearman Job Server gearmand Gearman Worker API (C, PHP, Perl,…) Your Worker Application Code Your Application Provided by Gearman

Slide 21

Slide 21 text

En cluster Job Server Client Client Worker Worker Job Server Client Client Worker Worker

Slide 22

Slide 22 text

Statistiques Yahoo 60+ servers, 6M jobs/jour Digg 45+ servers, 400k jobs/jour

Slide 23

Slide 23 text

Cas d’utilisation Map/Reduce Chauffage de cache Analyse de journaux et agrégation Redimensionnement d’images Envoi de courriels

Slide 24

Slide 24 text

Installation Installer le daemon gearman Installer l’extension PHP 1 brew install gearman! 2 brew install php5x-gearman https://gist.github.com/eljam/9911024

Slide 25

Slide 25 text

API client 1 addServer(); 12 13 echo "Sending job\n"; 14 15 $result = $gmclient->doNormal("reverse", "Hello!"); 16 17 echo "Success: $result\n";

Slide 26

Slide 26 text

1 addServer(); 12 13 # Register function "reverse" with the server. 14 $gmworker->addFunction("reverse", "reverse_fn"); 15 16 print "Waiting for job...\n"; 17 while ($gmworker->work()) { 18 if ($gmworker->returnCode() != GEARMAN_SUCCESS) { 19 echo "return_code: " . $gmworker->returnCode() . "\n"; 20 break; 21 } 22 } 23 24 function reverse_fn($job) 25 { 26 return strrev($job->workload()); 27 } API worker

Slide 27

Slide 27 text

API client priorité 1 doNormal('upper', 'fourchette'); 6 $result2 = $client->doHigh('upper', 'lafourchette'); 7 $result3 = $client->doLow('upper', 'couteau'); 8 9 # Jobs - asynchronous 10 11 $handle1 = $client->doBackground('lower', 'LaFourchette'); 12 $handle2 = $client->doHighBackground('lower', 'LaFourchette'); 13 $handle2 = $client->doLowBackground('lower', 'LaFourchette'); 14 15 $status = $client->jobStatus($handle1);

Slide 28

Slide 28 text

1 array(4) { 2 [0] => # le job est connu 3 bool(false) 4 [1] => # le job tourne toujours 5 bool(false) 6 [2] => # Numérateur 7 int(0) 8 [3] => # Dénominateur 9 int(0) 10 } API client status

Slide 29

Slide 29 text

Jobs et tasks Les « tasks » sont parallélisables!

Slide 30

Slide 30 text

Task callback GearmanClient::setDataCallback()
 Définit une fonction de rappel à appeler lorsqu'un paquet de données est reçu pour une tâche GearmanClient::setCreatedCallback()
 Définit une fonction de rappel à appeler lorsqu'une tâche est placée dans la file d'attente GearmanClient::setExceptionCallback()
 Définit une fonction de rappel pour les exceptions émises par l'agent GearmanClient::setFailCallback()
 Définit une fonction de rappel à appeler lorsqu'un travail échoue GearmanClient::setStatusCallback()
 Définit une fonction de rappel pour collecter les statuts d'une tâche GearmanClient::setWarningCallback()
 Définit une fonction de rappel lors de l'émission d'alerte depuis l'agent GearmanClient::setWorkloadCallback()
 Définit une fonction de rappel lors de la réception de mises à jour de données incrémentales

Slide 31

Slide 31 text

1 addServer(); 8 9 # Register some callbacks 10 $gmc->setCreatedCallback("reverse_created"); 11 $gmc->setDataCallback("reverse_data"); 12 $gmc->setStatusCallback("reverse_status"); 13 $gmc->setCompleteCallback("reverse_complete"); 14 $gmc->setFailCallback("reverse_fail"); 15 16 # Set some arbitrary application data 17 $data['foo'] = 'bar'; 18 19 # Add two tasks 20 # Background task don't send complete callback 21 $task= $gmc->addTaskBackground("reverse", "foo", $data); 22 $task2= $gmc->addTaskLow("reverse", "bar", null); 23 24 # Run the tasks in parallel (assuming multiple workers) 25 if (! $gmc->runTasks()) { 26 echo "ERROR " . $gmc->error() . "\n"; 27 exit; 28 } 29 Task callback 30 echo "DONE\n"; 31 32 function reverse_created($task) 33 { 34 echo "CREATED: " . $task->jobHandle() . "\n"; 35 } 36 37 function reverse_status($task) 38 { 39 echo "STATUS: " . $task->jobHandle() . " - " . $task->taskNumerator() . 40 "/" . $task->taskDenominator() . "\n"; 41 } 42 43 function reverse_complete($task) 44 { 45 echo "COMPLETE: " . $task->jobHandle() . ", " . $task->data() . "\n"; 46 } 47 48 function reverse_fail($task) 49 { 50 echo "FAILED: " . $task->jobHandle() . "\n"; 51 } 52 53 function reverse_data($task) 54 { 55 echo "DATA: " . $task->data() . "\n"; 56 }

Slide 32

Slide 32 text

Monitoring Pear package: 
 http://pear.php.net/package/Net_Gearman Interface Web: 
 https://github.com/gaspaio/gearmanui

Slide 33

Slide 33 text

Symfony ?

Slide 34

Slide 34 text

« There is a bundle for that »! Mitch Buchannon - 2014

Slide 35

Slide 35 text

Gearman bundle Sources:
 https://github.com/mmoreram/GearmanBundle Documentation: 
 http://gearmanbundle.readthedocs.org/en/latest

Slide 36

Slide 36 text

Avantages Annotations pour les workers et les jobs Vos services symfony2 comme des jobs « kernel events callback » pour les tasks

Slide 37

Slide 37 text

Définir un worker 1

Slide 38

Slide 38 text

1

Slide 39

Slide 39 text

Décrire un worker 1 $ php app/console gearman:worker:describe MmoreramerinoTestBundleServicesMyAcmeWorker 2 3 @Worker\className : Mmoreramerino\TestBundle\Services\AcmeWorker 4 @Worker\fileName : /var/www/projects/myrepo/src/Mmoreramerino/TestBundle/Services/AcmeWorker.php 5 @Worker\nameSpace : Mmoreramerino\TestBundle\Services 6 @Worker\callableName: MmoreramerinoTestBundleServicesMyAcmeWorker 7 @Worker\supervisord : /usr/bin/php /var/www/projects/myrepo/app/console gearman:worker:execute MmoreramerinoTestBundleServicesMyAcmeWorker --no-interaction 8 @worker\iterations : 3 9 @Worker\#jobs : 1 10 11 @worker\servers : 12 13 #0 - 192.168.1.1:4560 14 #1 - 192.168.1.2:4560 15 16 @Worker\description : 17 18 Acme Worker. Containing multiple available jobs

Slide 40

Slide 40 text

Décrire un job 1 @job\methodName : testA 2 @job\callableName : MmoreramerinoTestBundleServicesMyAcmeWorker~doSomething 3 @job\supervisord : /usr/bin/php /var/www/projects/myrepo/app/console gearman:job:execute MmoreramerinoTestBundleServicesMyAcmeWorker~doSomething --no-interaction 4 @job\iterations : 10 5 @job\defaultMethod : doBackground 6 @job\servers : 7 8 0 - 192.168.1.1:4560 9 10 @job\description : 11 12 #Acme Job action. This is just a description of a method that do something

Slide 41

Slide 41 text

Exécuter un job 1 $ php app/console gearman:worker:execute MmoreramerinoTestBundleServicesMyAcmeWorker 2 $ php app/console gearman:job:execute MmoreramerinoTestBundleServicesMyAcmeWorker~doSomething

Slide 42

Slide 42 text

Relancer un worker 1 [program:acme-worker-gearman] 2 numprocs=2 3 startretries=100 4 directory=/ 5 stdout_logfile=path_to_log/acme-worker-gearman-supervisord.log 6 autostart=true 7 autorestart=true 8 user=root 9 command=/usr/bin/php /var/www/projects/myrepo/app/console \ 10 gearman:worker:execute MmoreramerinoTestBundleServicesMyAcmeWorker --no-interaction

Slide 43

Slide 43 text

Démo https://github.com/eljam/symfony-live-2014-gearman

Slide 44

Slide 44 text

Liens http://gearman.info http://gearman.org http://php.net/gearman https://speakerdeck.com/eljam/gearman-big-data-without-hadoop Documentation Présentation

Slide 45

Slide 45 text

?

Slide 46

Slide 46 text

Merci Made with love by LRK - 2014 — Come and see us cause we roXX !!