Il presente articolo è stato tradotto automaticamente.
MapReduce in F#
Analisi di file di log con F#, MapReduce and Windows Azure
Noah regalo
Scaricare il codice di esempio
Programmatore Python esperti, stavo intrigued da un colloquio con Don Syme, architetto del linguaggio F #. In attesa di colloquio, Don menzionati, che "alcune persone vedere [F #] come una sorta di Python fortemente tipizzato, fino a differenze sintattiche." Questo carattere me come qualcosa di utile esaminare ulteriormente.
Ebbene, F # è un e stimolante nuovo linguaggio di programmazione che è ancora un segreto per molti sviluppatori. F # offre gli stessi vantaggi di produttività che i programmatori di Ruby e Python si potevano negli ultimi anni. Come Ruby e Python, F # è un linguaggio ad alto livello con sintassi e l'eleganza dell'espressione. Che cosa rende F # realmente univoco è una combinazione queste funzionalità pragmatic con un sistema sofisticato di inferenza del tipo e molte delle idee migliori del mondo di programmazione funzionale. In questo modo F # in una classe con alcuni colleghi.
Ma un nuovo linguaggio di programmazione ad elevata produttività non è solo interessanti nuove tecnologie disponibili oggi.
Ampia disponibilità di piattaforme di nuvola, ad esempio azzurro ghiaccio Windows rende archiviazione distribuita e risorse disponibili per gli sviluppatori singoli o aziende di dimensioni dell'organizzazione. Con archiviazione cloud provengono utili strumenti quali l'algoritmo MapReduce orizzontalmente scalabile, che consente rapidamente di scrivere il codice che è possibile analizzare e ordinare i set di dati potenzialmente enorme.
Strumenti quali il let che è scrivere poche righe di codice, distribuire la nuvola e manipolare gigabyte di dati in un pomeriggio di lavoro. Partecipa.
In questo articolo, mi auguro che condividono alcuni mio entusiasmo su F #, azzurro ghiaccio di Windows e MapReduce. È possibile raccogliere tutte le idee per mostrare il modo in cui è possibile utilizzare F # e l'algoritmo MapReduce per analizzare i file di registro su azzurro ghiaccio di Windows. In primo luogo, si parlerà alcune tecniche di creazione di prototipi per rendere meno complessa; la programmazione MapReduce quindi, analizzerò i risultati … per area.
Pirateria informatica con F #
Uno dei nuovi stili di lavoro è disponibile.NET esperti con F # è il flusso di lavoro interattivo che sono abituati a molti programmatori Perl, Python e Ruby. Questo stile di programmazione spesso utilizza un ambiente di codifica interattivo come la shell di Python o uno strumento come IPython, che fornisce il completamento di readline. Ciò consente agli sviluppatori di importare una classe da un modulo, crearne un'istanza e quindi utilizzare il completamento tramite tab per individuare i metodi e i dati sull'oggetto.
Un metodo comune di sviluppo interattivo risulterà familiare.NET possono è sufficiente scrivere il codice in Visual Studio e inviare frammenti di codice alla finestra F # interattiva per l'esecuzione. I frammenti vengono inviati utilizzando la combinazione di tasti Alt + INVIO per il testo selezionato o Alt + SingleQuote per una singola riga. Figura 1 illustra un esempio di questa tecnica in azione.
Figura 1 con F # finestra interattiva
Questo approccio è utile per il debug rapido di un programma di F # e completamento IntelliSense e scheda sono disponibili nello script F # si sta sviluppando.
Un altro approccio è nuovamente scrivere il codice in Visual Studio, ma quindi copiare una sezione di codice da Visual Studio e incollarlo direttamente nella Console interattiva F # autonomo (vedere nella figura 2). Se si utilizza questa tecnica, è necessario ricordarsi di inserire due punti e virgola dopo il codice incollato. Consente di interagire con il codice con l'ulteriore vantaggio del completamento tramite tab. Si troverà utilizzando questa tecnica consente di programmazione in modo più interattivo.
Figura 2 F # Console interattiva
È inoltre possibile sviluppare in modo interattivo con F # mediante l'esecuzione di codice direttamente da Windows PowerShell, in altre parole, passando uno script per fsi.exe (il file eseguibile Console interattiva F #) se stesso. Uno dei vantaggi di questo approccio è che consente di script rapida di prototipi e stampare i risultati nell'output standard. Inoltre, è possibile modificare il codice ripetutamente con un editor di testo semplice, ad esempio Blocco note + +. Figura 3 viene illustrato un esempio di script ridurre mappa output che si possono utilizzare in questo articolo, come viene eseguita da Windows PowerShell.
Figura 3 che esegue uno Script di F # in Windows PowerShell
PS C:\Users\Administrator\Desktop > & ' C:\Programmi (x86)\FSharp-2.0.0.0\bin\fsi.exe' mapreduce.fsscript 192.168.1.1, 11 192.168.1.2, 9 192.168.1.3, 8 192.168.1.4, 7 192.168.1.5, 6 192.168.1.6, 5 192.168.1.7, 5
Questi metodi per scrivere il codice tutti rivelano intenzionato a collaborare che con algoritmi complessi, programmazione di rete e la nuvola. È possibile scrivere un prototipo di automazioni ed eseguirlo dalla riga di comando per verificare se offre i risultati previsti. È quindi possibile avviare la generazione del progetto più grande in Visual Studio.
Con queste informazioni fuori dall'area di sfondo, esaminiamo alcune codice effettivo.
Analisi del Registro di stile MapReduce
Oltre ai vantaggi sopra di programmazione interattiva, F # codice è inoltre concisa ed efficace. Nell'esempio riportato in nella figura 4 è inferiore a 50 righe di codice, ma contiene tutte le parti importanti di un algoritmo di riduzione di mappa per calcolare gli indirizzi IP primi 10 in un set di file di registro.
Figura 4 MapReduce algoritmo per analizzare un File di registro
aprire System.Collections.Generic open System. IO
/ / Fase mappa let FileInput = @ "web.log" lasciare che il file di registro mapLogFileIpAddr = file di registro fileReader let = seq {utilizzare fileReader = nuovo StreamReader(File.OpenRead(logFile)) mentre fileReader.EndOfStream non producono fileReader.ReadLine()}
/ / Richiede righe ed estrae IP indirizzo Out, / / filtrare righe non valide-out prima che cutIp = line let fileReader FileInput riga = | > SEQ.Filter (divertenti riga - > non (riga.StartsWith("#"))) | > SEQ.map (divertenti riga - > riga.Split [|' ) | >SEQ.map (divertenti riga - > riga.[8], 1) | > SEQ.ToArray cutIp
/ / Riduce fase let ipMatches = mapLogFileIpAddr FileInput let reduceFileIpAddr = Array.fold (divertente (acc: mappa < string, int >) ((ipAddr, num): stringa * int)-> Se Map.containsKey ipAddr acc consente quindi a ipFreq = conto [ipAddr] Map.add ipAddr (ipFreq + num) acc else Map.add ipAddr 1 acc) Map.empty ipMatches
/ / Visualizza gli indirizzi Ip di Top 10 topIpAddressOutput let reduceOutput = sortedResults let = reduceFileIpAddr | > MAP.toSeq | > SEQ.sortBy (divertente (ip, ipFreq) - > -ipFreq) | > SortedResults SEQ.Take 10 | > SEQ.iter (divertente (ip, ipFreq) - > "% s % d", printfn IP ipFreq);
reduceFileIpAddr | > topIpAddressOutput
Questa versione autonoma, che diventerà in seguito una versione di rete, può essere suddiviso in tre fasi distinte: la fase di mappa, la fase di riduzione e la visualizzazione.
1 È la fase di mappa. MapLogFileIpAddr la funzione accetta un file di log come parametro. Definiti all'interno di questa funzione è un'altra funzione, fileReader, che utilizza una tecnica di programmazione funzionale per produrre lentamente una riga di testo dal file di registro (sebbene linguaggi quali c# e Python hanno anche questo). A questo punto, la funzione di cutIp analisi di ciascuna riga di input, vengono eliminate le righe di commento e quindi restituisce l'indirizzo IP e un valore integer, 1.
Per vedere perché è lenta, evidenziare il blocco dell'intera mappa del codice ed eseguirlo nella finestra di F # interattivi, con la riga:
Let ipMatches = FileInput mapLogFileIpAddr
Verrà visualizzato il seguente output:
Val ipMatches: seq < stringa * int >
Si noti che non sono effettivamente realizzate ancora e non è stato letto il file di registro. L'unica cosa è successo è che è stata valutata un'espressione. In questo modo, l'esecuzione viene ritardata fino a quando non è realmente necessario, senza estrarre i dati in memoria solo per motivi di valutazione di un'espressione. Si tratta di una tecnica efficace per l'elaborazione dei dati e diventa particolarmente evidente quando si dispone di enorme file di registro per l'analisi sono compreso nell'intervallo terabyte o gigabyte.
Se si vuole confrontare la differenza e valutare il codice più avidamente, quindi è sufficiente aggiungere una riga alla funzione cutIp, in modo che appaia come questa (nota: la linea |> Seq.toArray è del tutto facoltativo per la costruzione della funzione , lo scopo, nel nostro esempio, è quello di rendere la nostra funzione intenzionalmente ansioso-se questo è stato lasciato fuori, la funzione è sufficiente azionare pigramente, come la funzione mapLogFileIpAddr):
Let cutIp = line let fileReader FileInput riga = | > SEQ.Filter (divertenti riga - > non (riga.StartsWith("#"))) | > SEQ.map (divertenti riga - > riga.Split [|' ) | >SEQ.map (divertenti riga - > riga.[8], 1) | > SEQ.ToArray cutIp
Se si invia di nuovo il codice per F # interprete ed è necessario che un file registro di grandi dimensioni contenente molti gigabyte di dati, è possibile passare a prepararsi una tazza di caffè, poiché il computer verrà occupato l'intero file di lettura e la generazione di chiave/valore mapping per essa in memoria.
Nella sezione successiva della pipeline di dati, rendere l'output del risultato mappa e piegare i risultati della sequenza in una funzione anonima conta il numero di occorrenze degli indirizzi IP nella sequenza.A tale scopo, in modo continuo aggiunta alla struttura di dati mappa mediante la ricorsione.Questo stile di programmazione può essere difficile da comprendere per gli sviluppatori di nuovi alla programmazione funzionale, in modo che si desidera incorporare le istruzioni di stampa all'interno della funzione anonima per vedere esattamente cosa.
In uno stile di programmazione imperativo, è Impossibile eseguire la stessa operazione tramite l'aggiornamento di un dizionario modificabile che contiene ciascun indirizzo IP come chiave, un ciclo attraverso la sequenza di indirizzi IP, e quindi aggiornare il conteggio di ogni valore.
La fase finale non ha nulla a che fare con l'algoritmo di MapReduce, ma è utile negli script intrusione durante la fase di creazione di prototipi.I risultati della fase di mappa sono pipelined da una struttura di dati della mappa di un SEQ.I risultati vengono ordinati e per stampare i primi 10 risultati.Si noti che questi dati pipelining stile consentono i risultati di un'unica operazione fluisca perfettamente l'operazione successiva senza un ciclo for in sight.
Azzurro ghiaccio di Windows MapReduce Plus
Con lo script di prova completato, in meno di 50 righe di codice, è importante ricordare, spostarla in qualcosa di simile a un ambiente di produzione è ora.Ad esempio, si passerà l'esempio dal desktop per azzurro ghiaccio di Windows.
Come sfondo, può risultare utile esaminare gli esempi di Windows azzurro ghiaccio F # a code.msdn.microsoft.com/fsharpazure e installare i modelli azzurro ghiaccio di Windows.Di particolare interesse è l'esempio webcrawler in cui un ruolo di lavoro F # utilizza gli endpoint di archiviazione blob e coda.Questo sarebbe un progetto utile per esaminare come esplorare ulteriormente con F # azzurro ghiaccio di Windows.
Non desidero troppi dettagli sulla configurazione di una farm di MapReduce a più nodi.Ma ne tratterò da un livello superiore.Per informazioni specifiche, vedere la MSDNMagazine da Josh torsione (l'articolo "Sincronizzazione di più nodi in Windows Azure"MSDN.microsoft.com/magazine/gg309174).
Esistono diversi modi per impostare una farm di MapReduce su azzurro ghiaccio di Windows.Figura 5 di seguito viene illustrato un esempio di utilizzo di ruoli di lavoro F # dovrebbe essere diviso in parti uguali tra i lavoratori di mappa e ridurre i lavoratori.Tornando allo script, sarebbe estremamente semplice copiare e incollare la funzione mappa per il processo di lavoro di mapping e la funzione di riduzione al lavoratore ridurre.
Figura 5 MapReduce Farm in azzurro ghiaccio di Windows
La presentazione di MapReduce, Jeff Dean e Raffaella Ghemawat è un ottimo riferimento per ulteriori dettagli sull'algoritmo distribuito e possibili implementazioni (Labs.Google.com/papers/mapreduce-osdi04-Slides/).Nel nella figura 5 , tuttavia, illustrato che più file di registro vengono consumati in parallelo per i ruoli di lavoro F #.E quindi restituiscono l'output, costituito da chiavi di indirizzo IP con un valore pari a 1 tramite Windows azzurro ghiaccio AppFabric Service Bus per i lavoratori di ridurre o mediante scrittura su disco.
Successivamente, i lavoratori ridurre leggere i dati intermedi e produrre un conteggio di coppie di chiave / valore riepilogativo dalla scrittura di blob di archiviazione.Ogni lavoratore ridurre produce un report riepilogati, che deve essere combinati insieme prima di essere ordinati e visualizzati dal lavoratore Master.
Pubblicazione e la creazione di ruoli di lavoro
Con un prototipo finito e un'architettura di alto livello pianificato, il passaggio successivo consiste nel creare il progetto necessari in Visual Studio 2010 e pubblicarlo in azzurro ghiaccio di Windows.
Creazione di un ruolo di lavoro F # non è così semplice come potrebbe essere, pertanto, passiamo a esaminare i passaggi della procedura.In primo luogo, è necessario scaricare i modelli di Windows azzurro ghiaccio F # menzionati in precedenza.A questo punto, è necessario creare un progetto Visual c# per azzurro ghiaccio di Windows.Ho chiamato mio AzureFSharpProject.
A questo punto, è possibile creare un ruolo di lavoro F # come mostrato nella nella figura 6.
Figura 6 la creazione di un ruolo di F # lavoro
A questo punto, è possibile inserire nel ruolo del lavoro di ridurre la funzione mappa il ruolo di lavoro mappa o una funzione di riduzione.Quindi creare ulteriori ruoli di lavoro aggiuntivi mappa lavoratori o ridurre i lavoratori, in base alla scala delle esigenze di capacità di macinare dati.Il riferimento canonico per fare riferimento a è la carta di MapReduce di Google a Labs.Google.com/papers/-mapreduce.HTML.Vengono poste in ulteriori dettagli sull'architettura ridurre mappa, avvertenze e casi di utilizzo.
Quando si è pronti per la pubblicazione in azzurro ghiaccio di Windows, è fare clic sul progetto, seleziona pubblica, quindi Crea servizio pacchetto solo, come illustrato nella nella figura 7.
Figura 7 Publishing per azzurro ghiaccio di Windows
Infine, di accedere al nuovo portale di gestione azzurro ghiaccio di Windows e utilizzare l'interfaccia per creare il ruolo di lavoro (vedere nella figura 8).
Figura 8 il nuovo ruolo del lavoro di configurazione
A questo punto, è possibile associare i nodi in alcun modo che adattare e MapReduce i registri della cloud.Naturalmente, la stessa tecnica stato possibile applicare facilmente a origini dati diverse dai file di registro semplice.La struttura generale di questo algoritmo MapReduce F #, con le tecniche interattive è stato illustrato nel codice si, può essere utilizzato per qualsiasi tipo di analisi, la mappatura e la riduzione di processo.
Operazioni successive
F # è un linguaggio efficace che consente di risolvere i problemi da entrambi cranking out hacks veloce e mediante la creazione di soluzioni più complesse da tali hacks.In questo articolo ho utilizzato per limitare l'algoritmo MapReduce in dimensioni effetto significativo negli morsels.Questo ha consentito di dimostrare come solo 50 righe di F # quindi Impossibile trasformare in un analizzatore di registro in azzurro ghiaccio di Windows.
Riguardanti l'implementazione di MapReduce su azzurro ghiaccio di Windows, è possibile esaminare altri due interessanti articoli sull'argomento.Per prima cosa, dare un'occhiata alla "Creazione un scalabile, tenant dell'applicazione per Windows Azure" su MSDN per la discussione del (i ruoli di lavoro e MapReduceMSDN.microsoft.com/library/ff966483).Inoltre, g. JuanDiaz dispone di un post di blog, "Confronto tra l'utilizzo di 00137 e azzurro ghiaccio di Windows, di Amazon cloud computing e l'implementazione di MapReduce," che è utile lettura (bit.LY/hBQFSt).
Se non hai esaminato F # ancora, spero che questo articolo era di prova.E se si desidera ascoltare tutto il Don Syme intervista me attivate in F #, testa rispetto al blog di parlare semplice e assegnargli una (ascoltobit.LY/eI74iO).
Noah Gift è associare director of engineering in AT & T Interactive. Ha conseguito una laurea nella scienza nutrizionale da Cal Poly San Luis Obispo, si è specializzato nei sistemi di Computer informazioni dalla California State University, Los Angeles, ed è un candidato MBA in UC Davis, specializzata in Business Analytics, degli interessi e dell'imprenditorialità.
Un ringraziamento ai seguenti esperti tecnici per la revisione dell'articolo: Michael Bakkemo, Don Syme e Paras Wadehra