
cd /install_dir
# Hadoop 압축 해제
sudo tar -zxvf hadoop-3.3.0.tar.gz -C /usr/local
# Hadoop 디렉토리 이름 변경
sudo mv /usr/local/hadoop-3.3.0 /usr/local/hadoop
# owner(소유권)를 변경
sudo chown -R $USER:$USER /usr/local/hadoop
# owner(소유권)이 root로 변경되었는지 확인
ls -al /usr/local/hadoop

# 수정
sudo vim ~/.bashrc
# 아래내용 입력
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export HADOOP_YARN_HOME=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
# 적용
source ~/.bashrc
env | grep hadoop # 확인

HDFS에서 사용할 환경 정보를 설정하는 파일이다.
dfs.replication: HDFS 파일 블록 복제 개수 지정한다.dfs.namenode.name.dir: NameNode에서 관리할 데이터 디렉토리 경로 지정한다.dfs.datanode.data.dir: DataNode에서 관리할 데이터 디렉토리 경로 지정한다.dfs.journalnode.edits.dir: JournalNode는 NameNode의 동기화 상태를 유지한다. 특정 시점에 구성된 fsimage snapshot 이후로 발생된 변경 사항을 editlog라 하며, 해당 데이터의 저장 위치를 설정한다.dfs.nameservices: Hadoop 클러스터의 네임서비스 이름을 지정한다.dfs.ha.namenodes.my-hadoop-cluster: Hadoop 클러스터 네임서비스의 NameNode 이름을 지정한다.( “,”콤마로 구분하여 기재한다.)dfs.namenode.rpc-address.my-hadoop-cluster.namenode1: 클러스터 네임서비스에 포함되는 NameNode 끼리 RPC 통신을 위해 NameNode의 통신 주소를 지정한다.(여기서는 8020포트 사용)dfs.namenode.rpc-address.my-hadoop-cluster.namenode2: 클러스터 네임서비스에 포함되는 NameNode 끼리 RPC 통신을 위해 NameNode의 통신 주소를 지정한다.(여기서는 8020포트 사용)dfs.namenode.http-address.my-hadoop-cluster.namenode1: NameNode1(nn1)의 WEB UI 접속 주소를 지정한다.(여기서는 50070포트 사용)dfs.namenode.http-address.my-hadoop-cluster.namenode2: NameNode2(nn2)의 WEB UI 접속 주소를 지정한다.(여기서는 50070포트 사용)dfs.namenode.shared.edits.dir: NameNoderk editlog를 쓰고/읽을 JournalNode URL 이다. Zookeeper가 설치된 서버와 동일하게 JournalNode를 설정하면 된다.
(예 : qjournal://nn1:8485;nn2:8485;dn1:8485/my-hadoop-cluster)dfs.client.failover.proxy.provider.my-hadoop-cluster: HDFS 클라이언트가 Active NameNode에 접근할 때 사용하는 Java class 를 지정한다.dfs.ha.fencing.methods: Favilover 상황에서 기존 Active NameNode를 차단할 때 사용하는 방법을 기재한다.
(예 : sshfence 그러나 여기서는 shell(/bin/true)를 이용한다.)dfs.ha.fencing.ssh.private-key-files: ha.fencing.method를 sshfence로 지정하였을 경우, ssh를 경유하여 기존 Active NameNode를 죽이는데. 이 때, passpharase를 통과하기 위해 SSH Private Key File을 지정해야한다.dfs.ha.automatic-failover.enabled: 장애 복구를 자동으로 할 지에 대한 여부를 지정한다.
vim $HADOOP_HOME/etc/hadoop/hdfs-site.xml
<configuration>
<!-- configuration hadoop -->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/usr/local/hadoop/data/nameNode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/usr/local/hadoop/data/dataNode</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/usr/local/hadoop/data/dfs/journalnode</value>
</property>
<property>
<name>dfs.nameservices</name>
<value>my-hadoop-cluster</value>
</property>
<property>
<name>dfs.ha.namenodes.my-hadoop-cluster</name>
<value>namenode1,namenode2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.my-hadoop-cluster.namenode1</name>
<value>master:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.my-hadoop-cluster.namenode2</name>
<value>worker1:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.my-hadoop-cluster.namenode1</name>
<value>master:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.my-hadoop-cluster.namenode2</name>
<value>worker1:50070</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://master:8485;worker1:8485;worker2:8485/my-hadoop-cluster</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.my-hadoop-cluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>shell(/bin/true)</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/ubuntu/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.name.dir</name>
<value>/usr/local/hadoop/data/name</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/usr/local/hadoop/data/data</value>
</property>
</configuration>
Hadoop 시스템 설정 파일이다.
fs.default.name: HDFS의 기본 통신 주소를 지정한다.fs.defaultFS: HDFS 기본 파일시스템 디렉토리를 지정한다.ha.zookeeper.quorum: Zookeeper가 설치되어 동작할 서버의 주소를 기재한다.(여기서 포트는 2181)
vim $HADOOP_HOME/etc/hadoop/core-site.xml
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://master:9000</value>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://my-hadoop-cluster</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>master:2181,worker1:2181,worker2:2181</value>
</property>
</configuration>
Resource Manager 및 Node Manager에 대한 구성을 정의한다.
vim $HADOOP_HOME/etc/hadoop/yarn-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->
<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>master</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
</configuration>
MapReduce 어플리케이션 설정 파일이다.
vim $HADOOP_HOME/etc/hadoop/mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
</configuration>
vim $HADOOP_HOME/etc/hadoop/hadoop-env.sh
# Java
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
# Hadoop
export HADOOP_HOME=/usr/local/hadoop

vim $HADOOP_HOME/etc/hadoop/workers
worker1
worker2
worker3
vim $HADOOP_HOME/etc/hadoop/masters
master
worker1