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

빅데이터 환경에서 데이터 압축은 중요한 요소입니다. 데이터 압축은 디스크 공간을 절약하고, 데이터 전송 속도를 향상시키며, 저장 및 처리 비용을 줄일 수 있습니다. 자바와 아파치 하둡을 사용하여 데이터 압축을 구현하는 방법에 대해 알아보겠습니다.

1. 자바에서 데이터 압축하기

자바에서는 java.util.zip 패키지를 사용하여 데이터를 압축할 수 있습니다. 다음은 자바로 데이터를 압축하는 예제 코드입니다.

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

public class CompressionExample {

    public static void main(String[] args) {
        String sourceFile = "/path/to/source/file.txt";
        String compressedFile = "/path/to/compressed/file.gz";

        try {
            FileInputStream fis = new FileInputStream(sourceFile);
            FileOutputStream fos = new FileOutputStream(compressedFile);
            GZIPOutputStream gzipOS = new GZIPOutputStream(fos);

            byte[] buffer = new byte[1024];
            int bytesRead;
            
            while ((bytesRead = fis.read(buffer)) != -1) {
                gzipOS.write(buffer, 0, bytesRead);
            }
            
            gzipOS.close();
            fos.close();
            fis.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

위의 코드에서는 java.util.zip.GZIPOutputStream 클래스를 사용하여 파일을 압축하고 있습니다. sourceFile은 압축할 원본 파일의 경로를, compressedFile은 압축된 파일의 경로를 나타내도록 설정하십시오.

2. 아파치 하둡에서 데이터 압축하기

아파치 하둡은 대용량 데이터를 저장하고 처리하는 데 사용되는 오픈 소스 프레임워크입니다. 하둡에서는 여러 데이터 압축 알고리즘을 지원합니다.

아파치 하둡에서 데이터 압축을 구현하려면 압축 코덱을 사용해야 합니다. 압축 코덱은 org.apache.hadoop.io.compress 패키지에 있습니다. sequencefile 포맷의 데이터 압축을 위해 org.apache.hadoop.io.compress.SequenceFile을 사용할 수 있습니다. 다른 압축 포맷에 따라 압축 코덱을 선택할 수 있습니다.

다음은 아파치 하둡에서 데이터 압축을 설정하는 예제 코드입니다.

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.SequenceFile;
import org.apache.hadoop.io.compress.BZip2Codec;
import org.apache.hadoop.io.compress.CompressionCodec;
import org.apache.hadoop.io.compress.CompressionCodecFactory;
import org.apache.hadoop.io.compress.GzipCodec;

public class HadoopCompressionExample {

    public static void main(String[] args) {
        String inputFile = "/path/to/input/file";
        String outputFile = "/path/to/output/file";
        String codecName = "gzip"; // 압축 코덱 선택

        try {
            Configuration conf = new Configuration();
            FileSystem fs = FileSystem.get(conf);
            CompressionCodec codec = getCompressionCodec(codecName);

            // 입력 파일 설정
            SequenceFile.Reader reader = new SequenceFile.Reader(fs, new Path(inputFile), conf);

            // 출력 파일 설정
            SequenceFile.Writer writer = SequenceFile.createWriter(fs, conf, new Path(outputFile),
                    reader.getKeyClass(), reader.getValueClass(),
                    SequenceFile.CompressionType.BLOCK, codec);

            // 데이터 압축 작업
            Object key = reader.getKeyClass().newInstance();
            Object value = reader.getValueClass().newInstance();

            while (reader.next(key, value)) {
                writer.append(key, value);
            }

            reader.close();
            writer.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static CompressionCodec getCompressionCodec(String codecName) {
        Configuration conf = new Configuration();
        CompressionCodecFactory codecFactory = new CompressionCodecFactory(conf);
        
        if (codecName.equals("gzip")) {
            return new GzipCodec();
        } else if (codecName.equals("bzip2")) {
            return new BZip2Codec();
        } else {
            return codecFactory.getCodecByName(codecName);
        }
    }
}

위의 코드에서는 SequenceFile을 사용하여 하둡에서 데이터를 읽고 쓰고 있습니다. getCompressionCodec() 메서드를 사용하여 압축 코덱을 선택할 수 있습니다.

압축 코덱을 선택한 후에는 SequenceFile.Writer의 생성자에서 압축 코덱을 설정할 수 있습니다. 위의 예제에서는 gzip 압축 코덱을 사용하고 있습니다.

참고 자료