본문으로 건너뛰기

Hadoop Eco 스케줄링을 이용한 적재된 웹서버 로그 분석

Hadoop Eco 스케줄링 기능을 이용하여 Object Storage에 적재되는 로그를 주기적으로 분석하는 작업을 자동화하는 방법을 소개합니다.

안내

시나리오 소개

이 시나리오에서는 Hadoop Eco의 분산 처리 및 스케줄링 기능을 활용하여 Object Storage에 저장된 웹서버 로그를 정기적으로 분석하는 방법을 설명합니다. 이 자동화된 로그 분석 프로세스를 통해 사용자는 로그 데이터를 효율적으로 처리하고, 주기적인 분석 작업을 손쉽게 관리할 수 있습니다.

시작하기

아래 실습 단계에서는 Object Storage에 업로드된 로그 파일 확인, Hadoop Eco를 활용한 데이터 처리, 그리고 스케줄링 작업 자동화까지의 전체 과정을 다룹니다. 이 튜토리얼을 통해 로그 데이터를 저장, 관리, 처리하는 방법과 최종적으로 자동화된 스케줄링 작업을 설정하는 방법을 학습할 수 있습니다.

Step 1. Object Storage에 업로드된 로그 파일 확인하기

문서에 따라 핸즈온 진행에 필요한 로그 파일 예제를 생성합니다. 해당 핸즈온 튜토리얼을 먼저 진행한 뒤, Object Storage에 예제 로그 파일이 정상적으로 업로드되었는지 확인합니다.

예제 로그 파일 업로드

Step 2. Data Catalog 리소스 생성

Data Catalog는 카카오클라우드 내 조직과 사용자 데이터 자산을 파악하고 효율적으로 관리할 수 있도록 도와주는 완전 관리형 서비스입니다. 이 단계에서는 Data Catalog를 구성하는 Catalog, Database, Table을 생성해야 합니다.

  1. Catalog는 VPC 내 완전 관리형 중앙 리포지토리로, Data Catalog 서비스를 이용하기 위해 먼저 Catalog를 생성합니다.

    항목설정값
    이름hands_on
    VPC${any}
    서브넷${public}
  2. 생성한 카탈로그의 상태가 Running이 되면 Database를 생성합니다. Data Catalog의 데이터베이스는 테이블을 저장하는 컨테이너입니다.

    항목설정값
    카탈로그hands_on
    이름hands_on_db
    경로:버킷hands-on
    경로:디렉터리nginx
  3. Data Catalog의 메타데이터인 Table을 생성합니다.

    항목설정값
    데이터베이스hands_on_db
    테이블 이름handson_log_original
    데이터 저장 경로: 버킷 이름hands-on
    데이터 저장 경로: 디렉터리log/nginx
    데이터 유형CSV

Step 3. Hadoop Eco 리소스 생성

Hadoop Eco는 오픈 소스 프레임워크를 이용하여 분산 처리 작업을 실행하기 위한 카카오클라우드 서비스입니다. Hadoop Eco 리소스를 생성하는 방법은 다음과 같습니다.

  1. 카카오클라우드 콘솔 > Analytics > Hadoop Eco로 이동합니다. [클러스터 생성] 버튼을 클릭한 뒤 아래 정보에 해당하는 클러스터를 생성합니다.

    항목설정값
    클러스터 이름hands-on
    클러스터 버전Hadoop Eco 2.0.0
    클러스터 유형Core Hadoop
    클러스터 가용성표준
    관리자 ID${ADMIN_ID}
    관리자 비밀번호${ADMIN_PASSWORD}
  2. 마스터 노드와 워커 노드 인스턴스를 설정합니다.

    구분마스터 노드워커 노드
    인스턴스 개수1개       2개
    인스턴스 유형m2a.xlargem2a.xlarge
    볼륨 크기50GB100GB
  3. 키 페어 및 네트워크 구성(VPC, 서브넷)은 사용자가 ssh 접속을 진행할 수 있는 환경에 맞게 설정합니다. 다음으로 새로운 보안 그룹 생성을 선택합니다.

    네트워크 구성 및 보안 그룹 설정

  4. 스케줄링 설정을 열고 hive를 선택한 다음 쿼리를 입력합니다. 쿼리는 nginx 기본 포맷 로그를 정제하고 사용자 요청을 연산하여 결과를 저장합니다.

    -- Set the database
    USE hands_on_db;

    -- Repair the table
    MSCK REPAIR TABLE handson_table_original;

    -- Create empty refined_json table with JSON format using JsonSerDe
    CREATE EXTERNAL TABLE IF NOT EXISTS refined_json (
    remote_addr STRING,
    request_method STRING,
    request_url STRING,
    status STRING,
    request_time STRING,
    day_time STRING)
    PARTITIONED BY (date_id STRING)
    ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.JsonSerDe'
    STORED AS TEXTFILE;

    -- Populate refined_json table
    INSERT INTO refined_json PARTITION (date_id)
    SELECT
    split(log, ' ')[0] AS remote_addr,
    split(log, ' ')[5] AS request_method,
    split(log, ' ')[6] AS request_url,
    split(log, ' ')[8] AS status,
    split(log, ' ')[9] AS request_time,
    regexp_extract(split(log, ' ')[3], '\\d{2}:\\d{2}:\\d{2}', 0) AS day_time,
    date_id
    FROM
    handson_table_original;

    -- Create empty urlcount table with JSON format using JsonSerDe
    CREATE EXTERNAL TABLE IF NOT EXISTS urlcount (
    request_url STRING,
    status STRING,
    count BIGINT)
    PARTITIONED BY (date_id STRING)
    ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.JsonSerDe'
    STORED AS TEXTFILE;

    -- Populate urlcount table
    INSERT INTO urlcount PARTITION (date_id)
    SELECT
    request_url,
    status,
    count(*) AS count,
    date_id
    FROM
    refined_json
    GROUP BY
    request_url,
    status,
    date_id;
  5. 클러스터를 아래 조건에 맞게 설정합니다.

    항목설정값
    HDFS 블록 크기128
    HDFS 복제 개수2
    클러스터 구성 설정[직접 입력] 선택 후 아래 코드 입력
    클러스터 구성 설정값 - Object Storage 연동
    {
    "configurations": [
    {
    "classification": "core-site",
    "properties": {
    "fs.swifta.service.kic.credential.id": "${ACCESS_KEY}",
    "fs.swifta.service.kic.credential.secret": "${ACCESS_SECRET_KEY}"
    }
    }
    ]
    }
  6. 모니터링 에이전트, Data Catalog 서비스 연동 등을 설정합니다.

    항목설명
    모니터링 에이전트 설치설치 안함
    서비스 연동Data Catalog 연동
    데이터 카탈로그 이름[hands_on]에서 생성한 [hands_on] 선택
  7. 입력한 정보를 확인한 뒤 클러스터를 생성합니다.

Step 4. Hadoop Eco 스케줄링 크론잡 설정

  1. 크론잡을 실행할 가상머신을 생성합니다.

    TypeVirtual Machine
    Quantity1
    Namecron-vm
    ImageUbuntu 20.04
    Flavorm2a.large
    Volume20
    안내

    크론잡을 수행할 인스턴스는 외부 네트워크에 요청을 보냅니다. 따라서 외부 네트워크에 요청을 주고받을 수 있는 보안 그룹 및 네트워크 환경 설정이 필요합니다.

  2. 크론잡을 수행할 인스턴스에 ssh를 통해 접속합니다. 퍼블릭 IP를 추가하거나 Bastion 호스트 등을 사용하여 ssh 접속을 시도할 수 있습니다.

    ssh -i ${PRIVATE_KEY_FILE} ubuntu@${CRON_VM_ENDPOINT}
  3. shell에서 json 포맷의 데이터를 쉽게 사용하기 위해 jq 패키지를 설치합니다.

    sudo apt-get update -y
    sudo apt-get install -y jq
  4. ssh을 통해 인스턴스에 접속한 다음, 로그를 적재할 환경 변수 파일을 아래 표를 참조하여 작성합니다. 클러스터 ID는 클러스터의 상세 정보에서 확인할 수 있습니다.

    cat << \EOF | sudo tee /tmp/env.sh
    #!/bin/bash
    export CLUSTER_ID="${CLUSTER_ID}"
    export HADOOP_API_KEY="${HADOOP_API_KEY}"
    export ACCESS_KEY="${ACCESS_KEY}"
    export ACCESS_SECRET_KEY="${ACCESS_SECRET_KEY}"
    EOF
    환경 변수 키환경 변수 값
    ${CLUSTER_ID}클러스터 ID
    ${HADOOP_API_KEY}하둡 API 키
    ${ACCESS_KEY}액세스 키
    ${ACCESS_SECRET_KEY}사용자 보안 액세스 키
  5. 환경 변수 파일의 정보를 이용하여 클러스터 생성을 요청하는 스크립트를 작성합니다. 하둡 클러스터 API와 관련된 자세한 정보는 Hadoop Eco API를 확인하세요.

    cat << \EOF | sudo tee /tmp/exec_hadoop.sh
    #!/bin/bash

    . /tmp/env.sh

    curl -X POST "https://hadoop-eco.kr-central-1.kakaoi.io/hadoop-eco/v1/cluster/${CLUSTER_ID}" \
    -H "Hadoop-Eco-Api-Key:${HADOOP_API_KEY}" \
    -H "Credential-ID:${ACCESS_KEY}" \
    -H "Credential-Secret:${ACCESS_SECRET_KEY}" \
    -H "Content-Type: application/json"
    EOF
  6. 일정 시간마다 자동으로 스크립트를 실행하기 위해 cron 패키지를 사용합니다.

    sudo apt update -y
    sudo apt install -y cron
  7. crontab에 작성했던 하둡 클러스터를 생성하는 스크립트를 매일 자정에 실행하는 명령을 작성합니다.

    cat << EOF > tmp_crontab
    0 0 * * * /bin/bash /tmp/exec_hadoop.sh
    EOF
    sudo crontab tmp_crontab
    rm tmp_crontab
  8. 크론 작업이 등록되었는지 확인합니다.

    sudo crontab -l
  9. 아래 명령을 실행하고 클러스터가 생성되었는지 확인합니다.

    bash /tmp/exec_hadoop.sh

    클러스터 생성 확인

  10. 클러스터의 작업 결과를 확인합니다. 결과 로그는 하둡 클러스터 생성 단계에서 설정한 Object Storage의 버킷에서 확인합니다.

    클러스터 작업 결과 확인

  11. Object Storage에서 선택한 버킷과 log 디렉터리 내에 저장된 작업 결과를 확인합니다.

    버킷 및 로그 디렉터리 작업 결과 확인