Исключение Java-программы hadoop mapreduce: java.lang.NoSuchMethodError

Это мой первый опыт работы с Hadoop, и мне нужна помощь, чтобы решить проблему, с которой я застрял (как показано в заголовке).

Я нашел проект, который искал: https://github.com/tzulitai/distributed-svm

Перед запуском задания mapReduce я выполнил эти три команды на терминале, как сказано в информации о сборке:

$ git clone https://github.com/tzulitai/distributed-svm.git
$ cd distributed-svm
$ mvn clean install

был сгенерирован файл jar cascade-svm-mr-0.0.1-SNAPSHOT.jar, и я использовал его в приведенной ниже команде для запуска задания mapReduce:

$ '/usr/local/hadoop/bin/hadoop' jar \
>'/home/hduser/distributed-svm/cascade-svm-mr/target/cascade-svm-mr-0.0.1-SNAPSHOT.jar'\
> ncku.hpds.tzulitai.mapreduce.svm.cascade.CascadeSvm input output

Вот часть исключения:

Job[] prepartitionJobs = new Job[prepartitionJobCount];

    prepartitionJobs[0] = new Job(prepartitionConfs[0], "Cascade SVM: Partitioning training data, Phase 1");
    prepartitionJobs[0].setJarByClass(CascadeSvm.class);
    prepartitionJobs[0].setNumReduceTasks(0);   // map-only job
    prepartitionJobs[0].setMapperClass(PreStatCounterMapper.class);
    prepartitionJobs[0].setOutputKeyClass(NullWritable.class);
    prepartitionJobs[0].setOutputValueClass(Text.class);
    FileInputFormat.addInputPath(prepartitionJobs[0], new Path(otherArgs[0]));
    FileOutputFormat.setOutputPath(prepartitionJobs[0], new Path(otherArgs[1]+"/tmp"));
    prepartitionJobs[0].waitForCompletion(true);

(Весь код CascadeSvm.java можно найти по ссылке выше).

Ошибка была обнаружена в последней строке кода выше:

Exception in thread "main" java.lang.NoSuchMethodError: org.apache.hadoop.ipc.RPC.getProxy(Ljava/lang/Class;JLjava/net/InetSocketAddress;Lorg/apache/hadoop/security/UserGroupInformation;Lorg/apache/hadoop/conf/Configuration;Ljavax/net/SocketFactory;ILorg/apache/hadoop/io/retry/RetryPolicy;Z)Lorg/apache/hadoop/ipc/VersionedProtocol;
at org.apache.hadoop.mapred.JobClient.createRPCProxy(JobClient.java:505)
at org.apache.hadoop.mapred.JobClient.init(JobClient.java:496)
at org.apache.hadoop.mapred.JobClient.<init>(JobClient.java:479)
at org.apache.hadoop.mapreduce.Job$1.run(Job.java:563)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1657)
at org.apache.hadoop.mapreduce.Job.connect(Job.java:561)
at org.apache.hadoop.mapreduce.Job.submit(Job.java:549)
at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:580)
at ncku.hpds.tzulitai.mapreduce.svm.cascade.CascadeSvm.main(CascadeSvm.java:485)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.hadoop.util.RunJar.run(RunJar.java:221)
at org.apache.hadoop.util.RunJar.main(RunJar.java:136)

согласно исключению, я заметил, что метод waitForCompletion не распознан или не существует в классе Job, даже когда я импортировал пакет Job > из mapReduce.

Я подумал, что проект использует старую версию Hadoop 2.4.1, а я в настоящее время использую Hadoop 2.7.2, поэтому я изменил версию Hadoop в pom.xml. файл, но все еще не решает проблему.

Это файл pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>ncku.hpds.tzulitai</groupId>
  <artifactId>distributed-svm</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>pom</packaging>
  <name>distributed-svm</name>
  <description>Distributed SVM approaches implemented with MapReduce</description>
  <modules>
    <module>cascade-svm-mr</module>
    <module>bagging-svm-mr</module>
  </modules>
  <dependencies>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-common</artifactId>
        <version>2.7.2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-mapreduce-client-core</artifactId>
        <version>2.7.2</version>
    </dependency>
    <dependency>
        <groupId>tw.edu.ntu.csie</groupId>
        <artifactId>libsvm</artifactId>
        <version>3.17</version>
    </dependency>
  </dependencies>
  <build>
  <plugins>
    <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>2.3.2</version>
        <configuration>
            <source>1.8</source>
            <target>1.8</target>
        </configuration>
    </plugin>
   </plugins>
  </build>
</project>

Извините, если мой вопрос слишком длинный, но мне действительно нужно решить эту ошибку, любая помощь будет оценена, с уважением.


person Walid Ksiaa    schedule 28.05.2016    source источник
comment
Кажется, вам не хватает пакета org.apache.hadoop.ipc. Я не уверен, существует ли это в клиентском ядре Hadoop common или mapreduce.   -  person OneCricketeer    schedule 28.05.2016
comment
cricket_007, во первых спасибо за помощь. Я пытался добавить пакет org.apache.hadoop.ipc.RPC, но, похоже, это не решило проблему, как и со всеми пакетами в org.apache.hadoop.mapreduce.*.   -  person Walid Ksiaa    schedule 28.05.2016
comment
Итак, вы импортировали класс RPC? Затем ошибка говорит, что метод getProxy не существует в используемой вами версии пакета.   -  person OneCricketeer    schedule 28.05.2016
comment
Вы правы, я проверил jar-файл hadoop-common, и метод getProxy не существует в классе RPC в hadoop-common-2.7.2.jar.   -  person Walid Ksiaa    schedule 30.05.2016