分享

急!急!急!请大神回答,关于DistributedCache中的符号链接不存在问题

puxuanling 发表于 2013-10-16 13:38:49 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 6 8088
运行的时候console出现报错:
java.io.FileNotFoundException: god.txt (No such file or directory)
这是我的代码:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.net.URI;
import java.util.StringTokenizer;
  
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.filecache.DistributedCache;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;
  
public class WordCountWithDistributedCache {
  
    public static void UseDistributedCacheBySymbolicLink() throws Exception {
   
        FileReader reader = new FileReader("god.txt");
        
        BufferedReader br = new BufferedReader(reader);
        String s1 = null;
        while ((s1 = br.readLine()) != null) {
            System.out.println(s1);
        }
        br.close();
        reader.close();
    }
  
    public static class TokenizerMapper extends
            Mapper {
  
        private final static IntWritable one = new IntWritable(1);
        private Text word = new Text();
  
        protected void setup(Context context) throws IOException,
                InterruptedException {
//            DistributedCache.getLocalCacheFiles(context.getConfiguration());
            System.out.println("Now, use the distributed cache and syslink");
            try {
                UseDistributedCacheBySymbolicLink();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
  
        public void map(Object key, Text value, Context context)
                throws IOException, InterruptedException {
            StringTokenizer itr = new StringTokenizer(value.toString());
            while (itr.hasMoreTokens()) {
                word.set(itr.nextToken());
                context.write(word, one);
            }
        }
    }
  
    public static class IntSumReducer extends
            Reducer {
        private IntWritable result = new IntWritable();
  
        public void reduce(Text key, Iterable[I] values,
                Context context) throws IOException, InterruptedException {
            int sum = 0;
            for (IntWritable val : values) {
                sum += val.get();
            }
            result.set(sum);
            context.write(key, result);
        }
    }
  
    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        String[] otherArgs = new GenericOptionsParser(conf, args)
                .getRemainingArgs();
        if (otherArgs.length != 2) {
            System.err.println("Usage: wordcount [i] ");
            System.exit(2);
        }
  
        String path = "hdfs://localhost:9000/123";
        Path filePath = new Path(path);
        String uriWithLink = filePath.toUri().toString() + "#god.txt";
        DistributedCache.addCacheFile(new URI(uriWithLink), conf);
//        DistributedCache.createSymlink(conf);
  
        Job job = new Job(conf, "WordCountWithDistributedCache");
        job.setJarByClass(WordCountWithDistributedCache.class);
        job.setMapperClass(TokenizerMapper.class);
        job.setCombinerClass(IntSumReducer.class);
        job.setReducerClass(IntSumReducer.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
        FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
        FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
        System.exit(job.waitForCompletion(true) ? 0 : 1);
    }
}
              
               
               

已有(6)人评论

跳转到指定楼层
tntzbzc 发表于 2013-10-16 13:39:41

            
        String path = "hdfs://localhost:9000/123/";
        Path filePath = new Path(path);
        String uriWithLink = filePath.toUri().toString() + "god.txt";
        //确保这个文件的目录没问题
        DistributedCache.addCacheFile(new URI(uriWithLink), conf);
        
回复

使用道具 举报

tntzbzc 发表于 2013-10-16 13:40:19

            
        String path = "hdfs://localhost:9000/123/";
        Path filePath = new Path(path);
        String uriWithLink = filePath.toUri().toString() + "/god.txt";
        
回复

使用道具 举报

tntzbzc 发表于 2013-10-16 13:41:18

            引用 楼主 puxuanling 的回复:运行的时候console出现报错:
java.io.FileNotFoundException: god.txt (No such file or directory)
这是我的代码:
Java code?12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505……

LZ,你要确认 String path = "hdfs://localhost:9000/123"; //这个123是已存在的文件
然后才能
String uriWithLink = filePath.toUri().toString() + "#god.txt";
        
回复

使用道具 举报

L15191450395 发表于 2013-10-16 13:42:06

            你好,DistributedCache.getLocalCacheFiles(job),返回值为null,为什么,谢谢。
        
回复

使用道具 举报

s060403072 发表于 2013-10-16 13:42:48

            “java.io.FileNotFoundException: god.txt (No such file or directory)”
对的,从报错看是没有找到god.txt文件,首先就应该想到去检查程序中的文件路径有没有写对。当然了,你也可以不去写全路径,而是用参数在执行的时候传入。
        
回复

使用道具 举报

tntzbzc 发表于 2013-10-16 13:43:40

            DistributedCache的格式如下:DistributedCache.addCacheFile(new
URI("filepath#symlink"),job.getConfiguration());
其中filepath是指向文件的具体路径,必须是文件而不是目录
symlink是文件的别名。在使用文件的时候可以使用别名:File lookupDb = new File("symlink");
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条