먼저, eclipse는 설치 되었다고 가정하고 진행하겠습니다.^^;

  1. eclipse marketplace에서 git관련 플러그인을 설치합니다.



    ▶ HELP 탭에서 "Eclipse Marketplace를 선택하여 "egit"를 검색하여 Install.


  2. local에 git repository를 생성합니다.


    ▶ "Create a new local Git repository"로 local에 repository를 생성합니다.


  3. local에 생성된 repository와 서버에 있는 repository를 연동합니다.



    ▶ Project Explorer에 local reposiroty와 연동 되면 위와 같이 표시 됩니다.


  4. 작성된 source code를 local에 commit합니다.

    ▶ 소스 작성 후에 coomit을 하면 local repository에는 연동한 디렉토리에 반영이 되고 "Git repository" perspective view에 표시가 됩니다.


  5. local에 commit 된 내용을 server에 "push"합니다.



    - 최종적으로 git서버에 "push"를 해야 다른 개발자들도 "fetch"를 통해서 소스가 공유됩니다.
    (저는 종종 commit만 하고 push를 안해서 소스 반영이 안되곤 했었드랬죠.... -_-;)

여기서 중요한 것은 local에 여러번 commit을 하면 commit log도 여러개가 되겠죠... 이 여러번 commit된 local repo를 git 서버로 push하면 똑같이 여러번 commit한것 처럼 server에도 반영이 됩니다. 이 방식은 svn과 비교되는 "분산 버젼 관리" 방식이죠. 

아직 분산버전관리라는 이점을 제 자신도 잘 활용하지 못하는 느낌이 많이 들지만... 그냥 느낌상으로 svn보다는 conflict가 잘 안난다는 느낌이가 듭니다... branch와 branch와의 merge도 그렇고 repo와 repo사이의 push도 그렇고 conflict가 잘 안난다는 점은 개발자 입장에서 기분이 좋죠 ㅎㅎ




1. Introduction

  하둡(Hadoop) 공식 홈페이지에 업로드 되어 있는 컴파일 된 하둡을 사용할 때 다음과 같은 문제가 발생하였다. (사실 하둡만을 운영 한다면 문제 될 에러는 아니다. Java의 native 라이브러리를 사용하려고 한다면 해결해야 할 문제이다.)

WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

  이 오류는 32비트 운영체제에서 컴파일 된 것이기 때문에 64비트에서 사용하게되어 WARNING 에러가 발생한다. 그래서 이 문서에서는 하둡 2.2.0을 64비트로 컴파일하여 Psedo-Distributed Mode 설정까지 하려고 한다.


2. Environment

  • OS : Ubuntu 12.04 LTS 64bit
  • Hadoop : Hadoop 2.2.0
  • Proto Buffer : Protoc >= 2.5.0
  • User : hakawati
  • Building Path : /home/hakawati/tools

3. Compile
3.1. Support Package
[hakawati@hakawati-Virtualbox:~$] sudo apt-get install build-essential maven openjdk-7-jdk cmake libssl-dev ssh
  • build-essential : 프로그램 개발하는데 필요한 라이브러리를 제공하는 패키지
  • maven : 메이븐은 자바용 프로젝트 관리 도구로 Hadoop은 메이븐으로 설치
  • openjdk-7-jdk : 메이븐을 운용하기 위해서 자바 설치
  • cmake, libssl-dev : 하둡 설치 시 Common Library와 컴파일로 사용
  • ssh : 하둡에서 ssh 설정에 필요

[~$] mkdir tools

[~$] cd tools

[~/tools$] wget http://protobuf.googlecode.com/files/protobuf-2.5.0.tar.gz

[~/tools$] tar -zxvf protobuf-2.5.0.tar.gz

[~/tools$] cd protobuf-2.5.0

[~/tools/protobuf-2.5.0$] ./configure

[~/tools/protobuf-2.5.0$] make

[~/tools/protobuf-2.5.0$] sudo make install

[~/tools/protobuf-2.5.0$] sudo ldconfig

[~/tools/protobuf-2.5.0$] cd ..


  • Proto buffer : 통신을 통해 데이터를 주고 받을 때 각종 데이터를 byte형태로 바꾸어주는 도구 Ubuntu에는 기본으로 2.4.1 버전이 설치되어 있으나, Hadoop 컴파일때는 2.5.0 이후 버전을 사용해야 하기 때문에 설치


3.2. Hadoop Compile

  소스 컴파일을 할것이기 때문에 소스를 압축한 타르볼을 다운로드 받는다.

[~/tools$] wget http://mirror.apache-kr.org/hadoop/common/hadoop-2.2.0/hadoop-2.2.0-src.tar.gz

[~/tools$] tar xfz hadoop-2.2.0-src

[~/tools$] cd hadoop-2.2.0-src


3.2.1. Apply HADOOP-10110

  패치 없이 하둡을 컴파일 시 Apache Hadoop Auth 부분에서 에러가 발생하여 컴파일이 중단된다.

  아파치 하둡에서 해당 에러를 패치(Patch) 할 수 있게 대응했다. 해당 패치는 Hadoop Auth 설정 파일인 hadoop-common-project/hadoop-auth/pom.xml 파일을 패치한다. (https://issues.apache.org/jira/browse/HADOOP-10110)

[~/tools/hadoop-2.2.0-src$] wget https://issues.apache.org/jira/secure/attachment/12614482/HADOOP-10110.patch

[~/tools/hadoop-2.2.0-src$] patch -p0 < HADOOP-10110.patch

patching file hadoop-common-project/hadoop-auth/pom.xml

Hunk #1 succeeded at 55 (offset 1 line)


3.2.2. Command of Hadoop Compile

[~/tools/hadoop-2.2.0-src$] mvn package -Pdist,native -DskipTests -Dtar

정상적으로 완료되면 다음과 같은 결과를 볼 수 있다.

컴파일 완료되었다면 ~/tools/hadoop-2.2.0-src/hadoop-dist/target 폴더안에 다음과 같이 압축이 풀린 하둡 폴더와 Tarball로 압축된 하둡 두 가지 형태를 볼 수 있다. 어느 것이든 가져다 설정하여 쓸 수 있다.

3.3. Error Report

3.3.1. Haddop Common Error

  만약 Apache Haddop Common에서 FAILURE가 뜬다면 보조 모듈설치에서 설치하는 cmake와 libssl-dev를 설치하지 않았거나 설치 시 문제가 생겼을 경우이다.


4. Setting of Hadoop

4.1. Kind of Hadoop Mode

  • Stand-Alone Mode (독립 모드) : 하둡의 기본 모드로 로컬 머신에서만 실행한다. 다른 노드와 통신을 할 필요가 없기 때문에 HDFS를 사용하지 않으며 데몬들도 모두 실행하지 않는다. 독립적으로 MapReduce 프로그램의 로직을 개발하고 디버깅하는데 유용하다.
  • Pseudo-Distributed Mode (가상 분산 모드) : 한대의 메인 컴퓨터로 클러스터를 구성하고, 모든 데몬을 실행한다. 독립 모드 기능을 보완한 형태로 다른 데몬과의 상호작용에서 발생하는 일들을 모두 검사한다.
  • Fully-Distributed Mode (완전 분산 모드) : 분산 저장과 분산 연산의 모든 기능이 갖추어진 클러스터를 구성한다.

4.2. Setting of Path

환경 변수를 설정하는데, 하둡에서 사용하는 환경 변수도 함께 설정하기 때문에 환경 변수명을 바꾸어서는 안된다. 추가로 하둡 설정 파일에서 환경 변수의 JAVA_HOME 경로를 읽어들이는데, 하둡이 사용하는 사용자 그룹과 환경 변수를 사용하는 구룹은 다르다. 이 문서에서는 ~/.bashrc 에 환경 변수를 설정하고 하둡의 설정에서 복수로 설정한다. 하지만 복잡한 설정을 하고싶지 않으면 모든 사용자가 사용하는 환경변수 설정인 /etc/environment에 설정을 하면된다. (다만 environment에 설정하면 시스템을 재부팅 해줘야 한다.)

[~$] vim ~/.bashrc

#Java

export JAVA_HOME="/usr/lib/jvm/java-7-openjdk-amd64"

export PATH=$PATH:$JAVA_HOME/bin


# Hadoop

export HADOOP_PREFIX="~/hadoop-2.2.0"

export PATH=$PATH:$HADOOP_PREFIX/bin

export PATH=$PATH:$HADOOP_PREFIX/sbin

export HADOOP_MAPRED_HOME=${HADOOP_PREFIX}

export HADOOP_COMMON_HOME=${HADOOP_PREFIX}

export HADOOP_HDFS_HOME=${HADOOP_PREFIX}

export YARN_HOME=${HADOOP_PREFIX}


# Native Path

export HADOOP_COMMON_LIB_NATIVE_DIR=${HADOOP_PREFIX}/lib/native

export HADOOP_OPTS="-Djava.library.path=$HADOOP_PREFIX/lib/native"

[~$] source ~/.bashrc

4.3. Setting of SSH

  하둡이 노드들과 통신을 할 때 기본으로 SSH를 사용한다. 로컬에서 테스트를 할 목적이기에 비밀번호를 요구하지 않도록 설정한다.

[~$] ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa

[~$] cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys

[~$] chmod 644 ~/.ssh/authorized_keys


로컬로 SSH를 접근했을 때 비밀번호를 묻지 않으면 제대로 설정 된 것이다. 접근 후 exit로 빠져나온다.

[~$] ssh localhost

Welcome to Ubuntu 12.04 LTS (GNU/Linux 3.2.0-23-generic x86_64)

[~$] exit

logout

Connection to localhost closed.

4.4. Setting of Hadoop

  Pseudo-Distributed Mode 형태로 설정을 진행한다. 설정파일들은 모두 ${HADOOP_PREFIX}/etc/hadoop 디렉토리 안에 존재한다.


4.4.1. hadoop-env.sh

  하둡이 실행하는 모든 프로세스에 적용되는 시스템 환경 값에 대한 스크립트 파일로 전체 클러스터 노드에 복사해 사용하는 설정 파일이다.

# export JAVA_HOME=${JAVA_HOME} // 주석처리

export JAVA_HOME=”/usr/bin/jvm/java-7-openjdk-amd64”

export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_PREFIX/lib/native

export HADOOP_OPTS="-Djava.library.path=$HADOOP_PREFIX/lib/native"

4.4.2. yarn-env.sh

  yarn(Yet Another Resource Negotiator)는 분산된 환경을 운영 할 수 있도록 제공하는 환경 설정 파일이다.

export HADOOP_COMMON_LIB_NATIVE_DIR=${HADOOP_PREFIX}/lib/native

export HADOOP_OPTS="-Djava.library.path=$HADOOP_PREFIX/lib/native"

4.4.3. core-site.xml

  HDFS와 MapReduce에서 공통으로 사용하는 로그 파일, 네트워크 튜닝, I/O 튜닝, 파일 시스템 튜닝, 압축 등과 같은 하둡 코어를 위한 환경 설정 파일이다. MapReduce에서도 공통으로 사용한다.

<property>

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

    <value>hdfs://localhost:9000</value>

    <final>true</final>

</property>


4.4.4. hdfs-site.xml

  hdfs-site.xml은 네임노드, 보조 네임노드, 데이터 노드 등과 같은 HDFS 데몬을 위한 환경설정 구성한다. dfs.namenode.name.dir은 파일의 디렉토리 정보와 파일 정보 등을 저장하는 폴더이다. 해당 저장위치는 hdfs가 아닌 로컬에 저장을 한다. dfs.datanode.name.dir은 하둡 파일 시스템에 저장되는 모든 파일이 저장되는 위치이다.

<property>

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

    <value>file:${HADOOP_PREFIX}/hadoop/dfs/name</value>

    <final>true</final>

</property>


<property>

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

    <value>file:${HADOOP_PREFIX}/hadoop/dfs/data</value>

    <final>true</final>

</property>

 

<property>

    <name>dfs.permissions</name>

    <value>false</value>

</property>

4.4.5. mapred-site.xml

  mapred-site.xml은 JobTracker와 Task Track과 같이 맵 리듀스 데몬을 위한 환경설정 파일이다. 해당 파일은 mapred-site.xml.template로 제공되며 mapred-site.xml로 변경하여 사용한다.

<property>

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

    <value>yarn</value>

</property>

 

<property>

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

    <value>file:${HADOOP_PREFIX}/hadoop/mapred/system</value>

    <final>true</final>

</property>

 

<property>

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

    <value>file:${HADOOP_PREFIX}/hadoop/mapred/local</value>

    <final>true</final>

</property>

4.4.6. yarn-site.xml

  yarn과 관련된 데몬을 설정하는 파일이다.

<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>

4.4.7. Create Directories

  hdfs-site.xml과 mapred-site.xml에서 설정한 디렉터리 경로에 맞게 디렉터리를 생성한다. 디렉터리 이름들은 사용자가 원하는대로 변경해도 된다.

[~$] mkdir –p ${HADOOP_PREFIX}/hadoop/dfs/name

[~$] mkdir –p ${HADOOP_PREFIX}/hadoop/dfs/data
[~$] mkdir –p ${HADOOP_PREFIX}/hadoop/mapred/system
[~$] mkdir –p ${HADOOP_PREFIX}/hadoop/mapred/local


5. Start Hadoop

5.1. NameNode Format

  최초 실행시 NameNode를 포맷해준다.

[~$] hdfs namenode -format

5.2. 데몬 실행

  데몬 실행 스크립트는 ${HADOOP_PREFIX}/sbin 에 위치해있다. start-all.sh로 모든 데몬을 실행한다.

  • 전체 데몬 실행/종료 : start-all.sh / stop-all.sh
  • HDFS만 실행/종료 : start-dfs.sh / stop-dfs.sh
  • YARN만 실행/종료 : start-yarn.sh / stop-yarn.sh


5.3. 데몬 실행 확인

5.3.1. JPS

  jps 명령으로 자바 가상 머신(JVM)의 프로세스 상태를 확인한다. 다음과 같이 하둡과 관련된 5개의 데몬과 jps 명령의 1개의 데몬 총 6개의 데몬이 실행 되어있으면 된다.

5.3.2. Command of Hadoop

  하둡의 명령어 중에서 dfsadmin -report 명령을 통해 마스터와 슬레이브의 모든 시스템들의 상태를 콘솔 형태의 레포트로 확인 할 수 있다.

5.3.3. Connection Web Interface

  하둡은 웹 인터페이스로도 다양한 관리를 제공해주고 있다.

localhost:8088 

localhost:50070


6. 참조 사이트


jQuery를 사용 하는 추세가 javascript 네이티브 문법은 거의 사용을 안하게 되는데요.

하지만, 꼭 javascript로만 사용 할 수밖에 없는 이벤트들이 있네요. 예를 들어 <onbeforeunload> 이런 이벤트는 네이티브를 꼭 써야만 하겠죠? 앞으로는 서버 언어보다는 자바스크립트 위주로 공부를 계속 해야겠네요. 

 

onabort
이미지의 다운로드를 중지할 때 (브라우저의 중지버튼)

onactivate
개체가 활성화될 때 발생
(태그의 기능이 작용할 때 발생하는 이벤트로 예를 들어 링크를 누를 경우 링크가 옮겨질때 발생하는 것을 감지하는 이벤트 핸들러)

onafterprint
문서가 출력되거나 혹은 출력하기 위해 출력미리보기를 한 후에 발생

onafterupdate
데이터영역 개체에서 발생하는 이벤트로 데이터 소스 오브젝트내의 데이터가  업데이트 되었을 때 발생(데이터 개체부분 참조)

onbeforeactivate
개체가 활성화 상태로 되기 바로 직전에 발생 (onactivate 참고)

onbeforecopy
선택 영역이 시스템의 클립보드로 복사되기 바로 직전에 발생

onbeforecut
선택 영역이 지워지기 바로 직전에 발생

onbeforedeactivate
부모 문서에서 현재 개체에서 다른 개체로 activeElement가 바뀔 때 발생
(activeElement는 개체를 지칭하는 예약어로도 쓰임)

onbeforeeditfocus
편집가능한 개체 내부에 포함된 개체가 편집활성화된 상태가 되거나 혹은 편집가능한 개체가 제어를 위해 선택될 때

onbeforepaste
시스템의 클립보드에서 문서로 붙여넣기 될 때 대상 개체에서 발생

onbeforeprint
문서가 출력되거나 혹은 출력하기 위해 출력미리보기 직전에 발생

onbeforeunload
페이지가 언로드되기 직전에 발생

onbeforeupdate
데이터영역 개체에서 발생하는 이벤트로 데이터 소스 오브젝트내의 데이터가  업데이트 되기전에 발생 (데이터 개체부분 참조)

onblur
개체가 포커스를 잃었을 때

onbounce
마퀴태그에서 alernate상태에서 스크롤이 양 사이드에서 바운드될 때 발생

oncellchange
데이터 제공 개체에서 데이터가 변화할 때 발생

onchange
개체 혹은 선택영역의 내용이 바뀔 때 발생

onclick
개체위에서 마우스의 왼쪽 버튼을 누를 때 발생

oncontextmenu
클라이언트 영역에서 사용자가 마우스 오른쪽 버튼을 눌러 콘텍스트 메뉴를 열 때 발생

oncontrolselect
사용자가 개체의 제어 영역을 만들 때 발생

oncopy
시스템의 클립보드에 선택영역 혹은 개체를 복사할 때 소스 개체로부터 발생

oncut
시스템의 클립보드에 선택영역 혹은 개체를 잘라낼때 소스 개체로부터 발생

ondataavailable
비정기적으로 데이터를 전달하는 데이터 소스 개체로부터 데이터가 도착할 때마다 정기적으로 발생

ondatasetchanged
데이터 소스개체의 변화에 의해 데이터가 노출된 상태로 될 때 발생

ondatasetcomplete
데이터 소스 개체로부터 모든 데이터가 유용한 상태로 표시될 때 발생

ondblclick
사용자가 개체에 더블클릭 할때 발생

ondeactivate
모 문서에서 현재 개체에서 다른 개체로 activeElement가 변할 때 발생

ondrag
드래그 상태가 지속되는 동안 소스 객체로부터 발생

ondragend
드래그 상태가 끝날 때 소스 객체로부터 발생

ondragenter
사용자가 개체를 드래그하여 드롭가능 위치로 지정된 영역으로 이동할 때 타갯 개체에서 발생

ondragleave
사용자가 개체를 드래그하여 드롭가능 위치로 지정된 영역을 떠날 때 타갯 개체에서 발생

ondragover
사용자가 개체를 드래그하여 드롭가능 위치로 지정된 영역내에서 드래그할 때 계속적으로 타갯 개체에서 발생

ondragstart
선택된 개체 혹은 텍스트 영역에서 사용자가 드래그를 시작할 때 발생

ondrop
드래그앤드롭 작용에서 상태가 진행되는 동안 개체가 타갯 개체에 드롭되었을 때 타갯 개체에서 발생

onerror
개체가 로드되는 동안 발생하는 이벤트

onerrorupdate
데이터 소스 개체 내에 데이터가 없데이트 되는 동안 에러가 발생할 때 데이터 영역 개체에서 발생

onfilterchange
비주얼 필터의 상태가 바뀌거나 트랜지션이 완료되었을 때 발생

onfinish
마퀴개체의 loop가 완료되었을 때 발생

onfocus
개체가 포커스를 받았을 때 발생

onfocusin
개체에 포커스가 셋팅되기 바로 직전 개체에 대해 발생

onfocusout
포커스가 다른 개체로 이동한 후에 포커스를 가고 있는 현재 개체에서 발생

onhelp
브라우저가 활성화 되어 있는 동안 F1키를 눌렀을 때

onkeydown
사용자가 키를 눌렀을 때

onkeypress
기능키를 제외한 키를 눌렀을 때 발생

onkeyup
사용자가 키를 놓았을 때 발생

onlayoutcomplete
소스 문서로 부터 콘텐드를 가지는 객체가 미리보기나 출력을 할때 현제 LayoutRect 개체를 모두 채우는 것이 끝났을 때 발생

onload
브라우저가 개체를 로드한 후에 발생

onlosecapture
개체가 마우스 캡쳐를 잃었을 때 발생

onmousedown
개체 위에 마우스 버튼을 누를 때 발생(좌우 어느 버튼이든)

onmouseenter
개체 안으로 마우스 포인터가 들어올 때 발생

onmouseleave
개체의 경계밖으로 마우스 포인터가 이동할 때 발생

onmousemove
개체위에서 마우스가 움직일 때 발생

onmouseout
개체밖으로 마우스 포인터가 빠져나갈 때 발생

onmouseover
개체위로 마우스 포인터가 들어올 때 발생

onmouseup
마우스가 개체위에 있는 동안 마우스를 누른 상태에서 해제될 때 발생

onmousewheel
마우스 휠이 돌아갈 때 발생

onmove
개체가 움직일 때 발생

onmoveend
개체가 움직임이 끝날 때 발생

onmovestart
개체가 움직이기 시작할 때 발생

onpaste
문서에 클립보드로부터 데이터가 전송될 때 타겟 개체에서 발생

onpropertychange
개체의 속성이 바뀔 때 발생

onreadystatechange
개체의 상태가 변화할 때 발생

onreset
Form 을 사용자가 리셋할 경우 발생

onresize
개체의 크기가 바뀔 때 발생

onresizeend
제어영역에서 개체의 크기가 사용자에 의해 변화가 끝날 때 발생

onresizestart
제어영역에서 개체의 크기가 사용자에 의해 변화되기 시작할 때 발생

onrowenter
데이터 소스 내에서 현재 열이 변화되거나 개체에 새로운 유용한 데이터가 입력될 때 발생

onrowexit
데이터 소스 콘트롤이 개체 내의 현재 열을  변화시킬 때 발생

onrowsdelete
레코드셋에서 열이 삭제될 때 발생

onrowsinserted
현재 레코드셋에 새로운 열이 추가된 후에 발생 (데이터 개체에서)

onscroll
사용자가 개체 내의 스크롤 바를 스크롤할 때 발생

onselect
현재 선택된 영역이 바뀔 때 발생

onselectionchange
문서의 선택 영역의 상태가 바뀔 때 발생

onselectstart
개체가 선택되기 시작할 때 발생

onstart
마퀴개체에서 루프가 매번 시작될 때 발생

onstop
사용자가 stop 버튼을 눌렀을 경우 혹은 페이지를 떠날 때 발생

onsubmit
폼이 전송되기 직전에 발생

onunload
개체가 언로드되기 직전에 발생

 

<출처 : http://topboy.tistory.com/167>

+ Recent posts