web-dev-qa-db-fra.com

Qu'est-ce que Spark Job?

Je l'ai déjà fait avec l'installation d'étincelle et exécuté quelques testscases en configurant les nœuds maître et travailleur. Cela dit, j'ai une très grande confusion quant à la définition exacte d'un travail dans le contexte Spark (pas SparkContext). J'ai ci-dessous des questions

  • Quelle est la différence entre un travail et un programme de conduite?.
  • L'application elle-même fait partie du programme du pilote?
  • Spark soumettre en quelque sorte est un travail?

J'ai lu le Spark documention mais toujours cette chose n'est pas claire pour moi.

Cela dit, mon implémentation consiste à écrire des travaux spark {par programme} qui seraient ensuite soumis à un processus spark-submit.

Veuillez aider avec un exemple si possible. Ce serait très utile.

Note: Veuillez ne pas poster de liens d'allumage, car je l'ai déjà essayé. Même si les questions semblent naïves, j'ai néanmoins besoin de plus de clarté dans ma compréhension.

24
chaosguru

Eh bien, la terminologie peut toujours être difficile car elle dépend du contexte. Dans de nombreux cas, vous pouvez être utilisé pour "soumettre un travail à un cluster", ce qui pour spark serait de soumettre un programme pilote. 

Cela dit, Spark a sa propre définition du mot "travail", directement à partir du glossaire:

Job Un calcul parallèle composé de plusieurs tâches qui obtient engendré en réponse à une action Spark (par exemple, sauvegarder, collecter); tu verras ce terme utilisé dans les journaux du conducteur.

Donc, dans ce contexte, supposons que vous deviez procéder comme suit:

  1. Charger un fichier avec les noms et adresses de personnes dans RDD1
  2. Charger un fichier avec les noms de personnes et les téléphones dans RDD2
  3. Joignez RDD1 et RDD2 par nom pour obtenir RDD3
  4. Carte sur RDD3 pour obtenir une belle carte de présentation HTML pour chaque personne en tant que RDD4
  5. Enregistrez RDD4 dans un fichier.
  6. Mappez RDD1 pour extraire les codes postaux des adresses pour obtenir RDD5
  7. Regroupez RDD5 pour obtenir le nombre de personnes vivant sur chaque code postal en tant que RDD6.
  8. Collect RDD6 et imprime ces statistiques sur la sortie standard.

Alors, 

  1. Leprogramme du pilote _ est tout ce morceau de code qui exécute les 8 étapes.
  2. La production de l'ensemble du jeu de cartes HTML à l'étape 5 est untravail(efface car nous utilisons l'action enregistrer, pas une transformation). Idem avec le collect} à l'étape 8
  3. Les autres étapes seront organisées enétapes, chaque travail étant le résultat d’une séquence d’étapes. Pour des tâches simples, un travail peut avoir une seule étape, mais la nécessité de repartitionner les données (par exemple, la jointure à l'étape 3) ou tout élément qui casse la localisation des données entraîne généralement l'apparition d'étapes supplémentaires. Vous pouvez considérer les étapes comme des calculs produisant des résultats intermédiaires, qui peuvent en fait être persistés. Par exemple, nous pouvons conserver RDD1 car nous allons l’utiliser plusieurs fois, en évitant les recalculs.
  4. Les 3 ci-dessus parlent essentiellement de la manière dont la logique d'un algorithme donné sera cassée. En revanche, untâcheest un donnéeparticulier qui passera par une étape donnée, sur un exécuteur donné.

J'espère que cela rend les choses plus claires ;-)

35
Daniel Langdon

Hé voici quelque chose que j'ai fait avant, espérons que cela fonctionne pour vous:

#!/bin/bash
# Hadoop and Server Variables
HADOOP="hadoop fs"
HDFS_HOME="hdfs://ha-Edge-group/user/max"
LOCAL_HOME="/home/max"

# Cluster Variables
DRIVER_MEM="10G"
EXECUTOR_MEM="10G"
CORES="5"
EXECUTORS="15"

# Script Arguments
SCRIPT="availability_report.py" # Arg[0]
APPNAME="Availability Report" # arg[1]

DAY=`date -d yesterday +%Y%m%d`

for HOUR in 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23
do
        #local directory to getmerge to
        LOCAL_OUTFILE="$LOCAL_HOME/availability_report/data/$DAY/$HOUR.txt"

        # Script arguments
        HDFS_SOURCE="webhdfs://1.2.3.4:0000/data/lbs_ndc/raw_$DAY'_'$HOUR" # arg[2]
        HDFS_CELLS="webhdfs://1.2.3.4:0000/data/cells/CELLID_$DAY.txt" # arg[3]
        HDFS_OUT_DIR="$HDFS_HOME/availability/$DAY/$HOUR" # arg[4]

        spark-submit \
        --master yarn-cluster \
        --driver-memory $DRIVER_MEM \
        --executor-memory $EXECUTOR_MEM \
        --executor-cores $CORES \
        --num-executors $EXECUTORS \
        --conf spark.scheduler.mode=FAIR \
        $SCRIPT $APPNAME $HDFS_SOURCE $HDFS_CELLS $HDFS_OUT_DIR

        $HADOOP -getmerge $HDFS_OUT_DIR $LOCAL_OUTFILE
done
0
Max