Hadoop on Mac with IntelliJ IDEA: 1 解决输入路径不存在问题

本文讲述使用IntelliJ IDEA时遇到Hadoop提示input path does not exist(输入路径不存在)的一种解决办法。

环境:Mac OS X 10.9.5, IntelliJ IDEA 13.1.4, Hadoop 1.2.1

Hadoop放在虚拟机中,宿主机通过SSH连接,IDE和数据文件在宿主机。

这是自学Hadoop的第三天。以前做过点.NET开发,Mac、IntelliJ IDEA、Hadoop、CentOS对我而言,相当陌生。第一份Hadoop代码就遇到了问题。

以下代码摘自《Hadoop In Action》第4章第1份代码。

 1 public class MyJob extends Configured implements Tool {
 2     public static class MapClass extends MapReduceBase
 3             implements Mapper<Text, Text, Text, Text> {
 4         @Override
 5         public void map(Text key, Text value, OutputCollector<Text, Text> output, Reporter reporter)
 6                 throws IOException {
 7             output.collect(value, key);
 8         }
 9     }
10
11
12     public static class Reduce extends MapReduceBase
13             implements Reducer<Text, Text, Text, Text> {
14         @Override
15         public void reduce(Text key, Iterator<Text> values, OutputCollector<Text, Text> output, Reporter reporter) throws IOException {
16             String csv = "";
17             while (values.hasNext()) {
18                 if (csv.length() > 0) {
19                     csv += ", ";
20                 }
21                 csv += values.next().toString();
22             }
23             output.collect(key, new Text(csv));
24         }
25     }
26
27     @Override
28     public int run(String[] args) throws Exception {
29         Configuration configuration = getConf();
30
31         JobConf job = new JobConf(configuration, MyJob.class);
32
33         Path in = new Path(args[0]);
34         Path out = new Path(args[1]);
35
36         FileInputFormat.setInputPaths(job, in);
37         FileOutputFormat.setOutputPath(job, out);
38
39         job.setJobName("MyJob");
40         job.setMapperClass(MapClass.class);
41         job.setReducerClass(Reduce.class);
42
43         job.setInputFormat(KeyValueTextInputFormat.class);
44         job.setOutputFormat(TextOutputFormat.class);
45         job.setOutputKeyClass(Text.class);
46         job.setOutputValueClass(Text.class);
47         job.set("key.value.separator.in.input.line", ",");
48
49         JobClient.runJob(job);
50
51         return 0;
52     }
53
54     public static void main(String[] args) {
55         try {
56             int res = ToolRunner.run(new Configuration(), new MyJob(), args);
57             System.exit(res);
58         } catch (Exception e) {
59             e.printStackTrace();
60         }
61     }
62 }

主函数做了异常处理,其余地方和原书一致。

由于不会打jar包,我选择了直接在IDEA中执行代码,数据文件目录和书上不同,故命令行参数和原书略有差别,如下:

/Users/michael/Desktop/Hadoop/HadoopInAction/cite75_99.txt output

IDEA的配置如图

数据文件路径如图

以上配置无拼写错误。然后,我很高兴地按下‘Run MyJob.main()‘ ,准备等结果,继续跟着书走。

悲剧了,IDEA输出input path does not exist。输入路径是/Users/michael/IdeaProjects/Hadoop/Users/michael/Desktop/Hadoop/HadoopInAction/cite75_99.txt,这不是Working directory拼上我给的第一个参数么,怎么回事。

整份代码,就run方法中用了Path,应该是这边的问题。

在FileOutputFormat.setOutputPath(job, out);后面加上System.out.println(FileInputFormat.getInputPaths(job)[0].toUri());发现输入路径真的被合并到工作路径下了。怪不得报错呢(StackOverflow中有人说是我的数据文件没提前到Hadoop才会报这个错误。其实,我只会提交命令,提交后怎么让程序读取,我还不会,悲剧)。

现在,可以判断问题是FileInputFormat.setInputPaths(job, in);导致的。进源码看看它是怎么工作的。

  /**
   * Set the array of {@link Path}s as the list of inputs
   * for the map-reduce job.
   *
   * @param conf Configuration of the job.
   * @param inputPaths the {@link Path}s of the input directories/files
   * for the map-reduce job.
   */
  public static void setInputPaths(JobConf conf, Path... inputPaths) {
    Path path = new Path(conf.getWorkingDirectory(), inputPaths[0]);
    StringBuffer str = new StringBuffer(StringUtils.escapeString(path.toString()));
    for(int i = 1; i < inputPaths.length;i++) {
      str.append(StringUtils.COMMA_STR);
      path = new Path(conf.getWorkingDirectory(), inputPaths[i]);
      str.append(StringUtils.escapeString(path.toString()));
    }
    conf.set("mapred.input.dir", str.toString());
  }

可以看到,源码第一句就是合并conf和inputPaths。 既然合并了工作路径,那就把它去掉好了。

在FileInputFormat.setInputPaths(job, in);前保存合并前结果

  Path workingDirectoryBak = job.getWorkingDirectory();

再设置为根目录

  job.setWorkingDirectory(new Path("/"));

然后在它后面设置回来

  job.setWorkingDirectory(workingDirectoryBak);

加上输出,确认操作结果

  System.out.println(FileInputFormat.getInputPaths(job)[0].toUri());

新代码如下,mac下的输入法不好用,直接中式英语写注释

 1 public int run(String[] args) throws Exception {
 2         Configuration configuration = getConf();
 3
 4         JobConf job = new JobConf(configuration, MyJob.class);
 5
 6         Path in = new Path(args[0]);
 7         Path out = new Path(args[1]);
 8
 9         // backup current directory, namely /Users/michael/IdeaProjects/Hadoop where source located
10         Path workingDirectoryBak = job.getWorkingDirectory();
11         // set to root dir
12         job.setWorkingDirectory(new Path("/"));
13         // let it combine root and input path
14         FileInputFormat.setInputPaths(job, in);
15         // set it back
16         job.setWorkingDirectory(workingDirectoryBak);
17         // print to confirm
18         System.out.println(FileInputFormat.getInputPaths(job)[0].toUri());
19
20         FileOutputFormat.setOutputPath(job, out);
21
22         job.setJobName("MyJob");
23         job.setMapperClass(MapClass.class);
24         job.setReducerClass(Reduce.class);
25
26         job.setInputFormat(KeyValueTextInputFormat.class);
27         job.setOutputFormat(TextOutputFormat.class);
28         job.setOutputKeyClass(Text.class);
29         job.setOutputValueClass(Text.class);
30         job.set("key.value.separator.in.input.line", ",");
31
32         JobClient.runJob(job);
33
34         return 0;
35     }

再试一次,正常,将近1分钟执行完,配置差就是这样。

时间: 2024-10-04 07:56:15

Hadoop on Mac with IntelliJ IDEA: 1 解决输入路径不存在问题的相关文章

Hadoop on Mac with IntelliJ IDEA - 7 解决failed to report status for 600 seconds. Killing!问题

本文讲述作业在Hadoop 1.2.1完成map后ruduce阶段遇到failed to report status for 600 seconds. Killing!问题的解决过程. 环境:Mac OS X 10.9.5, IntelliJ IDEA 13.1.4, Hadoop 1.2.1 Hadoop放在虚拟机中,宿主机通过SSH连接,IDE和数据文件在宿主机.IDEA自身运行于JDK 1.8,IDEA工程及Hadoop使用JDK 1.6. 提交作业到hadoop后,作业执行时间过长,输出

Hadoop on Mac with IntelliJ IDEA - 5 解决java heap space问题

本文讲述在CentOS 6.5中提交作业到hadoop 1.2.1于reduce阶段遇到Error: java heap space错误导致作业重新计算的解决过程.解决办法适用Linux.Mac OS X 和Windows操作系统. 环境:Mac OS X 10.9.5, IntelliJ IDEA 13.1.4, Hadoop 1.2.1 Hadoop放在虚拟机中,宿主机通过SSH连接,IDE和数据文件在宿主机.IDEA自身运行于JDK 1.8,IDEA工程及Hadoop使用JDK 1.6.

Hadoop on Mac with IntelliJ IDEA - 2 解决URI错误导致Permission denied

本文讲述在IntelliJ IDEA中使用FileSystem.copyFromLocalFile操作Hadoop时因URI格式有误导致Permission denied的解决过程. 环境:Mac OS X 10.9.5, IntelliJ IDEA 13.1.4, Hadoop 1.2.1 Hadoop放在虚拟机中,宿主机通过SSH连接,IDE和数据文件在宿主机. 操作代码如下 1 public class CopyFromLocalTestDriver { 2 public static v

Hadoop on Mac with IntelliJ IDEA - 6 解决KeyValueTextInputFormat读取时只有key值问题

本文讲述使用KeyValueTextInputFormat在Hadoop 0.x正常工作.Hadoop 1.2.1失效的解决过程. 环境:Mac OS X 10.9.5, IntelliJ IDEA 13.1.4, Hadoop 1.2.1 Hadoop放在虚拟机中,宿主机通过SSH连接,IDE和数据文件在宿主机.IDEA自身运行于JDK 1.8,IDEA工程及Hadoop使用JDK 1.6. 还在折腾Hadoop In Action第4章的代码,书的写法,如下所示. job.setInputF

Hadoop on Mac with IntelliJ IDEA - 9 解决Type mismatch in value from map问题

修改陆喜恒. Hadoop实战(第2版)5.3排序的代码时遇到IO异常. 环境:Mac OS X 10.9.5, IntelliJ IDEA 13.1.5, Hadoop 1.2.1 异常具体信息如下 1 14/10/06 03:08:51 INFO mapred.JobClient: Task Id : attempt_201410021756_0043_m_000000_0, Status : FAILED 2 java.io.IOException: Type mismatch in va

Hadoop on Mac with IntelliJ IDEA - 4 制作jar包

本文讲述使用IntelliJ IDEA打包Project的过程,即,打jar包. 环境:Mac OS X 10.9.5, IntelliJ IDEA 13.1.4, Hadoop 1.2.1 Hadoop放在虚拟机中,宿主机通过SSH连接,IDE和数据文件在宿主机.IDEA自身运行于JDK 1.8,IDEA工程及Hadoop使用JDK 1.6. 在本系列博文的第一篇,我因不会使用IDEA打jar包,不得不直接调试代码,遇到输入路径不存在问题.今天,我打了几次jar包,结果不都满意,默认情况,ID

Hadoop on Mac with IntelliJ IDEA - 8 单表关联NullPointerException

简化陆喜恒. Hadoop实战(第2版)5.4单表关联的代码时遇到空指向异常,经分析是逻辑问题,在此做个记录. 环境:Mac OS X 10.9.5, IntelliJ IDEA 13.1.5, Hadoop 1.2.1 改好的代码如下,在reduce阶段遇到了NullPointerException. 1 public class STjoinEx { 2 private static final String TIMES = "TIMES"; 3 4 public static v

Hadoop on Mac with IntelliJ IDEA - 11 Hadoop版本衍化

最近阅读的材料总是提到Hadoop 0.20.0.23等版本号,导致个人对Hadoop版本感到相当讶异:1.2.1竟然比0.23还落后,你特么在逗我.好奇之下,搜索一把,找到了一个文档,以下内容均来自该文档,在此作个备份. 摘自迪伦. Hadoop大数据解决方案进阶应用 - Hadoop 2.0(1). 1.第一代Hadoop:Hadoop 1.0 包含三个大版本,分别是0.20.x.0.21.x.0.22.x和CDH3 0.20.x最后演化成1.0.x,变成了稳定版 0.21.x和0.22.x

Hadoop on Mac with IntelliJ IDEA - 10 陆喜恒. Hadoop实战(第2版)6.4.1(Shuffle和排序)Map端 内容整理

下午对着源码看陆喜恒. Hadoop实战(第2版)6.4.1  (Shuffle和排序)Map端,发现与Hadoop 1.2.1的源码有些出入.下面作个简单的记录,方便起见,引用自书本的语句都用斜体表示. 依书本,从MapTask.java开始.这个类有多个内部类: 从书的描述可知,collect()并不在MapTask类,而在MapOutputBuffer类,其函数功能是 1.定义输出内存缓冲区为环形结构2.定义输出内存缓冲区内容到磁盘的操作 在collect函数中将缓冲区的内容写出时会调用s