Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Gearman - big data without hadoop

eljam
April 07, 2014

Gearman - big data without hadoop

Utilisation de gearman pour le traitement en masse de gros volume de données.

eljam

April 07, 2014
Tweet

Other Decks in Programming

Transcript

  1. +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
  2. 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
  3. Big Data ? Avoir un traffic de plus en plus

    dense (4000, 10000 utilisateurs simultanés) ?
  4. 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
  5. Gearman ? Open Source Multi-langage - clients codés dans un

    langage différent des workers Design applicatif flexible Persistance
  6. 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
  7. 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
  8. Cas d’utilisation Map/Reduce Chauffage de cache Analyse de journaux et

    agrégation Redimensionnement d’images Envoi de courriels
  9. Installation Installer le daemon gearman Installer l’extension PHP 1 brew

    install gearman! 2 brew install php5x-gearman https://gist.github.com/eljam/9911024
  10. API client 1 <?php 2 3 # Client code. 4

    5 echo "Starting\n"; 6 7 # Create our client object. 8 $gmclient= new GearmanClient(); 9 10 # Add default server (localhost). 11 $gmclient->addServer(); 12 13 echo "Sending job\n"; 14 15 $result = $gmclient->doNormal("reverse", "Hello!"); 16 17 echo "Success: $result\n";
  11. 1 <?php 2 3 # Worker code. 4 5 echo

    "Starting\n"; 6 7 # Create our worker object. 8 $gmworker= new GearmanWorker(); 9 10 # Add default server (localhost). 11 $gmworker->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
  12. API client priorité 1 <?php 2 3 # Jobs -

    synchronous 4 5 $result1 = $client->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);
  13. 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
  14. 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
  15. 1 <?php 2 3 # Create the gearman client 4

    $gmc= new GearmanClient(); 5 6 # Add the default server (localhost) 7 $gmc->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 }
  16. Avantages Annotations pour les workers et les jobs Vos services

    symfony2 comme des jobs « kernel events callback » pour les tasks
  17. Définir un worker 1 <?php 2 3 namespace Acme\AcmeBundle\Workers; 4

    5 use Mmoreram\GearmanBundle\Driver\Gearman; 6 7 /** 8 * @Gearman\Work( 9 * iterations = 3, 10 * description = "Worker test description", 11 * defaultMethod = "doBackground", 12 * servers = { 13 * { "host": "192.168.1.1", "port": 4560 }, 14 * { "host": "192.168.1.2", "port": 4560 }, 15 * } 16 * ) 17 */ 18 class AcmeWorker 19 { 20 /** 21 * Test method to run as a job 22 * @param \GearmanJob $job Object with job parameters 23 * 24 * @return boolean 25 * 26 * @Gearman\Job( 27 * iterations = 3, 28 * name = "test", 29 * description = "This is a description" 30 * ) 31 */ 32 public function testA(\GearmanJob $job) 33 { 34 echo 'Job testA done!' . PHP_EOL; 35 36 return true; 37 }
  18. 1 <?php 2 3 namespace Acme\AcmeBundle\Services; 4 5 /** 6

    * @Gearman\Work( 7 * service="myServiceName" 8 * ) 9 */ 10 class AcmeService 11 { 12 13 /** 14 * Test method to run as a job 15 * 16 * @param \GearmanJob $job Object with job parameters 17 * 18 * @return boolean 19 * 20 * @Gearman\Job() 21 */ 22 public function testA(\GearmanJob $job) 23 { 24 echo 'Job testA done!' . PHP_EOL; 25 26 return true; 27 } 28 } Service et worker
  19. 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
  20. 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
  21. Exécuter un job 1 $ php app/console gearman:worker:execute MmoreramerinoTestBundleServicesMyAcmeWorker 2

    $ php app/console gearman:job:execute MmoreramerinoTestBundleServicesMyAcmeWorker~doSomething
  22. 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
  23. ?

  24. Merci Made with love by LRK - 2014 — Come

    and see us cause we roXX !!