Kesalahan aneh di kelas mapreduce

kesalahan ini tampaknya sepele, tetapi tidak akan hilang. Saya telah mendefinisikan kelas berikut:

import java.io.IOException;
import java.util.Iterator;
import java.util.StringTokenizer;

import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.FileInputFormat;
import org.apache.hadoop.mapred.FileOutputFormat;
import org.apache.hadoop.mapred.JobClient;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.MapReduceBase;
import org.apache.hadoop.mapred.OutputCollector;
import org.apache.hadoop.mapred.Reducer;
import org.apache.hadoop.mapred.Reporter;
import org.apache.hadoop.mapred.TextInputFormat;
import org.apache.hadoop.mapred.TextOutputFormat;
import org.apache.hadoop.mapreduce.Mapper;

public class Anagram_Mapper extends Mapper<LongWritable, Text, Text, Text> {

dalam fungsi 'utama' saya mencoba menggunakan JobConf untuk meluncurkan pengurangan peta sederhana:

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

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

       conf.setMapperClass(Anagram_Mapper.class);
       conf.setCombinerClass(Reduce.class);
       conf.setReducerClass(Reduce.class);

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

       FileInputFormat.setInputPaths(conf, new Path(args[0]));
       FileOutputFormat.setOutputPath(conf, new Path(args[1]));

       try {
        JobClient.runJob(conf);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

Eclipse membuat kesalahan pada baris ini:

conf.setMapperClass(Anagram_Mapper.class);

kesalahannya adalah:

The method setMapperClass(Class<? extends Mapper>) in the type JobConf 
is not applicable for the arguments (Class<Anagram_Mapper>)

tapi, seperti yang Anda lihat di atas, kelas Anagram_Mapper saya memperluas Mapper, bukan? jadi, saya tidak mengerti mengapa kesalahan ini....

EDIT: seseorang memposting di sini, lalu mencabut postingannya, tetapi itu membantu mengarahkan saya ke arah yang benar. rupanya saya menggunakan: org.apache.hadoop.mapreduce.Mapper

tetapi JobConf.setMapperClass hanya menerima: org.apache.hadoop.mapred.Mapper

sekarang saya sedikit bingung tentang perbedaannya, keduanya pada dasarnya sama, dan API memberi tahu saya bahwa keduanya valid di Hadoop 2.2.0, versi yang saya gunakan....


person pedron    schedule 19.08.2014    source sumber


Jawaban (2)


Memang Anda mencampurkan mapred API lama dengan mapreduce API baru.

Pada dasarnya Hadoop mapreduce mendukung dua API yang tidak kompatibel dan Anda harus memutuskan mana yang akan digunakan. Saya bisa membingungkan karena mereka berbagi kelas dengan nama yang sama atau mirip. Anda harus hati-hati melihat pernyataan impor Anda.

Kedua API dapat mencapai hal yang hampir sama. mapred belum ditinggalkan atau dihapus tanpa merusak aplikasi lama. mapreduce adalah API yang sama dengan desain yang sedikit lebih baik.

Jika Anda memulai proyek baru, saya menyarankan untuk menggunakan yang baru. Tapi itu bukan masalah besar. Perbaikan mudahnya adalah dengan mengubah pernyataan org.apache.hadoop.mapreduce.Mapper import Anda.

person Clément MATHIEU    schedule 19.08.2014
comment
Itu saja. Hal yang saya tidak perhatikan adalah bahwa Mapper adalah kelas di 1.0, tetapi antarmuka di 2.0. yang membuat saya terkejut adalah pelengkapan otomatis di Eclipse, ia tidak menawarkan versi 'dipetakan' karena saya memiliki 'perluasan' (yang telah diisi secara otomatis oleh Eclipse). Sekarang semuanya sudah beres, dan bagian Mapper berfungsi, terima kasih - person pedron; 20.08.2014
comment
Koreksi terhadap pernyataan di atas: org.apache.hadoop.mapred adalah antarmuka, dan versi 1.0. org.apache.hadoop.mapreduce adalah kelas dan versi 2.0. - person pedron; 21.08.2014

Menghadapi kesalahan yang sama setelah menulis kelas Driver, di bawah ini adalah kesalahan Metode setReducerClass(Class) dalam tipe Job tidak berlaku untuk argumen (Class)

alasan mendapatkan kesalahan ini : setelah pembuatan kelas peredam saya segera meneruskan nama kelas di setReducerClass(); tanpa mendefinisikan kelas peredam. Fungsi ini mengharapkan nama kelas yang benar-benar memperluas Reducer, itu akan menimbulkan kesalahan yang sama sampai argumen yang diteruskan sesuai dengan metode jenis argumen yang diharapkan.

person Sandeep bhalla    schedule 30.11.2015