하둡 Hadoop 서버 구축 및 대용량 데이터를 위한 분산 컴퓨팅 서버 구축 - Whitmem
하둡 Hadoop 서버 구축 및 대용량 데이터를 위한 분산 컴퓨팅 서버 구축
빅데이터 프로그래밍
2025-06-26 23:32 게시 007d57b6d74f05ecfe36

0
0
12
이 페이지는 외부 공간에 무단 복제할 수 없으며 오직 있는 그대로 게시되며 부정확한 내용을 포함할 수 있습니다. 법률이 허용하는 한 가이드 라인에 맞춰 게시 내용을 인용하거나 출처로 표기할 수 있습니다.
This page is not to be distributed to external services; it is provided as is and may contain inaccuracies.
이번 게시글에서는 기본적인 Hadoop 이 무엇인지, 또 원리는 무엇인지에 대해서 알아보고 Ubuntu 운영체제에서 이 하둡 소프트웨어를 설치하는 방법에 대해서 알아보고자 한다.
하둡 소프트웨어를 설치한 뒤 노드 서버를 분산 구성하여 각 여러 서버에서 기록과 같은 파일들을 분산 관리하고, 사용하는 방법에 대해서 알아본다.
소프트웨어 개발을 오래 공부해왔지만 하둡과 같은 대용량 자료 처리 플랫폼은 거의 처음 공부해본다. 보통 개인이 혼자서 대용량 데이터를 분산 컴퓨팅까지 하며 처리할 필요가 거의 없기 때문인데, 막상 찾아보니 복잡한 개념은 아닌 듯 싶다. 내가 자바로 분산 컴퓨팅을 개발해야 한다고 하더라도 이런식으로 개발할 것 같긴 하다...... 우선 이런 전통 도구가 있으니 공부하는게 맞을 듯 싶어 시험 구축해보았고, 다음에는 제공하는 API를 사용해보기로 한다.
Hadoop이란
하둡은 기본적으로 자료를 분산 보관하고 각 자료에 대한 통계 처리 및 분석 처리를 분산 컴퓨팅할 수 있도록 도와주는 소프트웨어이다. 보통 Hadoop 만을 단독으로 사용하지 않고 외부 도구를 엮어서 같이 활용하는데, 파일 시스템을 제공하고 분산 처리를 제공하는 서비스라고 생각하면 편하다. 즉 Hadoop 을 단독적으로 실행할 수는 있으나 보통은 단독적으로 사용하지 않는다. 우리가 하드디스크를 FAT32 로 포맷하면 내부적으로 FAT32 구조에 따라 파일 시스템이 처리되고 여기에 파일을 생성하고 복사, 자동화 도구를 사용해서 자동 백업등을 할 수 있듯, Hadoop 은 자체 분산 파일 시스템인 HDFS 를 제공하고, 분산 스케쥴링 등의 처리를 수행하는 역할을 한다. 물론 이 자체 파일 시스템 HDFS 의 특징이 존재하는데, 쌓아진 데이터를 원하는 대로 프로그래밍하여 분산 컴퓨팅을 할 수 있다는 점이 매력적이라서 그런지, 대용량 데이터를 수집하는 서비스(검색 엔진 등)에서 종종 사용하는 것으로 보인다.
기본적으로 네임 노드는 파일 시스템의 메타 데이터를 관리 처리 하는 서버, 데이터 노드는 실제 파일이 분산 저장된 스토리지 영역이라고 생각하면 된다. 네임 노드 서버에 데이터 노드를 포함해서 단독으로 사용할 수도 있다.
위 구조를 보면 알 수 있다시피 기본적으로 하둡은 마스터 - 슬레이브 구조로 구성된다. 네임 노드에서 각 데이터노드에 실제 데이터 조각을 요청하고 불러오는 작업 등을 수행할 수 있다. 다만, 데이터 노드의 서버에서도 네임 노드 정보를 기입하기 때문에, 파일 업로드, 저장, 다운로드, 삭제, 생성 등의 요청을 하면 네임 노드에 전달되어 결과적으로 모두 분산 처리 된다.
마스터 서버 세팅
아무튼 마스터 서버에는 네임 노드와 데이터 노드를 세팅하려고 한다. 기본적으로 하둡은 SSH 통신도 같이 사용한다고 한다.. 따라서 비밀번호 없이 공개키로 인증할 수 있어야 한다.
계정 설정
따라서 우선 하둡 처리를 위한 기본 계정을 생성한다.
#adduser hadoop #usermod -aG sudo hadoop
하둡용 사용자 계정을 생성하고 sudo 가능한 권한으로 부여한다. 비밀번호는 아무거나 하였다. 어차피 SSH 접속시에는 공개키 개인키가 있으면 가능하기 때문에 상관 없다. 물론 SSH 세팅 /etc/ssh/sshd_config 에서 publickey 로 엑세스를 할 수 있도록 해 줘야 한다.
다만 SSH 서버의 기본 값 설정은 Public Key 엑세스가 yes 이기 때문에 상관은 없다.
이제 방금 생성한 hadoop 계정으로 로그인하고, 다음으로 SSH Keygen을 사용해서 RSA 비대칭 암호키를 생성한다.
우선 방금 생성한 계정에 로그인한 뒤 $ls -al ~/ 를 쳐보면 hadoop 계정의 기본 홈 디렉터리 정보가 뜨는 것을 확인할 수 있다.
ssh-keygen -t rsa
이 상태에서 비대칭키를 생성해야 한다.
그러면 방금 계정 디렉터리 안에 .ssh 디렉터리가 생성되고,
id_rsaid_rsa.pub 쌍이 생성된 것을 확인할 수 있다. 이 쌍은 개인키, 공개키 쌍으로, 개인키는 id_rsa 라는 파일 명으로 내비두고, 공개키는 authorized_keys 라는 파일에 똑같이 등록해줘야 한다.
cp id_rsa.pub authorized_keys
즉 id_rsa 공개키를 authorized_keys 에 붙여넣어준다.
이러한 작업을 하는 이유는 현재 마스터 서버로 생성하는 서버는 네임 노드, 데이터 노드 둘다 설치하기 때문에 내부적으로 ssh 접속을 로컬 호스트로 시도한다. 즉 개인키로 엑세스를 시도할 것이기 때문에 id_rsa 파일은 개인키로 내비두고, 공개키를 authorized_keys 에 등록하면 로컬 ssh 에서 로컬 ssh 서버로 접속할 때 hadoop 계정(계정안에 소프트웨어를 설치하고 bashrc 를 등록할 것이기 때문이다.)의 개인키 id_rsa 를 사용해 접속을 시도하고, 로컬 ssh 서버는 상기 개인키에 대한 공개키가 authorized_keys 에 등록되어 있으므로 접속이 허가 된다. 즉 나중에 데이터 노드를 만들 때는 공개키만 가져와서 네임 노드 서버의 공개키에 대해 엑세스를 허가해주면 된다. 즉 헤더, 메타 데이터 모든 요청은 네임 노드의 셀을 거쳐서 ssh 접속 시도 된다고 보면 무방하다.
필요 구성요소 설치 및 설정
이제 마스터 서버에 필요 구성요소를 설치할 차례인데, 먼저 자바 환경을 설치해야 한다. 하둡 소프트웨어는 자바로 개발되었기 때문에 자바 머신을 사용하며, 여기서는 자바 11 버전을 설치하였다.
sudo apt-get install openjdk-11-jre-headless
이제 하둡을 내려받을 차례이다.
하둡은 기본적으로 우리가 방금 만든 hadoop 계정 내에 hadoop 디렉터리를 만들어 안에서 작업하기로 한다. 필자의 경우 hadoop 계정 내에 hadoop 디렉터리 안에 bin 와 같은 파일들이 있게끔 다운로드 받고 압축을 풀었다.
즉 hadoop 계정 디렉터리 내 hadoop 디렉터리 명으로 하나 더 있고 이 안에 파일들을 넣었다. 하둡을 다운로드 받기 위해서 아래 명령어를 참고한다.
wget https://dlcdn.apache.org/hadoop/common/hadoop-3.4.1/hadoop-3.4.1.tar.gz
그리고 이렇게 내려받아진 하둡 파일의 압축을 푼다.
tar -xvzf hadoop-3.4.1.tar.gz
그리고 hadoop 계정 내 hadoop 디렉터리 안에 구성요소들이 존재하도록 이동한다. 필자는 cp -rf 명령어를 사용했다. 이렇게 모두 옮겨준 다음에 hadoop 계정에 해당 디렉터리 권한을 부여한다.
sudo chown -R hadoop:hadoop /home/hadoop/hadoop
이제 기본 환경 변수 설정을 진행해야 하는데, 해당 hadoop 계정 내 .bashrc 파일을 열어 수정해야 한다.
sudo vi 명령어로 바로 열거나 아래와 같은 명령어로 열 수 있다.
$sudo vi ~/.bashrc
유의 할 점은 sudo 계정에서 바로 .bashrc 를 열어버리면 관리자 루트 계정의 .bashrc 파일이 열리기 때문에, 사용자 hadoop 모드에서 sudo 권한을 즉시 부여하여 열도록 한다. 그냥 열면 엑세스 권한이 없어 저장할 수 없다.
제일 하단에 기본 환경 변수를 추가해야 한다. 이 계정의 ~/ 디렉터리 이후 hadoop 디렉터리 안에 실제 하둡의 구성요소가 존재하기 때문에 기본 하둡 디렉터리는 ~/hadoop 으로 지정한다. 위 각 환경 변수 이름들은 하둡 소프트웨어에서 사용하는 기본 환경 변수를 지정하는 코드로, 해당 bash 에 접속하면 자동으로 환경 변수가 설정되게끔 하는 코드이다.
export HADOOP_HOME=~/hadoop export HADOOP_INSTALL=$HADOOP_HOME export HADOOP_MAPRED_HOME=$HADOOP_HOME export HADOOP_COMMON_HOME=$HADOOP_HOME export HADOOP_HDFS_HOME=$HADOOP_HOME export YARN_HOME=$HADOOP_HOME export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
기본 하둡 기본 홈 경로를 지정하고, 공통 구성 요소 정보를 지정한다.
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
위 환경 변수는 해당 계정의 bash 어디에서든지 하둡 명령어를 사용할 수 있게끔 bin 과 sbin 디렉터리를 PATH 변수에 추가 등록하는 것이다. 이외 JAVA_HOME 경로도 지정해줘야 한다.
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 export PATH=$PATH:$JAVA_HOME/bin
하단에 마저 작성해준다. 본인이 설치한 자바 버전이 OPENJDK 11이 아닌 경우 또는 amd64 버전이 아닌경우, 해당 버전이 존재하는 홈 디렉터리를 지정해야 한다. 그리고 현재 bashrc 를 적용하는 명령어를 입력하여 변경 사항을 즉시 반영한다.
source ~/.bashrc
환경 변수가 제대로 등록됐는지 확인하기 위해 echo $HADOOP_HOME 명령을 입력했을 때 아까 지정한 기본 하둡 경로가 뜬다면 문제 없이 설정이 완료된 것이다. 다만 필자의 경우 자바 경로 관련 문제로 오류가 계속 발생하여 하둡 소프트웨어 내부 환경 설정에도 JAVA_HOME 의 경로를 수동 지정해줄 필요가 있었다. 이제 하둡 소프트웨어 경로 안으로 들어오면, etc 디렉터리가 존재하는 것을 확인할 수 있는데, 들어가서 hadoop 디렉터리를 들어가면 아래와 같은 파일 목록이 존재한다.
여기서 hadoop-env.sh 파일을 vi 에디터로 열어 JAVA_HOME 환경 변수를 추가해줘야 한다.
친절하게 JAVA_HOME 을 입력하는 부분이 주석 처리되어 있는데, 아래에 JAVA_HOME 을 지정하는 라인을 bashrc 와 동일하게 하나더 입력하였다.
이제 필수적 설정은 모두 완료되었다.
이제 실질적 사용을 위한 노드 세팅을 진행해야 한다.
하둡 기본 구성 설정
기본적인 노드 설정은 모두 방금 JAVA_HOME 을 지정한 hadoop 내 etc 디렉터리 내 hadoop 디렉터리에서 진행할 수 있다. 잘 찾아보면 hdfs-site.xml 파일, core-site.xml이 존재하는데 이 파일에서 각 노드 정보를 지정할 수 있다. 이외 yarn 도 지정해서 리소스 관리자 정보를 기입해야하는 것으로 보이는데, 아직 이 부분은 정확하지 않아 기본 값을 입력하기로 한다.
$vi ~/hadoop/etc/hadoop/core-site.xml
위 파일을 연 다음 configuration 섹션 안에 다음 코드를 집어넣는다.
<property> <name>fs.defaultFS</name> <value>hdfs://네임노드_호스트주소:9000</value> </property>
호스트 주소를 시스템 자체 hosts 에 등록했다면 해당 DNS 나 네임을 입력해도 된다. 하지만 여기서는 그런 과정은 생략했기 때문에 아이피 주소로 입력하였다. 필자는 VMWare 가상화 도구의 NAT DHCP 서버가 발급해준 A 서버의 아이피 주소를 입력했으며, 로컬을 의미하더라도 나중에 분산 접속을 허용하기 위해서는 외부 아이피 형태로 적어야 외부 아이피로 바인딩 된다.
즉 단일 서버로 운영할 예정이라면 여기서는 localhost 로 해도 큰 지장이 없으나 defaultFS 시스템 즉, 네임 노드 서비스가 로컬로 바인딩되어 추후 확장시 접근할 수 없음에 유의해야 한다.
$vi ~/hadoop/etc/hadoop/hdfs-site.xml
다음으로는 hdfs-site 를 설정하는데 여기서는 각 네임 노드, 데이터 노드와 같은 디렉터리 정보를 기입할 수 있다. 이외 replication 이라는 것도 지정할 수 있는데, 분산 시스템에 블럭을 몇 쌍으로 복제할 것인지에 대한 정보이다. 1이면 각 블록에 대해 1개만 생성하고, 2면 여러 노드 등을 거쳐 최대 2개 블럭이 분산 저장되는 것을 의미한다.
<property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:///home/hadoop/data/hdfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:///home/hadoop/data/hdfs/data</value> </property>
dfs.namenode.name.dir 는 네임 노드 정보가 어디에 어떻게 저장될 것인지에 대한 것이고, dfs.datanode.data.dir 는 데이터 노드 정보가 어디에 어떻게 저장될 것인지에 대한 것이다. 그냥 경로 지정해주고 해당 경로에 hadoop 사용자 계정 권한을 주면 된다.
mkdir -p /home/hadoop/data/hdfs/data mkdir -p /home/hadoop/data/hdfs/name chown -R hadoop:hadoop /home/hadoop/data
다만 경로에 띄어쓰기나 한글이 들어가면 안된다.
$vi ~/hadoop/etc/hadoop/yarn-site.xml
<property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property>
다음으로 yarn-site.xml 에 yarn.nodemanager.aux-services를 설정하는데, 아무튼 내부 처리에 필요한 설정으로 보인다. MapReduce 작업 전 Mapping 후 Shuffle 과정에서 그 결과를 나누어주는 역할에 대한 서비스를 지정하는 것으로 보인다. Mapping 과 Reduce 작업은 각각 무엇인지에 대해서는 다음 게시글에서 자바 언어로 처리자를 구현하며 알아보기로 한다.
vi ~/hadoop/etc/hadoop/worker
여기서는 이제 실제 노드의 호스트 네임 주소 목록을 입력하면 된다. 여기서는 단일 노드로 구성하는 것이 아니라 마스터 서버(192.168.86.130)는 네임 노드와 데이터 노드를 포함하고, 이외 데이터 노드만 처리하는 서버(192.168.86.131)이므로 두 아이피 주소를 적어준다.
슬레이드 서버 세팅
필자는 분산 구성을 하기 위해 똑같은 세팅으로 서버를 하나 더 구성하여 dataname 노드 부분만 모두 A 서버의 주소인 192.168.86.130 을 입력해 넣어 세팅을 완료하였다.
자바 세팅, 환경 변수 세팅, YARN 세팅, CORE-SITE, HDFS-SITE 세팅은 모두 같게 하였다. 물론 data 노드이기 때문에 name 노드 관련된 설정은 제외하였다.
아무튼 두 서버다 core-site 의 fs.defaultFS 는 마스터 서버의 네임 노드 아이피 주소를 가르키게끔 세팅한다.
이제 각 노드들에서 start-all.sh 명령을 입력하여 하둡 서버를 실행한다. 이후 sudo netstat -tulnp 명령을 통해 현재 사용 중인 포트 정보를 조회해보면 Java 프로그램에서 다양한 서버 포트들을 사용하는 것을 확인할 수 있다. 이때 메인 HDFS 네임 노드 서버는 9000번 포트이다.
그렇기 때문에 9000번 포트는 마스터 서버에서만 실행중인 것을 확인할 수 있고, 데이터 노드쪽 슬레이브 서버는 요청이 발생하면 위 마스터 서버의 9000번 포트에 접속하여 명렁을 수행하게 된다.
파일 조회
필자는 임의로 하둡 분산 시스템 안에 여러 파일을 등록해봤는데 우선 기본 조회 명령어는 아래와 같다.
hdfs dfs -ls 경로
하둡이 설치되고 세팅된 시스템 어느 노드에서든 사용할 수 있다.
위 사진은 서로 다른 복제본 운영체제 즉, 마스터 노드와 데이터 노드에서 각각 명령어를 쳐본 결과이다. 동일한 파일 구조가 반환되는 것을 확인할 수 있다. 즉 데이터 노드는 네임 서버를 거쳐 요청한 뒤 데이터를 가져온 것이다.
참고로 하둡 시스템 내 경로는 루트부터 시작하며 / 뒤 원하는 경로를 붙이면 된다. 리눅스 파일 시스템과 별개이다.
파일 업로드
필자는 테스트를 위해 임의 파일을 하나 로컬에 생성하였다.
hdfs dfs -put testfile /testfile
이후 위 명령어로 로컬 testfile 파일을 하둡 시스템 내 /testfile 경로에 업로드하였다.
이후 다시 조회하면 testfile 이 정상적으로 업로드된 것을 확인할 수 있다. 이 결과는 데이터 노드에서 조회해도 동일하다.
파일 제거
hdfs dfs -rm /testfile
디렉터리를 재귀적으로 제거하려면 -rm 인자 뒤에 -r 을 붙이면 된다.
이렇게 분산 시스템으로 구축된 하둡 기본 설정을 완료해보았다. 즉 분산 가능한 파일 시스템을 구축해본 것이며, 여기에 업로드하고 파일을 내려받을 수 있다. 물론 실시간 파일을 업로드하고 내려받기에는 적합하지는 않다. 하둡은 보통 String 문자열이나 비정형 데이터 등을 한번에 모아두고 일괄적인 처리가 필요할 때 유용하며 보통 통계 처리 또는 분석, 검색 처리할 때 사용하는 듯 싶다.
물론 이러한 알고리즘을 짜기 위해 각각의 서버에 코드를 일일이 업로드할 필요 없이 한 번에 실행해서 결과를 취합해주는 형태를 지니고 있는데 이 작업이 기본적인 MapReducer 이다. 하지만 MapReducer 은 기본적으로 Java 언어로 짜야할 뿐만이 아니라 코드가 생각보다는 복잡하다. 콜백 함수니 뭐니 클래스를 만들고 등록하고 구조에 맞게 작성해야 한다. (당연한 소리이다.) 하지만 최근와서는 다양한 플랫폼 또는 프레임워크 도구들이 이러한 작업을 간략하게 도와주는 것으로 보인다.
우선 어찌하였든 간에 이러한 하둡 시스템은 기본이고 다음 게시글에서 시도해볼 MapReducer 은 결과적으로 내부 API 를 다뤄보는 것이기 때문에 필요한 과정이라고 생각한다. 내부 구조를 공부하는게 목적이 아니라 당장 사용하는게 주 목적이라면 Java 언어로 MapReducer 을 맞춰 짜지 말고 Spark 등 라이브러리를 사용해서 다양한 언어로 바로 사용하는 것도 괜찮아보이나, 우선 위 API 로 구조를 파악해야 데이터가 어떤 흐름으로 취합되고 왜 이런 방식일 수 밖에 없는지 이해할 수 있을 것 같다
댓글 0개
댓글을 작성하는 경우 댓글 처리 방침에 동의하는 것으로 간주됩니다. 댓글을 작성하면 일회용 인증키가 발급되며, 해당 키를 분실하는 경우 댓글을 제거할 수 없습니다. 댓글을 작성하면 사용자 IP가 영구적으로 기록 및 부분 공개됩니다.
확인
Whitmemit 개인 일지 블로그는 개인이 운영하는 정보 공유 공간으로 사용자의 민감한 개인 정보를 직접 요구하거나 요청하지 않습니다. 기본적인 사이트 방문시 처리되는 처리 정보에 대해서는 '사이트 처리 방침'을 참고하십시오. 추가적인 기능의 제공을 위하여 쿠키 정보를 사용하고 있습니다. Whitmemit 에서 처리하는 정보는 식별 용도로 사용되며 기타 글꼴 및 폰트 라이브러리에서 쿠키 정보를 사용할 수 있습니다.
이 자료는 모두 필수 자료로 간주되며, 사이트 이용을 하거나, 탐색하는 경우 동의로 간주합니다.