본문으로 건너뛰기

Hadoop Eco 서비스를 이용한 웹서버 로그 분석

Hadoop Eco 서비스를 이용하면 카카오클라우드에서 웹서버 로그 분석 환경을 쉽게 구축할 수 있습니다. 이 문서에서는 Hadoop Eco와 Object Storage, Data Catalog를 연계한 핸즈온 튜토리얼을 제공합니다.

안내
  • 예상 소요 시간: 60분
  • 사용자 환경 - 권장 운영 체제: any - Region: kr-central-2

사전 준비

이 실습을 진행하기 위해서는 액세스 키VM 접근용 키 페어 확인이 필요합니다.

Step 1. Object Storage에 로그 파일 업로드

분석에 사용할 웹서버 로그를 Object Storage에 업로드합니다.

  1. 예제 로그 파일은 웹서버 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
  2. 로그 파일을 Object Storage에 업로드합니다. 아래 표를 참조하여 버킷과 디렉터리를 생성하고 사용자 로컬 다운로드 폴더에 저장된 예제 로그 파일을 업로드합니다.

    항목
    버킷 이름hands-on
    디렉터리/nginx/ori/date_id=2023-02-01/hour_id=00
    파일 이름    access.log
  3. 예제 로그 파일이 Object Storage에 업로드되었는지 확인합니다.

    로그 파일 업로드

Step 2. Data Catalog 리소스 생성

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

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

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

    항목
    카탈로그hands_on
    이름hands_on_db
    경로:버킷hands-on
    경로:디렉터리  nginx
  3. Data Catalog의 메타데이터인 오리진 데이터 테이블, 정제 데이터 테이블, 결과 데이터 테이블을 생성합니다.

    항목
    데이터베이스hands_on_db
    테이블 이름handson_table_original
    데이터 저장 경로: 버킷 이름  hands-on
    데이터 저장 경로: 디렉터리nginx/ori
    데이터 타입CSV
    스키마
    파티션 키칼럼 번호필드 이름데이터 타입
    off     1     log    string
    on-date_idstring
    on-hour_idstring

Step 3. Hadoop Eco 리소스 생성

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

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

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

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

    항목설정값
    작업 스케줄링 설정선택 안함
    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}"
    }
    }
    ]
    }
  4. 서비스 연동을 설정합니다.

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

Step 4. 원본 데이터 추출하여 정제 테이블에 쓰기

  1. 생성된 Hadoop 클러스터의 마스터 노드에 ssh를 사용하여 접속합니다.

    마스터 노드에 접속
    ssh -i ${PRIVATE_KEY_FILE} ubuntu@${HADOOP_MST_NODE_ENDPOINT}
    주의

    생성된 마스터 노드는 사설 IP로 구성되어 있어 퍼블릭 네트워크 환경에서 접근할 수 없습니다. 따라서 공인 IP를 연결하거나 Bastion 호스트를 사용하는 등의 방식으로 접속할 수 있습니다.

  2. 데이터 추출을 위해 Apache Hive를 사용합니다. Apache Hive는 SQL을 사용하여 분산 스토리지에 상주하는 대규모 데이터 세트의 읽기, 쓰기 및 관리를 용이하게 합니다.

    Apache Hive
    hive
  3. 작업을 진행할 데이터베이스를 Data Catalog 생성 단계에서 생성한 데이터베이스로 설정합니다.

    데이터베이스 설정
    use hands_on_db;
  4. 원본 로그 테이블 파티션을 추가합니다. 콘솔 Data Catalog 페이지에서 원본 데이터 테이블 파티션 정보의 추가를 확인합니다.

    원본 로그 테이블 파티션 추가
    msck repair table handson_table_original;

    원본 로그 테이블 파티션 추가

  5. 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;
  6. Hivecli 작업을 종료합니다.

    작업 종료
    exit;

Step 5. 필요 데이터 추출 및 테이블 작성

  1. Spark shell을 실행합니다.

    실행
    spark-shell
  2. Spark를 이용하여 정제 테이블에 작성한 데이터를 연산합니다. request_urlstatus에 대한 개수를 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 데이터에 쉽게 접근할 수 있고, 다양한 하둡 에코 시스템과 연동이 용이합니다.

  1. Hue 페이지에 접속합니다. 브라우저를 통해 하둡 클러스터의 마스터노드 8888포트로 접속할 수 있습니다. 접속에 성공하면 생성한 하둡 클러스터에서 설정한 관리자 아이디와 비밀번호를 입력하여 로그인합니다.

    Hue 접속
    open http://{HADOOP_MST_NODE_ENDPOINT}:8888
    주의

    생성된 노드는 사설 아이피로 구성되어 있으며 퍼블릭 네트워크 환경에서 접근할 수 없습니다. 따라서 공인 IP 연결 및 Bastion 호스트를 사용하는 등의 방법을 사용합니다.

  2. 페이지에 접속한 후 Hive 쿼리를 실행할 수 있습니다. 작업을 진행할 데이터베이스를 Data Catalog 생성 단계에서 생성한 데이터베이스로 설정합니다.

    데이터베이스 설정
    use hands_on_db;
  3. 다음 아래 명령어를 실행하여 결과 테이블의 파티션을 추가합니다.

    Hive 쿼리 실행
    msck repair table handson_table_request_url_count;
  4. Data Catalog 콘솔에 접속하여 결과 테이블의 파티션 추가를 확인합니다.

  5. 결과 테이블로 저장된 데이터를 조회합니다. 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;
  6. Hue 페이지에서 조회한 결과를 그래프로 확인할 수 있습니다.

    결과 확인