'Technical Note/NoSQL'에 해당되는 글 10건

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

Technical Note/NoSQL


disk mode는 기대하는 cache hit ratio를 얻기 위해 캐쉬하여야 할 cache item이 매우 많은 경우 사용하도록 합니다

- expire time이 길고 purge가 자주 발생하지 않는 경우 사용하면 더욱 좋습니다

wcache 재시작시 소스 서버에 절대로 부하를 주어서는 안되는 경우 사용하도록 합니다

- 운영적으로 wcache를 1대씩 순차적으로 천천히 투입함으로써 어느 정도 소스 서버의 부하 조절은 가능할 것입니다.

성능면에서 Wcache > Jaguar > Squid 의 순서로 나타남.

Technical Note/NoSQL
웹에서 사용할 수 있는 오픈 소스 Caching proxy (http://play.daumcorp.com/pages/viewpage.action?pageId=10931170)

squid의 주요기능은 proxy와 cache이며 
proxy로써 squid는 웹 트랜잭션의 중재자 역할 (필수)
cache로써 squid는 웹 컨텐츠를 저장용  (옵션)


참고 : web caching은 미래에 재사용을 위해 웹 리소스를 저장하는 행위를 말한다. cache hit은 squid가 cache로 부터 HTTP 요청을 처리했을때를 말함

하드웨어 사양 :  3~7일 정도의 웹 트래픽을 저장할 수 있는 디스크 공간을 가지는 시스템을 만들라고 한다. 
squid에서 cache 디렉토리로 RAID는 절대 사용마라. RAID는 squid를 위한 filesystem 성능을 저하시킨다. squid를 위해 UFS 성능을 향상시키는 여러 방법이 있다..


Technical Note/NoSQL

memcached


memcached를 분산캐시라고 부르긴 하지만 자체는 분산 기능이 없고

memcached 라이브러리인 Consistent Hashing 을 통해서 데이터 분산을 한다.


why : 

1. 사용량이 많은 동적 웹 어플리케이션에서 디비의 부하를 줄이기 위해 캐쉬 용으로 만들어 졌으며

2. web서버의 동적 추가/삭제에 대한 대처 능력이 뛰어남



 

repcached 패치는 replication기능을 추가해준다



** Consistent Hashing 이란

분산캐쉬를 구현하는 기술 

다수의 노드로 이루어진 클러스터안에 데이터를 저장할 때, 데이터의 키를 기반으로 어떤 노드에 저장할 것인가 계산하는 로직



redis 


캐쉬는 이미 요청됐거나 나중에 요청될 결과를 미리 저장해 두었다가 이를 빠르게 서비스 해 주는 것을 의미




여러대의 memcached 서버에 데이터를 분산하기 위해서 

hasing 기능을 제공해주는 라이브러리를 사용하여 각각이 서버에 접근하는 식



expire Time 설정시 주의해야 함


memcached를 리플리케이션 하려면 어떻게 해야 하나요?

 

repcached는 memcached를 Master/Master 리플리케이션

단점 : 한번에 한대만 리플리케이션이 가능하다.



redis

- Memcached와 다르게 서버 기능으로 리플리케이션을 제공함 : 

이브에 있는 Redis Conf에서 마스터 서버만 지정해주면 리플리케이션 가능

- RDB와 AOF를 꼭 사용하자

  - RDB : 현재의 메모리 상태의 Snapshot을 만들어 두는것, 일정 시기와 명령 개수가 쌓였을 때마다 남길 수 있다.

  - save 300 10 : 10개 key가 변경되면 300초 뒤에 dump를 생성하라는 의미

  

  - AOF: 일종의 Jounaling 파일 역할을 함


- RDB/ AOF는 File에 write를 하는 것이므로 성능을 저하 시킨다.

- 그래서 실제로 마스터에서는 서비스만 하고 슬레이브에서 AOF와 RDB를 이용해서 백업하는 형태로 사용한다.

 

메모리 할당 크기

: 일반적으로 전체 메모리의 60~70% 정도를 사용하는 것이 안정적입니다.




추가 사항

Memory manage : jemalloc  / max memory 초과 시 처리 매커니즘 / 메모리 할당 가이드 / 각 type별 elements 최적의 size 

Data Type : 이미지 추가, 주요 연산 command 추가

Replicaion : failover 시 처리 방법 자세히 (master가 죽었을 때)




memcached & redis 메커니즘 차이점 정리




 data type 커맨드에서 set(이었나?) 에 insert 하는 커맨드 추가도 해주세요~ 



* 샤딩 과 여러 master 

* redis 안정성 



활용

1. 가장 최근의 리스트 보여주기: LPUSH, LTRIM

2. 삭제와 필터링 : LREM

3. 순위 관련 문제 (최고점수 상위 100위의 순위표, 현재 유저의 세계 랭킹) : ZADD, ZREVRANGE. ZRANK

4. 아이템에 대한 만료시간 구현 : ZRANGE..WITHSCORES

5. Count : INCR, INCRBY

6. 주어진 시간동안 고유한 N 항목 : SADD page:day1:<page_id> <user_id>, SISMEMBER page:day1:<page_id> <user_id>



Queues


여러분들은 아마도 list push, list pop 같은 Redis 명령들이 Queues에 적합하게 만들어졌는지 알고 있을 것입니다.


하지만 이보다 더 나아가서 Redis는 목록이 비어있다면 list pop의 변형을 막을 것을 할 수 있습니다. Link : http://redis.io/commands/blpop



h2. Redis 장/단점


* 장점

** 빠른 속도

** 다양한 Data Types (memcached 와 크게 다른점)

** Persistence

** Publish/Subscribe 형태의 message 제공

** 다양한 언어의 클라이언트가 제공되고 있음

** Replication을 통한 성능 향상


* 단점

** Clustering 기능이 없어 횡적 확장성이 좋지 않음

** 쿼리 기능이 풍부하지 못함

** Sharding을 일일이 클라이언트 API를 이용해서 해줘야 함. API에서 반드시 지원

** consistent hashing 을 지원하는 client를 이용해야 distribute 가능


h2. Redis가 적합한 Case


* Case1 : 데이터 검색이 많은 경우

* Case2 : 실시간 통계 데이터가 필요한 경우

* Case3 : 랭킹 정보 및 최근 N개 데이터

* Case4 : Counter 정보 

Technical Note/NoSQL

설치라고 할 것도 없음


http://redis.io/download 에서 설명하는대로 하면 됨.. 위치만 좀 달리..


# cd /usr/local/src

# wget http://redis.googlecode.com/files/redis-2.4.14.tar.gz

# tar zxvf redis-2.4.14.tar.gz

# cp -Rf redis-2.4.14 /usr/local/redis

# cd /usr/local/redis

# make


설치 끝..


서버 구동


# nohup ./src/redis-server &


명령행 클라이언트를 실행하려면


# ./src/redis-cli

redis 127.0.0.1:6379>  slaveof 10.99.99.91 6379


redis 명령어는 아래에 자세히 나온다.


http://redis.io/commands

1 2
블로그 이미지

zzikjh