635
18
스칼라를 활용한 빅데이터
분야의 프로그램을 구현할 있었다.
GFS
맵리듀스는 둘을 본떠서 만든 하둡
Hadoop
이라는 구현 (
http
://
hadoop
.
apache
.
org
)에 영감을 줬다.
2000
년대 말 여러 다른 회사에서 점점 커지는 자신의 데이터를 저장하고
분석하기 위해 채택하기 시작하면서 하둡은 매우 빠르게 유명해졌다. 파일시스템은
HDFS
Hadoop
Distributed
File
System
(하둡 분산 파일시스템 )다.
오늘날 거대한 데이터 집합을 소유한 조직들은 종종 하둡과
NoSQL
데이터베이스를 혼합해서
다양한 애플리케이션에 사용한다. 비용을 절감하면서 데이터 웨어하우스
data
warehouse
구축하
다른 오프라인’ 분석을 진행하는 것부터 시작해서, 대규모 트랜잭션 처리에 이르는 애플
리케이션이 그런 범주에 들어간다.
여러 데이터 집합이 실제로는 그다지 크지 않으므로 빅데이터잘못된 명칭일 수도 있다.
지만 빅데이터 도구라고 불리는 것의 유연성과 저렴한 가격이 다양한 근원으로부터 다양한 형
태의 데이터를 저장, 통합, 분석할 유용하다는 사실을 알게 되었다.
이번 장의 나머지 부분에서는 이런 계산 엔진에 초점을 맞춰 맵리듀스 기반의 도구가 어떻게
화해왔는지, 그리고 맵리듀스가 점차 다른 개선된 후계자로 대치되고 있는 이유에 대해 설명
것이다. 그런 변화의 중심과 전면에 스칼라가 자리 잡고 있다.
대부분의
NoSQL
데이터베이스는 스칼라
API
제공한다. 하지만 그런
API
대부분은 같은
도구에서 제공하는 자바
API
와 비슷한 전통적인
API
다. 이런 식으로 스칼라를 덧붙이는 것에
불과한 이해하기 쉬운 주제를 다루기보다는, 더 파괴력 있는 생각인 함수형 프로그래밍을
용해서 데이터 중심의 애플리케이션을 단순하고 강력하게 만드는 방법에 초점을 맞출 것이다.
18.2
스칼라로 맵리듀스 개선하기
맵리듀스 자바
API
는 매우 저수준이며 사용하기도 어렵다. 단순하지 않은 알고리즘을 구현하
고, 좋은 성능을 얻으려면 특별한 전문성이 필요하다. 그 모델은 파일을 읽어서 데이터를 알고
리즘에서 처리하기 위한 키
-
값 쌍으로 변환하는
map
단계를 조합한다. 키
-
값 쌍을 클러스터
상에서 뒤섞으면서 동일한 키의 데이터를 한데 모은 다음, 마지막 처리 단계인 리듀스
reduce
수행한다. 많은 알고리즘에서는 여러
-
리듀스 ‘작업’을 순서대로 실행해야 한다. 불행히도
636
4
고급 주제 및 실전 응용
리듀스는 각 작업이 끝나고 나면 데이터를 디스크에 기록한다. 심지어 다음 단계의 작업에서
데이터를 메모리로 읽어 와야 하는 경우에도 그렇다. 거대한 데이터 집합에 대한 맵리듀스
작업에서 이런 왕복 디스크
I
/
O
비효율을 야기하는 주된 원인이다.
모든 입력 (예를 들어 텍스트 파일의 줄이라고 하자 )대해 출력
-
쌍의 개수가
0
있으므로, 맵리듀스의 실제로는 평평한
flat
map
이다. 리듀스일반적인 의미와
같다. 하지만 스칼라의 컨테이너가
flatMap
reduce
라는 콤비네이터만 제공한다고 생각해
보자. 둘만 사용해서 여러 변환을 구현하는 일은 매우 이상할 것이다. 설상가상으로, 거대한
데이터 집합에 대해 그런 변환을 효율적으로 수행할 방법을 이해할 필요까지 있다. 결론은 이렇
다. 원칙적으로는 거의 모든 알고리즘을 맵리듀스로 구현할 수 있지만, 실제로는 특별한 전문성
필요하고 프로그래밍도 어렵다.
캐스케이딩
Cascading
(
http
://
cascading
.
org
)하둡 맵리듀스를 기반으로 전형적인 데이터
리 문제를 위한 다양한 추상화를 제공하는 가장 잘 알려진 자바
API
다. 그것은 맵리듀스에서
저수준의 자세한 내용을 상당부분 감춰준다(이 책을 쓰는 시점을 기준으로 할 때, 맵리듀스를
제거할 있는 대체용 백엔드가 개발 중이다 ). 트위터
Twitter
캐스케이딩 위에 스칼라
API
스캘딩
Scalding
(
http
://
bit
.
ly
/
1wNnkzG
)만들었으며, 또한 매우 유명해졌다.
고전적 알고리즘인 단어 세기살펴보자. 이는 하둡의
Hello
World
다. 문제는 개념적으
로 이해하기 쉽기 때문에
API
를 배우는 데 초점을 맞출 수 있다. 단어를 셀 때는 문서의 뭉치
병렬 작업으로 읽어온다 (보통은 작업이 한 파일을 처리한다). 본문을 단어로 나누고,
각각의 작업은 자신이 처리한 문서의 단어 빈도세서, 모든 (단어, 빈도 ) 쌍으로 이루어진
시퀀스를 반환한다. 가장 간단한 구현에서는 맵퍼
mapper
가 단어와 마주칠 때마다 (단어,
1
)
만들어낼 수도 있다. 하지만 (단어, 빈도) 쌍만 만들어내서 클러스터에서 리듀서
reducer
보내
위해 뒤섞어야 하는
-
쌍을 최소화하는 성능 최적화를 있다. 알고리즘에서는
키로 사용한다.
뒤섞기 과정은 단어가 같은 쌍을 모아서 리듀서 작업에 보낸다. 리듀서에서는 최종 횟수를 계
산해서 기록을 디스크에 다시 쓴다. 그래서 (
Foo
,
1
) 튜플을
10
쓰는 것이나 (
Foo
,
10
)
플을 한 번 쓰는 것이 논리적으로 같다. 덧셈은 결합 법칙성립하기 때문에
10
개의
Foo
퍼에서 합치건 리듀서에서 합치건 문제가 되지 않는다.
단어 세기를 자바 맵리듀스, 캐스케이딩, 스캘딩의 가지
API
구현해서 비교해보자.
637
18
스칼라를 활용한 빅데이터
NOTE
_
여기서 다룰 예제들을 빌드하고 실행하기 위해서는 많은 추가 의존성이 필요하다. 하지만 포함된
도구 중 일부는 아직 스칼라
2
.
11
지원하지 않는 것도 있다. 그런 파일은 확장자에 ‘
X
를 붙여서
sbt
파일하지 않도록 했다. 각각을 어떻게 빌드하고 실행해야 하는가에 대해서는 예제 밑의 각주를 참조하라.
지면을 절약하기 위해 하둡 맵리듀스 버전의 일부분만 보여줄 것이다. 전체 소스 코드는 책의
예제를 내려받으면 들어 있다.
1
//
src
/
main
/
java
/
progscala2
/
bigdata
/
HadoopWordCount
.
javaX
...
class WordCountMapper extends MapReduceBase
implements Mapper
<
IntWritable
,
Text
,
Text
,
IntWritable
>
{
static final IntWritable one
=
new IntWritable
(
1
);
static final Text word
=
new Text
;
@
Override public void map
(
IntWritable key
,
Text valueDocContents
,
OutputCollector
<
Text
,
IntWritable
>
output
,
Reporter reporter
)
{
String
[]
tokens
=
valueDocContents
.
toString
.
split
("\\
s
+");
//
for
(
String wordString
:
tokens
)
{
if
(
wordString
.
length
>
0
)
{
word
.
set
(
wordString
.
toLowerCase
);
output
.
collect
(
word
,
one
);
}
}
}
}
class WordCountReduce extends MapReduceBase
implements Reducer
<
Text
,
IntWritable
,
Text
,
IntWritable
>
{
public void reduce
(
Text keyWord
,
java
.
util
.
Iterator
<
IntWritable
>
counts
,
OutputCollector
<
Text
,
IntWritable
>
output
,
Reporter reporter
)
{
int totalCount
=
0
;
while
(
counts
.
hasNext
)
{
//
totalCount
+
=
counts
.
next
.
get
;
}
output
.
collect
(
keyWord
,
new IntWritable
(
totalCount
));
}
}
1
주_ 하둡자습서 (
the
Hadoop
tutorial
,
http
://
bit
.
ly
/
10FjLBZ
)에서다른구현을볼수있고,하둡애플리케이션을빌드하고실행하는
방법에대해배울수있다.또한『
Hadoop
:
The
Definitive
Guide
,
Third
Edition
』(
Tom
White
저,
O
Reilly
)을보라.

Get 프로그래밍 스칼라: 실용적인 스칼라 활용법을 익히는 가장 확실한 실전 바이블 (2.11.x 버전 기반) now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.