#Write parameters for alpha, graph size and cumulative hanging weight
echo $ALPHA > $TEMPDIR/data_.txt
tail n 1 $TEMPDIR/graph_.txt | awk ‘{print $1+1}’ >> $TEMPDIR/data_.txt
head n 1 $TEMPDIR/output.txt | awk ‘{print $2}’ >> $TEMPDIR/data_.txt

hadoop fs rm r pageout
hadoop fs rm output.txt
hadoop fs copyFromLocal $TEMPDIR/output.txt output.txt
hadoop jar /usr/lib/hadoopmapreduce/hadoopstreaming.jar D mapred.output.key.comparator.class=org.apache.hadoop.mapred.lib.KeyFieldBasedComparator D stream.num.map.output.key.fields=1 D mapred.text.key.comparator.options=-k1n file $MRDIR/alphaMapper.py mapper alphaMapper.py reducer org.apache.hadoop.mapred.lib.IdentityReducer file $TEMPDIR/data_.txt input output.txt output pageout
if [[ $? != 0 ]]; then
echo “Run unsuccessful!”
exit $?
fi
rm rf $TEMPDIR/pageout
hadoop fs copyToLocal pageout $TEMPDIR
cat $TEMPDIR/pageout/part* > $TEMPDIR/out.txt
rm $TEMPDIR/graph_.txt
paste $TEMPDIR/out.txt $TEMPDIR/adja.txt > $TEMPDIR/graph_.txt
done

cat $TEMPDIR/graph_.txt | sort k2g | head n 10

if [[ $CLEANUP == 1 ]]; then
rm rf $TEMPDIR
fi

Die Date graph.txt soll unverändert bleiben, daher wird sie als Kopie graph_.txt durch den Algorithmus gehen, und hin und her kopiert werden. Ich will hier gar nicht auf das ganze Shell-Skript eingehen, fragt wenn ihr mehr wissen wollt, aber da könnte ich (und werde vielleicht) einen eigenen Artikel zu schreiben. Schauen wir nur auf die Streaming-Kommandos:

hadoop jar /usr/lib/hadoop-mapreduce/hadoop-streaming.jar -D mapred.output.key.comparator.class=org.apache.hadoop.mapred.lib.KeyFieldBasedComparator -D stream.num.map.output.key.fields=1 -D mapred.text.key.comparator.options=-k1n -file $MRDIR/weightMapper.py -mapper weightMapper.py -file $MRDIR/weightReducer.py -reducer weightReducer.py -input $TEMPDIR/graph_.txt -output pagerank

Hier sehen wir, wie mit -D Optionen eingestellt werden können. Eine davon ist KeyFieldBasedComparator. Dieser hilft den richtigen Sortierer zu konfigurieren – wir wollen doch Schlüssel als Zahlenwerte ausgeben, und nicht wie Buchstaben sortieren. Das konfigurieren die weiteren Parameter – wir haben ein Feld für den Schlüssel, und es ist numerisch (-k1n ist ein Parameter, wie unix sort ihn erhält).

Im zweiten Streaming-Befehl

hadoop jar /usr/lib/hadoop-mapreduce/hadoop-streaming.jar -D mapred.output.key.comparator.class=org.apache.hadoop.mapred.lib.KeyFieldBasedComparator -D stream.num.map.output.key.fields=1 -D mapred.text.key.comparator.options=-k1n -file $MRDIR/alphaMapper.py -mapper alphaMapper.py -reducer org.apache.hadoop.mapred.lib.IdentityReducer -file $TEMPDIR/data_.txt -input output.txt -output pageout

Geben wir org.apache.hadoop.mapred.lib.IdentityReducer als Reducer an – also der Identitätsreducer, der die Zeilen nur durchreicht.
Und mit dem -file Kommando sehen wir auch, wie die Parameterdatei zum zweiten Mapper kommt. Zwischen den MapReducern können wir sie dynamisch erstellen.

Wenn ihr also Hadoop korrekt gestartet habt, sollte der folgende Befehl all die Arbeit erledigen und die wichtigsten zehn Seiten ausgeben:

bash iter.sh

 

P.S.: Diax’s Rake zieht um! Noch gibt es die Artikel auf beiden Seiten, aber bald werdet ihr mich nur noch in meiner neuen Heimat lesen können!

1 / 2 / 3 / 4

Kommentare (1)

  1. #1 rolak
    12/10/2012

    moin Jörg, was mir auffiel:

    an alle Seiten, auf die er liegt.

    ‘zeigt’ oder ‘linkt’

    Knoten D dar, der zwar einkommende, aber keine ausgehenden Links hat

    D verlinkt B, dagegen hängt C