Hadoop Eco 서비스를 이용한 웹서버 로그 분석
이 문서에서는 Hadoop Eco와 Object Storage, Data Catalog를 연계하여 서버 로그 분석 환경을 쉽게 구축하는 방법을 소개합니다.
- 예상 소요 시간: 60분
- 사용자 환경
- 권장 운영 체제: any
- Region: kr-central-2
- 사전 준비 사항
시나리오 소개
이 시나리오에서는 Hadoop Eco, Object Storage, 및 Data Catalog를 연계하여 웹서버 로그 분석 환경을 구축하는 과정을 안내합니다. 사용자는 이 실습을 통해 대량의 로그 데이터를 효율적으로 분석하여 유의미한 인사이트를 도출하는 방법을 학습할 수 있습니다.
주요 내용은 다음과 같습니다.
- Object Storage를 사용한 로그 파일 업로드 및 관리
- Data Catalog를 통한 데이터 카탈로그 및 테이블 생성
- Hadoop Eco 클러스터를 이용한 데이터 분석 환경 구성
시작하기
Step 1. Object Storage에 로그 파일 업로드
분석에 사용할 웹서버 로그를 Object Storage에 업로드합니다.
-
예제 로그 파일은 웹서버 Nginx의 기본 포맷을 사용합니다. 사용자 로컬 터미널을 열고 아래 명령어를 실행하여 로컬 다운로드 폴더에 예제 로그 파일을 저장합니다.
cat << EOF > ~/Downloads/access.log
172.16.0.174 - - [02/Mar/2023:03:04:05 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"
172.16.0.174 - - [02/Mar/2023:03:04:07 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"
172.16.0.174 - - [02/Mar/2023:03:04:30 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"
172.16.0.174 - - [02/Mar/2023:03:48:54 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"
172.16.0.174 - - [02/Mar/2023:03:48:57 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"
172.16.0.174 - - [02/Mar/2023:03:48:59 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"
172.16.0.174 - - [02/Mar/2023:03:49:34 +0000] "GET / HTTP/1.1" 200 396 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.3 Safari/605.1.15"
EOF -
로그 파일을 Object Storage에 업로드합니다. 아래 표를 참조하여 버킷과 디렉터리를 생성하고 사용자 로컬 다운로드 폴더에 저장된 예제 로그 파일을 업로드합니다.
항목 값 버킷 이름 hands-on 디렉터리 /nginx/ori/date_id=2023-02-01/hour_id=00 파일 이름 access.log -
예제 로그 파일이 Object Storage에 업로드되었는지 확인합니다.
Step 2. Data Catalog 리소스 생성
Data Catalog는 카카오클라우드 내 조직과 사용자 데이터 자산을 파악하고 효율적으로 관리할 수 있도록 도와주는 완전 관리형 서비스로, Catalog, Database, Table로 구성되어 있습니다.
-
Catalog는 VPC 내 완전 관리형 중앙 리포지토리로, Data Catalog 서비스를 이용 전에 생성해야 합니다.
항목 값 이름 hands_on VPC ${any}
서브넷 ${public}
-
생성한 카탈로그의 상태가
Running
이 되면 Database를 생성합니다. Data Catalog의 데이터베이스는 테이블을 저장하는 컨테이너입니다.항목 값 카탈로그 hands_on 이름 hands_on_db 경로:버킷 hands-on 경로:디렉터리 nginx -
Data Catalog의 메타데이터인
오리진 데이터 테이블
,정제 데이터 테이블
,결과 데이터 테이블
을 생성합니다.- 오리진 데이터 테이블
- 정제 데이터 테이블
- 결과 데이터 테이블
항목 값 데이터베이스 hands_on_db 테이블 이름 handson_table_original 데이터 저장 경로: 버킷 이름 hands-on 데이터 저장 경로: 디렉터리 nginx/ori 데이터 유형 CSV 스키마
파티션 키 칼럼 번호 필드 이름 데이터 유형 off 1 log string on - date_id string on - hour_id string 항목 값 데이터베이스 hands_on_db 테이블 이름 handson_table_orc 데이터 저장 경로: 버킷 이름 hands-on 데이터 저장 경로: 디렉터리 nginx/orc 데이터 유형 ORC 스키마
파티션 키 칼럼 번호 필드 이름 데이터 유형 off 1 remote_addr string off 2 date_time string off 3 request_method string off 4 request_url string off 5 status string off 6 request_time string on - date_id string on - hour_id string 항목 값 데이터베이스 hands_on_db 테이블 이름 handson_table_request_url_count 데이터 저장 경로: 버킷 이름 hands-on 데이터 저장 경로: 디렉터리 nginx/request_url_count 데이터 유형 JSON 파티션 키 칼럼 번호 필드 이름 데이터 유형 off 1 request_url string off 2 status string off 3 count int on - date_id string on - hour_id string
Step 3. Hadoop Eco 리소스 생성
Hadoop Eco는 오픈 소스 프레임워크를 이용하여 분산 처리 작업을 실행하기 위한 카카오클라우드 서비스입니다.
-
카카오클라우드 콘솔 > Analytics > Hadoop Eco 서비스를 선택합니다. [클러스터 생성] 버튼을 클릭한 뒤 아래 정보에 해당하는 클러스터를 생성합니다.
항목 값 클러스터 이름 hands-on 클러스터 버전 Hadoop Eco 2.0.0 클러스터 유형 Core Hadoop 클러스터 가용성 표준 관리자 ID ${ADMIN_ID}
관리자 비밀번호 ${ADMIN_PASSWORD}
-
마스터 노드와 워커 노드 인스턴스를 설정합니다.
- 키 페어 및 네트워크 구성(VPC, 서브넷)은 사용자가 ssh 접속을 진행할 수 있는 환경에 맞게 설정합니다. 다음으로 새로운 보안 그룹 생성을 선택합니다.
구분 마스터 노드 워커 노드 인스턴스 개수 1개 2개 인스턴스 유형 m2a.2xlarge m2a.2xlarge 볼륨 크기 50GB 100GB -
클러스터를 설정합니다.
항목 설정값 작업 스케줄링 설정 선택 안함 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 연동 데이터 카탈로그 이름 [hands_on]에서 생성한 [hands_on] 선택 -
입력한 정보를 확인한 뒤 클러스터를 생성합니다.
Step 4. 원본 데이터 추출하여 정제 테이블에 쓰기
-
생성된 Hadoop 클러스터의 마스터 노드에 ssh를 사용하여 접속합니다.
마스터 노드에 접속ssh -i ${PRIVATE_KEY_FILE} ubuntu@${HADOOP_MST_NODE_ENDPOINT}
주의생성된 마스터 노드는 프라이빗 IP로 구성되어 있어 퍼블릭 네트워크 환경에서 접근할 수 없습니다. 따라서 퍼블릭 IP를 연결하거나 Bastion 호스트를 사용하는 등의 방식으로 접속할 수 있습니다.
-
데이터 추출을 위해 Apache Hive를 사용합니다. Apache Hive는 SQL을 사용하여 분산 스토리지에 상주하는 대규모 데이터 세트의 읽기, 쓰기 및 관리를 용이하게 합니다.
Apache Hivehive
-
작업을 진행할 데이터베이스를 Data Catalog 생성 단계에서 생성한 데이터베이스로 설정합니다.
데이터베이스 설정use hands_on_db;
-
원본 로그 테이블 파티션을 추가합니다. 콘솔 Data Catalog 페이지에서 원본 데이터 테이블 파티션 정보의 추가를 확인합니다.
원본 로그 테이블 파티션 추가msck repair table handson_table_original;
-
HiveCLI에 아래 SQL 명령을 실행합니다. 원본 로그 데이터를 추출하여 정제 테이블에 작성합니다.
SQL 명령어 실행INSERT INTO TABLE handson_table_orc PARTITION(date_id, hour_id)
SELECT remote_addr,
from_unixtime(unix_timestamp(time_local, '[DD/MMM/yyyy:HH:mm:ss')) as date_time,
request_method,
request_url,
status,
request_time,
date_id,
hour_id
FROM (
SELECT split(log, " ")[0] AS remote_addr,
split(log, " ")[3] AS time_local,
split(log, " ")[5] AS request_method,
split(log, " ")[6] AS request_url,
split(log, " ")[8] AS status,
split(log, " ")[9] AS request_time,
date_id,
hour_id
FROM handson_table_original
) R; -
Hivecli 작업을 종료합니다.
작업 종료exit;
Step 5. 필요 데이터 추출 및 테이블 작성
-
Spark shell을 실행합니다.
실행spark-shell
-
Spark를 이용하여 정제 테이블에 작성한 데이터를 연산합니다.
request_url
과status
에 대한 개수를json
형식으로 결과 테이블에 작성합니다.작성 데이터 연산spark.conf.set("spark.sql.hive.convertMetastoreOrc", false)
spark.sql("use hands_on_db").show()
spark.sql("SELECT request_url, status, count(*) as count FROM handson_table_orc GROUP BY request_url, status").write.format("json").option("compression", "gzip").save("swifta://hands-on.kic/nginx/request_url_count/date_id=2023-02-01/hour_id=01")
Step 6. Hue를 이용한 결과 확인
Hue(Hadoop User Experience)는 Apache Hadoop 클러스터와 함께 사용되는 웹 기반 사용자 인터페이스입니다. Hue를 사용하면 Hadoop 데이터에 쉽게 접근할 수 있고, 다양한 하둡 에코 시스템과 연동이 용이합니다.
-
Hue 페이지에 접속합니다. 브라우저를 통해 하둡 클러스터의 마스터노드
8888
포트로 접속할 수 있습니다. 접속에 성공하면 생성한 하둡 클러스터에서 설정한 관리자 ID와 비밀번호를 입력하여 로그인합니다.Hue 접속open http://{HADOOP_MST_NODE_ENDPOINT}:8888
주의생성된 노드는 프라이빗 IP로 구성되어 있으며 퍼블릭 네트워크 환경에서 접근할 수 없습니다. 따라서 퍼블릭 IP 연결 및 Bastion 호스트를 사용하는 등의 방법을 사용합니다.
-
페이지에 접속한 후 Hive 쿼리를 실행할 수 있습니다. 작업을 진행할 데이터베이스를 Data Catalog 생성 단계에서 생성한 데이터베이스로 설정합니다.
데이터베이스 설정use hands_on_db;
-
다음 아래 명령어를 실행하여 결과 테이블의 파티션을 추가합니다.
Hive 쿼리 실행msck repair table handson_table_request_url_count;
-
Data Catalog 콘솔에 접속하여 결과 테이블의 파티션 추가를 확인합니다.
-
결과 테이블로 저장된 데이터를 조회합니다.
json
데이터 처리를 위해jar
파일을 추가합니다.JSON 데이터 처리를 위한 라이브러리 추가add jar /opt/hive/lib/hive-hcatalog-core-3.1.3.jar;
저장된 데이터 조회select * from handson_table_request_url_count order by count limit 10;
-
Hue 페이지에서 조회한 결과를 그래프로 확인할 수 있습니다.