2014-05-12 4 views
2

hdfs/hadoop을 처음 사용하고 hdfs 디렉토리에있는 파일을 압축하는 방법을 알아야합니다. hdfs : // sandbox : 8020/some/path.hdfs에서 java를 사용하여 파일을 압축하는 방법

나는

 Path p = new Path("/my/path/test1.gz"); 
     FSDataOutputStream os = fs.create(p); 

     GZIPOutputStream gzipOs = new GZIPOutputStream(new BufferedOutputStream(os)); 

     Path filePath = file.getPath(); 
     FSDataInputStream is = fs.open(filePath); 

     System.out.println("Writing gzip"); 

     byte[] buffer = new byte[1024]; 
     int len; 
     while((len= is.read(buffer)) != -1){ 
     gzipOs.write(buffer, 0, len); 
     } 
     //close resources 
     is.close(); 
     gzipOs.close(); 

을 시도했지만 작동하지 않습니다.

제안 사항? 미리 감사드립니다.

+0

"작동하지 않는 것"보다 구체적 일 수 있습니까? – climbage

+0

@ S.M.AlMamun hdfs에서 파일을 압축하려고하는 mapreduce를 사용하지 않습니다. – user3403657

+0

@climbage. hdfs에 파일을 보관하려고합니다. "archive.bz2"에 보관하려고하는 test.doc 파일이 있습니다. "archive.bz2"를 만들 수 있지만 7zip에서 열면 "archive"가 포함됩니다. 압축을 풀고 이름을 "test.doc"로 바꾼다. hdfs에 아카이브를 만들려면 어떻게해야합니까? 나는 결국 gzip dirs를 tar 할 필요가있을 것이다. 그러나 단지 일하는 무엇인가 얻으려고 노력하고있다! – user3403657

답변

1

아래 코드는 Tom White의 확실한 안내서입니다.

public class StreamCompressor { 
    public static void main(String[] args) throws Exception { 

    String codecClassname = args[0]; 
    Class<?> codecClass = Class.forName(codecClassname); 
    Configuration conf = new Configuration(); 
    CompressionCodec codec = (CompressionCodec) 
    ReflectionUtils.newInstance(codecClass, conf); 
    CompressionOutputStream out = codec.createOutputStream(System.out); 
    IOUtils.copyBytes(System.in, out, 4096, false); 
    out.finish(); 
} 
} 
+0

코드 스 니펫을 보내 주셔서 감사합니다.하지만이 방법은 저에게 적합하지 않습니다. 아카이브가 생성되었지만 내용의 이름이 적절하지 않습니다. test.doc라는 hdfs에 파일이 있는데 압축하려고합니다. archive.bz2 파일을 만들 수 있지만 파일을 열면 "아카이브"가 포함됩니다. 내가 "test.doc"로 이름을 바꾸면 예상대로. 파일 이름으로 압축 할 파일이 포함 된 아카이브를 만들 수없는 이유는 무엇입니까? – user3403657

관련 문제