0

在我的地图函数中,我试图从分布式缓存中读取一个文件,将其内容加载到哈希映射中。

MapReduce 作业的 sys 输出日志打印 hashmap 的内容。这表明它已找到文件,已加载到数据结构中并执行了所需的操作。它遍历列表并打印其内容。从而证明操作是成功的。

但是,在运行 MR 作业几分钟后,我仍然收到以下错误:

27 年 13 月 1 日 18:44:21 信息 mapred.JobClient:任务 ID:尝试_201301271841_0001_m_000001_2,状态:失败
java.io.FileNotFoundException:文件不存在:/app/hadoop/jobs/nw_single_pred_in/predict
    在 org.apache.hadoop.hdfs.DFSClient$DFSInputStream.openInfo(DFSClient.java:1843)
    在 org.apache.hadoop.hdfs.DFSClient$DFSInputStream.(DFSClient.java:1834)
    在 org.apache.hadoop.hdfs.DFSClient.open(DFSClient.java:578)
    在 org.apache.hadoop.hdfs.DistributedFileSystem.open(DistributedFileSystem.java:154)
    在 org.apache.hadoop.fs.FileSystem.open(FileSystem.java:427)
    在 org.apache.hadoop.mapreduce.lib.input.LineRecordReader.initialize(LineRecordReader.java:67)
    在 org.apache.hadoop.mapred.MapTask$NewTrackingRecordReader.initialize(MapTask.java:522)
    在 org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:763)
    在 org.apache.hadoop.mapred.MapTask.run(MapTask.java:370)
    在 org.apache.hadoop.mapred.Child$4.run(Child.java:255)
    在 java.security.AccessController.doPrivileged(本机方法)
    在 javax.security.auth.Subject.doAs(Subject.java:396)
    在 org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1121)
    在 org.apache.hadoop.mapred.Child.main(Child.java:249)

这是使用要放置在分布式缓存中的文件的位置初始化 Path 的部分

    // 在 main 内部,被 try catch 块包围,但这里没有抛出异常
        配置 conf = new Configuration();
        // 与 conf 相关的其他内容
        路径知识filepath = new Path(args[3]); // args[3] = /app/hadoop/jobs/nw_single_pred_in/predict/knowledge.txt
        DistributedCache.addCacheFile(knowledgefilepath.toUri(), conf);
        job.setJarByClass(NBprediction.class);
        // 其他作业设置
        作业.waitForCompletion(true); // 开始加载

这个在 map 函数里面:

    尝试 {
    System.out.println("里面试试!!");
    路径文件[]= DistributedCache.getLocalCacheFiles(context.getConfiguration());
    路径 cfile = new Path(files[0].toString()); // 只有一个文件
    System.out.println("文件路径:"+cfile.toString());
    CSVReader reader = new CSVReader(new FileReader(cfile.toString()),'\t');
    而 ((nline=reader.readNext())!=null)
    data.put(nline[0],Double.parseDouble(nline[1])); // 加载到哈希图中
    }
    捕获(异常 e)
    {// 处理异常 }

帮助表示赞赏。

干杯!

4

1 回答 1

0

做了一个全新的hadoop安装并用同一个jar运行了这个工作,问题就消失了。似乎是一个错误而不是编程错误。

于 2013-02-10T15:22:32.107 回答