Wywołanie zadania mapreduce z prostego programu java

Próbowałem wywołać zadanie mapreduce z prostego programu java w tym samym pakiecie.. Próbowałem odwołać się do pliku JAR mapreduce w moim programie java i wywołać go za pomocą metody runJar(String args[]), przekazując również ścieżki wejściowe i wyjściowe dla zadania mapreduce.. Ale program działa..


Jak uruchomić taki program, w którym wystarczy przekazać wejście, wyjście i ścieżkę jar do jego głównej metody?? Czy możliwe jest uruchomienie zadania mapreduce (jar)?? Chcę to zrobić, bo chcę Uruchom kilka zadań mapreduce jeden po drugim, gdzie mój program java VL wywołuje każde takie zadanie, odwołując swój plik jar.. Jeśli stanie się to możliwe, równie dobrze mogę użyć prostego servletu, aby wykonać takie wywołanie i skierować jego pliki wyjściowe do celów graficznych..


/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author root
 */
import org.apache.hadoop.util.RunJar;
import java.util.*;

public class callOther {

    public static void main(String args[])throws Throwable
    {

        ArrayList arg=new ArrayList();

        String output="/root/Desktp/output";

        arg.add("/root/NetBeansProjects/wordTool/dist/wordTool.jar");

        arg.add("/root/Desktop/input");
        arg.add(output);

        RunJar.main((String[])arg.toArray(new String[0]));

    }
}
Author: Ravi Trivedi, 2012-03-24

6 answers

Oh please don ' t do it with runJar, The Java API is very good.

Zobacz jak można rozpocząć pracę z normalnego kodu:

// create a configuration
Configuration conf = new Configuration();
// create a new job based on the configuration
Job job = new Job(conf);
// here you have to put your mapper class
job.setMapperClass(Mapper.class);
// here you have to put your reducer class
job.setReducerClass(Reducer.class);
// here you have to set the jar which is containing your 
// map/reduce class, so you can use the mapper class
job.setJarByClass(Mapper.class);
// key/value of your reducer output
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
// this is setting the format of your input, can be TextInputFormat
job.setInputFormatClass(SequenceFileInputFormat.class);
// same with output
job.setOutputFormatClass(TextOutputFormat.class);
// here you can set the path of your input
SequenceFileInputFormat.addInputPath(job, new Path("files/toMap/"));
// this deletes possible output paths to prevent job failures
FileSystem fs = FileSystem.get(conf);
Path out = new Path("files/out/processed/");
fs.delete(out, true);
// finally set the empty out path
TextOutputFormat.setOutputPath(job, out);

// this waits until the job completes and prints debug out to STDOUT or whatever
// has been configured in your log4j properties.
job.waitForCompletion(true);

Jeśli używasz zewnętrznego klastra, musisz umieścić następujące informacje w konfiguracji poprzez:

// this should be like defined in your mapred-site.xml
conf.set("mapred.job.tracker", "jobtracker.com:50001"); 
// like defined in hdfs-site.xml
conf.set("fs.default.name", "hdfs://namenode.com:9000");

Nie powinno to być problemem, gdy hadoop-core.jar znajduje się w classpath kontenerów aplikacji. Ale myślę, że powinieneś umieścić jakiś wskaźnik postępu na swojej stronie internetowej, ponieważ ukończenie zadania hadoop może potrwać od kilku minut do godzin ;)

Do przędzy (>Hadoop 2)

Dla przędzy należy ustawić następujące konfiguracje.

// this should be like defined in your yarn-site.xml
conf.set("yarn.resourcemanager.address", "yarn-manager.com:50001"); 

// framework is now "yarn", should be defined like this in mapred-site.xm
conf.set("mapreduce.framework.name", "yarn");

// like defined in hdfs-site.xml
conf.set("fs.default.name", "hdfs://namenode.com:9000");
 31
Author: Thomas Jungblut,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-14 19:55:13

Wywołanie zadania MapReduce z aplikacji webowej java (Servlet)

Można wywołać zadanie MapReduce z aplikacji internetowej przy użyciu Java API. Oto mały przykład wywołania zadania MapReduce z servletu. Kroki podane są poniżej:

Krok 1 : na początku Utwórz klasę serwletów sterowników MapReduce. Opracuj również mapę i zmniejsz usługę. Oto przykładowy fragment kodu:

Zadzwoń do Jobf z Serwleta.java

    public class CallJobFromServlet extends HttpServlet {

    protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {

    Configuration conf = new Configuration();
    // Replace CallJobFromServlet.class name with your servlet class
        Job job = new Job(conf, " CallJobFromServlet.class"); 
        job.setJarByClass(CallJobFromServlet.class);
        job.setJobName("Job Name");
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(Text.class);
        job.setMapperClass(Map.class); // Replace Map.class name with your Mapper class
        job.setNumReduceTasks(30);
        job.setReducerClass(Reducer.class); //Replace Reduce.class name with your Reducer class
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(Text.class);
        job.setInputFormatClass(TextInputFormat.class);
        job.setOutputFormatClass(TextOutputFormat.class);

        // Job Input path
        FileInputFormat.addInputPath(job, new  
        Path("hdfs://localhost:54310/user/hduser/input/")); 
        // Job Output path
        FileOutputFormat.setOutputPath(job, new 
        Path("hdfs://localhost:54310/user/hduser/output")); 

        job.waitForCompletion(true);
   }
}

Krok 2 : Umieść wszystkie powiązane pliki JAR (hadoop, application specific jars) znajdujące się w folderze lib serwera www (np. Tomcat). Jest to obowiązkowe dla uzyskania dostępu do konfiguracji Hadoop (folder hadoop 'conf' zawiera pliki konfiguracyjne XML tj. core-site.XML, HDFS-site.xml etc). Wystarczy skopiować jars z folderu hadoop lib do katalogu lib serwera www(tomcat). Lista nazw jar jest następująca:

1.  commons-beanutils-1.7.0.jar
2.  commons-beanutils-core-1.8.0.jar
3.  commons-cli-1.2.jar
4.  commons-collections-3.2.1.jar
5.  commons-configuration-1.6.jar
6.  commons-httpclient-3.0.1.jar
7.  commons-io-2.1.jar
8.  commons-lang-2.4.jar
9.  commons-logging-1.1.1.jar
10. hadoop-client-1.0.4.jar
11. hadoop-core-1.0.4.jar
12. jackson-core-asl-1.8.8.jar
13. jackson-mapper-asl-1.8.8.jar
14. jersey-core-1.8.jar

Krok 3 : wdrożenie aplikacji internetowej na serwerze WWW (w folderze "webapps" dla Tomcat).

Krok 4 : Utwórz plik jsp i połącz klasę servlet (CallJobFromServlet.java) w atrybucie form action. Oto przykładowy fragment kodu:

Indeks.jsp

<form id="trigger_hadoop" name="trigger_hadoop" action="./CallJobFromServlet ">
      <span class="back">Trigger Hadoop Job from Web Page </span> 
      <input type="submit" name="submit" value="Trigger Job" />      
</form>
 7
Author: RS Software -Competency Team,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-18 09:02:15

Inny sposób dla zadań już zaimplementowanych w przykładach hadoop i wymaga zaimportowania słoików hadoop.. następnie wystarczy wywołać statyczną funkcję główną żądanej klasy job z odpowiednim łańcuchem [] argumentów

 1
Author: faridasabry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-10 13:43:54

Ponieważ map i reduce działają na różnych maszynach, wszystkie odwołane klasy i Jary muszą przenosić się z maszyny na maszynę.

Jeśli masz pakiet jar, i uruchomić na pulpicie, @ ThomasJungblut odpowiedź jest OK. Ale jeśli uruchomisz w Eclipse, kliknij prawym przyciskiem myszy swoją klasę i uruchom, to nie działa.

Zamiast:

job.setJarByClass(Mapper.class);

Użycie:

job.setJar("build/libs/hdfs-javac-1.0.jar");

W tym samym czasie manifest jar musi zawierać właściwość Main-Class, która jest Twoją główną klasą.

Dla użytkowników gradle, można umieścić te linie w budowie."gradle": {]}

jar {
manifest {
    attributes("Main-Class": mainClassName)
}}
 1
Author: Jiang Libo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-26 02:36:17

Nie mogę wymyślić wielu sposobów, aby to zrobić bez angażowania biblioteki hadoop-core(lub rzeczywiście, jak powiedział @ ThomasJungblut, dlaczego chcesz).

Ale jeśli koniecznie musisz, możesz skonfigurować serwer Oozie z przepływem pracy dla swojego zadania, a następnie użyć interfejsu Oozie webservice, aby przesłać przepływ pracy do Hadoop.

Ponownie, wydaje się, że to dużo pracy dla czegoś, co może być po prostu rozwiązane za pomocą odpowiedzi Thomasa (Dołącz hadoop-core jar i użyj jego fragment kodu)

 0
Author: Chris White,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-24 15:29:52

Możesz zrobić w ten sposób

public class Test {

    public static void main(String[] args) throws Exception {
        int res = ToolRunner.run(new Configuration(), new YourJob(), args);
        System.exit(res);

    }
 0
Author: techlearner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-26 02:36:31