Hadoop Eco 스케줄링을 이용한 적재된 웹서버 로그 분석
Hadoop Eco 스케줄링 기능을 이용하여 Object Storage에 적재되는 로그를 주기적으로 분석하는 작업을 자동화하는 방법을 소개합니다.
- 예상 소요 시간: 60분
- 사용자 권장 환경
- 권장 운영 체제: MacOS, Ubuntu
- Region: kr-central-2
- 사전 준비 사항
- 참고 문서
시나리오 소개
이 시나리오에서는 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을 생성해야 합니다.
-
Catalog는 VPC 내 완전 관리형 중앙 리포지토리로, Data Catalog 서비스를 이용하기 위해 먼저 Catalog를 생성합니다.
항목 설정값 이름 hands_on VPC ${any}
서브넷 ${public}
-
생성한 카탈로그의 상태가 Running이 되면 Database를 생성합니다. Data Catalog의 데이터베이스는 테이블을 저장하는 컨테이너입니다.
항목 설정값 카탈로그 hands_on 이름 hands_on_db 경로:버킷 hands-on 경로:디렉터리 nginx -
Data Catalog의 메타데이터인 Table을 생성합니다.
- 오리진 데이터 테이블
- 스키마
항목 설정값 데이터베이스 hands_on_db 테이블 이름 handson_log_original 데이터 저장 경로: 버킷 이름 hands-on 데이터 저장 경로: 디렉터리 log/nginx 데이터 유형 CSV 파티션 키 칼럼 번호 필드 이름 데이터 유형 off 1 log string on - date_id string on - hour_id string
Step 3. Hadoop Eco 리소스 생성
Hadoop Eco는 오픈 소스 프레임워크를 이용하여 분산 처리 작업을 실행하기 위한 카카오클라우드 서비스입니다. Hadoop Eco 리소스를 생성하는 방법은 다음과 같습니다.
-
카카오클라우드 콘솔 > Analytics > Hadoop Eco로 이동합니다. [클러스터 생성] 버튼을 클릭한 뒤 아래 정보에 해당하는 클러스터를 생성합니다.
항목 설정값 클러스터 이름 hands-on 클러스터 버전 Hadoop Eco 2.0.0 클러스터 유형 Core Hadoop 클러스터 가용성 표준 관리자 ID ${ADMIN_ID}
관리자 비밀번호 ${ADMIN_PASSWORD}
-
마스터 노드와 워커 노드 인스턴스를 설정합니다.
구분 마스터 노드 워커 노드 인스턴스 개수 1개 2개 인스턴스 유형 m2a.xlarge m2a.xlarge 볼륨 크기 50GB 100GB -
키 페어 및 네트워크 구성(VPC, 서브넷)은 사용자가 ssh 접속을 진행할 수 있는 환경에 맞게 설정합니다. 다음으로
새로운 보안 그룹 생성
을 선택합니다. -
스케줄링 설정을 열고 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; -
클러스터를 아래 조건에 맞게 설정합니다.
항목 설정값 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}"
}
}
]
} -
모니터링 에이전트, Data Catalog 서비스 연동 등을 설정합니다.
항목 설명 모니터링 에이전트 설치 설치 안함 서비스 연동 Data Catalog 연동 데이터 카탈로그 이름 [hands_on]에서 생성한 [hands_on] 선택 -
입력한 정보를 확인한 뒤 클러스터를 생성합니다.
Step 4. Hadoop Eco 스케줄링 크론잡 설정
-
크론잡을 실행할 가상머신을 생성합니다.
Type Virtual Machine Quantity 1 Name cron-vm Image Ubuntu 20.04 Flavor m2a.large Volume 20 안내크론잡을 수행할 인스턴스는 외부 네트워크에 요청을 보냅니다. 따라서 외부 네트워크에 요청을 주고받을 수 있는 보안 그룹 및 네트워크 환경 설정이 필요합니다.
-
크론잡을 수행할 인스턴스에 ssh를 통해 접속합니다. 퍼블릭 IP를 추가하거나 Bastion 호스트 등을 사용하여 ssh 접속을 시도할 수 있습니다.
ssh -i ${PRIVATE_KEY_FILE} ubuntu@${CRON_VM_ENDPOINT}
-
shell
에서 json 포맷의 데이터를 쉽게 사용하기 위해 jq 패키지를 설치합니다.sudo apt-get update -y
sudo apt-get install -y jq -
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}
사용자 보안 액세스 키 -
환경 변수 파일의 정보를 이용하여 클러스터 생성을 요청하는 스크립트를 작성합니다. 하둡 클러스터 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 -
일정 시간마다 자동으로 스크립트를 실행하기 위해 cron 패키지를 사용합니다.
sudo apt update -y
sudo apt install -y cron -
crontab에 작성했던 하둡 클러스터를 생성하는 스크립트를 매일 자정에 실행하는 명령을 작성합니다.
cat << EOF > tmp_crontab
0 0 * * * /bin/bash /tmp/exec_hadoop.sh
EOF
sudo crontab tmp_crontab
rm tmp_crontab -
크론 작업이 등록되었는지 확인합니다.
sudo crontab -l
-
아래 명령을 실행하고 클러스터가 생성되었는지 확인합니다.
bash /tmp/exec_hadoop.sh
-
클러스터의 작업 결과를 확인합니다. 결과 로그는 하둡 클러스터 생성 단계에서 설정한 Object Storage의 버킷에서 확인합니다.
-
Object Storage에서 선택한 버킷과 log 디렉터리 내에 저장된 작업 결과를 확인합니다.