ข้อผิดพลาดแปลก ๆ ในคลาส mapreduce

ข้อผิดพลาดนี้ดูเหมือนเล็กน้อย แต่จะไม่หายไป ฉันได้กำหนดคลาสต่อไปนี้:

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> {

ในฟังก์ชั่น 'main' ฉันกำลังพยายามใช้ JobConf เพื่อเปิดใช้ mapreduce อย่างง่าย:

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 กำลังส่งข้อผิดพลาดในบรรทัดนี้:

conf.setMapperClass(Anagram_Mapper.class);

ข้อผิดพลาดคือ:

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

แต่อย่างที่คุณเห็นด้านบน คลาส Anagram_Mapper ของฉันขยาย Mapper ใช่ไหม ดังนั้นฉันจึงไม่เข้าใจว่าทำไมถึงเกิดข้อผิดพลาดนี้....

แก้ไข: มีคนโพสต์ที่นี่ จากนั้นถอนโพสต์ของพวกเขา แต่มันช่วยชี้นำฉันไปในทิศทางที่ถูกต้อง เห็นได้ชัดว่าฉันใช้: org.apache.hadoop.mapreduce.Mapper

แต่ JobConf.setMapperClass ยอมรับเฉพาะ: org.apache.hadoop.mapred.Mapper

ตอนนี้ฉันสับสนเล็กน้อยเกี่ยวกับความแตกต่าง ดูเหมือนว่าโดยพื้นฐานแล้วจะเหมือนกัน และ API บอกฉันว่าทั้งคู่ใช้ได้ใน Hadoop 2.2.0 ซึ่งเป็นเวอร์ชันที่ฉันใช้....


person pedron    schedule 19.08.2014    source แหล่งที่มา


คำตอบ (2)


แน่นอนว่าคุณกำลังผสม mapred API เก่ากับ mapreduce API ใหม่

โดยพื้นฐานแล้ว Mapreduce ของ Hadoop รองรับ API ที่เข้ากันไม่ได้สองตัว และคุณต้องตัดสินใจว่าจะใช้อันไหน ฉันอาจทำให้สับสนได้เพราะพวกเขาแชร์คลาสที่มีชื่อเหมือนหรือคล้ายกัน คุณควรดูใบแจ้งยอดการนำเข้าของคุณอย่างรอบคอบ

API ทั้งสองสามารถบรรลุสิ่งเดียวกันได้เกือบหมด mapred ยังไม่เลิกใช้งานหรือถูกลบออกโดยไม่ทำให้แอปพลิเคชันรุ่นเก่าเสียหาย mapreduce เป็น API เดียวกันที่มีการออกแบบที่ดีขึ้นเล็กน้อย

หากคุณกำลังเริ่มโครงการใหม่ ฉันจะแนะนำให้ใช้โครงการใหม่ แต่มันไม่ใช่เรื่องใหญ่ วิธีแก้ไขง่ายๆ คือเปลี่ยนคำสั่งนำเข้า org.apache.hadoop.mapreduce.Mapper ของคุณ

person Clément MATHIEU    schedule 19.08.2014
comment
นั่นก็คือมัน สิ่งที่ฉันไม่ได้สังเกตเห็นก็คือ Mapper เป็นคลาสใน 1.0 แต่เป็นอินเทอร์เฟซใน 2.0 สิ่งที่ทำให้ฉันประหลาดใจคือการเติมข้อความอัตโนมัติใน Eclipse มันไม่ได้เสนอเวอร์ชัน 'mapred' ขึ้นมาเพราะฉันมี 'ขยาย' (ซึ่ง Eclipse กรอกโดยอัตโนมัติ) ตอนนี้ฉันได้แก้ไขทุกอย่างให้ตรงแล้ว และส่วน Mapper ก็ใช้งานได้ ขอบคุณ - person pedron; 20.08.2014
comment
การแก้ไขคำสั่งข้างต้น: org.apache.hadoop.mapred เป็นอินเทอร์เฟซและเวอร์ชัน 1.0 org.apache.hadoop.mapreduce เป็นคลาสและเวอร์ชัน 2.0 - person pedron; 21.08.2014

พบข้อผิดพลาดเดียวกันหลังจากเขียนคลาส Driver ด้านล่างคือข้อผิดพลาด เมธอด setReducerClass(Class) ในประเภท Job ไม่สามารถใช้งานได้กับอาร์กิวเมนต์ (คลาส)

สาเหตุของการได้รับข้อผิดพลาดนี้: หลังจากสร้างคลาสตัวลดขนาดแล้ว ฉันได้ส่งชื่อคลาสใน setReducerClass(); ทันที โดยไม่ต้องกำหนดคลาสตัวลด ฟังก์ชันต้องการชื่อคลาสที่ขยายย่อจริง ๆ โดยจะส่งข้อผิดพลาดเดียวกันจนกว่าอาร์กิวเมนต์ที่ส่งจะเป็นไปตามประเภทอาร์กิวเมนต์ที่คาดหวังของวิธีที่คาดหวัง

person Sandeep bhalla    schedule 30.11.2015