Dopo aver parlato con un mio amico di Google, vorrei implementare una sorta di modello Lavoro/Lavoratore per aggiornare il mio set di dati.Devo imparare/utilizzare MapReduce o qualche altro tipo di parallelizzazione per questa attività?
Questo set di dati rispecchia i dati di un servizio di terze parti, pertanto, per eseguire l'aggiornamento, è necessario effettuare diverse chiamate remote alle proprie API. Penso che passeremo molto tempo in attesa di risposte da questo servizio di terze parti. Mi piacerebbe accelerare le cose e utilizzare meglio le ore di calcolo, parallelizzando queste richieste e mantenendo aperte molte di esse contemporaneamente, in attesa delle loro risposte individuali.
Prima di spiegare il mio gruppo di dati specifici e ottenere nel problema, vorrei chiarire che cosa le risposte che sto cercando:
- Si tratta di un flusso che sarebbe adatto a parallelizzazione con MapReduce?
- Se sì, sarebbe economicamente vantaggioso eseguirlo sul modulo mapreduce di Amazon, che fattura all'ora e alle ore di arrotondamento quando il lavoro è completo? (Non sono sicuro di quello che conta come "lavoro", quindi non so esattamente come mi verrà addebitato)
- Se no, Esiste un altro sistema/schema che dovrei usare? e C'è una libreria che mi aiuterà a farlo in python (su AWS, usign EC2 + EBS)?
- Ci sono dei problemi che vedi nel modo in cui ho progettato questo flusso di lavoro?
Ok, ora sui dettagli:
Il set di dati è costituito da utenti che dispongono di elementi preferiti e che seguono altri utenti. L'obiettivo è essere in grado di aggiornare la coda di ogni utente: l'elenco di elementi che l'utente vedrà quando caricherà la pagina, in base agli elementi preferiti degli utenti che segue. Ma, prima di poter elaborare i dati e aggiornare la coda di un utente, devo assicurarmi di avere i dati più aggiornati, ovvero da dove arrivano le chiamate API.
Ci sono due chiamate che posso fare :
- convincere gli utenti seguito - che restituisce tutti gli utenti seguiti dall'utente richiesto, e
- ottenere oggetti preferiti - che restituisce tutti gli elementi preferiti dell'utente richiesto.
Dopo che io chiamo get utenti seguiti per l'utente in fase di aggiornamento, ho bisogno di aggiornare gli elementi preferiti per ogni utente di essere seguito. Solo quando tutti i preferiti vengono restituiti per tutti gli utenti che vengono seguiti, posso iniziare a elaborare la coda per quell'utente originale. Questo flusso si presenta come:
Lavoro in questo flusso sono:
- avviare l'aggiornamento coda per l'utente - prende il via il processo mediante il recupero degli utenti seguiti dall'utente in fase di aggiornamento, memorizzandoli e creando quindi Ottieni i lavori preferiti per ciascun utente.
- Ottieni preferiti per l'utente - Richiede e memorizza, un elenco di preferiti per l'utente specificato, dal servizio di terze parti.
- Calcola nuova coda per l'utente: elabora una nuova coda, ora che tutti i dati sono stati recuperati e quindi memorizza i risultati in una cache utilizzata dal livello applicazione.
Così, ancora una volta, le mie domande sono:
- Si tratta di un flusso che sarebbe adatto a parallelizzazione con MapReduce? Non so se mi permetterebbe di avviare il processo per UserX, recuperare tutti i dati relativi, e tornare a elaborare la coda di UserX solo dopo aver fatto tutto.
- Se sì, sarebbe economicamente vantaggioso eseguirlo sul modulo mapreduce di Amazon, che fattura all'ora e alle ore di arrotondamento quando il lavoro è completo? C'è un limite al numero di "thread" che posso aspettare sulle richieste API aperte se utilizzo il loro modulo?
- Se no, C'è un altro sistema/schema che dovrei usare? e C'è una libreria che mi aiuterà a farlo in python (su AWS, usign EC2 + EBS?)?
- Ci sono dei problemi che vedi nel modo in cui ho progettato questo flusso di lavoro?
Grazie per la lettura, non vedo l'ora di discutere con tutti voi.
Modifica, in risposta a JimR:
Grazie per una risposta solida. Nella mia lettura da quando ho scritto la domanda originale, mi sono distolto dall'uso di MapReduce. Non ho ancora deciso per certo come voglio costruire questo, ma sto iniziando a sentire che MapReduce è migliore per distribuire/parallelizzare il carico di calcolo quando sto solo cercando di parallelizzare le richieste HTTP.
Quale sarebbe stato il mio compito di "ridurre", la parte che prende tutti i dati recuperati e la scricchiola in risultati, non è molto intensa dal punto di vista computazionale. Sono abbastanza sicuro che finirà per essere una grande query SQL che viene eseguita per un secondo o due per utente.
Quindi, quello che sto appoggiato verso è:
- A/modello non MapReduce lavoro operaio, scritto in Python . Un mio amico google mi ha dato l'opportunità di imparare Python per questo, dato che è un overhead basso e si adatta bene.
- Utilizzo di Amazon EC2 come livello di calcolo. Penso che questo significhi anche bisogno di una fetta EBS per archiviare il mio database.
- Possibilmente utilizzando la coda dei messaggi semplici di Amazon thingy. Sembra che questo terzo widget di Amazon sia progettato per tenere traccia delle code di lavoro, spostare i risultati da una attività agli input di un'altra e gestire con grazia le attività non riuscite. È molto economico Può valere la pena implementare invece di un sistema di coda dei lavori personalizzato.
Ho utilizzato il motore di app di google per richieste altamente parallele e la gestione quasi in tempo reale di questo tipo di problema. MapReduce ha avuto un sovraccarico molto più alto di avvio e di lavoro rispetto a quello che stavo cercando. – kevpie
Interessante. So che il motore delle app può usare python, che è quello su cui ho iniziato a scrivere questi lavori, ma non so in quale altro modo utilizzerei GAE per questo. Non ho familiarità con il funzionamento di GAE, né con il modo di esprimere questo problema, quindi non riesco a trovare le mie risposte. Avete altre risorse che dovrei guardare qui? Grazie per il consiglio! –
In realtà ho scritto un processo Python che utilizzava thread e accodamento per eseguire richieste web parallele e l'elaborazione dei dati. Ha funzionato bene, ma non ero "completamente esperto" nella programmazione Python, o nei thread, per renderlo veramente affidabile, o per funzionare bene. Dopo molte ricerche su google e alcune frustrazioni e altri compiti che richiedono priorità, ho abbandonato di lavorarci su. Potrei riprenderlo. Sono arrivato a conclusioni simili riguardo al lavoro con MapReduce, dal momento che non avrei mai sfruttato nulla se non il parallelismo costruito in hadoop. Ad ogni modo, se vuoi chattare di più sugli approcci e le soluzioni, lmk! –