Azkaban et docker

Chez ShareThis, nous n'aimons pas créer du travail supplémentaire pour nous-mêmes. La gestion des téraoctets et des pétaoctets de données en temps réel est déjà assez difficile. C'est pourquoi nous recherchons activement des moyens de travailler plus rapidement et plus efficacement. Cela signifie qu'il faut évaluer différentes technologies et les automatiser autant que possible. Cela implique également un prototypage rapide et une mise en route avec le moins de code possible.

Récemment, je voulais tester Azkaban pour planifier les flux de travail rapidement et facilement. Cependant, je ne voulais pas passer beaucoup de temps à mettre le système de haut en bas pendant les tests, et je voulais garder une trace de tous les changements afin que je puisse construire et détruire le système à volonté. Cela sonnait comme un grand moment pour sortir mon Docker chapeau et utilisation docker-composer. Il m'a également permis de brosser sur bash curl.

La première étape consistait à obtenir un Dockerfile qui configure une application de nœud unique. Cela me permettrait d'obtenir un premier aller à l'aide du système:



from java:7


COPY azkaban-solo-server-2.5.0.tar.gz /azkaban-solo-server-2.5.0.tar.gz
RUN tar -xf /azkaban-solo-server-2.5.0.tar.gz
RUN apt-get update
RUN apt-get install zip
ADD flows /azkaban-solo-2.5.0/flows
ADD run.sh /
ADD jq /usr/bin/jq


CMD /azkaban-solo-2.5.0/bin/azkaban-solo-start.sh

Ensuite, le docker-composer pourrait être utilisé pour mettre le tout en place. En tant que tel, j'ai écrit un fichier DC-solo. yml:



azkaban:
  build: solo/.
  ports:
        - 8081:8081

Maintenant, je peux:

docker-composer -f dc-solo.yml build
docker-composer -f dc-solo.yml up

Azkaban est en cours d'exécution! J'ai joué avec l'interface utilisateur et réalisé si cela allait fonctionner, nous aurions besoin d'avoir des flux enregistrés dans GitHub et auto-chargé. Cela m'a conduit à la deuxième partie du processus qui a été de jouer autour de la façon d'obtenir des flux de GitHub à Azkaban. Pour ce faire, j'ai commencé à pirater leur API à l'aide de curl (je ne le conseille jamais pour un projet fini, mais pour l'itération rapide, cela fonctionne). J'ai aussi eu à connaître un outil JSON Nice: JQ.

Tout d'abord, nous allons écrire une fonction qui enregistre un jeton de session à une variable appelée FCRED:

#

getSession simply creates a session with default credentials.

#

getSession () { CRED=curl -k -X POST --data "action=login&username=azkaban&password=azkaban" $PROD alors que [ $ ? -ne 0 ] faire l'affaire sommeil 1 CRED=curl -k -X POST --data "action=login&username=azkaban&password=azkaban" $PROD cuit FCRED=echo $CRED | jq '."session.id"' | sed s/\"//g }

Ensuite, nous allons créer un projet dans Azkaban:

#

createProject creates a project in Azkaban

#

$1 The name of the project.

$2 The description of the project.

#

createProject () { RESP=curl -k -X POST --data "session.id=$FCRED&name=${1}&description=$2" $PROD/manager?action=create }

Vous pouvez télécharger un fichier zip avec votre flux vers votre projet:

uploadZip () { RESP=curl -k -H "Content-Type: multipart/mixed" -X POST --form "session.id=$1" --form "ajax=upload" --form "file=@$2;type=application/zip" --form "project=$3" $PROD/manager PROJECTID =echo $RESP | jq '.projectId' | sed s/\"//g }

Même le programmer:

schedule () { RESP=curl -k "localhost:8081/schedule?ajax=scheduleFlow&session.id=$1&projectName=$2&flow=$3&projectId=$4&scheduleTime=$5&scheduleDate=$6&is_recurring=on&period=$7" echo "scheduling : $ ?" echo $RESP echo $RESP | jq | jq ''. }

J'ai fini par parcourir l'arborescence des répertoires, zipping les répertoires qui avaient des fichiers de travail Azkaban et les télécharger.

#

uploadFlow will zip up the contents of each project directory and upload the flow.

#

$1 The name of the project which corresponds to a directory.

#

uploadFlow () { proj=$1 rm $proj.zip zip $proj.zip $proj/* uploadZip $FCRED $proj.zip $proj }

#

Main Script

#

getSession for dir in ls -d */; do proj=${dir%%/} desc="cat ${dir}description.txt" createProject $proj $proj "$desc" uploadFlow $proj c'est fait ;

Ce n'est pas la fin. Ces flux Azkaban se révèlent utiles dans une mode MVP et j'ai commencé à élargir la recette docker-composer de sorte que nous sommes soufaits par le RDS d'Amazon. Voyez-vous comment je me sauve le travail en ne mettant pas en œuvre la DB? J'aime le Cloud! Voici mon docker multi-noeud-composer: (mon travail DC-Full. yml pour la mise en scène sur un environnement local. Pour l'utilisation de RDS, je remplace l'image du docker par une véritable image réseau.)


mysql:
  image: mysql
  environment:
        - MYSQLROOTPASSWORD=root
        - MYSQLDATABASE=azkaban
        - MYSQLUSER=azkaban
        - MYSQL_PASSWORD=azkaban
  volumes:
        - /mnt/mysql/azkaban:/var/lib/mysql
executor:
  build: exec/.
  links:
        - mysql
  ports:
        - 12321
web:
  build: web/.
  links:
        - mysql
        - executor
  ports:
        - 8081:8081

C'est tout pour le moment. Nous verrons si cela s'avère à ShareThiset puis continuerons à itérer dessus. Un jour, il pourrait faire fonctionner tous nos pipelines automatisés. Si vous aimez itérer rapidement et détestez les processus qui encombrent le temps de développement, alors s'il vous plaît Rejoins-nous!

À propos de ShareThis

Depuis 2007,ShareThis libère la puissance du comportement numérique mondial en synthétisant les données relatives aux partages sociaux, aux intérêts et aux intentions. Grâce au comportement des consommateurs sur plus de trois millions de domaines mondiaux, ShareThis observe les actions en temps réel de personnes réelles sur des destinations numériques réelles.

S'abonner à notre newsletter

Recevez les dernières nouvelles, les conseils et les mises à jour

S'abonner

Contenu connexe