eu.stratosphere.fuzzyjoin.test.TestA.java Source code

Java tutorial

Introduction

Here is the source code for eu.stratosphere.fuzzyjoin.test.TestA.java

Source

/**
 * Copyright (C) 2011 AIM III course DIMA TU Berlin
 *
 * This programm is free software; you can redistribute it and/or modify
 * it under the terms of the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package eu.stratosphere.fuzzyjoin.test;

import java.util.Collection;
import java.util.LinkedList;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

import eu.stratosphere.nephele.configuration.Configuration;
import eu.stratosphere.nephele.jobgraph.JobGraph;
import eu.stratosphere.pact.common.plan.Plan;
import eu.stratosphere.pact.compiler.PactCompiler;
import eu.stratosphere.pact.compiler.jobgen.JobGraphGenerator;
import eu.stratosphere.pact.compiler.plan.OptimizedPlan;
import eu.stratosphere.pact.example.wordcount.WordCount;
import eu.stratosphere.pact.test.util.TestBase;

@RunWith(Parameterized.class)
public class TestA extends TestBase {

    public TestA(Configuration config) {
        super(config);
    }

    private static final Log LOG = LogFactory.getLog(TestA.class);

    private final String TEXT = "Goethe - Faust: Der Tragoedie erster Teil\n" + "Prolog im Himmel.\n"
            + "Der Herr. Die himmlischen Heerscharen. Nachher Mephistopheles. Die drei\n" + "Erzengel treten vor.\n"
            + "RAPHAEL: Die Sonne toent, nach alter Weise, In Brudersphaeren Wettgesang,\n"
            + "Und ihre vorgeschriebne Reise Vollendet sie mit Donnergang. Ihr Anblick\n"
            + "gibt den Engeln Staerke, Wenn keiner Sie ergruenden mag; die unbegreiflich\n"
            + "hohen Werke Sind herrlich wie am ersten Tag.\n"
            + "GABRIEL: Und schnell und unbegreiflich schnelle Dreht sich umher der Erde\n"
            + "Pracht; Es wechselt Paradieseshelle Mit tiefer, schauervoller Nacht. Es\n"
            + "schaeumt das Meer in breiten Fluessen Am tiefen Grund der Felsen auf, Und\n"
            + "Fels und Meer wird fortgerissen Im ewig schnellem Sphaerenlauf.\n"
            + "MICHAEL: Und Stuerme brausen um die Wette Vom Meer aufs Land, vom Land\n"
            + "aufs Meer, und bilden wuetend eine Kette Der tiefsten Wirkung rings umher.\n"
            + "Da flammt ein blitzendes Verheeren Dem Pfade vor des Donnerschlags. Doch\n"
            + "deine Boten, Herr, verehren Das sanfte Wandeln deines Tags.\n"
            + "ZU DREI: Der Anblick gibt den Engeln Staerke, Da keiner dich ergruenden\n"
            + "mag, Und alle deine hohen Werke Sind herrlich wie am ersten Tag.\n"
            + "MEPHISTOPHELES: Da du, o Herr, dich einmal wieder nahst Und fragst, wie\n"
            + "alles sich bei uns befinde, Und du mich sonst gewoehnlich gerne sahst, So\n"
            + "siehst du mich auch unter dem Gesinde. Verzeih, ich kann nicht hohe Worte\n"
            + "machen, Und wenn mich auch der ganze Kreis verhoehnt; Mein Pathos braechte\n"
            + "dich gewiss zum Lachen, Haettst du dir nicht das Lachen abgewoehnt. Von\n"
            + "Sonn' und Welten weiss ich nichts zu sagen, Ich sehe nur, wie sich die\n"
            + "Menschen plagen. Der kleine Gott der Welt bleibt stets von gleichem\n"
            + "Schlag, Und ist so wunderlich als wie am ersten Tag. Ein wenig besser\n"
            + "wuerd er leben, Haettst du ihm nicht den Schein des Himmelslichts gegeben;\n"
            + "Er nennt's Vernunft und braucht's allein, Nur tierischer als jedes Tier\n"
            + "zu sein. Er scheint mir, mit Verlaub von euer Gnaden, Wie eine der\n"
            + "langbeinigen Zikaden, Die immer fliegt und fliegend springt Und gleich im\n"
            + "Gras ihr altes Liedchen singt; Und laeg er nur noch immer in dem Grase! In\n"
            + "jeden Quark begraebt er seine Nase.\n"
            + "DER HERR: Hast du mir weiter nichts zu sagen? Kommst du nur immer\n"
            + "anzuklagen? Ist auf der Erde ewig dir nichts recht?\n"
            + "MEPHISTOPHELES: Nein Herr! ich find es dort, wie immer, herzlich\n"
            + "schlecht. Die Menschen dauern mich in ihren Jammertagen, Ich mag sogar\n"
            + "die armen selbst nicht plagen.\n" + "DER HERR: Kennst du den Faust?\n"
            + "MEPHISTOPHELES: Den Doktor?\n" + "DER HERR: Meinen Knecht!\n"
            + "MEPHISTOPHELES: Fuerwahr! er dient Euch auf besondre Weise. Nicht irdisch\n"
            + "ist des Toren Trank noch Speise. Ihn treibt die Gaerung in die Ferne, Er\n"
            + "ist sich seiner Tollheit halb bewusst; Vom Himmel fordert er die schoensten\n"
            + "Sterne Und von der Erde jede hoechste Lust, Und alle Naeh und alle Ferne\n"
            + "Befriedigt nicht die tiefbewegte Brust.\n"
            + "DER HERR: Wenn er mir auch nur verworren dient, So werd ich ihn bald in\n"
            + "die Klarheit fuehren. Weiss doch der Gaertner, wenn das Baeumchen gruent, Das\n"
            + "Bluet und Frucht die kuenft'gen Jahre zieren.\n"
            + "MEPHISTOPHELES: Was wettet Ihr? den sollt Ihr noch verlieren! Wenn Ihr\n"
            + "mir die Erlaubnis gebt, Ihn meine Strasse sacht zu fuehren.\n"
            + "DER HERR: Solang er auf der Erde lebt, So lange sei dir's nicht verboten,\n"
            + "Es irrt der Mensch so lang er strebt.\n"
            + "MEPHISTOPHELES: Da dank ich Euch; denn mit den Toten Hab ich mich niemals\n"
            + "gern befangen. Am meisten lieb ich mir die vollen, frischen Wangen. Fuer\n"
            + "einem Leichnam bin ich nicht zu Haus; Mir geht es wie der Katze mit der Maus.\n"
            + "DER HERR: Nun gut, es sei dir ueberlassen! Zieh diesen Geist von seinem\n"
            + "Urquell ab, Und fuehr ihn, kannst du ihn erfassen, Auf deinem Wege mit\n"
            + "herab, Und steh beschaemt, wenn du bekennen musst: Ein guter Mensch, in\n"
            + "seinem dunklen Drange, Ist sich des rechten Weges wohl bewusst.\n"
            + "MEPHISTOPHELES: Schon gut! nur dauert es nicht lange. Mir ist fuer meine\n"
            + "Wette gar nicht bange. Wenn ich zu meinem Zweck gelange, Erlaubt Ihr mir\n"
            + "Triumph aus voller Brust. Staub soll er fressen, und mit Lust, Wie meine\n"
            + "Muhme, die beruehmte Schlange.\n"
            + "DER HERR: Du darfst auch da nur frei erscheinen; Ich habe deinesgleichen\n"
            + "nie gehasst. Von allen Geistern, die verneinen, ist mir der Schalk am\n"
            + "wenigsten zur Last. Des Menschen Taetigkeit kann allzu leicht erschlaffen,\n"
            + "er liebt sich bald die unbedingte Ruh; Drum geb ich gern ihm den Gesellen\n"
            + "zu, Der reizt und wirkt und muss als Teufel schaffen. Doch ihr, die echten\n"
            + "Goettersoehne, Erfreut euch der lebendig reichen Schoene! Das Werdende, das\n"
            + "ewig wirkt und lebt, Umfass euch mit der Liebe holden Schranken, Und was\n"
            + "in schwankender Erscheinung schwebt, Befestigt mit dauernden Gedanken!\n"
            + "(Der Himmel schliesst, die Erzengel verteilen sich.)\n"
            + "MEPHISTOPHELES (allein): Von Zeit zu Zeit seh ich den Alten gern, Und\n"
            + "huete mich, mit ihm zu brechen. Es ist gar huebsch von einem grossen Herrn,\n"
            + "So menschlich mit dem Teufel selbst zu sprechen.";

    private final String TEXT2 = "Goethe - Faust: Der Tragoedie erster Teil\n" + "Prolog im Himmel.\n"
            + "Der Herr. Die himmlischen Heerscharen. Nachher Mephistopheles. Die drei\n" + "Erzengel treten vor.\n"
            + "RAPHAEL: Die Sonne toent, nach alter Weise, In Brudersphaeren Wettgesang,\n"
            + "Und ihre vorgeschriebne Reise Vollendet sie mit Donnergang. Ihr Anblick\n"
            + "gibt den Engeln Staerke, Wenn keiner Sie ergruenden mag; die unbegreiflich\n"
            + "hohen Werke Sind herrlich wie am ersten Tag.\n"
            + "GABRIEL: Und schnell und unbegreiflich schnelle Dreht sich umher der Erde\n"
            + "Pracht; Es wechselt Paradieseshelle Mit tiefer, schauervoller Nacht. Es\n"
            + "schaeumt das Meer in breiten Fluessen Am tiefen Grund der Felsen auf, Und\n"
            + "Fels und Meer wird fortgerissen Im ewig schnellem Sphaerenlauf.\n"
            + "MICHAEL: Und Stuerme brausen um die Wette Vom Meer aufs Land, vom Land\n"
            + "aufs Meer, und bilden wuetend eine Kette Der tiefsten Wirkung rings umher.\n"
            + "Da flammt ein blitzendes Verheeren Dem Pfade vor des Donnerschlags. Doch\n"
            + "deine Boten, Herr, verehren Das sanfte Wandeln deines Tags.\n"
            + "ZU DREI: Der Anblick gibt den Engeln Staerke, Da keiner dich ergruenden\n"
            + "mag, Und alle deine hohen Werke Sind herrlich wie am ersten Tag.\n"
            + "MEPHISTOPHELES: Da du, o Herr, dich einmal wieder nahst Und fragst, wie\n"
            + "alles sich bei uns befinde, Und du mich sonst gewoehnlich gerne sahst, So";

    private String textPath = null;
    private String resultPath = null;

    @Override
    protected void preSubmit() throws Exception {
        textPath = getFilesystemProvider().getTempDirPath() + "/text";
        resultPath = getFilesystemProvider().getTempDirPath() + "/result";

        System.out.println(textPath);
        System.out.println(resultPath);

        getFilesystemProvider().createDir(textPath);

        String[] splits = splitInputString(TEXT, '\n', 4);
        int i = 0;
        for (String split : splits) {
            getFilesystemProvider().createFile(textPath + "/part_" + (i++) + ".txt", split);
            LOG.debug("Text Part " + (i - -1) + ":\n>" + split + "<");
        }

        String[] splits2 = splitInputString(TEXT2, '\n', 4);
        int j = 0;
        for (String split : splits2) {
            getFilesystemProvider().createFile(textPath + "/part_" + (j++) + ".txt", split);
            LOG.debug("Text Part " + (j - -1) + ":\n>" + split + "<");
        }

    }

    @Override
    protected JobGraph getJobGraph() throws Exception {
        WordCount wc = new WordCount();
        Plan plan = wc.getPlan(config.getString("WordCountTest#NoSubtasks", "1"),
                getFilesystemProvider().getURIPrefix() + textPath,
                getFilesystemProvider().getURIPrefix() + resultPath);

        PactCompiler pc = new PactCompiler();
        OptimizedPlan op = pc.compile(plan);

        JobGraphGenerator jgg = new JobGraphGenerator();
        return jgg.compileJobGraph(op);

    }

    @Override
    protected void postSubmit() throws Exception {
        // clean up hdfs
        getFilesystemProvider().delete(textPath, true);
        getFilesystemProvider().delete(resultPath, true);
    }

    @Parameters
    public static Collection<Object[]> getConfigurations() {

        LinkedList<Configuration> tConfigs = new LinkedList<Configuration>();

        Configuration config = new Configuration();
        config.setInteger("WordCountTest#NoSubtasks", 4);
        tConfigs.add(config);

        return toParameterList(tConfigs);
    }

    private String[] splitInputString(String inputString, char splitChar, int noSplits) {

        String splitString = inputString.toString();
        String[] splits = new String[noSplits];
        int partitionSize = (splitString.length() / noSplits) - 2;

        // split data file and copy parts
        for (int i = 0; i < noSplits - 1; i++) {
            int cutPos = splitString.indexOf(splitChar,
                    (partitionSize < splitString.length() ? partitionSize : (splitString.length() - 1)));
            splits[i] = splitString.substring(0, cutPos) + "\n";
            splitString = splitString.substring(cutPos + 1);
        }
        splits[noSplits - 1] = splitString;

        return splits;

    }

}