Back to site
Since 2004, our University project has become the Internet's most widespread web hosting directory. Here we like to talk a lot about web servers, web development, networking and security services. It is, after all, our expertise. To make things better we've launched this science section with the free access to educational resources and important scientific material translated to different languages.

Korišćenje awk i prijatelja sa Hadoop-om

Zamislite da imate CSV datoteku kojom želite da manipulišete. Evo primera fajla gde se možemo igrati sa:

lopez,charlie,2002,11,21
parker,ward,1995,04,08
henderson,russell,2007,10,01

Naš cilj je da se transformiše ovo u sledeći oblik kombinujući poslednje tri kolone:

lopez,charlie,20021121
parker,ward,19950408
henderson,russell,20071001

U Linux-u bi trebalo preduzmete sve u roku od dve sekunde (izgovor koji je neprijatan awk komandi):

shell$ awk -F"," '{ print $1","$2","$3$4$5 }' people.txt

Šta ako ste želeli da brzo uradite isto u HDFS - u i pretpostavimo da želite da pišete rezultate nazad na HDFS. Jedan pristup bio bi da se koristi HDFS IKL za slušanje ulaza u awk, i stream awk izlaz nazad u HDFS. Vi biste mogli to da uradite sa HDFS mačka i put - opcijama (imajte na umu da dodavanje crtice nalaže da stavite komandu stream podataka iz standardnog ulaza ka HDFS):

shell$ hadoop fs -cat people.txt | awk -F"," '{ print $1","$2","$3$4$5 }' | hadoop fs -put - people-coalesed.txt

Usput, ako su vaši ulazni i izlazni fajlovi LZOP-kompresovani onda ova komanda bi radila:

shell$ hadoop fs -cat people.txt.lzo | lzop -dc | awk -F"," '{ print $1","$2","$3$4$5 }' | \
         lzop -c | hadoop fs -put - people-coalesed.txt.lzo

Ovo je odlično ako datoteka nije prevelika, ali ako je više gigabajta onda verovatno želite da iskoristite moć MapReduce da se ovo uradi u tren oka! Reči "u tren oka" i "MapReduce" se obično ne koriste zajedno, pa šta da radimo? Pa mogli biste razbiti otvorene funkcije i napisati neke uobičajene korisničke definisane funkcije, ali to znači da ste završili u Javi koje želimo da izbegnemo.

    Hadoop streaming dolazi u pomoć u ovakvim situacijama. Hajde da prvo stvorimo naš skript awk koji će biti izvršen.

shell$ cat people.awk
#!/bin/awk -f

BEGIN { FS = "," }
{ print $1","$2","$3$4$5 }

u Linux-u, ako napravite ovu awk izvršnu skriptu, mogli biste izvršiti kako glasi:

shell$ ./people.awk people.txt

MapReduce-zemlja ne treba da se pridruži podacima u ovom konkretnom primeru, tako da nismo morali da pokrenemo bilo koje reduktore. Pozovite svoj awk zapis, iz Mappers preko Hadoop Streaming sa ovom komandom:

shell$ HADOOP_HOME=/usr/lib/hadoop
shell$ ${HADOOP_HOME}/bin/hadoop \
  jar ${HADOOP_HOME}/contrib/streaming/*.jar \
  -D mapreduce.job.reduces=0 \
  -D mapred.reduce.tasks=0 \
  -input people.txt \
  -output people-coalesed \
  -mapper people.awk \
  -file people.awk

Možete da vidite izlaz u HDFS-u sa mačkom:

shell$ hadoop fs -cat /user/aholmes/people-coalesed/part*
henderson,russell,20071001
lopez,charlie,20021121
parker,ward,19950408

Nekoliko opcija u Hadoop Streaming komandama su vredne ispitivanja:

    Konačno - da stavite LZO u sliku, morate da dodate -inputformat,-D mapred.output.compress i-D mapred.output.compression.codec argumente:

    shell$ HADOOP_HOME=/usr/lib/hadoop
    shell$ ${HADOOP_HOME}/bin/hadoop \
      jar ${HADOOP_HOME}/contrib/streaming/*.jar \
      -D mapreduce.job.reduces=0 \
      -D mapred.reduce.tasks=0 \
      -D mapred.output.compress=true \
      -D stream.map.input.ignoreKey=true \
      -D mapred.output.compression.codec=com.hadoop.compression.lzo.LzopCodec \
      -inputformat com.hadoop.mapred.DeprecatedLzoTextInputFormat \
      -input people.txt.lzo \
      -output people-coalesed \
      -mapper people.awk \
      -file people.awk





Published (Last edited): 16-04-2013 , source: http://grepalex.com/2013/01/17/awk-with-hadoop-streaming/