Bata Omou Ответов: 2

Проблема либеральной компиляции hadoop java


я пытаюсь выполнить и скомпилировать этот код java mapreduce на моем eclipse в local, но эта проблема обнаруживается, пожалуйста, помогите, где проблема?


и вот эта ошибка обнаружилась:
WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
    at LogFile.TraitServeur.main(TraitServeur.java:63)"



ошибка строки 63 относится к выходному формату:
FileOutputFormat.setOutputPath(conf, new Path(args[1]))


Что я уже пробовал:

это мой исходный код

import java.io.IOException ; 
import java.util.* ;
import org.apache.hadoop.fs.Path ;
//import org.apache.hadoop.conf.* ;/*Package de apache hadoop utilisé dans le développement*/
import org.apache.hadoop.io.* ;
import org.apache.hadoop.mapred.* ;
//import org.apache.hadoop.util.* ;
public class TraitServeur {
    //phase Map
public static class TokenizerMapper extends MapReduceBase implements Mapper<LongWritable,
Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1) ;
private Text map = new Text();
public void map(LongWritable key, Text value, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException { 
String line = value.toString() ;
String[] rows = line.split("\\s+") ; 
StringTokenizer tokenizer = new StringTokenizer(rows[3]);
tokenizer = new StringTokenizer(rows[3]) ;
int count = 0 ;
String date = rows[0] ;
String day = rows[1] ; 
String gravite = rows[3] ;
while (tokenizer.hasMoreTokens()) {
map.set(tokenizer.nextToken()) ;
map.set(date + day + "\t" + gravite) ;
output.collect(map, one) ;
count= count+1;
}
}
}
//phase reduce
public static class Reduce extends MapReduceBase implements Reducer<Text,
IntWritable, Text, IntWritable> { 
public void reduce(Text key, Iterator<IntWritable> values, OutputCollector<Text,
IntWritable> output, Reporter reporter) throws IOException {
int sum = 0 ;
while (values.hasNext()) {
sum += values.next().get() ;  }
output.collect(key, new IntWritable(sum)) ;
}
}
}
public static void main(String[] args) throws Exception {
JobConf conf = new JobConf(TraitServeur.class) ; 
conf.setJobName("dpgs") ; 
conf.setOutputKeyClass(Text.class) ; 
conf.setOutputValueClass(IntWritable.class) ;
conf.setMapperClass(TokenizerMapper.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])) ;
JobClient.runJob(conf) ;
}

Jochen Arndt

Прочтите сообщение об ошибке. Он содержит имя файла и номер строки (63). Найдите эту строку в своем коде. В этой строке используется индекс, который находится за пределами допустимого диапазона.

2 Ответов

Рейтинг:
2

Bata Omou

да спасибо действительно это была проблема что я не сделал outputPath но он показал мне еще одну ошибку alawys о родной librery haddoop и еще одну:

<pre>2018-05-28 16:27:24,687 WARN  [main] util.NativeCodeLoader (NativeCodeLoader.java:<clinit>(62)) - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
2018-05-28 16:27:29,189 INFO  [main] Configuration.deprecation (Configuration.java:warnOnceIfDeprecated(1274)) - session.id is deprecated. Instead, use dfs.metrics.session-id
2018-05-28 16:27:29,193 INFO  [main] jvm.JvmMetrics (JvmMetrics.java:init(76)) - Initializing JVM Metrics with processName=JobTracker, sessionId=
2018-05-28 16:27:29,251 INFO  [main] jvm.JvmMetrics (JvmMetrics.java:init(71)) - Cannot initialize JVM Metrics with processName=JobTracker, sessionId= - already initialized
Exception in thread "main" java.lang.NoClassDefFoundError: org/codehaus/jackson/map/JsonMappingException
	at org.apache.hadoop.mapreduce.Job.getJobSubmitter(Job.java:1291)
	at org.apache.hadoop.mapreduce.Job.submit(Job.java:1302)
	at org.apache.hadoop.mapred.JobClient$1.run(JobClient.java:578)
	at org.apache.hadoop.mapred.JobClient$1.run(JobClient.java:573)
	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:1920)
	at org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:573)
	at org.apache.hadoop.mapred.JobClient.submitJob(JobClient.java:564)
	at org.apache.hadoop.mapred.JobClient.runJob(JobClient.java:873)
	at LogFile.TraitServeur.main(TraitServeur.java:70)
Caused by: java.lang.ClassNotFoundException: org.codehaus.jackson.map.JsonMappingException
	at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:338)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	... 11 more




а строка 70 моего кода такова :

JobClient.runJob(conf) ;


в чем сейчас проблема


Рейтинг:
12

Jochen Arndt

Цитата:
ошибка строки 63 относится к выходному формату:
FileOutputFormat.setOutputPath(conf, new Path(args[1]));
и сообщение об ошибке таково
java.lang.ArrayIndexOutOfBoundsException
Таким образом, при выполнении приложения нет второго аргумента командной строки.


Вы должны выполнить приложение, как
NameOfApp InputPath OutputPath
или лучше добавить код, чтобы проверить, присутствуют ли все необходимые параметры командной строки:
public static void main(String[] args) throws Exception {
    if (args.length < 2) {
        System.err.println("Must pass InputPath and OutputPath.");
        System.exit(1);
    }
    // ...
}