[java] 자바와 아파치 하둡의 웹 로그 분석 예제

이 예제는 자바와 아파치 하둡을 사용하여 웹 로그 데이터를 분석하는 방법을 보여줍니다.

1. 웹 로그 데이터

웹 로그는 웹 서버에서 발생하는 각각의 요청에 대한 정보를 기록한 파일입니다. 일반적으로 웹 서버는 클라이언트에 대한 IP 주소, 접속 시간, 요청한 URL, HTTP 상태 코드 등을 로그로 남깁니다.

예를 들어, 아래와 같은 형식의 웹 로그 데이터를 가정해 봅시다:

192.168.0.1 - - [27/Feb/2022:10:00:00] "GET /page.html HTTP/1.1" 200 1234
192.168.0.2 - - [27/Feb/2022:10:00:01] "GET /image.jpg HTTP/1.1" 404 0

2. 웹 로그 분석 예제

이 예제에서는 웹 로그 데이터를 분석하여 가장 많이 방문된 URL을 찾는 기능을 구현합니다.

2.1. 자바 코드

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
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 java.io.IOException;

public class WeblogAnalyzer {

    public static class WeblogMapper extends Mapper<LongWritable, Text, Text, IntWritable> {

        private final static IntWritable one = new IntWritable(1);
        private Text url = new Text();

        public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
            String line = value.toString();
            String[] fields = line.split(" ");
            if (fields.length >= 7) {
                url.set(fields[6]);
                context.write(url, one);
            }
        }
    }

    public static class WeblogReducer extends Reducer<Text, IntWritable, Text, IntWritable> {

        private IntWritable result = new IntWritable();

        public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
            int sum = 0;
            for (IntWritable value : values) {
                sum += value.get();
            }
            result.set(sum);
            context.write(key, result);
        }
    }

    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        Job job = Job.getInstance(conf, "weblog analyzer");
        job.setJarByClass(WeblogAnalyzer.class);
        job.setMapperClass(WeblogMapper.class);
        job.setReducerClass(WeblogReducer.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
        FileInputFormat.addInputPath(job, new Path(args[0]));
        FileOutputFormat.setOutputPath(job, new Path(args[1]));
        System.exit(job.waitForCompletion(true) ? 0 : 1);
    }
}

2.2. 실행

위의 자바 코드를 컴파일하고, 웹 로그 데이터가 있는 HDFS 경로와 출력 디렉토리를 명령어의 인자로 전달하여 실행합니다:

$ javac -classpath hadoop-core.jar WeblogAnalyzer.java
$ jar cf weblog-analyzer.jar WeblogAnalyzer.class
$ hadoop jar weblog-analyzer.jar WeblogAnalyzer /input/weblogs.txt /output

3. 결과

위의 실행 명령어를 실행한 후, 출력 디렉토리에는 가장 많이 방문된 URL과 해당 횟수가 저장됩니다. 이를 통해 웹 사이트의 인기 있는 페이지를 파악할 수 있습니다.

참고 자료