종묘와 사직의 그 종묘.
서울 종로구 종로 157 (훈정동)
알아도 삶에 도움 1도 안되는 얕고 잡스러운 지식, 그리고 쓸데 없는 이야기.
종묘와 사직의 그 종묘.
서울 종로구 종로 157 (훈정동)
서울특별시 종로구 사직로 161 (세종로)
2016년 가을. 이직을 준비하며 처음으로 ‘홀로’ 한국이 아닌 나라로 향했다.
원체 게으르기도 하고, 준비하고 계획 하는 것은 몸에 안맞는 터라 당연히 계획 따위는 없었다. 다행이라면 다행이랄까, 내년엔 꼭 해외여행을 가리라 마음 먹고 여권을 만들 었던 것이… 아마도 이마저도 없었다면 지금 이곳이 얼마나 사랑스럽고 아름 다운 곳인지 꿈에도 깨닿지 못했을 터.
사직서를 제출하기 전 두어달 전부터 ‘어딘가 가야지 ‘ 고민만하다 하루하루 시간은 흐르고 결국 퇴직일 보름 전에 이르러서야 부랴부랴 갈 곳을 찾기 시작했다.
무식하면 용감하다 했던가 ‘비행기 탈 때는 신발 벗어야 해요?’ 수준의 무식함으로 비행기 표를 끊었다. 정말이지 용감했다. 내 손으로 여권을 내밀어 본적은 단 한번도 없었다. 당연히 해외여행 시 주의 해야 할 것이라던가 전혀 아는 것이 없었으니…. 심지어, 캐리어 조차 없었다…. 다행히 동생이 가지고 있었으니 망정이지..
아, 심지어 숙소 예약조차 출국 전날 밤 11시에 했다.
아무튼, 그렇게 용감하게 집을 나서 공항으로 향했다.
인천공항이야 내 나라의 공항이니 내 나라의 언어요 문자인지라 ‘다행히도’ 출국 수속을 마치고, 비행기에 오를 수 있었다. (그리고 또 다행히도, 비행기가 처음은 아니었다.)
문제 없이 하늘로 올라갔던 비행기는 상처 없이 날 타이페이의 타오위안 공항에 내려줬고, 막강한 힘을 지닌 대한민국 여권은 날 ‘Hello’ 와 ‘Thank you’ 이 문장만으로 타이페이에 입국 시켜줬다.
얼마나 다행인가.. 구글 번역기가 없었더라면 가방조차 못 찾았을 터인데.. 어찌어찌 캐리어를 찾고, 구글 지도를 열고 무작정 지도를 따라 걷기 시작했다.
(이 숙소까지의 걸음이 내 여행 스타일이 될 줄이야…)
10월 중순인데도 더웠던 날씨는 날 땀범벅으로 만들었고, 시내 한복판에서 엄마를 잃어버린 아이와 같은 기분을 느끼게 해줬다. 모든 것이 생소했고 신기했다. 아는 이도, 대화를 할 수 있는 이도 없는 이 도시에서 내가 할 수 있는 것은 오로지 하나, ‘걸어서 내가 예약 한 게스트 하우스에 도착하는 것’. 용감함에 대한 보상이었을까 아니면 운이 좋았던 것일까, 대만은 내 나라 대한민국만큼 안전한 나라였고 타국 땅에서 말한마디 할 줄 모르는 30대의 어른아이를 괴롭히지는 않았다.
30여분을 걸었을까.. 난 생에 첫 여행의 첫번째 목표인 ‘숙소 찾기’ 퀘스트를 완료할 수 있었다. 삐쭉삐쭉 게스트하우스 안으로 들어갔고, 되지도 않는 영어로 체크인을 시도하고, 열쇠를 받았다. (오예!)
일단 캐리어와 가방을 대강 정리해서 사물함에 넣고 또한번 무작정 거리로 나가는 순간, 두 명의 외국인이 내 뒤를 따라 게스트하우스에서 나오며 내게 말을 걸어왔다.
외국인 : “안녕, 너도 여행을 왔구나, 어디서 왔니?”
나 : (두려움에 떨며)”안녕, 난 한국에서 왔어. 너희는 어디에서 왔니?”
외국인 : “우린 OO(기억 안남)에서 왔어, 우리 지금부터 101 타워에 갈건데 너도 같이 갈래?”
나 : (처음 본 날 데리고 어딜 가겠다고???) 우물쭈물…
외국인 : ” 우린 택시를 불렀어 택시를 타고 갈꺼야! 같이 가자”
나 : (다시 또 두려움에 떨며..) ” 아니야, 난 오늘 101타워에 가지 않을꺼야, 아마도 모레쯤?”
외국인 : (쿨하게) ” 그래 그럼 아쉽지만 어쩔 수 없지. 즐거운 여행이 되길 빌께 안녕!”
나 : (안도의 한숨을 쉬며) “그래 너희도! 안녕”
(대충.. 이런 식의 대화였던 것 같다)
사실 그들과 함께 가지 않았던 것이 좋은 선택이었는지, 아닌지는 잘 모르겠다. 어쨌거나 약간의 아쉬움과, 약간의 안도감을 안고 구글 지도에 의지한 채 큰 도로로 향했다.
처음 만난 타이페이 거리의 모습은 ‘어릴적 TV에서 봤던 서울 + 일본’ 의 느낌이었다. 거리는 오토바이가 즐비 했고, 중국을 예상했던 것과는 다르게 매우 깨끗했고, 질서있는 모습이었다.
대만은 야시장이라 했던가, 우선은 가장 가까운 시장을 찾았다. 다행히도 멀지 않은 곳에 야시장이 있었고 그렇게 대한민국 촌놈은 걸어걸어 한 야시장에 도착했다.
Shuangcheng Street Night Market. (당시엔 이름도 모르고 무작정 걸었다)
아직은 해지기 전인지라 이제서야 장사를 준비하는 시점인지라 보는 것 말고는 할 것이 아무 것도 없었고, 더위에 지친 목을 축을 음료를 하나 사고 또다시 걷는 것 말고는 할 수 있는 일이 없었다.
1지금 그 때의 기억을 떠올려보니 굳이 그럴 필요 없었다. 저 사진을 찍은 시각이 17시 경이니까 대충 음료 한잔 먹고 쉬었어도 아무런 문제 없었는데…..
그렇게 일단 발걸음을 떼면서 다시 휴대폰을 들여다 봤다. ‘드디어! 이제서야!’ 타이페이 여행을 검색 했다. 여행을 오기 전에, 여행지에 도착해서 사람들이 어딜 가는지 찾아봤단거다.
그렇게 도착한 곳이 바로 Shilin Market. 금강산도 식후경이라 했던가. 일단 다들 그리도 맛있다 하는 ‘지파이’에 도전 했다.
맛있었다…
여행은.. 둘 이상 다녔어야 한다는 것을 첫날 저녁 지파이를 먹고 바로 깨닳을 수 있었다. 배가 불렀다… 먹을 것 천국인데, 더 먹을 수가 없었다. 이미 내 위장은 고등학교 시절 그 튼튼하던 위장은 아니었고, 이미 몸은 지쳤어도 아직은 숙소로 돌아갈 수 없었다. 왜? 시간이 아까우니까.
그렇게 홀로 야시장을 배회하다 만난 절.
한국인 입장에서는 나름 신기한 풍경이었다. 그도 그럴것이 한국의 절은 대부분 산속에 있으니까. 한참을 헤집고 다닌 북적거리는 시장 한 가운데에 절이라니..
(왜 시장 한가운데에 절이 있는지는 삼일째가 되어서야 알 수 있었다.)
그렇게 또 얼마나 걸었을까… 이미 게으름에 찌든 내 몸은 더 움직일 수 없다는 신호를 보냈고 숙소로 돌아와 생에 첫 여행의 첫날을 마무리 해야 했다.
개요
Linux의 swap 메모리, swap 영역은 정확히 사전적 의미그대로의 영역을 말한다.
(윈도우는 가상 메모리)
CPU(Cache) – RAM – HDD (혹은 SSD를 포함하는 모든스토리지) 가 있는 컴퓨터는
사용자가 특정한 프로그램을 실행하면
1. HDD에서 필요한 데이터를 읽어서
2. RAM에 일정량을 저장하고
3. 다시 CPU의 Cache 메모리에 일정량을 저장하고
4. CPU에서 연산을 하고
5. 결과를 반환한다.
보통은 위 5단계에서 아무런 문제가 일어나지 않지만 요즘 게임을 하거나, 사진을 찍어서 편집을 하고 하다보면 메모리(RAM) 사용량이 늘어나는 것을 볼 수 있다.
예컨대 RAM이 4GB인데 동영상 편집을 할 때 동영상의 크기가 8GB를 넘어간다면?
바로 이 때 Paging(단편화1 복잡하게 생각 할 필요 없다. 책을 한권 램에 올려야 하는데 램의 크기가 작아서 페이지를 떼어서 올리는 것이라고 생각하면 된다. 우리가 실행하는 게임이건 포토샵이건 다 매 한가지다.) 이라는 작업이 일어나고 swapping 이 필요해 진다.
일단 동양상 편집을 위해 4GB램의 PC에서 8GB짜리 동영상을 로드하게 되면
1. 우선 HDD에 있는 8GB의 데이터 중 4GB의 데이터가 램으로 이동한다.
2. 사용자가 현재 램에 있는 4GB의 동영상 편집을 수행한다.
그런데 이 때 현재 램에 있는 4GB 말고 나머지 반쪽의 내용을 불러와야 한다면?
1. 현재 4GB의 동영상을 HDD의 스왑 파티션으로 이동한다. 2여기서 램에 있는 내용을 삭제 하지 않는 이유는 사용자가 아직 기존에 램에 있던 4GB의 데이터의 작업을 완료하지 않았기 때문이다.
2. HDD에 남아있던 나머지 뒤쪽 4GB를 램에 올린다.
3. 다시 편집 작업을 한다.
그래서 보통 물리 메모리(RAM)의 1배~2배 정도로 설정을 하는데 익히 알고 있다시피 HDD건, SSD건 RAM보다 느린데다가, swap 되는 데이터의 크기 두배3RAM에 있는 데이터를 읽어서, swap에 쓰고 다시 HDD의 데이터를 읽어서 RAM에 올려야 하므로swap으로 만큼 읽고 쓰기가 일어나므로 swapping 이 잦아지면 작업 지연이 생길 수 밖에 없다. 4지금이야 대부분의 PC에 SSD가 달려있어서 잘 못느끼지만 HDD가 주류이던 시절 게임을 하다 지역 이동을 하거나 할 때 본체의 빨간불이 깜빡이며 열심히 HDD가 돌아가고 화면이 멈춰있거나 느려지거나.. 경험 했을 것이다.
swap 영역 해제
# 현재 swap 정보 확인 [root@centos7:~]# free -h total used free shared buff/cache available Mem: 62G 5.5G 54G 264M 2.9G 56G Swap: 31G 0B 31G [root@centos7:~]# blkid /dev/sda1: UUID="d8888888-80c0-4156-8b73-6b5323dd2c01" TYPE="xfs" /dev/sda2: UUID="p22222-84DI-Hvny-RZ7Z-FbHq-QBq2-tTl5yK" TYPE="LVM2_member" /dev/sdb1: UUID="45555555-0ca0-4b99-86b5-33e45689fc10" TYPE="xfs" /dev/mapper/centos-root: UUID="5999999-877a-4fe9-a464-5376cb476310" TYPE="xfs" /dev/mapper/centos-swap: UUID="2333333-b2d1-4f58-9123-865739a3c2eb" TYPE="swap" # 현재 swap 영역을 사용하고 있으면 해제할 수 없다. # swap 영역이 여러개일 때 [root@centos7:~]# swapoff /dev/mapper/centos-swap # 현재 모든 swap을 해제 할 때 [root@centos7:~]# swapoff -a # 해제 여부 확인. # swap 이 모두 0B인 것을 확인할 수 있다. [root@centos7:~:]# free -h total used free shared buff/cache available Mem: 62G 7.7G 52G 161M 3.0G 54G Swap: 0B 0B 0B
# swap 파티션 마운트 정보 변경 [root@centos7:~:]# vi /etc/fstab /dev/mapper/centos-root / xfs defaults 0 0 UUID=d675d2d3-80c0-1234-8j72-6b5323dd2c01 /boot xfs defaults 0 0 # type이 swap 인 파티션에 대해 주석 처리 해 준다. # 삭제 해도 된다. #/dev/mapper/centos-swap swap swap defaults 0 0 /dev/sdb1 /data xfs defaults 0 0
사전 작업
하둡을 구동할 계정은 hadoop, 그룹도 hadoop 으로 한다. hadoop 계정의 홈 디렉토리는 /home/hadoop 이다. 키-쌍 생성 관련 내용은 별도의 포스트를 통해 설명하겠다
# 사용자 생성 [root@hadoop01 ~]# useradd -g hadoop hadoop [root@hadoop01 ~]# su - hadoop [root@hadoop01 ~]# passwd hadoop hadoop 사용자의 비밀 번호 변경 중 새 암호: 새 암호 재입력: passwd: 모든 인증 토큰이 성공적으로 업데이트 되었습니다. #여기까지 모든 서버에서 작업한다.
# 키 쌍 생성 [hadoop@hadoop01 ~]$ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/home/hadoop/.ssh/id_rsa): Created directory '/home/hadoop/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/hadoop/.ssh/id_rsa. Your public key has been saved in /home/hadoop/.ssh/id_rsa.pub. The key fingerprint is: SHA256:kQyuv0LCUMDOBwicLr4VyFSskm0wYIGHLIv1pTbALF0 hadoop@centos7 The key''s randomart image is: +---[RSA 2048]----+ |%O=oE . | |XBO. ..o . | |O@+o o. + | |BBoo=. . | |++..o. S | | .o... | | oo . | | . . . | | .. | +----[SHA256]-----+ [hadoop@hadoop01 ~]$ chmod 700 ~/.ssh [hadoop@hadoop01 ~]$ cat ~/.ssh/id_rsa.pub >> authorized_keys [hadoop@hadoop01 ~]$ chmod 600 ~/.ssh/* [hadoop@hadoop01 ~]$ ls -l ~/.ssh/ 합계 12 -rw------- 1 hadoop hadoop 396 9월 14 15:32 authorized_keys -rw------- 1 hadoop hadoop 1675 9월 14 15:24 id_rsa -rw------- 1 hadoop hadoop 396 9월 14 15:24 id_rsa.pub # 하둡 클러스터로 사용할 모든 서버에 키를 복사하고 권한을 변경한다. [hadoop@hadoop01 ~]$ scp ~/.ssh/authorized_keys hadoop@hadoop02:/home/hadoop/.ssh/authorized_keys The authenticity of host 'hadoop02 (192.168.0.2)' can't be established. ECDSA key fingerprint is SHA256:nhIT6XvSamWF1mgXDkAuM64eZj5XCJww5T2NEojH2iU. ECDSA key fingerprint is MD5:7b:a5:40:02:c3:cd:0f:e7:36:77:dd:3c:cc:3b:ba:d2. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts. hadoop@hadoop02's password: authorized_keys [hadoop@hadoop01 ~]$ ssh hadoop02 chmod 700 /home/hadoop/.ssh [hadoop@hadoop01 ~]$ ssh hadoop02 chmod 600 /home/hadoop/.ssh/authorized_keys hadoop@hadoop02's password:
설치
Apache Hadoop 홈페이지에서 바이너리를 다운로드 하고 압축을 해제한다.
※ hadoop 계정으로 진행
[hadoop@hadoop01 ~]$ wget http://mirror.apache-kr.org/hadoop/common/hadoop-3.1.4/hadoop-3.1.4.tar.gz --2020-09-14 15:28:30-- http://mirror.apache-kr.org/hadoop/common/hadoop-3.1.4/hadoop-3.1.4.tar.gz Resolving mirror.apache-kr.org (mirror.apache-kr.org)... 125.209.216.167 Connecting to mirror.apache-kr.org (mirror.apache-kr.org)|125.209.216.167|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 348326890 (332M) [application/octet-stream] Saving to: ‘hadoop-3.1.4.tar.gz’ 100%[=====================================================================================================================================>] 348,326,890 37.9MB/s in 11s 2020-09-14 15:28:41 (30.1 MB/s) - ‘hadoop-3.1.4.tar.gz’ saved [348326890/348326890] [hadoop@hadoop01 ~]$ tar -xvzf hadoop-3.1.4.tar.gz hadoop-3.1.4/ hadoop-3.1.4/lib/ 중략 hadoop-3.1.4/libexec/mapred-config.sh hadoop-3.1.4/libexec/hadoop-config.cmd hadoop-3.1.4/libexec/hdfs-config.cmd [hadoop@hadoop01 ~]$ ln -s ~/hadoop-3.1.4 ~/hadoop [hadoop@hadoop01 ~]$ ls -l 합계 340164 lrwxrwxrwx 1 hadoop hadoop 12 9월 14 15:31 hadoop -> hadoop-3.1.4 drwxr-xr-x 9 hadoop hadoop 169 9월 14 15:31 hadoop-3.1.4 -rw-rw-r-- 1 hadoop hadoop 348326890 8월 24 21:40 hadoop-3.1.4.tar.gz drwxrwxr-x 2 hadoop hadoop 6 9월 14 15:22 perl5 #나머지 노드에서 모두 동일한 작업을 수행한다. (다운로드, 압축 풀기, 심볼릭 링크 생성)
[hadoop@hadoop01 ~]$ vi ~/.bas_profile # 여기부터 파일의 맨 뒤에 붙여넣기 한다. export HADOOP_HOME=/home/hadoop/hadoop export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin [hadoop@hadoop01 ~]$ source ~/.bas_profile 나머지 노드들에서 동일하게 수행 해 준다.
설정
# Hadoop 환경변수 설정 (하둡이 구동될 때 읽어들이는 환경변수) [hadoop@hadoop01 ~]$ vi $HADOOP_HOME/etc/hadoop/hadoop-env.sh # 기존 내용을 모두 지우고 여기서부터 붙여넣기 한다. export HADOOP_HOME=/home/hadoop/hadoop export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop # 시스템 사양에 맞추어 적절히 증감한다. export HADOOP_HEAPSIZE_MAX= 8g export HADOOP_HEAPSIZE_MIN=8g export HADOOP_OS_TYPE=${HADOOP_OS_TYPE:-$(uname -s)}
# core-site.xml [hadoop@hadoop01 ~]$ vi $HADOOP_HOME/etc/hadoop/core-site.xml <!-- 모두 지우고 여기서부터 붙여넣기 한다. --> <configuration> <property> <name>fs.defaultFS</name> <value>hdfs://hadoop01:8020</value> <!-- 기본 HDFS 주소. 예를 들어 "hdfs dfs -ls / " 를 수행하면 / 앞에 value의 주소가 들어간다고 이해하면 된다 --> </property> <property> <name>hadoop.proxyuser.hive.groups</name> <value>*</value> </property> <property> <name>hadoop.proxyuser.hive.hosts</name> <value>*</value> </property> </configuration>
# hdfs-site.xml [hadoop@hadoop01 ~]$ vi $HADOOP_HOME/etc/hadoop/hdfs-site.xml <!-- 모두 지우고 여기서부터 붙여넣기 한다. --> <configuration> <property> <name>dfs.replication</name> <value>3</value> <!-- 데이터 복제 횟수 --> </property> <property> <name>dfs.namenode.name.dir</name> <value>/home/hadoop/namenode</value> <!-- 로컬(리눅스 시스템의) 디렉토리 경로이며, 반드시 hadoop을 구동하는 계정이 디렉토리에 대한 모든 권한을 가지고 있어야 한다. --> </property> <property> <name>dfs.namenode.checkpoint.dir</name> <value>/home/hadoop/namesecondary</value> <!-- namenode 디렉토리와 동일하게 로컬 디렉토리이고 모든 권한을 부여해야 한다. --> </property> <property> <name>dfs.datanode.data.dir</name> <value>/home/hadoop/datanode</value> <!-- 실제 hdfs 에 쌓인 데이터가 저장되는 경로. 여유공간이 넉넉한 파티션의 디렉토리를 지정해야 한다. datanode로 동작하는 클라이언트, 즉 workers 파일에 등록되어있는 호스트에 모두 동일하게 적용해야 한다. 당연히 hadoop을 구동하는 계정이 모든 권한을 가진 디렉토리여야 한다. --> </property> <property> <name>dfs.http.address</name> <value>hadoop01:50070</value> <!--namenode http 주소 및 포트. hadoop web-UI --> </property> <property> <name>dfs.secondary.http.address</name> <value>hadoop01:50090</value> <!-- Secondary namenode http 주소 및 포트 주의 할 점은 secondary-namenode는 백업, 복구를 담당하는 것이 아니라 보조의 역할이라는 점이다. --> </property> <property> <name>dfs.block.size</name> <value>16777216</value> <!-- HDFS의 block size, Byte 단위. 다음 값들을 참고하자. 8MB=8,388,608 / 16MB=16,777,216 / 32MB=33,554,432 / 64MB=67,108,864 / 128MB=134,217,728 --> </property> <property> <name>dfs.permissions.enabled</name> <value>false</value> <!-- 값이 false일 경우 파일 시스템의 퍼미션 관련 기능이 비활성화된다. --> </property> <property> <name>fs.trash.interval</name> <value>3</value> <!-- 휴지통과 같은 기능이다. 파일을 삭제하면 임시 공간으로 이동되고 지정한 시간 이후 삭제된다. value의 값(=분)에 따라 휴지통이 비워진다. --> </property> </configuration>
# yarn-site.xml [hadoop@hadoop01 ~]$ vi $HADOOP_HOME/etc/hadoop/yarn-site.xml <!-- 모두 지우고 여기서부터 붙여넣기 한다. --> <configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name> <value>org.apache.hadoop.mapred.ShuffleHandler</value> </property> <property> <name>yarn.resourcemanager.hostname</name> <value>hadoop02</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address</name> <value>hadoop02:8025</value> </property> <property> <name>yarn.resourcemanager.scheduler.address</name> <value>hadoop02:8030</value> </property> <property> <name>yarn.resourcemanager.address</name> <value>hadoop02:8050</value> </property> <property> <name>yarn.resourcemanager.webapp.address</name> <value>hadoop02:8055</value> </property> <property> <name>yarn.resourcemanager.scheduler.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value> <!-- org.apache.hadoop.yarn.server.resourcemanager.scheduler.fifo.FifoScheduler - FIFO : 먼저 들어온 작업을 먼저 처리한다. 후순위 작업은 이전 작업이 끝날 때까지 대기한다. org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler - FAIR : 작업에 균등하게 자원을 할당한다. org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler - 트리 형태로 큐를 선언하고 각 큐 별로 이용할 수 있는 자원의 용량을 정하여 할당한다. --> </property> </configuration>
# mapreduce-site.xml [hadoop@hadoop01 ~]$ vi $HADOOP_HOME/etc/hadoop/mapreduce-site.xml <!-- 모두 지우고 여기서부터 붙여넣기 한다. --> <configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>mapred.local.dir</name> <value>/home/hadoop/mapred</value> </property> <property> <name>mapred.system.dir</name> <value>/home/hadoop/mapred</value> </property> <property> <name>mapred.map.memory.mb</name> <value>2048</value> <!-- map 작업을 위한 최대 리소스 제한 --> </property> <property> <name>mapred.map.java.opts</name> <value>-Xmx1024M</value> <!-- map 작업을 위한 최대 child jvms --> </property> <property> <name>mapred.reduce.memory.mb</name> <value>3072</value> <!-- reduce 작업을 위한 최대 리소스 제한 --> </property> <property> <name>mapred.reduce.java.opts</name> <value>-Xmx2560M</value> <!-- reduce 작업을 위한 최대 child jvms --> </property> <property> <name>mapreduce.jobhistory.address</name> <value>hadoop02:10020</value> <!-- Job history server 주소 (기본 포트는 10020) --> </property> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>hadoop02:19888</value> <!-- Job history server Web UI주소 (기본 포트는 19888) --> </property> <property> <name>mapreduce.jobhistory.intermediate-done-dir</name> <value>/home/hadoop/mr-history/tmp</value> </property> <property> <name>mapreduce.jobhistory.done-dir</name> <value>/home/hadoop/mmr-histroy/done</value> </property> </configuration>
[hadoop@hadoop01 ~]$ vi $HADOOP_CONF_DIR/workers # datanode 구동을 위한 노드를 기록한다. hadoop01 hadoop02 192.168.0.3 hadoop04.net
# 수정한 설정 파일을 모든 노드에 복사한다. [hadoop@hadoop01 ~]$ scp $HADOOP_HOME/etc/hadoop/* hadoop02:/home/hadoop/etc/hadoop/
구동 및 확인. 그리고 종료
# 구동 스크립트를 이용한 방법 # 하둡 구동 [hadoop@hadoop01 ~]$ $HADOOP_HOME/sbin/start-all.sh WARNING: Attempting to start all Apache Hadoop daemons as hadoop in 10 seconds. WARNING: This is not a recommended production deployment configuration. WARNING: Use CTRL-C to abort. Starting namenodes on [centos7] Starting datanodes Starting secondary namenodes [centos7] Starting resourcemanager Starting nodemanagers # 프로세스 확인 [hadoop@hadoop01 ~]$ jps -l 92880 org.apache.hadoop.yarn.server.nodemanager.NodeManager 92339 org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode 93780 sun.tools.jps.Jps 92685 org.apache.hadoop.yarn.server.resourcemanager.ResourceManager 92111 org.apache.hadoop.hdfs.server.datanode.DataNode # 종료 [hadoop@hadoop01 ~]$ sbin/stop-all.sh WARNING: Stopping all Apache Hadoop daemons as hadoop in 10 seconds. WARNING: Use CTRL-C to abort. Stopping namenodes on [centos7] Stopping datanodes Stopping secondary namenodes [centos7] Stopping nodemanagers Stopping resourcemanager
개요
아파치 하둡(Apache Hadoop, High-Availability Distributed Object-Oriented Platform)은 대량의 자료를 처리할 수 있는 큰 컴퓨터 클러스터에서 동작하는 분산 응용 프로그램을 지원하는 프리웨어 자바 소프트웨어 프레임워크이다. 원래 너치의 분산 처리를 지원하기 위해 개발된 것으로, 아파치 루씬의 하부 프로젝트이다. 분산처리 시스템인 구글 파일 시스템을 대체할 수 있는 하둡 분산 파일 시스템(HDFS: Hadoop Distributed File System)과 맵리듀스를 구현한 것이다.
베이스 아파치 하둡 프레임워크는 다음의 모듈을 포함하고 있다:
하둡 커먼(Hadoop Common)
하둡 분산 파일 시스템(HDFS)
하둡 YARN
하둡 맵리듀스
쉽게 설명하면 자바로 만든 네트워크 클러스터링이 가능한 가상 파일 시스템 이다.
컨셉 자체는 매우 단순하다.
1. 네트워크로 연결 되어있다.
2. 데이터를 쪼개서 각 노드에 분산 저장한다.
3. 노드의 장애에 대비해 중복 저장한다.
4. 어디까지나 ‘파일을 저장하기 위한 파일 시스템이다.’
OSI 모형(Open Systems Interconnection Reference Model)은 국제표준화기구(ISO)에서 개발한 모델로, 컴퓨터 네트워크 프로토콜 디자인과 통신을 계층으로 나누어 설명한 것이다. 일반적으로 OSI 7 계층 모형이라고 한다. 1위키백과 에서 발췌
이 모델 자체가 특별한 역할을 하거나, 목적은 아니고 네트워크 설계를 하게 되면 이 모델을 따라 설계를 하자 하는 표준. 약속이다. 많은 공학도들이 네트워크 과목에서 이걸 만나고 ‘WTF!’2What The Fuck(와떠뻑) 을 외친다는 사실은 많이 알려진 사실이다. 많은 책, 오픈백과, 블로그 등등에서 친절하게 설명하고있고, 이 포스트도 가능한한 친절하게 설명하고자 하지만 그들보다 쉬울 수 있을지는 잘 모르겠다.
1계층은 물리연결 계층이고 2계층은 데이터링크… 이런 내용은 따로 설명하지 않겠다. 이미 검색결과 상단의 링크에서 지겨울정도로 봤을테니까. 조금은 다른 방법으로 접근 해보자.
스위치는 L2 스위치 부터 존재한다.
여기서 ‘L’ 은 ‘Layer’를 의미한다.
즉, L2 스위치는 Layer-2 를 처리할 수 있는 스위치라는 뜻이다.
L3 는 Layer-3, L4는 Layer-4. 당연히 L5, L6, L7 스위치도 존재한다.
Layer 1
하.지.만. L1 스위치란 단어는 생소하다. 마치 없는 것 같다.
이유를 알기 위해서는 Layer-1 에서의 역할을 이해야 한다.
Layer-1은 ‘물리’계층임을 이미 알고 있을 것이다. 이름 그대로 물리적으로 연결이 되고, 신호가 전달 되는 것이 1 계층이다.
그림에서처럼 ‘뭔지 모르지만 신호를 보내는 장비’는 ‘뭔지 모르지만 신호를 받고 싶은 장비’ 에게 빨간색 신호를 보내지만 거리가 멀어서 닿지 않는다.
이 중간에 ‘들어오는신호를 증폭 시켜서 밖으로 내보내는 장비’를 설치한다. 멀어서 닿지 않던 신호는 ‘뭔지 모르지만 신호를 받고 싶은 장비’까지 전달된다.
이런 역할을 하는 녀석이 바로 ‘리피터(Repeater)’3신호의 증폭에 초점을 두면 리피터, 단순 연결에 초점을 두면 브릿지(Bridge)가 된다. 결국 그놈이 그놈이다. 신호라고 해서 이해가 안되면 1.5v짜리 건전지를 1Km밖에 있는 전구에 연결한다고 생각해보자. 1Km까지 1.5v를 유지하려면 중간중간 전압을 높여주는 장비들을 설치 해야 할 것이다.이다.
즉 Layer 1 에 해당하는 무언가를 만들 때는 ‘신호의 온전한 전달’ 만 신경 쓰면 된다는 이야기이다.
[가.] 는 리피터(혹은 브릿지)이다.
[나.] 는 출력을 세 개로 늘린 장비이다.
여기서 기억 해야 하는 건, 들어온 신호는 나머지 모든 출력으로 ‘동일하게’ 출력된다는 점이다.
이제 이것들을 수도관이라고 생각해보자.
[가]의 경우 왼쪽 구멍에 물을 부으면 오른쪽으로 나간다. 당연히 오른쪽에서 물을 부으면 왼쪽으로 물이 나간다.
[나]의 경우 왼쪽 구멍에서 물을 부으면 오른쪽 모든 구멍으로 물이 나갈 것이다. 그럼 오른쪽 위의 구멍에 물을 부으면? 역시나 나머지 구멍에서 물이 나올 것이다.
왼쪽 구멍에도 물을 붓고, 오른쪽에서도 물을 부으면? 어디로도 물이 나가지 못한다. (물을 붓지 않는 구멍으로 나가겠지만 그렇다고 치자…)
이게 바로 ‘허브’4(Hub:(특정 장소·활동의) 중심지, 중추, Herb 아니다.)이다.
1. 어딘가에서 신호가 들어오면 자기 자신을 제외한 모든 포트호로 신호를 증폭시켜 내보낸다.
2. 동시에 여러 포트에서 신호가 들어오면 처리하지 못한다.
※ 이것을 브로드캐스트(Broadcast)라고 한다. 신호를
Layer 2
1. Layer 1에서의 장비에 스위칭 기능을 추가한다.
즉, 누군가 신호를 쏘려고 하면 나머지 녀석들은 대기 하게 한다.
2. 각각의 장비에 주소를 부여한다.
즉, 모든 포트에 동일한 신호를 쏘는 것이 아니라 ‘선택적으로’ 신호를 전달한다.
여기에서의 주소는 우리가 흔히 말하는 MAC adress라고 하는 하드웨어의 물리적 주소를 의미한다.
이쯤에서 눈치를 챈 사람들도 있겠지만 허브에 ‘스위칭’ 기능을 추가함으로써 비로소 우리가 아는 ‘스위칭 허브’ 가 된 것이다.
Layer 3
신호가 정상적으로 전달되고, 장비들을 MAC 주소로 식별하여 신호를 전송한다.
L3에서는 TCP 라는 프로토콜을 이용해 신뢰할 수 있는 연결을 만든다
경로 설정을 통해 가장 빠르고 안정적인 경로를 찾아 연결을 수립한다.
(TCP나 신뢰할 수 있는 연결 등이 무엇인지는 따로 포스팅 하도록 하겠다)
Layer 4
신뢰할 수 있는 연결위에 암호화 기능을 추가한다.
애초에 L1은 무엇이고 L5는 무엇이니 하는 설명을 할 것은 아니었으니 이제 데이터가 어떻게 이동하는지 살펴보자. 누군가 한국에서 미국으로 편지를 보낸다고 가정해보자.
편지에 빗대 설명하자면 위와 같다.
풀어 설명하자면 OSI 7 Layer 참조 모델은 ‘각 영역마다 해야 하는 일의 표준’을 정해 놓은 것이다.
만약 송신자가 편지를 보냈는데 수신자에 도착하지 않았을 경우 편지가 미국의 우편물 센터까지 갔다고 한다면, 내가 보낸 신호가 (L4-> L3-> L2-> L1-> L1) 수신측까지 물리적 연결은 문제가 없다는 이야기 일 것이다.
또 만약 내가 보낸 편지가 수신자에게 전달은 됐는데 편지의 내용을 수신자가 모른다면 자물쇠에 문제가 있거나, 수신자가 열쇠를 가지고 있지 않아서이기 때문일 것이다.
이제 결론.
거창할 것 없다. OSI 7 Layer 참조모델은 ‘네트워크를 통해 통신을 하거나, 하는 프로그램을 만들 때 참고해야 하는 하나의 참고모델‘ 일 뿐이다.
OSI 7 Layer 참조모델을 참고해 만들어진 프로그램과 장비를 이용한다면, 위 편지의 예처럼
– 각 레이어마다 고유한 일을 하므로 하위레이어의 프로그램을 만들지 않아도 되고,
– 만약 문제가 생겼을 경우 어느 Layer에서 문제가 생겼는지만 파악하기도 쉽다.
댓글을 달려면 로그인해야 합니다.