Hadoop MapReduce opdrachtinvoerbestand ClassNotFound

Ik bouw een voorbeeldkaart-/-reductietaak op een hadoop-cluster met twee knooppunten - master/slave en slaaf. Hieronder volgen mijn specificaties:

$HADOOP_HOME = /usr/local/hadoop
My M/R classfiles path = $HADOOP_HOME/MyMapRed_classes
My Mapper classfile = $HADOOP_HOME/MyMapRed_classes/MyMapper
My Reducer classfile = $HADOOP_HOME/MyMapRed_classes/MyReducer
My Jar path = $HADOOP_HOME/MyMapred/MyMapRed.jar
My HDFS Input Path = /user/hadoop/MyMapRed/inputfile
My HDFS Output Path = /user/hadoop/MyMapRed_output

Ik voer de M/R-taak als volgt uit

@localhost:/usr/local/hadoop$ bin/hadoop jar $HADOOP_HOME/MyMapRed/MyMapRed.jar -input /user/hadoop/MyMapRed/inputfile -output /user/hadoop/MyMapRed_output/ -mapper $HADOOP_HOME/MyMapRed_classes/MyMapper -reducer $HADOOP_HOME/MyMapRed_classes/MyReducer

Maar het lijkt erop dat het niet in staat is om het invoerbestand te vinden zoals blijkt uit het onderstaande bericht

Exception in thread "main" java.lang.ClassNotFoundException: -input
at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at org.apache.hadoop.util.RunJar.main(RunJar.java:149)

Hieronder ziet u de klasse MyMapRed die ik gebruik. Het heeft als invoer een lijst met paren. Het reducer wordt verondersteld om de gemiddelde Val per groep te geven.

import java.io.IOException;
import java.util.Iterator;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.DoubleWritable;
import org.apache.hadoop.io.Text;

import org.apache.hadoop.mapred.FileInputFormat;
import org.apache.hadoop.mapred.FileOutputFormat;
import org.apache.hadoop.mapred.MapReduceBase;
import org.apache.hadoop.mapred.Mapper;
import org.apache.hadoop.mapred.OutputCollector;
import org.apache.hadoop.mapred.Reducer;
import org.apache.hadoop.mapred.Reporter;
import org.apache.hadoop.mapred.JobClient;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.TextInputFormat;
import org.apache.hadoop.mapred.TextOutputFormat;


public class MyMapRed {

public static class MyMapper extends MapReduceBase 
implements Mapper {

    private final static Text Group = new Text();
    private final static DoubleWritable Val = new DoubleWritable();

    public void map(Text key, Text value, OutputCollector output, Reporter reporter) 
        throws IOException {
        String line = value.toString();
        String[] KeyAndVal = line.split("\t",2);
        Group.set(KeyAndVal[0]);
        Val.set(Double.valueOf(KeyAndVal[1]));
        output.collect(Group, Val);
    }
}

public static class MyReducer extends MapReduceBase 
implements Reducer {
    public void reduce(Text key, Iterator values,
            OutputCollector output, Reporter reporter)
            throws IOException {
        DoubleWritable val = new DoubleWritable();
        double valSum = 0.0;
        int valCnt = 0;
        while (values.hasNext()) {
            val = values.next();
            valSum += val.get();
            valCnt++;
        }
        if (valCnt>0)
            valSum = valSum/valCnt;
        output.collect(key, new DoubleWritable(valSum));
    }
}


public static void main(String[] args) {
    JobClient client = new JobClient();
    JobConf conf = new JobConf(MyMapRed.class);
    conf.setJobName("MyMapRed");

    conf.setOutputKeyClass(Text.class);
    conf.setOutputValueClass(DoubleWritable.class);

    conf.setMapperClass(MyMapper.class);
    conf.setReducerClass(MyReducer.class);

    conf.setInputFormat(TextInputFormat.class);
    conf.setOutputFormat(TextOutputFormat.class);

    FileInputFormat.addInputPath(conf, new Path("input"));
    FileOutputFormat.setOutputPath(conf, new Path("output"));

    client.setConf(conf);

    try {
        JobClient.runJob(conf);
    } catch (Exception e) {
        e.printStackTrace();
    }

}
}

Kan iemand voorstellen wat ik mis als ClassNotFoundException wordt verhoogd?

1
Is uw mapper en reducer geschreven in Java-code? Zo ja, waarom probeert u streaming te gebruiken ?.
toegevoegd de auteur Chris White, de bron
Ja, ik gebruik Java. Momenteel gebruik ik Eclipse 3.5.2 (Galileo) en zie ik geen enkele manier om een ​​MR-taak uit te voeren op Hadoop van Eclipse. Ik heb geprobeerd Maven te integreren om het hadoop-common-project te bouwen (SVN-link: svn.apache.org/repos/asf/hadoop/common/trunk/… ) en daardoor MR-taken uitvoeren vanuit Eclipse, maar de build was mislukt en ik heb deze in de andere geplaatst thread link gisteren stackoverflow.com/questions/11164370/… . Om dit te controleren, gebruik ik streaming om te zien of de M/R echt werkt
toegevoegd de auteur somnathchakrabarti, de bron

1 antwoord

Als uw MapRed.jar-bestand geen hoofdklasse heeft die is gedefinieerd in het jars-manifest, verwacht hadoop dat het argument na de kruik een klasse is die de statische hoofdmethode bevat.

U moet uw hoofdklasse een naam geven (de hoofdklasse die de openbare static void main (String args []) -methode bevat en een job configureert via de JobConf- of Job-klasse).

Als het lijkt alsof u streaming probeert te gebruiken, wat niet nodig is als uw mapper en reducer in Java zijn geschreven

3
toegevoegd
Is er een manier waarop ik de Runtime Environment kan configureren om op Hadoop te worden uitgevoerd? Ik heb gisteren wat onderzoek gedaan en kwam erachter dat de hadoop - $ {version} -eclipse-plugin.jar nodig is onder $ {eclipse.home}/plugins/directory voor het maken van MR-project in eclipse. De $ {eclipse.home} is meestal/usr/lib/eclipse/en dit pad wordt toegevoegd als entry eclipse.home =/usr/lib/eclipse/in $ HADOOP_HOME/src/contrib/eclipse-plugin/build.properties voor Hadoop om eclipshuis te herkennen tijdens het maken/samenstellen van elke MR-taak. Het is dus als een tweerichtingsproces
toegevoegd de auteur somnathchakrabarti, de bron
Ik weet niet zo goed wat het verschil is tussen streaming en normale kaart/verkleinen. Kan ik, naast mijn bovenstaande opmerking, een beetje uitweiden?
toegevoegd de auteur somnathchakrabarti, de bron
Ik heb de details van de Mapper/Reducer-klasse toegevoegd met de JobConf-details.
toegevoegd de auteur somnathchakrabarti, de bron