[빅데이터] 텀 프로젝트(8) - 텀 프로젝트 최종
Updated:
Intro
2020년도 1학기 수강과목인 빅데이터 이해 텀프로젝트 최종 발표 자료 입니다.
TermProject 주제 선정
- 주제 및 목표 기술
해당 프로젝트의 주제는 2011년부터 2018년까지 국내에서 발생한 해상 조난사고 상세 데이터를 활용하여 해상에서 발생한 선박 관련 사고에 대하여 분석하는 것입니다. 해상 조난 사고 데이터를 활용하여 년도 별, 관할 해경서 별 해상 조난사고의 상세현황을 분석 및 도출 하였습니다.
- 데이터 설명
해상 조난 사고 데이터는 공공데이터포털에서 2011년부터 2018년도까지의 해양경찰청 해상조난사고 상세데이터를 사용하였습니다.
데이터 셋은 해상에서 발생한 모든 선박관련 해양사고 중 해양경찰청에 신고, 접수된 사오의 상세데이터로 이루어 져있고, 20개의 열 중 사용하지 않는 5개의 열을 드롭하였습니다. 최종적으로 Date/Jurisdiction/Area/Type/Causes/Weather/Accident Ship/Rescue/Injured/Death/Missing/Location/Latitude/Longitude/Ship Type 으로 구성된 15개의 항목으로 데이터 셋을 구성하였습니다.
각 항목(열)에 대한 설명은 다음 표와 같습니다.
- 소스 데이터 설명
사건 데이터 생성
- 데이터 하둡 적재
먼저 사건 데이터를 하둡에 적재하기 위해 WinSCP를 사용하여 본인의 컴퓨터에 있는 데이터 파일을 Master 서버로 업로드 하였습니다.
업로드한 파일을 확인해보니 한글 인코딩 오류가 발생한 것을 알수 있었습니다.
iconv 명령어로 원본 파일을 utf-8로 인코딩 변화하고, 변환된 csv 파일을 생성하였습니다.
hdfs에 디렉토리를 생성한 후 인코딩한 입력 데이터 로컬 파일을 하둡 파일 시스템의 파일로 복사하였습니다.
- 데이터 세트 생성
- 제플린 실행
제플린을 실행하여 클래스 임포트와 케이스 클래스, 데이터 프레임 데이터 세트를 정의하였습니다.
데이터 세트 테이블 내용을 출력하였습니다. 처음 100개의 데이터를 출력하였고, show() 함수에 false 인자를 넣어주어 칼럼의 사이즈 조절 여부를 설정하였습니다. 데이터 세트의전체 레코드 수를 출력해본 결과 총 16389 행인 것을 알 수 있습니다.
해양 사고 데이터 조사
- 사용자 정의 함수
해당 데이터에서 발생일시는 yyyy-mm-dd hh:mm형식으로 저장되어 있습니다. 년도, 월 시간대를 추출하기 위해 ‘-‘와 공백문자를 기준으로 문자열을 자르고 나눠주어야 합니다.
문자열을 인수로 받는 getYear value에 UDF 함수(사용자 정의 함수)를 정의하였습니다. 인수로 받은 문자열을 substring 메소드를 사용하여 추출합니다. 0번째 인덱스부터 첫번째 ‘-‘의 인덱스 -1 까지의 문자열을 추출하여 year 변수에 저장한 후 return 합니다. getYear 함수를 적용하여 년도 별 사건 수를 표시하였습니다.
위의 방법과 마찬가지로 월 별 사건 조사를 하기 위한 사용자 정의 함수를 정의하였고 월별 사건 수를 출력하였습니다.
년도별 사건 조사를 SQL 질의로 하기위해 문자열에서 년도만 추출해주는 UDF 작성 후 UDF 함수를 등록하였습니다.
- 데이터 세트 재정의
위에서 정의한 사용자 함수를 적용하여 사건 테이블에 년도, 월로 이루어진 열을 추가하였습니다.
- 질문 조사 사항
해상 조난 사고 데이터에 대해 다음 5가지의 질문을 조사하였습니다.
- 사건 조사
Q. 사고가 가장 많이 발생한 해는?
A. 년도 추출 UDF를 사용하여 SQL 질의한 결과 2018 > 2017 > 2016 > 2015 > 2011 > 2012 > 2014 > 2013 순으로 사건이 가장 많이 발생한 것을 알 수 있었습니다. 또한 해당 결과를 스파크 SQL을 사용하여 데이터를 시각화 하였습니다.
Q. 사고가 가장 많이 발생한 관할 해경서는?
A. 관할 해경서 별 사건 수를 count한 후 내림차순으로 정렬한 결과 통영 > 목포 > 서귀포 > 평택 > 여수 > … 순으로 사건이 가장 많이 발생한 것을 알 수 있었습니다. 스파크 SQL을 사용하여 데이터를 시각화 하였습니다.
Q. 사고가 가장 많이 일어난 발생 원인은?
A. 발생 원인으로 그룹화한 데이터 세트를 생성하여 발생 원인별로 사건의 수를 카운트 한 후 내림차순으로 정렬하였습니다. 그 결과 정비불량이 6660건, 운항부주의 4819건, 기타 1853건이 가장 많이 일어난 사고 원인 세가지임을 알 수 있었습니다. 스파크 SQL을 사용하여 데이터를 시각화 하였습니다.
Q. 사망자 수가 10명 이상 발생한 사건의 정보는?
A. filter 메소드로 사망자수가 10명 이상인 레코드로만 이루어진 데이터 세트를 정의한 후 사망자가 가장 많은 순으로 출력하였습니다. 2011년 부터 2018년까지의 해상 사고 중 사망자가 10명 이상인 사건은 총 6건 인것을 알 수 있었습니다.
Q. 2011년 부터 2018년까지의 관할 해경서 별 구조, 부상, 사망, 실종 인원의 통계
A. year와 month 열을 추가한 데이터 세트를 view로 등록한 후 구조, 부상, 사망, 실종 인원의 년도별 통계 조사 SQL문으로 질의하여 조사하였습니다.
해양 사고 데이터 응용 구축
- accidentApp 빌드 스크립트 작성
- accidentApp 응용 작성
- accidentApp 응용의 빌드
- accidentApp 응용 실행
해양 사고 데이터 응용 모니터링
- NAT 설정
해양 사고 데이터의 응용 모니터링을 해보겠습니다. 먼저 NAT 내부의 스파크 드라이버의 웹 UI 포트 4040포트와 히스토리 웹 UI 포트 18080포트로 접근하기 위해서 게이트웨이 포트 포워딩을 설정해주어야 합니다.
- 스파크 설정
NAT설정 하였으면 스파크의 spark-defaults.conf에 지정해주어야 합니다.
- 제플린 스파크 설정 수정
제플린에서 스파크 실행 시에는 아래와 같이 수정을 해야 스파크 웹 모니터링이 가능합니다. 제플린에서 스파크 실행 후 스파크 웹 UI 4040 포트를 모니터링 합니다.
- 스파크 웹 UI tlfgod 제플린에서 실행한 모습입니다.
- 잡 페이지(Jobs Page)
잡 페이지는 최근에 완료된 스파크 잡에 대한 상세 실행 정보를 표시합니다.
- 스테이지 상세 페이지
Leave a comment