[java] 자바와 아파치 하둡의 데이터 압축 방법

빅 데이터 처리 시스템인 아파치 하둡은 많은 양의 데이터를 처리하기 위해 데이터를 압축하여 저장하고 전송하는 기능을 제공합니다. 이러한 압축은 데이터 저장 공간을 절약하고 데이터 전송 속도를 향상시킬 수 있습니다. 자바와 아파치 하둡을 함께 사용할 때 데이터를 압축하는 방법에 대해 알아보겠습니다.

Gzip 압축

Gzip은 자바와 아파치 하둡에서 기본적으로 사용할 수 있는 압축 방식 중 하나입니다. Gzip은 파일 또는 스트림을 압축하고 해제하는 데 사용됩니다. 아파치 하둡에서는 Gzip 압축을 사용하여 파일을 저장할 수 있습니다.

아래는 자바에서 Gzip 압축을 사용하는 예시 코드입니다.

import java.io.*;
import java.util.zip.GZIPOutputStream;

public class GzipExample {
    public static void compressFile(String inputFile, String outputFile) throws IOException {
        FileInputStream fis = new FileInputStream(inputFile);
        FileOutputStream fos = new FileOutputStream(outputFile);
        GZIPOutputStream gzipos = new GZIPOutputStream(fos);

        byte[] buffer = new byte[1024];
        int len;
        while ((len = fis.read(buffer)) != -1) {
            gzipos.write(buffer, 0, len);
        }

        gzipos.close();
        fos.close();
        fis.close();
    }

    public static void main(String[] args) throws IOException {
        String inputFile = "input.txt";
        String outputFile = "compressed.gz";
        compressFile(inputFile, outputFile);
    }
}

위의 예시 코드는 compressFile 메소드를 통해 inputFile의 내용을 읽어와 outputFile에 Gzip 압축 형식으로 저장합니다.

LZO 압축

LZO는 아파치 하둡에서 사용되는 다른 압축 방식입니다. LZO는 데이터 압축 속도가 빠르고 압축된 데이터의 크기가 작다는 특징이 있습니다. 아파치 하둡의 LZO 압축을 사용하려면 별도의 라이브러리 설치가 필요합니다.

아래는 자바에서 LZO 압축을 사용하는 예시 코드입니다.

import com.hadoop.compression.lzo.LzoCodec;
import org.apache.hadoop.io.compress.CompressionOutputStream;
import org.apache.hadoop.io.compress.Compressor;
import org.apache.hadoop.io.compress.CompressorStream;
import org.apache.hadoop.util.ReflectionUtils;

import java.io.*;

public class LzoExample {
    public static void compressFile(String inputFile, String outputFile) throws IOException {
        InputStream is = new FileInputStream(inputFile);
        OutputStream os = new FileOutputStream(outputFile);
        
        // LzoCodec 설정
        Class<?> codecClass = LzoCodec.class;
        Compressor codec = (Compressor) ReflectionUtils.newInstance(codecClass, new Configuration());
        
        // 압축 스트림 생성
        CompressionOutputStream cos = codec.createOutputStream(os);
        CompressorStream cs = new CompressorStream(cos, codec);

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

        cs.flush();
        cs.close();
        os.close();
        is.close();
    }

    public static void main(String[] args) throws IOException {
        String inputFile = "input.txt";
        String outputFile = "compressed.lzo";
        compressFile(inputFile, outputFile);
    }
}

위의 예시 코드는 아파치 하둡의 LzoCodec 클래스를 사용하여 compressFile 메소드를 통해 inputFile의 내용을 읽어와 outputFile에 LZO 압축 형식으로 저장합니다.

결론

자바와 아파치 하둡을 함께 사용하면 데이터를 압축하여 저장하고 전송할 수 있습니다. Gzip과 LZO는 자주 사용되는 압축 방식 중 일부입니다. 원하는 압축 방식에 따라 적절한 압축 기법을 선택하여 데이터 처리 속도와 저장 공간을 최적화할 수 있습니다.

참고 자료