2015-05-14 11 views
5

Vorrei raccogliere tutti i registri di executor nel driver dell'applicazione Spark a livello di programmazione. (Quando qualcosa è fallito, voglio raccogliere e archiviare tutti i registri pertinenti.) C'è un modo carino per farlo?Ottieni tutti i registri di esecuzione di Apache Spark

Un'idea è creare un RDD vuoto con una partizione per esecutore. Poi in qualche modo mi assicuro che ogni partizione venga effettivamente elaborata su un altro esecutore (non so come) e faccia un mapPartitions in cui carico il log dell'esecutore dal disco, e poi un collect per scaricarli nell'applicazione.

risposta

3

forse c'è un modo migliore, ma abbiamo utilizzare uno script per sincronizzare i registri esecutore a S3 ogni 5 secondi

#!/bin/sh 
# This scripts syncs executor log files to S3. 

while [[ $# > 1 ]]; do 
    key="$1" 
    case $key in 
    -l|--log-uri) 
     LOG_BUCKET="$2" 
     shift 
     ;; 
    *) 
     echo "Unknown option: ${key}" 
     exit 1; 
    esac 
    shift 
done 

set -u 

JOB_FLOW_ID=$(cat /mnt/var/lib/info/job-flow.json | grep jobFlowId | sed -e 's,.*"\(j-.*\)".*,\1,g') 

# Start background process that syncs every 5 seconds. 
while true; do aws s3 sync /home/hadoop/spark/work ${LOG_BUCKET}/${JOB_FLOW_ID}/executors/`hostname`/; sleep 5; done & 

Lanciamo lo script (che è memorizzato su S3 in un file chiamato sync-executor- logs.sh) in un'azione bootstrap

--bootstrap-actions Path=s3://path/to/my/script/sync-executor-logs.sh,Name=Sync-executor-logs,Args=[-l,s3://path/to/logfiles] 
+0

Grazie, questa è una bella soluzione! Al giorno d'oggi eseguiamo per lo più su YARN, e YARN fornisce un po 'di gestione per i file di log. Mentre non ho ancora capito come configurarlo, ha anche risolto molti dei nostri problemi. –