The Ultimate Hands-On Hadoop: Tame your Big Data!
이 강의를 따라 Hadoop에 대해 공부하려고한다.
강의에서는 Ambari에서 배포하는 하둡 배포판을 사용하지만 직접 설치하여 구성하고 강의를 들어보려고 한다. 클러스터 구성도 싱글 노드가 아니라 5개의 서버로 구성했다.
일단 설치 후 간단하게 사용하면서 HDFS나 MapReduce 등에 대해 더 자세히 알아볼 것이다.
server01 | server02 | server03 | server04 | server05 |
---|---|---|---|---|
NameNode | SecondaryNameNode | |||
NodeManager | DataNode | DataNode | DataNode | DataNode |
ResourceManager | ||||
JobHistoryServer |
openjdk-11-jre를 설치했다.
apt-get install
혹은 소스를 받아 직접 설치하면 된다.
설치되어있던 java11을 사용한 것인데 하둡 3.3버전 이상부터 Java11 런타임 실행이 가능하다. 하둡 컴파일은 Java8으로만 가능하다
/etc/hosts
파일에 하둡 서버들의 호스트명을 적어준다.
192.168.XX.XX hadoop-server-01
192.168.XX.XX hadoop-server-02
192.168.XX.XX hadoop-server-03
192.168.XX.XX hadoop-server-04
192.168.XX.XX hadoop-server-05
이때 ubuntu
계정을 사용했는데 hosts 파일이 root 계정의 소유로 접근 불가해서 호스트명으로 노드간 통신에 에러가 있었다.
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop-server-01
ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop-server-02
ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop-server-03
ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop-server-04
ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop-server-05
마스터 노드의 역할을 할 1번 서버에서 key를 생성하고 모든 서버의 authorized_key
파일에 내용을 추가
3.3.4 버전을 사용할 것이다. (Java11 설치했으니 3.3 버전 이상 사용해야 함)
sudo mkdir -p /usr/local/hadoop
sudo tar -xvzf /usr/local/hadoop-3.3.0.tar.gz -C /usr/local/hadoop --strip-components 1
sudo chown -R $USER:$USER /usr/local/hadoop
$HADOOP_HOME
으로 사용할 디렉토리를 만들어주고 다운받은 파일을 압축풀어주면 설치는 끝
모든 서버에 동일하게 진행해주면 된다.
마스터에서만 해줘도 괜찮은 것 같다.
# .bashrc
JAVA_HOME=<JAVA 설치 디렉토리>
HADOOP_HOME=/usr/local/hadoop
YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop
HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export JAVA_HOME HADOOP_HOME YARN_CONF_DIR HADOOP_CONF_DIR
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HADOOP_HOME/lib/native
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
소스로 자바를 설치한 서버는 $JAVA_HOME
을 당연히 알고 있었지만 깔려있던 곳은 알수가 없었다. 설정도 안되어있었고. 자바 실행에는 문제가 없지만 이후 하둡 실행 시 필요한 부분이기 때문에 여기서 알아두고 같이 설정할 필요가 있다.
# 자바 홈 디렉토리 찾기
java -XshowSettings:properties -version 2>&1 > /dev/null | grep 'java.home'
# $HADOOP_HOME/etc/hadoop/core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop-server-01:9000</value>
</property>
</configuration>
# $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>/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.namenode.secondary.http-address</name> # 세컨더리 네임노드 설정
<value>hadoop-server-02:50090</value>
</property>
</configuration>
# $HADOOP_HOME/etc/hadoop/yarn-site.xml
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop-server-01</value>
</property>
<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>
</configuration>
# $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>
export JAVAHOME=/MY/JAVA/HOME/DIRECTORY
하둡이 실행되면서 ssh 접속을 하게 되는데, 이때 환경변수가 초기화된다고 한다. 그래서 자바홈 변수를 설정해준다
# $HADOOP_HOME/etc/hadoop/worker
hadoop-server-02
hadoop-server-03
hadoop-server-04
hadoop-server-05
# 실행
$HADOOP_HOME/bin/hdfs namenode -format -force
$HADOOP_HOME/sbin/start-dfs.sh
$HADOOP_HOME/sbin/start-yarn.sh
$HADOOP_HOME/bin/mapred --daemon start historyserver
# 중지
$HADOOP_HOME/sbin/stop-dfs.sh
$HADOOP_HOME/sbin/stop-yarn.sh
$HADOOP_HOME/bin/mapred --daemon stop historyserver
rm -rf $HADOOP_HOME/data/namenode/*