RedPlug's Tory

1. 우분투 설치

- Ubuntu Desktop 18.04 버젼 설치 하여 테스트 진행

- Namenode * 1ea, DataNode * 3ea 설치 진행

 노드

Hostname

IP 

 비고

NameNode

 master

192.168.0.200 

 

DataNode 01

 slave01

192.168.0.201 

 

DataNode 02 

 slave02

192.168.0.202 

 

DataNode 03

 slave03

 192.168.0.203

 



2. 패키지 업데이트 & 업그레이드

sudo apt-get update && sudo apt-get upgrade

3. 레파지토리 추가 및 패키지 업데이트

sudo add-apt-repository ppa:webupd8team/java

sudo apt-get update

자바 설치, 자바 업그레이드, 설치 확인

sudo apt-get install oracle-java8-installer

sudo apt-get upgrade

java -version

하둡 그룹 생성

sudo addgroup hadoop

하둡 계정 생성

sudo adduser --ingroup hadoop hduser

관리자 권한 추가

sudo nano /etc/sudoers


hduser 라인 추가

# User privilege specification

root        ALL=(ALL:ALL) ALL

hduser    ALL=(ALL:ALL) ALL


hosts파일 수정 내용 추가 (namenode,datanode 모두 수정)
sudo nano /etc/hosts 
하기 내용 추가
192.168.0.200   master
192.168.0.201   slave01
192.168.0.202   slave02
192.168.0.203   slave03

ssh 설치 +rsa키 설정

apt-get install openssh-server

sudo su hduser
cd
ssh-keygen -t rsa -P ""
cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys

scp -rp ~/.ssh/authorized_keys hduser@slave01:~/.ssh/authorized_keys
scp -rp ~/.ssh/authorized_keys hduser@slave02:~/.ssh/authorized_keys
scp -rp ~/.ssh/authorized_keys hduser@slave03:~/.ssh/authorized_keys


*SSH 접속을 위하여 마스터 서버에서 모두 복사(편의상 실 운용 서버는 아마 별도로 만들어서 authorized_keys에 추가로 복사해줘야 하는것으로 보여짐)
scp -rp ~/.ssh/id_rsa hduser@slave01:~/.ssh/id_rsa
scp -rp ~/.ssh/id_rsa hduser@slave02:~/.ssh/id_rsa
scp -rp ~/.ssh/id_rsa hduser@slave03:~/.ssh/id_rsa
scp -rp ~/.ssh/id_rsa hduser@slave01:~/.ssh/id_rsa.pub
scp -rp ~/.ssh/id_rsa hduser@slave02:~/.ssh/id_rsa.pub
scp -rp ~/.ssh/id_rsa hduser@slave03:~/.ssh/id_rsa.pub

/home/redplug/.ssh/authorized_keys: No such file or directory 라고 노출될 경우 .ssh폴더 생성하여야 함.



하둡 다운로드&압축풀기&설치위치 변경
wget http://mirror.navercorp.com/apache/hadoop/common/hadoop-2.7.7/hadoop-2.7.7.tar.gz

tar zxvf hadoop-2.7.7.tar.gz

sudo mv ./hadoop-2.7.7 /usr/local/hadoop/

sudo chown hduser:hadoop -R /usr/local/hadoop
네임노드,데이터노드 폴더 만들기

마스터 노드

sudo mkdir -p /usr/local/hadoop_tmp/hdfs/namenode

sudo mkdir -p /usr/local/hadoop_tmp/hdfs/datanode

sudo chown hduser:hadoop -R /usr/local/hadoop_tmp/

sudo chmod 777 /usr/local/hadoop_tmp/


데이터노드

sudo mkdir -p /usr/local/hadoop_tmp/hdfs/datanode

sudo chown hduser:hadoop -R /usr/local/hadoop_tmp/

sudo chmod 777 /usr/local/hadoop_tmp/

bashrc 수정
> 부팅 시 자동실행되는 파일(Windows autoexec.bat파일과 같은 역할)
cd ~
sudo nano .bashrc

하기내용 기입
#  -- HADOOP ENVIRONMENT VARIABLES START -- #
export JAVA_HOME=/usr/lib/jvm/java-8-oracle
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
export PATH=$PATH:$JAVA_HOME/bin
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 HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"
#  -- HADOOP ENVIRONMENT VARIABLES END -- #

bashrc적용
source .bashrc

* JAVA_HOME 위치 : java -XshowSettings:properties -version 2>&1 > /dev/null | grep 'java.home' 에서/jre빼면됨.


hadoop-env.sh 수정
sudo nano $HADOOP_HOME/etc/hadoop/hadoop-env.sh

export JAVA_HOME=${JAVA_HOME} 하단에 JAVA_HOME위치 기입
export JAVA_HOME='/usr/lib/jvm/java-8-oracle'



core-site.xml 수정 (모든노드 수정)
sudo nano $HADOOP_HOME/etc/hadoop/core-site.xml

<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://master:9000</value>
    </property>
</configuration>



hdfs-site.xml 수정
마스터 노드

sudo nano $HADOOP_HOME/etc/hadoop/hdfs-site.xml

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>2</value>
    </property>
    <property>
        <name>dfs.permissions</name>
        <value>false</value>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>/usr/local/hadoop_tmp/hdfs/namenode</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>/usr/local/hadoop_tmp/hdfs/datanode</value>
    </property>
</configuration>

슬레이브 노드

sudo nano $HADOOP_HOME/etc/hadoop/hdfs-site.xml

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>2</value>
    </property>
    <property>
        <name>dfs.permissions</name>
        <value>false</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>/usr/local/hadoop_tmp/hdfs/datanode</value>
    </property>
</configuration>


yarn-site.xml 수정

sudo nano $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>

</configuration>


mapred-site.xml 수정

cp $HADOOP_HOME/etc/hadoop/mapred-site.xml.template $HADOOP_HOME/etc/hadoop/mapred-site.xml



sudo nano $HADOOP_HOME/etc/hadoop/mapred-site.xml


<configuration>

    <property>

        <name>mapreduce.framework.name</name>

        <value>yarn</value>

    </property>

</configuration>



masters, slaves 파일 편집

sudo nano $HADOOP_HOME/etc/hadoop/masters


master


sudo nano $HADOOP_HOME/etc/hadoop/slaves

master

slave01

slave02

slave03



네임노드 포멧(마스터노드만)

hdfs namenode -format

start-dfs.sh, start-yarn.sh 실행 및 확인(jps)

start-dfs.sh

start-yarn.sh


jps


> start-dfs.sh

NameNode, SecondaryNameNode, DataNode 가 실행

> start-yarn.sh

master에서는 ResourceManager, NodeManager 실행, slave NodeManager 실행


> http://master:50070 / 9000 액티브 확인 , 라이브노드 4개여야 함

> http://master:8088  / yarn 확인


맵리듀스 테스트

- 테스트용 파일을 HDFS에 업로드


hdfs dfs -mkdir /input

hdfs dfs -copyFromLocal /usr/local/hadoop/README.txt /input

hdfs dfs -ls /input

hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar wordcount /input/README.txt ~/wordcount-output


- 결과 디렉톨 확인

hdfs dfs -ls ~/wordcount-output

>  SUCCESS 있으면 성공, 파트 파일에 실해 정보 값 표기


- 실행 결과 확인

hduser@master:/usr/local/hadoop$hdfs dfs -cat ~/wordcount-output/part-r-00000


....

source  1

the     8

this    3

to      2

under   1

use,    2

uses    1

using   2

visit   1

website 1

which   2

wiki,   1

with    1

written 1

you     1

your    1

hduser@master:/usr/local/hadoop$

hduser@master:/usr/local/hadoop$

 






하둡 테스트


멀티노드 클러스터

- master ,slave1~3 서버, 네트워크 설정

- /etc/hosts 파일 설정에서 각 서버에 대한 DNS 설정

- /etc/hostname 파일 수정

- /bin/hostname -F /etc/hostname

> hostname 쳐서 확인

- 재부팅

- SSH 공개키 복사 작업

> scp -rp ~/.ssh/authorized_keys root@slave1:~/.ssh/authorized_keys

> scp -rp ~/.ssh/authorized_keys root@slave2:~/.ssh/authorized_keys

> scp -rp ~/.ssh/authorized_keys root@slave3:~/.ssh/authorized_keys

- 노드간 SSH 접속 설정(master~ slave3까지 모두 작업)

> ssh master
> exit
> ssh slave1

> exit
> ssh slave2

>  exit

> ssh slave3

- hadoop-env.sh 수정 (master에서 실행)

> gedit $HADOOP_HOME/etc/hadoop/hadoop-env.sh

> 25라인 JDK 경로 수정 : export JAVA_HOME=/usr/local/jdk1.8

> 104번 라인 하둡 데몬의 pid 저장 경로 수정 : export HADOOP_PID_DIR=/home/centos/hadoop-2.9.0/pids

- core-site.xml 수정 (모든 노드에서 실행)

> gedit $HADOOP_HOME/etc/hadoop/core-site.xml

> localhost:9000 > master:9000로 수정


- hdfs-site.xml 수정 (master)

> $HADOOP_HOME 하위에 namenode와 datanode 디렉토리 생성

> rm -rf $HADOOP_HOME/namenode

> mkdir $HADOOP_HOME/namenode

> chwon root -R $HADOOP_HOME/namenode

> chmod 777 $HADOOP_HOME/namenode

> rm -rf $HADOOP_HOME/datanode

> mkdir $HADOOP_HOME/datanode

> chwon root -R $HADOOP_HOME/datanode

> chmod 777 $HADOOP_HOME/datanode

> gedit $HADOOP_HOME/etc/hadoop/hdfs-site.xml

> dfs.replication 1 > 2로 수정

> dfsnamenode.name.dir, dfs.datanode.data.dir 내용 추가

- hdfs-site.xml 수정 (slave123)

> $HADOOP_NODE 하위에 datanode 생성

> rm -rf $HADOOP_HOME/datanode

> mkdir $HADOOP_HOME/datanode

> chwon root -R $HADOOP_HOME/datanode

> chmod 777 $HADOOP_HOME/datanode

> gedit $HADOOP_HOME/etc/hadoop/hdfs-site.xml
> dfs.replication 1 > 2로 수정

> dfs.datanode.data.dir 내용 추가

- 잡트래커 설정(모든노드)

> cp $HADOOP_HOME/etc/hadoop/mapred-site.xml-template $HADOOP_HOME/etc/hadoop/mapred-site.xml

> gpedit $HADOOP_HOME/etc/hadoop/mapred-site.xml

> mapreduce.framework.name yarn 추가

- yarn-size.xml 파일 수정 (모든노드)

> gedit $HADOOP_HOME/etc/hadoop/yarn-site.xml

> 기본 옵션 설정으로 수정

- masters, slaves 파일 수정(master만 수정)

> gedit $HADOOP_HOME/etc/hadoop/masters

> master

> gedit $HADOOP_HOME/etc/hadoop/slaves

> master
    slave1
    slave2
    slave3

- 네임노드 포멧(master에서만 실행), 하둡가동, HDFS 폴더 생성

> $HADOOP_HOME/bin/hdfs namenode -format

- 방화벽 내림 (모든노드)

> systemctl stop firewalld.service

> systemctl disable firewalld.service

- DFS, YARN 시작 (master만 실행)

> start-dfs.sh

NameNode, SecondaryNameNode, DataNode 가 실행

> start-yarn.sh

master에서는 ResourceManager, NodeManager 실행, slave NodeManager 실행

> 확인은 jps

> http://master:50070 / 9000 액티브 확인 , 라이브노드 4개여야 함

> http://master:8088  / yarn 확인


분석 프로그램 실행

- 맵리듀스 jab을 실행하기 위해 HDFS 데릭토리 만듬(master)

> hdfs dfs -mkdir /user

> hdfs dfs -mkdir /user/root

> hdfs dfs -mkdir /user/root/conf

- 하둡 쉘 커맨드로 확인(master)

> hdfs dfs -ls

- 하둡파일시스템에 파일 업로드

> hdfs dfs put $HADOOP_HOME/etc/hadoop/hadoop-env.sh /user/conf/hadoop-env.sh

- 업로드 파일 확인

> hdfs dfs -ls /

> hdfs dfs -ls /user

> hdfs dfs -ls /user/conf / hadoop-env-sh 파일 제대로 올라왔는지 확인



- 테스트용 파일을 HDFS에 업로드

hdfs dfs -mkdir /input

hdfs dfs -copyFromLocal /usr/local/hadoop/README.txt /input

hdfs dfs -ls /input

hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar wordcount /input/README.txt ~/wordcount-output


- 결과 디렉톨 확인

hdfs dfs -ls ~/wordcount-output



>  SUCCESS 있으면 성공, 파트 파일에 실해 정보 값 표기

- 실행 결과 확인

> hdfs dfs -cat ~/wordcount-output/part-r-00000



- 로컬로 다운

> hdfs dfs -copyToLocal ~/wordcount-output/part-r-00000 /home/centos/result.txt

> head -5 /home/centos/result.txt / 5줄만 머리에 출력

- 두번 실행하게 되면 에러 발생 아웃풋 디렉토리는 삭제하여야 함

> hdfs dfs -rm -r ~/wordcount-output // r은 하위디렉토리 까지 삭제

- master:50070에서 사용량 확인 가능


명령어 관련내용

- 형식 : hdfs dfs -명령어 옵션

> dfs : Distributed Filesystem Shell (분산 파일 시스템 쉘)


- help : 도움말

> hdfs dfs -help

> hdfs dfs -help ls // ls 명령어에 대한 도움말


- ls : 파일 목록 보기

> hdfs dfs -ls //// 경로 없을경우 사용자 계정의 홈 디렉토리 조회

> hdfs dfs -ls conf / 해당 디렉토리 파일 목록 조회

> hdfs dfs -ls -R / 하위 디렉토리 목록까지 출력

> master 뿐만 아니라 slave에도 동일하게 실행 가능


- du : 파일용량 확인

> hdfs dfs -du : 디렉토리 또는 파일의 사용량을 바이트 단위로 출력

> hdfs dfs -du -s : 해당 디렉토리의 전체용량만(합계) 출력


- cat, text : 파일내용 보기

> cat : 텍스트 파일 전용

> hdfs dfs -cat conf/hadoop-env.sh

> text : 텍스트 파일과 압축파일도 읽을 수 있음

> hdfs dfs -text conf/hadoop-env.sh


- mkdir : 디렉토리 생성

> hdfs dfs -mkdir input

> hdfs dfs ls 


- put, copyFromLocal,get, copyToLocal, getmerge, cp : 파일 복사

> hdfs dfs -put $HADOOP_HOME/etc/hadoop/core-site.xml input

input 경로로 복사

> hdfs dfs -ls input

> hdfs dfs -copyFromLocal : 로컬 파일시스템에서 하둡분산파일 시스템으로 복사

> hdfs dfs -copyFromLocal $HADOOP_HOME/etc/hadoop/core-site.xml input/a : input폴더에 a이름으로 변경하여 복사

> hdfs dfs -get input/a a : HDFS의 input/a 를 로컬시스템 에 현재폴더에 a라는 파일이름으로 복사

> ls -la

> hdfs dfs -copyToLocal input/a b : HDFS의 input/a 파일을 로컬시스템에 b라는 파일명으로 변경하여 복사

> cat b

> hdfs dfs -getmerge : 머지하여 복사

> hdfs dfs -getmerge input c : HDFS의 input디렉토리의 파일을 로컬시스템의 c파일에 머지하여 복사

> cat c

> ls -la : c파일 용량 확인

> hdfs dfs -cp conf/hadoop-env.sh hadoop-env-copy.sh : HDFS서버에서 HDFS서버로 파일 복사

> hdfs dfs -ls

> hdfs dfs -ls /user/root


- mv, moveFromLocal : 파일이동

>  hdfs dfs -mv input/a input/a2 : input/a 파일을 input/a2로 옮김 (HDFS간 옮김)

> hdfs dfs -moveFromLocal : 로컬 시스템에서 하둡 분산파일 시스템으로 옮김

> hdfs dfs -mkdir temp

> hdfs dfs -moveFromLocal a temp/a : 로컬시스템의 a파일을 HDFS의 temp/a파일로 옮김


- rm : 디렉토리나 파일 삭제

> hdfs dfs -rm temp/a : temp 디렉토리의 a파일 삭제

> hdfs dfs -rm temp : temp 디렉토리 삭제

> hdfs dfs -rm -r input : input 디렉토리 및 하위 디렉토리, 파일까지 다 삭제 


- count : 카운트값 조화

> hdfs dfs -count conf : 디렉토리, 파일, 파일사이즈


- tail : 파일의 마지막 내용 확인

> hdfs dfs -tail hadoop-env-copy.sh


- chmod : 권한변경

> hdfs dfs -chmod 777 conf : conf 디렉토리 권한을 777로 변경

> 폴더 내 하위 파일까지 권한 변경하는 방법 확인

> hdfs dfs -ls : conf 권한 변경 확인

> 유닉스 파일 권한 : 10자리
    디렉토리(1) 소유자(3) 그룹(3) 전체(3)

r 읽기(4)

w 쓰기(2)

x 실행(1)


- touchz : 0바이트 파일 생성

> hdfs dfs -touchz test.txt

> hdfs dfs -ls