Динамично собирая и Управляя работой Hadoop от другого Явского Файла

Я пытаюсь написать Явский файл, который получает исходный код работы MapReduce, собирает его динамично и управляет работой на группе Hadoop. Чтобы достигнуть этого, я написал, что 3 названные метода собирают (), makeJAR() и run_Hadoop_Job (). Все хорошо работает с компиляцией и созданием файла БАНКИ. Однако, когда работа представлена Hadoop, как только работа начинается, это стоит перед проблемой с нахождением необходимых классов Картопостроителя/Преобразователя данных и бросает ClassNotFoundException и для Mapper_Class и для Reducer_Class * (java.lang. ClassNotFoundException: reza.rCloud. Mapper_Reducer_Classes$Mapper_Class.class) * . Я знаю, что должно быть что-то не так с тем, как я сослался на необходимые классы Картопостроителя/Преобразователя данных, но я не смог понять его после нескольких. Любая помощь/предложение о том, как решить проблему, высоко ценится.

Regarding the details of the project: I have a file called "rCloud_test/src/reza/Mapper_Reducer_Classes.java" that contains the source code for Mapper_Class and Reducer_Class. This file is ultimately received during the runtime but for now I copied the Hadoop WordCount example in it and store it locally in the same folder as my main class file: rCloud_test/src/reza/Platform2.java.

Ниже вы видите основное() метод Platform2.java, который является моим главным классом для этого проекта:

    public static void main(String[] args){
    System.out.println("Code Execution Started");
    String className = "Mapper_Reducer_Classes";
    Platform2 myPlatform = new Platform2();

    //step 1: compile the received class file dynamically:
    boolean compResult = myPlatform.compile(className); 
    System.out.println(className + ".java compilation result: "+compResult);

    //step 2: make a JAR file out of the compiled file:
    if (compResult) {
        compResult  = myPlatform.makeJAR("jar_file", myPlatform.compilation_Output_Folder);
        System.out.println("JAR creation result: "+compResult);
    } 
    //step 3: Now let's run the Hadoop job:
    if (compResult) {       
        compResult = myPlatform.run_Hadoop_Job(className);
        System.out.println("Running on Hadoop result: "+compResult);
    }

Метод, который вызывает меня все проблемы, является run_Hadoop_Job (), который является как указано ниже:

private boolean run_Hadoop_Job(String className){
try{
    System.out.println("*Starting to run the code on Hadoop...");
    String[] argsTemp = { "project_test/input", "project_test/output" };

    Configuration conf = new Configuration();
    conf.set("fs.default.name", "hdfs://localhost:54310");
    conf.set("mapred.job.tracker", "localhost:54311");

    conf.set("mapred.jar", jar_Output_Folder + "/jar_file"+".jar");

    conf.set("libjars", required_Execution_Classes);

    //THIS IS WHERE IT CAN'T FIND THE MENTIONED CLASSES, ALTHOUGH THEY EXIST BOTH ON DISK 
   //AND IN THE CREATED JAR FILE:??????
    System.out.println("Getting Mapper/Reducer package name: " + 
                        Mapper_Reducer_Classes.class.getName());
    conf.set("mapreduce.map.class", "reza.rCloud.Mapper_Reducer_Classes$Mapper_Class");
    conf.set("mapreduce.reduce.class", "reza.rCloud.Mapper_Reducer_Classes$Reducer_Class");

    Job job = new Job(conf, "Hadoop Example for dynamically and programmatically compiling-running a job");
    job.setJarByClass(Platform2.class);

    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(IntWritable.class);

    FileInputFormat.addInputPath(job, new Path(argsTemp[0]));
    FileSystem fs = FileSystem.get(conf);
    Path out = new Path(argsTemp[1]);
    fs.delete(out, true);
    FileOutputFormat.setOutputPath(job, new Path(argsTemp[1]));

    //job.submit();
    System.out.println("*and now submitting the job to Hadoop...");
    System.exit(job.waitForCompletion(true) ? 0 : 1); 
    System.out.println("Job Finished!");        
} catch (Exception e) {         
            System.out.println("****************Exception!" ); 
            e.printStackTrace();
            return false; 
    }
return true;
}

в случае необходимости вот является исходный код для собирания() методом:

private boolean compile(String className) {
    String fileToCompile =  JOB_FOLDER   + "/" +className+".java";
    JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();       
    FileOutputStream errorStream = null;        
    try{
        errorStream = new FileOutputStream(JOB_FOLDER + "/logs/Errors.txt");
    } catch(FileNotFoundException e){ 
        //if problem creating the file, default wil be console 
    }   

    int compilationResult = 
            compiler.run(   null, null, errorStream, 
                            "-classpath", required_Compilation_Classes,
                            "-d", compilation_Output_Folder,
                            fileToCompile);
    if (compilationResult == 0) {
        //Compilation is successful:
        return true;
    } else {
        //Compilation Failed:
        return false;
    }   
}

и исходный код для makeJAR() метод:

private boolean makeJAR(String outputFileName, String inputDirectory) {
    Manifest manifest = new Manifest();
    manifest.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION,
            "1.0");

    JarOutputStream target = null;                      
    try {       
        target = new JarOutputStream(new FileOutputStream(
                jar_Output_Folder+ "/"  
                + outputFileName+".jar"                      ), manifest);
        add(new File(inputDirectory), target);
    } catch (Exception e) { return false; }
    finally {
        if (target != null)
            try{
                target.close();
            } catch (Exception e) { return false; }
    }
    return true;
}

    private void add(File source, JarOutputStream target) throws IOException
{
  BufferedInputStream in = null;
  try
  {
    if (source.isDirectory())
    {
      String name = source.getPath().replace("\\", "/");
      if (!name.isEmpty())
      {
        if (!name.endsWith("/"))
          name += "/";
        JarEntry entry = new JarEntry(name);
        entry.setTime(source.lastModified());
        target.putNextEntry(entry);
        target.closeEntry();
      }
      for (File nestedFile: source.listFiles())
        add(nestedFile, target);
      return;
    }

    JarEntry entry = new JarEntry(source.getPath().replace("\\", "/"));
    entry.setTime(source.lastModified());
    target.putNextEntry(entry);
    in = new BufferedInputStream(new FileInputStream(source));

    byte[] buffer = new byte[1024];
    while (true)
    {
      int count = in.read(buffer);
      if (count == -1)
        break;
      target.write(buffer, 0, count);
    }
    target.closeEntry();
  }
  finally
  {
    if (in != null)
      in.close();
  }
}

и наконец фиксированные параметры, используемые для доступа к файлам:

private String JOB_FOLDER = "/Users/reza/My_Software/rCloud_test/src/reza/rCloud";
private String HADOOP_SOURCE_FOLDER = "/Users/reza/My_Software/hadoop-0.20.2";
private String required_Compilation_Classes = HADOOP_SOURCE_FOLDER + "/hadoop-0.20.2-core.jar";
private String required_Execution_Classes = required_Compilation_Classes + "," +
     "/Users/reza/My_Software/ActorFoundry_dist_ver/lib/commons-cli-1.1.jar," +
     "/Users/reza/My_Software/ActorFoundry_dist_ver/lib/commons-logging-1.1.1.jar";
public String compilation_Output_Folder = "/Users/reza/My_Software/rCloud_test/dyn_classes";
private String jar_Output_Folder = "/Users/reza/My_Software/rCloud_test/dyn_jar";

В результате управления Platform2, структурой проекта на видах диска как указано ниже:

rCloud_test/classes/reza/rCloud/Platform2.class: содержите класс Platform2 rCloud_test/dyn_classes/reza/rCloud/содержит классы для Mapper_Reducer_Classes.class, Mapper_Reducer_Classes$Mapper_Class.class и Mapper_Reducer_Classes$Reducer_Class.class rCloud_test/dyn_jar/jar_file.jar содержит созданный файл банки

REVSED: вот исходный код для rCloud_test/src/reza/rCloud/Mapper_Reducer_Classes.java:

package reza.rCloud;

import java.io.IOException;
import java.lang.InterruptedException;
import java.util.StringTokenizer;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;

public class Mapper_Reducer_Classes {
/**
 * The map class of WordCount.
 */
public static class Mapper_Class
    extends Mapper {

    private final static IntWritable one = new IntWritable(1);
    private Text word = new Text();

    public void map(Object key, Text value, Context context)
        throws IOException, InterruptedException {
        StringTokenizer itr = new StringTokenizer(value.toString());
        while (itr.hasMoreTokens()) {
            word.set(itr.nextToken());
            context.write(word, one);
        }
    }
}
/**
 * The reducer class of WordCount
 */
public static class Reducer_Class
    extends Reducer {
    public void reduce(Text key, Iterable values, Context context)
        throws IOException, InterruptedException {
        int sum = 0;
        for (IntWritable value : values) {
            sum += value.get();
        }
        context.write(key, new IntWritable(sum));
    }
}
}
1
nl ja de
Каков пакет вашего собранного картопостроителя и классов преобразователя данных? You' ve получил его набор как reza.rCloud когда you' ре, формирующее его для hadoop, но это отражает объявления пакета в тех классах (и таким образом структура каталогов в банке)?
добавлено автор Jeffrey Theobald, источник
@Jeffery Теобальд: Я пересмотрел свое первое сообщение и добавил файл Mapper_Reducer_Classes.java также. Как вы видите, я добавил пакет reza.rCloud к тому же файл также. Я также расстегнул молнию на/Users/reza/My_Software/rCloud_test/dyn_jar/jar_file.jar, и это привело к следующим папкам, которые будут созданы: /Users/reza/My_Software/rCloud_test/dyn_jar/Users/reza/My_So‌​ftware/rCloud_test/d‌​yn_Classes/reza/rClo‌​ud/, который содержит Mapper_Reducer_Classes.class, Mapper_Reducer_Classes$Mapper_Class.class и Mapper_Reducer_Classes$Reducer_Class.class.So, я предполагаю структуру БАНКИ fileis также хорошо
добавлено автор reza, источник

1 ответы

Попытайтесь установить их при помощи setClass () метод:

conf.setClass("mapreduce.map.class", 
              Class.forName("reza.rCloud.Mapper_Reducer_Classes$Mapper_Class"),
              Mapper.class);

conf.setClass("mapreduce.reduce.class",
              Class.forName("reza.rCloud.Mapper_Reducer_Classes$Reducer_Class"),
              Reducer.class);
1
добавлено
Вы могли объявить результат банка tf jar_file.jar | grep Mapper_Reducer_Classes ?
добавлено автор Lorand Bendig, источник
makeJAR() создает структуру каталогов это doesn' t соответствуют объявлению пакета reza.rCloud . Mapper_Reducer_Class ‌​ es.class должен находиться под / reza/ rCloud/ в вашем файле банки.
добавлено автор Lorand Bendig, источник
Первый I' d предлагают, чтобы вы создали новый вопрос начиная с этого isn' t Hadoop-связанный больше. Также поиск на ПОЭТОМУ с тех пор там, конечно, задали подобные вопросы.
добавлено автор Lorand Bendig, источник
Я попробовал "System.out.println ("Класс. ForName": + Class.forName ("reza.rCl‌ ​ уд. Mapper_Reducer_C‌ ​ lasses$Mapper_Class" ‌ ​))"; но это все еще can' t находят reza.rCloud. Mapper_Reducer_Classes$Mapper_Class и броски "java.lang. ClassNotFoundException: reza.rCloud. Mapper_Reducer_Classes$Mapper_Class"
добавлено автор reza, источник
here' s результат:/Users/reza/My_Software/rCloud_test/dyn_classes/reza/rCloud/‌ ​ Mapper_Reducer_Class‌ ​ es$Mapper_Class.clas‌ ​ s/Users/reza/My_Software/rCloud_test/dyn_classes/reza/rCloud/‌ ​ Mapper_Reducer_Class‌ ​ es$Reducer_Class.cla‌ ​ ss/Users/reza/My_Software/rCloud_test/dyn_classes/reza/rCloud/‌ ​ Mapper_Reducer_Class‌ ​ es.class
добавлено автор reza, источник
Все необходимые классы доступны в файле БАНКИ, но по некоторым причинам, конфигурация не может получить доступ к ним? Я думаю, что пропускаю что-то здесь. Я должен добавить, что несколько дней назад это внезапно хорошо работало, но когда я удалил все и попытался восстановить его, это начинает бросать ошибку снова. Мое предположение - то, что я скопировал некоторые классы к некоторому пути вручную и который заставил его работать на короткий период времени. но не уверено, что точно я сделал?
добавлено автор reza, источник
спасибо. Я пытался создать файл БАНКИ вручную, и он привел к/reza/rCloud/, как вы сказали. Какая-либо идея о том, как я должен зафиксировать это?
добавлено автор reza, источник
также, я попробовал код вручную созданной БАНКОЙ, и это хорошо работало. таким образом ваше предположение правильно, и проблема со структурой каталогов в файле БАНКИ. теперь вопрос состоит в том, как зафиксировать его?
добавлено автор reza, источник
спасибо Lorand. Я понял его. Проблема была с использованием file' s путь во время добавления JAREntries. Так или иначе я зафиксировал его. благодарит выяснить проблему. Я потратил впустую несколько дней на это.
добавлено автор reza, источник
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async