2017-07-06 7 views
0

Hadoopでカウンタを使用して、さまざまな種類のLIC顧客を数えました。以下は私のコードです -Hadoopカウンタの実装中にメインスレッドでIllegalStateExceptionが発生する

地図

import java.io.IOException; 
import org.apache.hadoop.io.LongWritable; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.io.IntWritable; 
import org.apache.hadoop.mapreduce.Mapper; 

public class Map 
      extends Mapper<LongWritable,Text,Text,IntWritable> 
{ 

@Override 
protected void map(LongWritable key,Text value,Context context) 
         throws IOException,InterruptedException 
{ 
    String line = value.toString().trim(); 
    String[] part = line.split(" "); 

    if(part.length > 1) 
    { 
     String str = part[0].toLowerCase(); 

     if(str.equals("LIC1")) 
      context.getCounter("LIC1","lic1").increment(1); 
     else if(str.equals("LIC2")) 
      context.getCounter("LIC2", "lic2").increment(1); 
     else 
      context.getCounter("Others", "others").increment(1); 

     context.write(new Text(str),new IntWritable(1)); 
    } 
} 
} 

ドライバクラス

import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.io.IntWritable; 
import org.apache.hadoop.mapreduce.Job; 
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; 
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; 


public class MapReduceDriver 
{ 
public static void main(String[] args) throws Exception 
{ 
    Job job = new Job(); 

    job.setJarByClass(MapReduceDriver.class); 
    job.setJobName("Counter Example"); 

    FileInputFormat.addInputPath(job,new Path(args[0])); 
    FileOutputFormat.setOutputPath(job,new Path(args[1])); 

    job.setMapperClass(Map.class); 
    job.setNumReduceTasks(0); 

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

    long lic1 = job.getCounters().findCounter("LIC1", "lic1").getValue(); 
    long lic2 = job.getCounters().findCounter("LIC2", "lic2").getValue(); 
    long others = job.getCounters().findCounter("Others", 
     "others").getValue(); 

    System.out.println("LIC1= "+lic1); 
    System.out.println("LIC2= "+lic2); 
    System.out.println("Others= "+others); 

    System.exit(job.waitForCompletion(true)?0:1); 

} 

} 

は、次の例外は、ドライバクラス

Exception in thread "main" java.lang.IllegalStateException: Job in state 
DEFINE instead of RUNNING 
at org.apache.hadoop.mapreduce.Job.ensureState(Job.java:64) 
at org.apache.hadoop.mapreduce.Job.getCounters(Job.java:425) 
at MapReduceDriver.main(MapReduceDriver.java:27) 
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.main(RunJar.java:156 

のために投げているあなたは何を見つける私を助けてください私たちのコードに間違っていますか?

答えて

0

job.getCounters()メソッドは、実行中のジョブに対してのみ機能します。 MapReduceDriverクラスで実行するジョブを送信するコードはありません。 job.submit()を追加してジョブを投入し、クラスタに実行してすぐに戻る。

+0

Job.submit()をSystem.exit(job.waitForCompletion(true)?0:1)の前に追加すると、同じエラーが発生します。 –

関連する問題