Technical Note/NoSQL

http://datamining.dongguk.ac.kr/wiki/index.php/Hadoop_%EB%AA%85%EB%A0%B9%EC%96%B4



###############################################################

본 문서는 hadoop 클러스터를 구축하는 방법에 대하여 설명한다.

###############################################################

* 테스트 환경은 아래와 같다.

* OS: ubuntu 12.04

* 클러스터 환경: 1대의 master와 5대의 slave


[목 차]

1. Java 설치 

2. SSH 설치 및 공개 키 설정

3. hadoop 설치


########################################################

# 1. Java 설치 

#    hadoop은 java로 구현되었기 때문에 java를 반드시 설치해야 한다.

########################################################


1.1 java 설치

----------------------------------------------------------------------------------

$ sudo add-apt-repository ppa:upubuntu-com/java

$ sudo apt-get update

$ sudo apt-get install oracle-java7-installer

----------------------------------------------------------------------------------

(주1) Ubuntu를 최소 시스템으로 설치하여 "add-apt-repository" 명령어를 찾을 수 없는 경우

      아래를 실행한 후 1.1 실행할 것

        $ sudo apt-get install python-software-properties


1.2 자바 설치 확인

----------------------------------------------------------------------------------

$ java -version

----------------------------------------------------------------------------------

########################################################

#java version "1.7.0_04"

#Java(TM) SE Runtime Environment (build 1.7.0_04-b20)

#Java HotSpot(TM) Server VM (build 20.1-b02, mixed mode)

########################################################




########################################################

# 2. SSH 설치 및 공개 키 설정 

#   :  hadoop클러스터에서 master와 slave들 간에 통신은 SSH를 이용한다. 

#      따라서 모든 컴퓨터들은 SSH를 설치 해야 하고, 

#      master에서 암호없이 slave에 접속하기 위해서 공개 키가 필요하다.

########################################################


2.1 SSH 설치

- ubuntu를 설치했을 경우는 기본적으로 ssh가 설치 되어있지만, 설치가 안되있다면 아래의 코드를 통해 설치

----------------------------------------------------------------------------------

$ sudo apt-get install ssh

----------------------------------------------------------------------------------



2.2 공개 키 설정

- 모든 slave에 master ip 등록

----------------------------------------------------------------------------------

$ sudo vi /etc/hosts.allow

----------------------------------------------------------------------------------

sshd: 203.247.248.250 # master ip 또는 ALL


- [master] 공개 키 생성

----------------------------------------------------------------------------------

$ sudo vi /etc/ssh/sshd_config

----------------------------------------------------------------------------------

PubkeyAuthentication yes

AuthorizedKeysFile      .ssh/authorized_keys


----------------------------------------------------------------------------------

$ mkdir ~/.ssh

$ ssh-keygen -t rsa -P ""

$ cp /home/stat/.ssh/id_rsa.pub /home/stat/.ssh/authorized_keys

----------------------------------------------------------------------------------


- [master] master에서 생성한 공개 키를 모든 slave로 복사

----------------------------------------------------------------------------------

          $ scp /home/stat/.ssh/authorized_keys 203.247.248.241:/home/stat/.ssh/.

          $ scp /home/stat/.ssh/authorized_keys 203.247.248.242:/home/stat/.ssh/.

          $ scp /home/stat/.ssh/authorized_keys 203.247.248.243:/home/stat/.ssh/.

          $ scp /home/stat/.ssh/authorized_keys 203.247.248.244:/home/stat/.ssh/.

          $ scp /home/stat/.ssh/authorized_keys 203.247.248.245:/home/stat/.ssh/.

          scp /home/stat/.ssh/authorized_keys 203.247.232.233:/home/jskim/.ssh/.

----------------------------------------------------------------------------------


- [master, slaves] 디렉토리 및 파일 권한 변경

----------------------------------------------------------------------------------

        $ chmod 755 ~/.ssh

        $ chmod 644 ~/.ssh/authorized_keys

----------------------------------------------------------------------------------


-test

----------------------------------------------------------------------------------

        $ sudo /etc/init.d/ssh restart

        $ ssh localhost

----------------------------------------------------------------------------------


- 행여 안될 경우에는 ssh-keygen -R 203.247.248.241 또는 known_hosts를 지우고 위의 공개 키 설정 절차를 다시 실행

(기존에 저장되있던 hosts(공개 키)때문에 안되는 경우가 발생함)


- host 지정 (master와 slave 모두 설정)

----------------------------------------------------------------------------------

        $ sudo vi /etc/hosts

----------------------------------------------------------------------------------

                203.247.248.250 master

                203.247.248.241 slave01

                203.247.248.242 slave02

                203.247.248.243 slave03

                203.247.248.244 slave04

                203.247.248.245 slave05


- hosts 일치

        ex) master의 경우

----------------------------------------------------------------------------------

        $ sudo vi /etc/hostname

----------------------------------------------------------------------------------

                master  


----------------------------------------------------------------------------------

        $ sudo /bin/hostname -F /etc/hostname

----------------------------------------------------------------------------------

                

        ex) slave01의 경우

----------------------------------------------------------------------------------

        $ sudo vi /etc/hostname

----------------------------------------------------------------------------------

                slave01 


----------------------------------------------------------------------------------

        $ sudo /bin/hostname -F /etc/hostname

----------------------------------------------------------------------------------




##############################################

############### 3. hadoop 설치 ###############

##############################################

- hadoop을 구축하기 위해서는 동일하게 설정된 hadoop관련 파일을 master와 slave에 설치해야 한다. 

 이에 master에 hadoop파일을 설정 한 후에 동일한 파일을 slave에 복사하는 절차로 hadoop 클러스터를 구축하도록 하겠다.


1) hadoop 다운로드 및 압축 해제

        $ cd /home/stat

        $ wget http://mirror.apache-kr.org//hadoop/common/hadoop-1.0.3/hadoop-1.0.3.tar.gz

        $ tar xvfz hadoop-1.0.3.tar.gz

        $ ls

        $ ln -s hadoop-1.0.3 hadoop #/home/stat/hadoop 가 hadoop의 설치디렉토리가 된다.




2) hadoop 환경설정  

 hadoop-env.sh 설정

 ----------------------------------------------------------------------------------------

 : Hadoop이 실행하는 모든 프로세스에 적용되는 시스템 환경 값에 대한 스크립트

   환경변수에 대해서 시스템 변수로 등록해 사용하는 방식이 아니라, 

   이 파일에 모든 환경 변수를 설정하고 이 파일을 전체 클러스터 노드에 복사해 사용함

 ----------------------------------------------------------------------------------------

        $ vi /home/stat/hadoop/conf/hadoop-env.sh

        ###############################################################

        # The maximum amount of heap to use, in MB. Default is 1000.

        export HADOOP_HEAPSIZE=2000

        

        # JAVA HOME

        export JAVA_HOME=/usr/lib/jvm/java-7-oracle

        export HADOOP_HOME=/home/stat/hadoop

        export HADOOP_SLAVES=${HADOOP_HOME}/conf/slaves

        export HADOOP_LOG_DIR=${HADOOP_HOME}/logs

        # for R

        export LD_LIBRARY_PATH=/home/stat/lib/R/i686-pc-linux-gnu-library/2.15:$LD_LIBRARY_PATH


        # Warning: $HADOOP_HOME is deprecated.

        export HADOOP_HOME_WARN_SUPPRESS="TRUE"

        ###############################################################


 core-site.xml 설정

 ----------------------------------------------------------------------------------------

  Hadoop 설치 후 로그파일, 네트워크 튜닝, I/O튜닝, 파일 시스템 튜닝, 압축 등과 같이 기본적인 하부 시스템 설정

  맵리듀스에서도 공통으로 사용

 ----------------------------------------------------------------------------------------

        $ vi /home/stat/hadoop/conf/core-site.xml

        ###############################################################

        <configuration>

         <property>

                 <name>fs.default.name</name>

                 <value>hdfs://master:9000</value>

         </property>

        </configuration>

        ###############################################################


 hdfs-site.xml 설정

 ----------------------------------------------------------------------------------------

 Hadoop파일 시스템을 위한 설정파일로 자세한 항목은 hdfs-default.xml파일을 참고

 ----------------------------------------------------------------------------------------


        $ vi /home/stat/hadoop/conf/hdfs-site.xml

        ###############################################################

        <configuration>

        <property>

          <name>hadoop.tmp.dir</name>

          <value>/home/hadoop/temp</value>

          <description>A base for other temporary directories.</description>

        </property>

        <property>

          <name>dfs.name.dir</name>

          <value>/home/stat/filesystem/name</value>

        </property>

        <property>

          <name>dfs.data.dir</name>

          <value>/home/stat/filesystem/data</value>

        </property>

        <property>

          <name>dfs.replication</name>

        <value>3</value>

        </property>

        </configuration>

        ###############################################################


 mapred-site.xml 설정

 ----------------------------------------------------------------------------------------


 ----------------------------------------------------------------------------------------

        $  vi /home/stat/hadoop/conf/mapred-site.xml

        ###############################################################

        <configuration>

           <property>

              <name>mapred.system.dir</name>

              <value>/home/stat/filesystem/mapreduce/system</value>

           </property>

           <property>

              <name>mapred.local.dir</name>

              <value>/home/stat/filesystem/mapreduce/local</value>

           </property>

           <property>

              <name>mapred.job.tracker</name>

              <value>master:9001</value>

           </property>

           <property>

              <name>mapred.child.jvm.opts</name>

              <value>-Xmx1g -Xms1g  -Djava.library.path=/usr/local/lib/R/site-library </value>

           </property>

        </configuration>

        ###############################################################


- masters / slaves 노드 추가하기

 ----------------------------------------------------------------------------------------

masters: 세컨드리 네임 노드가 실행될 서버지정

slaves: 데이터 노드가 실행될 서버지정

hadoop-metrics.properties - Hadoop에서 각 기능별(파일시스템, 맵리듀스)로 모니터링 데이터를 수집하는 방식에 대한 설정


./conf/masters 파일을 열어 master 컴퓨터의 ip 혹은 호스트명을 입력한다.

※ master 라고 입력한다.

./conf/slaves 파일을 열어 slave 컴퓨터들의 ip 혹은 호스트명을 입력한다.

※ ip를 입력해도 되지만 /etc/hosts에 slave 호스트명을 추가하고 호스트명을 입력하는 것도 좋은 방법이다.

 ----------------------------------------------------------------------------------------


$ vi /home/stat/hadoop/conf/masters 

        master


$ vi /home/stat/hadoop/conf/slaves 

        slave01

        slave02

        slave03

        slave04

        slave05



3) hadoop 설정파일 복사 (master에 설정한 파일을 slave로 복사)

- master 서버

        ###############################################################

        $ cd /home/stat/

        $ tar -cvzf hadoop.tgz ./hadoop-1.0.3

        ###############################################################


-slave에 디렉토리생성


- 생성된 hadoop.tgz를   /var/www로 복사

        ###############################################################

          $ sudo cp /home/stat/hadoop.tgz /var/www/hadoop.tgz

        ###############################################################


- slave 서버

        ###############################################################

        $ cd /home/stat

        $ wget http://203.247.248.250/hadoop.tgz

        $ tar -xvzf hadoop.tgz

        $ ln -s hadoop-1.0.3 hadoop

        ###############################################################



4) hadooop 실행

- namenode 포맷(master 에서 실행)

        $ ./hadoop/bin/hadoop namenode -format


- hadoop 서버시작(master 에서 실행: 작업디렉토리는 "/home/stat"라고 가정)

        $ ./hadoop/bin/start-all.sh


- slave 서버: slave 서버로그 확인

        $ cd /home/stat/hadoop/logs

        $ ls

                hadoop-webservice-datanode-slave-01.log

                hadoop-webservice-datanode-slave-01.out

                hadoop-webservice-tasktracker-slave-01.log

                hadoop-webservice-tasktracker-slave-01.out

        

- hadoop 실행

        $ ./start-all.sh

- hadoop 종료시

        $ ./hadoop/bin/stop-all.sh 


- hdfs 실행

        $ ./start-dfs.sh

- mapreduce 실행

        $ ./start-mapred.sh



- http://203.247.248.250:50030/ 에서 mapreduce 설정 확인가능

- http://203.247.248.250:50070/ 에서 hdfs 설정 확인가능



5) test


- dfs 디렉토리 생성

        $ ./home/stat/hadoop/bin/hadoop dfs -mkdir input


- dfs 파일 input

        $ vi test.txt

        $ ./hadoop dfs -put test.txt input2


- dfs 파일 조회

        $ ./hadoop dfs -ls input2


-dfs 파일 삭제

        $ ./hadoop dfs -rm input/test.txt

        Deleted hdfs://master:9000/user/hadoop/input/data.log

        $ ./hadoop dfs -ls input

        $ ./hadoop dfs -rm - output


        $ ./hadoop dfs -put test.txt input


-word count

        $ ./hadoop dfs -put test.txt input2

        $ ./hadoop jar ../hadoop-examples-1.0.3.jar wordcount input2 output3

        $ ./hadoop dfs -copyToLocal output3 aaa

        $./hadoop dfs -copyToLocal out_pois aaa



Prerequisites for Installing RHIPE

1.A working Hadoop cluster

2.R installed as a shared library

3.Google protocol buffers

4.Environment variables



- Prerequisite 1: Hadoop


- Prerequisite 2: R as a Shared Library

        # R 제거

        $ sudo apt-get remove r-base-core


        # R 설치: 아래 참고하여 설치할 것

        ####################################################

        $ wget http://infostat.dongguk.ac.kr/CRAN/src/base/R-2/R-2.15.1.tar.gz

        $ tar -xzf R-2.15.1.tar.gz

        $ cd R-2.15.1

        # need to build shared library (--enable-R-shlib)

        $ ./configure --enable-R-shlib # --prefix=...

//오류시 아래 패키지 설치 후 재시도

        $ sudo apt-get install libX11-dev

        $ sudo apt-get install libxt-dev

//#설치

        $ sudo make

        $ sudo make install

        ####################################################


- Prerequisite 3: Protocol Buffers


        ####################################################

        # Download Protobuf from here.

        $ wget http://protobuf.googlecode.com/files/protobuf-2.4.1.tar.gz

        # Decompress downloaded file.

        $ tar -xzf protobuf-2.4.1.tar.gz

        $ cd protobuf-2.4.1

        # configuration

        $ sudo ./configure --prefix /usr

        # Set Environment Path

        $ export LD_LIBRARY_PATH=/usr/local/lib

    # install

        $ sudo make

        $ sudo make install



$sudo vi /etc/profile

---맨뒤에 아래 추가

PATH=$PATH:/home/stat/hadoop/bin:/home/stat/R-2.15.1/bin

export PATH

----


$source /etc/profile 해주시면 적용됩니다. 


        ####################################################

        5.Install binutils-gold for (Ubuntu 11.10).

        This package is used to resolve link error when compiling RHIPE in (Ubuntu 11.10).

        I found an article that describes linker of Ubuntu is changed slightly in order of parameters, therefore, RHIPE makes many many link errors.

        To install, just follow the command if binutils-gold is not installed.

        $ sudo apt-get install binutils-gold


- Prerequisite 4: Environment Variable


        $ sudo vi /etc/R/Rprofile.site

        ####################################################

        Sys.setenv(JAVA_HOME="/usr/lib/jvm/java-7-oracle")

        Sys.setenv(HADOOP_HOME="/home/stat/hadoop")

        Sys.setenv(HADOOP_BIN="/home/stat/hadoop/bin")

        ####################################################



- Installing Rhipe

        ####################################################

        $ wget https://github.com/downloads/saptarshiguha/RHIPE/Rhipe_0.67.tar.gz

        또는

        $ wget http://datamining.dongguk.ac.kr/hadoop/Rhipe_0.67.tar.gz

        $ tar -xzf Rhipe_0.67.tar.gz

        $ sudo R CMD INSTALL Rhipe_0.67.tar.gz

        ####################################################


#아래의 에러발생시

g++ -I/usr/share/R/include -DNDEBUG      -fpic  -O3 -pipe  -g  -I.  -O3 -pipe  -g   -DHAVE_UINTPTR_T    `/usr/lib/R/bin/R CMD config --cppflags` `pkg-config --cflags protobuf` -c signal.cc -o signal.o

/bin/bash: pkg-config: 명령어를 찾을 수 없음


$ sudo apt-get install pkg-config


######

네이티브 스내피 라이브러리를 하둡으로 복사


        wget http://anova.dongguk.ac.kr/snappy-1.0.5.tar.gz

        tar -xzf snappy-1.0.5.tar.gz

        cd snappy-1.0.5

    ./configure --enable-shared

        sudo make

        sudo make install


        cp /usr/local/lib/libsnappy.* /home/stat/hadoop/lib/native/Linux-amd64-64

        cp /usr/local/lib/libsnappy*.* /home/stat/hadoop/lib/native/Linux-i386-32