udemy 강의 실습은 VM Virtual Machine을 사용하여, Hadoop 이미지(다양한 프로젝트가 미리 설치되어 있는)를 가져온다. 해당 이미지를 실행시키기 위해서는 8gb RAM이 필요한데, 내 노트북으로는 돌아가지 않는다... AWS 인스턴스를 만들어 직접 설치해볼까 했지만, 설치까지 하기엔 너무 많은 시간을 써야할 것 같다. 그래서 직접 실습하기 보다는 각 프로젝트가 어떤 기능이 있고, 어떤 식으로 돌아가는지 공부하는 걸 목표로 하기로 했다.
HDFS란 Hadoop Distributed File System의 약어다.
아주 큰 용량의 데이터를 저장할 수 있다.
저장된 데이터는 수정이 불가하여, 수정을 위해서는 해당 데이터를 삭제하고 수정된 데이터를 다시 저장해야한다.
데이터는 블록 단위(128mb~256mb)로 쪼개서 저장이 된다. 덕분에 쉽게 데이터를 찾거나, 복제 및 분산이 가능해진다.
Namenode와 Datanode로 역할이 나뉘며, Datanode는 실질적 데이터를 보관하는 역할을 하고, Namenode에서 데이터 파일과 경로에 대한 메타 데이터를 보관한다. 즉, 데이터가 어느 Datanode에 있는 지를 Namenode가 파악하고 있다.
Read: client에서 Namenode에 찾고자 하는 데이터 정보를 요청한다. 정보를 통해 데이터가 어느 Datanode에 존재하는 지 파악하고, 해당 Datanode에서 데이터를 가져오는 방식으로 작동한다.
Write: client는 요청을 통해 Namenode에서 정해준 Datanode에 데이터를 저장하게 된다. 그 후, 데이터는 복제되어 분산 저장이 되고, 그 결과 로그는 client를 통해 Namenode에 전달된다.
High Availability of Namenode: HDFS에서 Namenode는 정말 중요합니다. Namenode가 손상될 경우, 모든 데이터 정보를 잃게 됩니다. 단순하게 Namenode를 2개를 사용할 경우, Namenode가 가진 정보가 서로 다르게 되거나 데이터 유입의 혼선이 생길 수 있습니다. 그래서 Active, Stanby Namenode를 사용하게 됩니다. 일단 Namenode의 편집 로그 정보는 모두 안전한 공유 저장소에 저장됩니다. 그리고 Zookeeper는 Active Namenode가 작동하는 것을 확인하고 있으며, Stanby Namenode는 비활성화 상태로 어떤 노드와 소통하지 못하는 상태로 둡니다. Active Namenode가 손상될 경우, Stanby Namenode가 Active 상태로 변경되어 역할을 건내받습니다. 이러한 방식의 장점은 데이터 전체를 안전하게 지킬 수 있으며, HDFS를 항상 Active 상태로 둘 수 있습니다.
간단하게 빅데이터 분산 처리 기능이라고 할 수 있을 것 같다. MapReduce는 Map과 Reduce로 나뉘는데 각자의 기능은 다음과 같다.
예를 들어, 평점 텍스트의 경우, 평가자 id와 평점을 키-값으로 map에서 처리하고, reduce에서 데이터를 id 순으로 sort한 다음, 평가자 id가 같은 평을 모두 묶는다. 그리고 len함수를 통해 평가자의 평점이 몇개인지 반환한다.
Hadoop은 Java로 만들어져 있기 때문에 MapReduce도 Java로 작성해야 한다. 하지만 STREAMING을 사용하면 Python을 포함한 다양한 언어로 MapReduce를 작성할 수 있다.
다음은 mrjob 라이브러리를 사용하여 Python으로 MapReduce 코드를 작성한 것이다.
from mrjob.job import MRJob
from mrjob.step import MRStep
class RatingsBreakdown(MRJob):
def steps(self):
return [ MRStep(mapper=self.mapper_get_ratings,
reducer=self.reducer_count_ratings)]
def mapper_get_ratings(self, _, line):
(userID, movieID, rating, timestamp) = line.split('\t')
yield rating, 1 # 키-값으로 반환한다
def reducer_count_ratings(self, key, values):
yield key, sum(values)
if __name__ == '__main__':
RatingBreakdown.run()
위 코드는 Python cmd hadoop 환경에서 다음과 같이 실행할 수 있다.
$ python RatingsBreakdown.py -r hadoop --hadoop-streaming-jar /usr/hdp/current/hadoop-mapreduce-client/hadoop-streaming.jar u.data
-r hadoop : 하둡 환경에서 실행한다.
--hadoop-streaming-jar : hadoop-streaming.jar의 위치와 함께 streaming 사용한다는 것을 알린다.