2015-01-19 3 views
0

У меня есть файл .txt в моем локальном файле, и я хочу сжать этот файл в .gz и загрузить его в местоположение в HDFS.Текстовый файл не получается сжатым в HDFS

Ниже приведен код, я попробовал:

String codecClassName = args[1]; 
    String source = args[2]; 
    String dest = args[3]; 

    InputStream in = new BufferedInputStream(new FileInputStream(source)); 
    Class<?> codecClass = Class.forName(codecClassName); 

    Configuration conf = new Configuration(); 
    CompressionCodec codec = (CompressionCodec)ReflectionUtils.newInstance(codecClass, conf); 

    FileSystem fs = FileSystem.get(URI.create(dest),conf); 
    OutputStream out = fs.create(new Path(dest),new Progressable() { 

     @Override 
     public void progress() { 
      System.out.println("."); 
     } 
    }); 

    CompressionOutputStream outStream = codec.createOutputStream(out); 

    IOUtils.copyBytes(in, outStream, 4096,false); 

Ниже приведены значения аргумента, переданного в этом коде:

arg1 (Название Compresser): org.apache.hadoop.io.compress.GzipCodec

арг2 (A местонахождение на моем местном диске): /home/user/Demo.txt

arg3 (Место в HDFS): hdfs://localhost:8020/user/input/Demo.gz

Когда я запускаю этот код, файл Demo.gz создается в вышеупомянутом местоположении HDFS, но размер файла .gz равен 0 МБ.

Пожалуйста, дайте мне знать, почему файл не будет сжат и загружен в HDFS правильно.

ответ

2

Вы, похоже, не закрыли потоки. У вас есть два варианта:

  1. закрыть их автоматически, передавая верно в качестве параметра далее к copyBytes
  2. закройте их вручную, например, outStream.close()