기술자료

DBMS, DB 구축 절차, 빅데이터 기술 칼럼, 사례연구 및 세미나 자료를 소개합니다.

Java development 2.0: Hadoop MapReduce로 대용량 데이터 분석

기술자료
DBMS별 분류
Etc
작성자
dataonair
작성일
2020-12-13 00:00
조회
7101



Java development 2.0: Hadoop MapReduce로 대용량 데이터 분석

데이터의 산맥이 정보의 보고가 되는 방법


Apache Hadoop은 분산 데이터를 분석하기 위해 사용하는 현존하는 고급 도구이며, 대부분의 Java™ 2.0 기술과 마찬가지로 규모를 확장하기 위해 빌드되었습니다. Hadoop의 MapReduce 프로그래밍 모델을 시작하여, 대규모 및 소규모 비즈니스 정보 필요성을 위해 데이터를 분석하는 데 어떻게 사용하는지 배워봅시다.

Google이 2001년에 이미지 검색 기능을 실행했을 때, 2억 5천만 개의 인덱스된 이미지를 보유했다. 십 년이 지나지 않아, 이 검색 거인은 100억 개 이상의 이미지를 인덱스했다. 분당 35시간의 컨텐츠가 YouTube로 업로드된다. Twitter는 평균적으로 매일 5천 5백만 건의 트윗을 처리한다고 주장한다. 올해 초에 그 검색 기능은 매일 6억 개의 쿼리를 로깅했다. 대용량 데이터를 논의할 때 대용량이란 바로 그 정도이다.

이러한 엄청난 규모의 데이터는 대기업, 대학 및 정부 ― 엄청나게 비싼 슈퍼컴퓨터를 구입할 수 있으며 이를 계속 실행할 직원을 가용할 수 있는 단체 ―에 국한되었다. 오늘날 스토리지 비용의 절감과 프로세싱 성능의 상용화를 통해 중소기업 및 일부 개인들도 동일한 데이터를 저장하고 마이닝하기 시작하여, 애플리케이션 혁신의 흐름을 발전시킨다.

대용량 데이터 혁명이 가능한 기술 중 하나는 MapReduce이다. 이는 엄청난 규모의 분산 데이터 세트를 처리하기 위해 Google이 개발한 프로그래밍 모델 겸 구현 방식이다. 이 기사에서 필자는 Apache의 오픈 소스 MapReduce 구현 방식인 Hadoop을 소개한다. 이는 클라우드 컴퓨팅의 킬러 앱(killer app)이라고도 한다.

Hadoop 정보

Apache의 Hadoop 프레임워크는 본질적으로 대용량 데이터 세트를 분석하기 위한 메커니즘이며, 이는 반드시 데이터 저장소에 수용하지 않아도 된다. Hadoop은 MapReduce의 거대한 데이터 분석 엔진을 요약하여 개발자들이 액세스하기에 더 쉽게 만든다. Hadoop은 무수한 노드로 확장하여 데이터 정렬과 관련된 활동 및 조정을 모두 처리할 수 있다.

Hadoop은 수많은 기능과 구성을 통해 놀랍도록 유용하고 강력한 프레임워크가 된다. Yahoo!와 무수한 다른 조직들은 산더미 같은 비트와 바이트들을 분석하기 위해 이를 효율적인 메커니즘이라고 인식했다. 또한 Hadoop은 단일 노드에서 작업하기에 매우 간편하다. 즉, 분석할 데이터가 어느 정도 있고, 제네릭을 비롯한 Java 코드에 익숙하기만 하면 된다. Hadoop은 또한 Ruby, Python 및 C++로 작업한다.

대용량 데이터 세트를 처리하기 위한 개념적인 프레임워크로서 MapReduce는 다수의 컴퓨터를 사용하여 분산된 문제 해결을 위해 고도로 최적화되었다. 프레임워크는 이름이 암시하는 대로 두 가지 함수로 구성된다. map 함수는 대용량 데이터 입력을 취하여 더 잘게 나누도록 설계되었으며, 그러면 이를 통해 어떠한 작업을 할 수 있는 다른 프로세스로 전달한다. reduce 함수는 map으로 수집되는 개별 응답을 요약하고 최종 출력으로 이를 렌더링한다.

Hadoop에서 Hadoop의 자체적인 기본 클래스를 확장하여 map과 reduce 구현을 정의한다. 구현은 입력 및 출력 형식과 함께 이를 지정하는 구성으로 함께 묶인다. Hadoop은 구조화된 데이터가 들어있는 대용량 파일을 처리하기 위한 훌륭한 세트이다. Hadoop의 특히 편리한 측면 하나는 입력 파일의 원시 구문 분석을 처리하기 때문에, 사용자는 한 번에 한 행씩 다룰 수 있다. 따라서 map 함수를 정의하는 것은 실제로 텍스트의 수신되는 행에서부터 취하려는 것을 판별하는 문제에 불과하다.

데이터는 어디에나 있다!

미국 정부는 일반 시민이 크게 관심을 가지는 엄청난 양의 데이터를 제작한다. 다양한 정부 기관들은 미국 경제 상태 및 변화하는 사회적 인구 통계와 관련된 데이터를 자유롭게 분배한다. 미국 지질 조사소(USGS)는 국제적인 지진 데이터를 발표한다.

여러 소규모 지진들이 전 세계 곳곳에서 매일 발생한다. 이들 중 다수는 지각 내 깊은 곳에서 발생하여 아무도 인식하지 못하지만, 그럼에도 불구하고 청취 스테이션은 이를 기록한다. USGS는 주간 CSV(또는 콤마로 분리된 값) 파일 형태로 지진 데이터를 발표한다.

평균적인 주간 파일은 엄청나게 크지는 않다 ― 겨우 100KB 정도이다. 하지만 이는 Hadoop을 학습하기 위한 기초로 쓰일 것이다. 그렇다고 하더라도 Hadoop이 훨씬 더 큰 규모의 데이터 세트를 처리할 수 있다는 점을 잊지 말자.

진동 추적

최근에 USGS 웹 사이트에서 다운로드한 CSV 파일은 다음 리스트 1과 같이 약 920개의 행으로 되어있다.

리스트 1. USGS 지진 데이터 파일의 행 개수

$> wc -l eqs7day-M1.txt
920 eqs7day-M1.txt

CVS 파일의 컨텐츠는 다음 리스트 2(즉, 처음 두 개의 행)에서 보는 것과 비슷하다.

리스트 2. CVS 파일의 처음 두 개의 행

$> head -n 2 eqs7day-M1.txt
Src,Eqid,Version,Datetime,Lat,Lon,Magnitude,Depth,NST,Region
ci,14896484,2,"Sunday, December 12, 2010 23:23:20 UTC",33.3040,-116.4130,1.0,11.70,22,
"Southern California"

특히 총 행의 합이 920개라는 점을 고려할 때에, 필자는 이를 Information Rich 파일이라고 할 것이다. 하지만 필자는 이 파일로 보고되는 그 주의 각 날짜에 발생하는 지진의 수만 알고자 한다. 그 다음에 이러한 7일에 대부분의 지진이 나타나는 일반적인 영역이 어디인지 알고자 한다.

필자의 첫 번째 생각은 일일 지진 수를 검색하기 위해 간단한 grep 명령을 사용할 수 있었다는 점이다. 파일을 살펴보면 데이터가 12월 12일에 시작하는 것으로 표시된다. 따라서 다음 리스트 3의 결과로 그 문자열의 grep -c를 수행한다.

리스트 3. 12월 12일에 지진이 얼마나 많이 발생하는가

$> grep -c 'December 12' eqs7day-M1.txt
98

이제 12월 12일에 98개의 항목 또는 98개의 기록된 지진이 있었음을 알게 되었다. 행 아래로 이동하여 12월 11일, 10일 등에 grep을 수행할 수도 있을 것이다. 하지만, 그것은 필자가 생각하기에는 지루하다. 더욱 나쁜 것은 이를 이끌어 내기 위해 파일에 어느 날짜가 있는지 알아야 한다는 것이다. 필자는 그 내용에 실제로 신경을 쓰지 않으며, 어떠한 경우에는 그러한 정보에 액세스 권한이 없을 수 있다. 실제로 필자는 어느 7일 범위에서나 주어진 각 날짜의 숫자만 알고자 하고, Hadoop을 통해 그러한 정보를 간편하게 얻을 수 있다.
Hadoop은 필자의 첫 번째와 두 번째 질문에 응답하는 정보의 몇 가지 부분만 필요로 한다. 다시 말해서, 처리할 입력이 어느 모두 함께 묶는 작업도 제공해야 할 것이다. 하지만, 그 코드에 작업을 시작하기 전에 전부 필자의 CSV 데이터 순서로 되어 있는지 확인하는 데 수분이 걸릴 것이다.

o

pencsv로 데이터 구문 분석

지진 CSV 파일의 첫 행인 헤더를 제외하고 각 행은 콤마로 분리된 데이터 값의 시리즈이다. 필자는 세 가지 데이터 부분인 각 지진의 날짜, 위치 및 규모에 주로 관심이 있다. 이러한 데이터를 확보하기 위해 opencsv라는 실용적인 오픈 소스 라이브러리를 사용할 것이며, 이는 CSV 파일을 구문 분석하는 데 유용하다.

테스트를 우선 시행하는 사람이 되기 위해, 목록 4와 같이 CSV 파일에서 확보한 샘플 행에서 원하는 정보를 확보할 수 있는지 확인하는 빠른 JUnit 테스트를 작성하여 시작할 것이다.

리스트 4. CSV 행 구문 분석하기

public class CSVProcessingTest { private final String LINE = "ci,14897012,2,\Monday

"