2016-12-18 18 views
1

私は、Javaコードを使用してHadoop 2.6でMapReduceプログラムを試しています。私はスタックオーバーフローの他の記事を参照しようとしましたが、私のコードをデバッグできませんでした。MapReduce Hadoopランタイム文字列例外

まず私は、レコードの種類を説明してみましょう: SUBID = 00001111911128052627towerid = 11232w34532543456345623453456984756894756bytes = 122112212212212218.4621702216543667E17 SUBID = 00001111911128052639towerid = 11232w34532543456345623453456984756894756bytes = 122112212212212219.6726312167218586E17 SUBID = 00001111911128052615towerid = 11232w34532543456345623453456984756894756bytes = 122112212212212216.9431647633139046E17 SUBID = 00001111911128052615towerid = 11232w34532543456345623453456984756894756bytes = 122112212212212214.7836041833447418E17

マッパークラス:AircelMapper.class

import java.io.IOException; 
import java.lang.String; 
import java.lang.Long; 
import org.apache.hadoop.mapreduce.*; 
import org.apache.hadoop.io.*; 
public class AircelMapper extends Mapper<LongWritable,Text,Text, LongWritable> 
{ 

    public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException 
    { 

     String acquire=value.toString(); 
     String st=acquire.substring(81, 84); 

     LongWritable bytes=new LongWritable(Long.parseLong(st)); 
     context.write(new Text(acquire.substring(6, 26)), bytes); 
    } 
} 

ドライバクラス:AircelDriver.class

import java.io.IOException; 
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; 
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; 
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat; 
import org.apache.hadoop.mapreduce.Job; 
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat; 
import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.io.LongWritable; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapreduce.Mapper; 
import org.apache.hadoop.mapreduce.Reducer; 

public class AircelDriver 
{ 
    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException 
    { 
     if(args.length<2) 
     { System.out.println(" type ip and op file correctly"); 
      System.exit(-1); 
     } 


     Job job = Job.getInstance(); 

     job.setJobName(" @@@@@@@@@@@@@@@  MY FIRST PROGRAM  @@@@@@@@@@@@@@@"); 


     job.setJarByClass(AircelDriver.class); 
     job.setOutputKeyClass(Text.class); 
     job.setOutputValueClass(LongWritable.class); 
     FileInputFormat.setInputPaths(job, new Path(args[0])); 
     FileOutputFormat.setOutputPath(job, new Path(args[1])); 

     job.setInputFormatClass(TextInputFormat.class); 
     job.setOutputFormatClass(TextOutputFormat.class); 
     job.setMapperClass(AircelMapper.class); 
     job.setReducerClass(AircelReducer.class); 
     job.submit(); 
     job.waitForCompletion(true); 

    } 
} 

問題は、実行時にマッパーコードであるので、私は減速クラスを投稿していないです。次のようにHadoopの実行時の出力は、(基本的にジョブの障害の指標である)である:

16/12/18 04:11:00 INFO mapred.LocalJobRunner: Starting task: attempt_local1618565735_0001_m_000000_0 
16/12/18 04:11:01 INFO output.FileOutputCommitter: File Output Committer Algorithm version is 1 
16/12/18 04:11:01 INFO mapred.Task: Using ResourceCalculatorProcessTree : [ ] 
16/12/18 04:11:01 INFO mapred.MapTask: Processing split: hdfs://quickstart.cloudera:8020/practice/Data_File.txt:0+1198702 
16/12/18 04:11:01 INFO mapred.MapTask: (EQUATOR) 0 kvi 26214396(104857584) 
16/12/18 04:11:01 INFO mapred.MapTask: mapreduce.task.io.sort.mb: 100 
16/12/18 04:11:01 INFO mapred.MapTask: soft limit at 83886080 
16/12/18 04:11:01 INFO mapred.MapTask: bufstart = 0; bufvoid = 104857600 
16/12/18 04:11:01 INFO mapred.MapTask: kvstart = 26214396; length = 6553600 
16/12/18 04:11:01 INFO mapred.MapTask: Map output collector class = org.apache.hadoop.mapred.MapTask$MapOutputBuffer 
16/12/18 04:11:01 INFO mapreduce.Job: Job job_local1618565735_0001 running in uber mode : false 
16/12/18 04:11:01 INFO mapreduce.Job: map 0% reduce 0% 
16/12/18 04:11:02 INFO mapred.MapTask: Starting flush of map output 
16/12/18 04:11:02 INFO mapred.MapTask: Spilling map output 
16/12/18 04:11:02 INFO mapred.MapTask: bufstart = 0; bufend = 290000; bufvoid = 104857600 
16/12/18 04:11:02 INFO mapred.MapTask: kvstart = 26214396(104857584); kvend = 26174400(104697600); length = 39997/6553600 
16/12/18 04:11:03 INFO mapred.MapTask: Finished spill 0 
16/12/18 04:11:03 INFO mapred.LocalJobRunner: map task executor complete. 
16/12/18 04:11:03 WARN mapred.LocalJobRunner: job_local1618565735_0001 
****java.lang.Exception: **java.lang.StringIndexOutOfBoundsException: String index out of range: 84****** 
    at org.apache.hadoop.mapred.LocalJobRunner$Job.runTasks(LocalJobRunner.java:462) 
    at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:522) 
Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range: 84 
    at java.lang.String.substring(String.java:1907) 
    at AircelMapper.map(AircelMapper.java:13) 
    at AircelMapper.map(AircelMapper.java:1) 
    at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:145) 
    at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:787) 
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341) 
    at org.apache.hadoop.mapred.LocalJobRunner$Job$MapTaskRunnable.run(LocalJobRunner.java:243) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) 
    at java.util.concurrent.FutureTask.run(Fut 

それが限界例外のうち、文字列のインデックスを与えているのはなぜ? Stringクラスは内部的に文字列のサイズに制限がありますか? Mapperクラスの13-15行目で何が問題なのか分かりません。

+0

試し '(81、84-1)をacquire.substringであなたの入力をチェックしてください;'インデックスは0から始まり、 'String.lengthです(行きます) -1' –

+0

しかし、レコードの長さを見ると110になるので、プログラムが行全体を文字列として受け取っている場合は、84にアクセスしようとするとエラーが発生しないはずです。なぜ文字列サイズを制限しているのですか? –

+0

エラーが 'String index out of range:84 'という文字列の長さが十分ではないことを意味しているので、コード中に文字列の長さを印刷しようとしました –

答えて

0

IndexOutOfBoundsException - beginIndexが負の場合、またはendIndexがこのStringオブジェクトの長さより大きい場合、またはbeginIndexがendIndexより大きい場合不正なインデックスを示す引数を持つ新しいStringIndexOutOfBoundsExceptionクラスを構築し

公共StringIndexOutOfBoundsExceptionを(int型のインデックス)。 - 指定された詳細メッセージをでStringIndexOutOfBoundsExceptionを構築し 84(あなたのケースでは)

公共StringIndexOutOfBoundsExceptionを(文字列S)。 - (あなたの場合)の範囲外の配列

インデックス84

+0

Sir私はその例外の意味を知っていますが、すでに私がコメントしたように、実行時に私が試したように、マップフェーズはすべての入力レコードの長さを出力してから処理を開始します。 Mapperクラスはすべての入力レコードで動作しますが、私の場合はそうではありません。私はこれが何か、奇妙なバグを意味します。あなたの同僚に私にここでお手伝いをしてもらえますか? –