hadoop 3.2.0 cluster setup

연구실에서 만들어놓은 도커 이미지로 구성해서 쓰니까 내부를 전혀 모르겠어서 직접 해보기로 했다.

GCP에서 ubuntu 16.04 instance 네 개(1master, 3workers) 만듦. hadoop 3.2.0 버전으로 진행.

하둡 유저 추가(모든 인스턴스에)

첫 접속은 console.cloud.google.com에서 SSH로. 나는 모든 유저 이름 eon으로 통일.

sudo adduser eon
# 비번설정 후 enter 여러번 누르기

sudo vi /etc/sudoers

# 아래 내용 추가
eon     ALL=(ALL:ALL) ALL

su - eon
# enter password

mkdir ~/.ssh
vi ~/.ssh/authorized_keys
# 로컬에서 만든 id_rsa.pub 추가 

로컬에서(OS X)

vi ~/.bash_profile

# 편하게 접속하기 위해 alias 만들어놓기(아래는 내가 임의로 지어낸 IP주소)
alias master="ssh eon@100.13.1.1"
alias worker1="ssh eon@100.13.1.2"
alias worker2="ssh eon@100.13.1.3"
alias worker3="ssh eon@100.13.1.4"

자바 설치(모든 인스턴스에)

#!/bin/bash
sudo apt-get update && sudo apt-get upgrade -y
sudo apt-get install software-properties-common -y
sudo add-apt-repository ppa:webupd8team/java -y
sudo apt-get update
echo "oracle-java8-installer shared/accepted-oracle-license-v1-1 select true" | sudo debconf-set-selections
sudo apt-get install oracle-java8-installer -y
sudo add-apt-repository -r ppa:webupd8team/java -y

/etc/hosts 에 master/workers 등록하기(master에서만!)

sudo vi /etc/hosts

아래내용(master의 ip주소와 worker들의 주소) write

127.0.0.1 localhost master

#100.13.1.1 master
100.13.1.2 worker1
100.13.1.3 worker2
100.13.1.4 worker3

ssh접속을 위해 master에서 키 생성 후 각 worker 에게 추가 해주기

ssh-copy-id 명령어로 등록 할 수 있는 것 같은데.. 잘 안돼서 직접 각 worker들의 ~/.ssh/authorized_keys 에 붙여넣음

ssh-keygen -t rsa -P ""

# master의 authorized_keys 에도 등록해줘야 함!
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

cat ~/.ssh/id_rsa.pub
# copy해서 각 worker들의 ~/.ssh/authorized_keys 에 붙여넣기

# master, 각 worker 접속되면 잘 된 것
ssh master
exit
ssh worker1
exit
ssh worker2
exit
ssh worker3
exit

master에서 접속중인 계정이름과 worker의 authorized_keys에 등록한 계정 이름이 다르면 {dest_hostname}@worker1 이런식으로 해야 접속이 되는데 굳이 다르게 해야 할 이유 없다면 같게 하는게 좋은 것 같다(나는 eon으로 모두 같게 진행)

hadoop 설치/설정

설치(master에서만!)

cd
wget http://mirror.apache-kr.org/hadoop/common/hadoop-3.2.0/hadoop-3.2.0.tar.gz
# 링크 깨졌으면 https://hadoop.apache.org/releases.html 가보기

tar -zxf hadoop-3.2.0.tar.gz

mv hadoop-3.2.0 hadoop

# 어디 두든 상관없음 나는 /usr/local/ 에
mv hadoop /usr/local

vi ~/.bashrc

# 아래내용 추가
export HADOOP_HOME=/usr/local/hadoop
export JAVA_HOME=/usr/lib/jvm/java-8-oracle
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

source ~/.bashrc

# 폴더에 권한 주기
chown -R eon /usr/local/hadoop/

설정 후 worker들에게 나눠주기

cd $HADOOP_HOME/etc/hadoop/
vi hadoop-env.sh

# JAVA_HOME 잡아주기
export JAVA_HOME=/usr/lib/jvm/java-8-oracle

vi core-site.xml

# Namenode URI 잡아주기
<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://master:9000</value>
    </property>
</configuration>

# worker node로 hadoop폴더 통째로 복사해줄거라 일단 data폴더도 만들기
mkdir /usr/local/hadoop/dfs
mkdir /usr/local/hadoop/dfs/name
mkdir /usr/local/hadoop/dfs/data

vi hdfs-site.xml

# Namenode 가 저장할 경로 지정. 위와 마찬가지로 worker 노드에서 필요한 데이터 경로도 지정.
<configuration>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>/usr/local/hadoop/dfs/name</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>/usr/local/hadoop/dfs/data</value>
    </property>
</configuration>

# /usr/local 은 권한이 없어서 worker의 eon 폴더로 복사 후 이동
scp -r /usr/local/hadoop worker1:/home/eon
scp -r /usr/local/hadoop worker2:/home/eon
scp -r /usr/local/hadoop worker3:/home/eon

ssh worker1
mv hadoop /usr/local/
exit
ssh worker2
mv hadoop /usr/local/
exit
ssh worker3
mv hadoop /usr/local/
exit

# worker들에서는 chown 안해줘도 hadoop폴더 r/w 가능하던데 권한까지 옮겨지는건지?

해보기

# 시작해보기
start-dfs.sh

jps
# SecondaryNameNode
# NameNode
# Jps

ssh worker1
jps
# DataNode
# Jps

exit

참고 사이트

In general, it is recommended that HDFS and YARN run as separate users. 라고 써져있는데 나눠써야하나?

도커에서 만들어서 해보기