问题一:表头
WARN mapred.LocalJobRunner: job_local 1060669736_0001
java.lang.Exception: java.lang.ArrayIndexOutOfBoundsException: 1
2024-01-03 21:39:40,671 WARN mapreduce.JobResourceUploader: Hadoop command-line option parsing not performed. Implement the Tool interface and execute your application with ToolRunner to remedy this.
这个警告信息表示在执行Hadoop作业时,没有正确解析命令行选项。为了解决这个问题,需要实现Tool接口并使用ToolRunner来执行应用程序。
2024-01-03 21:39:41,462 WARN mapred.LocalJobRunner: job_local 1060669736_0001
java.lang.Exception: java.lang.ArrayIndexOutOfBoundsException: 1
这个异常表示在执行Hadoop作业时,数组索引越界。
数据集中包含表头:
解决办法:将表的第一列删除,重新上传数据,执行成功。
问题二:数据集问题
WARN mapred.LocalJobRunner: job_local1053007145_0001
java.lang.Exception: java.lang.ArrayIndexOutOfBoundsException: 1
at org.apache.hadoop.mapred.LocalJobRunner$Job.runTasks(LocalJobRunner.java:492)
at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:552)
Caused by: java.lang.ArrayIndexOutOfBoundsException: 1
at MapReduce.Map_vegetable.map(Map_vegetable.java:24)
at MapReduce.Map_vegetable.map(Map_vegetable.java:9)
at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:146)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:799)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:347)
at org.apache.hadoop.mapred.LocalJobRunner$Job$MapTaskRunnable.run(LocalJobRunner.java:271)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
数据集中有空格或与Mapper函数处理识别数组分隔符时导致的溢出错误,例如下图数据第三行多了一个“,”导致数据处理到第三行时出现报错。原因是在执行MapReduce作业时,数组索引越界。
通过打印i我们可以发现数据集具体问题所在位置:
执行第三行时报错:
仔细检查数据集第三行数据多了一个“,”导致数组索引越界: