*해당 글은 국민대학교 2020년 빅데이터 플랫폼 수업에서 배운 내용을 제가 이해한 내용을 바탕으로 작성했으며 pdf 내용을 그대로 사용하지 않았습니다.

 

1. 배경

 이전 글에서는 Hadoop과 MapReduce가 왜 연관이 되어 있는지에 대한 내용을 작성했습니다. 이번에는 Map과 Reduce의 기능을 살펴보고 MapReduce의 Map과 Reduce가 어떻게 동작하는지 알아보겠습니다.

 

2. Map

 MapReduce의 첫번째 단계인 Map입니다. Map은 input 데이터들에 대해서 공통의 작업을 실행해서 원하는 형태로 만들어 줍니다. 예를 들자면 어떤 하나의 리스트에 담긴 정수들을 절대값 형태로 바꾸고 싶다고 가정을 합시다. 그렇다면 이때 리스트 안에 있는 원소들에 대해서는 원소를 절대값으로 바꾸는 공통의 작업을 실행합니다. 이렇게 원소들에게 어떤 작업을 통해서 공통된 형태를 만들어 줄 때 Map을 사용합니다. 스칼라 코드로 예를 들면 List(-10, 3, -4, 1).map(x=> Math.abs(x))라는 코드를 작성하면 예를 든 리스트의 원소를 절대값 형태로 바꿔주는 Map 함수를 작성한 것입니다. 일반적으로 MapReduce에서의 Map은 input 데이터를 (key, value)형식으로 만들어주는 역할을 합니다. 즉 다시 스칼라 코드로 예를 들면 List(-10, 3, -4, 1).map(x=> (x,1)) 이런식으로 작성하며 이때 map함수를 거친 리스트의 결과 값은 List((-10,1), (3,1), (-4,1) (1,1))의 형태가 나타날 것입니다.

 

3. Reduce

 Reduce는 입력으로 주어진 리스트 또는 집합 원소에 주어진 함수를 실행해서 하나의 값으로 모으는 작업을 진행합니다. 스칼라 코드를 예를 들면 List(-10, 3, -4, 1).reduce((x,y)=> x+y)를 실행하면 리스트의 전체 원소의 합인 -10이 나옵니다. Reduce에서는 주의할 점이 있습니다. 윗줄의 scala코드에서 (x,y)를 입력으로 받는 것을 볼 수 있습니다. 처음보는 사람들은 x와 y에는 순서대로 값이 들어 갈 것이라고 예상하는데 그렇지 않습니다. 즉 List(-10, 3, -4, 1).reduce((x,y)=> x+y) 코드에서 -10+3+(-4)+1 순서로 계산이 될지 3+(-10)+1+(-4) 순서로 계산이 될지는 아무도 모릅니다. 즉 계산 순서의 변경으로 결과가 달라지는 함수를 정의해서는 안됩니다. 예를 들면 뺄셈, 나눗셈 등등이 있겠네요. MapReduce의 Reduce는 위에서 설명한 Map을 통해서 나온 (key, value)로 이루어진 리스트를 같은 키 값끼리 묶어서 계산하는 역할을 합니다. 이것이 이해가 안간다면 다음 문단에서 예시로 확인해도 되겠습니다.

 

4. MapReduce 활용

 MapReduce의 예제로는 WordCount를 이용해서 예를 듭니다. 다른 예로는 페이지 랭크 알고리즘이나 문서(또는 책)에서의 특정 키워드가 몇페이지에 나타나는지 알려주는데에도 사용이 됩니다. 여기에서도 WordCount를 예로들어서 설명을 하겠으며 WordCount에서 이해한 내용을 바탕으로 다른 예제를 어떤식으로 구현하면 될지 생각해보시는 것도 좋을거 같습니다.

 입력데이터는 "This is a peach and that is a apple"을 사용하겠으며 여기 문장에서 쓰인 단어들이 각각 몇개가 사용되었는지 알아보는 WordCount를 진행해보겠습니다. 언어는 scala를 통해서 진행하겠습니다.

 우선 입력 데이터가 우리가 원하는 단어 형태로 split이 되어 있는 것이 아니라 문장으로 들어왔습니다. 그렇다면 Map을 실행하기 전에 단어로 split해주는 작업이 필요할거 같습니다. .split(" ")을 사용하면 띄어쓰기로 split이 되므로 각 단어들을 원소로하는 리스트가 반환이 될거 같습니다. 그렇다면 결과 형태는 List("This", "is", "a", "peach", "and", "that", "is", "a", "apple") 입니다.

 이 상태에서 Map 과정을 실행할 것입니다. 각 단어를 key로, 사용된 횟수를 value로 사용하기 위해서는 리스트의 원소들을 (key, value) 형태의 튜플로 만들어줘야겠네요. .map(x=> (x,1))을 사용한다면 결과는 List(("This", 1), ("is", 1), ("a", 1), ("peach", 1), ("and", 1), ("that", 1), ("is", 1), ("a", 1), ("apple", 1)) 형태로 바뀔 것입니다. 각 단어들에게 value 1을 부여했습니다.

 다음으로는 Reduce 과정을 실행해서 같은 key값들의 value를 다 더해준다면? (각 단어, 나온 총 횟수) 형태로 바뀔 것입니다. .reduceByKey((x,y)=> x._2 + y._2)를 작성하면 value를 더한 형태가 반환 될 것입니다. 이렇게된다면 최종결과는 List(("This", 1), ("is", 2), ("a", 2), ("peach", 1), ("and", 1), ("that", 1), ("apple", 1))이 됩니다.

 

5. 글을 마치며

 이번 글에서는 Map과 Reduce가 어떤 기능을하며 MapReduce에서는 각각 어떤식으로 주로 사용되는지 알아보았습니다. Map과 Reduce 함수에 대해서는 코딩을 조금 해보신 분들은 다른 언어에서도 사용을 해보셔서 비슷하다고 느끼거나 별 내용이 없다고 느끼셨을거 같습니다. 맞습니다.. 아마도 처음보신 분들도 '별 내용없네' 라고 생각하셨을거 같지만..ㅎ 부족하지만 읽어주셔서 감사합니다.

'CS > 빅데이터' 카테고리의 다른 글

MapReduce? Hadoop? 둘이 다른거야?  (0) 2020.12.03

1. 글의 배경

 2016년 알파고와 이세돌의 대국이후에 인공지능에 대한 관심을 많이 받기 시작했습니다. 물론 전공자들은 이전부터 계속 개발을 하고있었지만, 대중들은 SF영화 속에서만 보던 인공지능의 성능을 직접 보고 느끼게 한 것은 알파고가 엄청난 역할을 한거 같습니다. 인공지능에 대해서 잘 모르셔도 인공지능에 대한 가벼운 지식을 가지고 있으신 분들은 인공지능이 알파고처럼 뛰어난 성능을 나타나게 하기위해서는 많은 데이터를 가지고 학습을 해야한다는 점을 아실 것입니다.

 인공지능이 떠오르면서 당연히 데이터에 대한 가치가 엄청나게 커졌고 빅데이터를 원하는 작업을 위해 변형하고 수정하는 것도 중요해졌습니다. 하지만 빅데이터를 가지고 작업을 한다는 것은 쉬운 일이 아닙니다. 혹시 100MB크기나 그 이상이 되는 txt파일을 열어본 적이 있으신가요? 좋은 성능의 컴퓨터를 가지신 분은 크게 불편한 점을 못느끼셨을 수도 있지만 저는 그렇게 좋은 성능의 컴퓨터를 가지고있지 않아서;; 저런 큰 용량의 파일을 열었을 때 컴퓨터가 버벅거리거나 멈춰버린 경험이 있었습니다. 그 파일가지고 변형하는 작업이 아니라 그저 파일을 연 작업만 했을 뿐인데 벌써부터 작업에 어려움이 발생했죠. 빅데이터를 가지고있기 위해서 많은 디스크 용량이 필요하고, 빅데이터를 가지고 작업하기 위해서는 메모리와 CPU의 성능도 중요합니다. 기업에서는 사업을 하기위해서 좋은 성능을 가진 컴퓨터나 장비를 마련할 수 있지만, 학생이나 일반 사용자들은 그런 장비들을 마련하기는 쉬운 일이 아닙니다. 또한 장비가 있더라도 이러한 작업을 가능하게해주는 소프트웨어도 필요하겠죠.

 빅데이터에 대한 중요성이 커지면서, 빅데이터를 가지고 작업할 수 있는 기술도 중요해졌다는 것은 알겠는데, 개인적으로 Hadoop과 MapReduce에 대해서 처음 들었을 때, 이 둘이 뭐가 다른건지 많이 헷갈려했습니다. 여러 블로그를 찾아보아도 이 둘의 설명을 혼동해서 적으신 분들도 많았고요. 이번 글에서는 빅데이터를 쉽게 다룰 수 있게 만들어준 MapReduce와 Hadoop에 대해서 개인적으로 이해한 내용을 토대로 작성해보겠습니다.

 

2. MapReduce와 Hadoop이 등장하기 전

 MapReduce와 Hadoop이 등장하기 전에 배경에 대해서 조금 알아볼 필요가 있습니다. 위에서 말했다시피 빅데이터를 다루는 것은 마냥 쉬운 일이 아닙니다. 과제가 밀렸을 때 한번 쯤은 몸이 여러개 였으면 좋겠다고 생각해보시지 않으셨나요? 그런 것처럼 큰 용량의 데이터를 변형하고 처리하기 위해서는 일을 분산하고 병렬로 작업하는 과정이 필요합니다. 그리고 큰 데이터를 처리하다보면 처리 시간도 오래걸리고 컴퓨터 성능에 따라서 컴퓨터가 멈춰버리거나 작업이 실패하는 경우도 종종 발생합니다. 실패하는 경우에는 어떻게 처리해줘야할까요? 그냥 소프트웨어가 꺼지거나 작업한 데이터가 날아가버리면 아무도 그 소프트웨어를 사용하지 않겠죠? 이렇게 실패(failure)에 대한 처리도 필요합니다. MapReduce와 Hadoop이 등장하기 전에는 분산 병렬 작업, 실패처리를 관리해주는 소프트웨어가 없었습니다. 그렇기 때문에 빅데이터를 가지고 작업하는 것은 너무 어려운 일이었죠. 그래서 MapReduce와 Hadoop이 등장했습니다. Hadoop은 위에서 말한 분산 병렬처리 와 실패에 대한 처리 문제들 해결할 수 있도록 해주었습니다. 또한 MapReduce는 분산 병렬처리된 작업들을 받아서 데이터를 작업해주는 역할을 합니다.(2006년의 하드웨어 가지고 이러한 소프트웨어를 만들어냈다니.. 이래서 성공한 기업이 아닌가 싶습니다.)

 

3. MapReduce? Hadoop?

 MapReduce와 Hadoop을 각각 검색해도 둘은 빠지지 않는 관계인거 같습니다. 그래서 이 둘이 같은 것인지 헷갈리는 사람들도 있고 이해를 잘못하는 경우도 있습니다. 조금 차이가 있긴 하지만 로고도 둘다 노란색 코끼리.. 머리가 아픕니다. 그렇다면 이 둘은 뭐가 다른 것일까요? 왜 이렇게 MapReduce를 설명하면 Hadoop이 따라오고 Hadoop을 설명하면 MapReduce가 따라오는 걸까요?

 먼저 MapReduce는 2004년 구글에서 대용량 데이터 처리를 분산 병렬 컴퓨팅에서 처리하기 위한 목적으로 제작한 소프트웨어 프레임워크입니다. MapReduce는 이름에서 나와있듯이 Map작업과 Reduce 작업으로 나눌 수 있습니다.

 Hadoop의 본명은 Apache Hadoop으로 대량의 자료를 처리할 수 있는 큰 컴퓨터 클러스터에서 동작하는 분산 응용 프로그램을 지원하는 자바 소프트웨어 프레임워크로서 2006년에 나왔습니다. 

 둘다 대량의 자료를 처리할 수 있게 만들어진거면 둘이 같은거냐? 아닙니다. 쉽게 이해하자면 Hadoop안에 MapReduce가 있다고 생각하시는게 이해하시기 편한거 같습니다. 빅데이터를 처리하기 위해서는 큰 용량과 분산, 병렬처리환경이 필요하다고 했습니다. 이렇게 빅데이터를 저장할 수 있는 큰 용량과 분산, 병렬처리 환경을 제공해주는 것이 Hadoop이고 그 안에서 분산된 데이터를 작업해주는 것이 MapReduce라고 생각하시면 될거 같습니다. Hadoop과 MapReduce의 안에서 각각 동작은 추후에 따로 작성하겠습니다.

 

4. 결론

 빅데이터에 대한 중요성이 커지면서 이러한 빅데이터를 변형하고 다루는 작업도 같이 중요해졌습니다. 하지만 이러한 빅데이터를 가지고 작업한다는 것은 쉬운 일이 아니었습니다. 큰 용량의 데이터를 처리함으로써 발생하는 문제점들이 많았거든요. 이렇게 개발자들이 어려움을 겪을 때 이 어려움들을 잘 처리해준 것이 Hadoop과 MapReduce입니다. 이상으로 이번 글도 마치겠습니다. 읽어주셔서 감사합니다.

'CS > 빅데이터' 카테고리의 다른 글

MapReduce 동작  (0) 2020.12.08

+ Recent posts