반응형
반응형

Apache Ambari는 손쉬운 웹 UI 및 REST API 사용을 제공하여 Hadoop 클러스터의 관리 및 모니터링을 간소화합니다. Ambari는 Linux 기반 HDInsight 클러스터에 포함되어 있으며 클러스터를 모니터링하고 구성을 변경하는데 사용됩니다.


ubuntu 14 기준으로 설치하는 방법은 다음과 같습니다.


$ cd /etc/apt/sources.list.d

$ sudo wget http://public-repo-1.hortonworks.com/ambari/ubuntu14/2.x/updates/2.2.2.0/ambari.list

$ sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com B9733A7A07513CAD

$ sudo apt-get update

$ sudo apt-get install ambari-server


$ sudo ambari-server setup

# 설정 변경은 안하는걸로 하는게 속 편합니다.


$ sudo ambari-server start


# 로그 확인

cat /var/log/ambari-server/ambari-server.out


웹 접속

http://<ambari-server-host>:8080.

admin/admin


그런데, 기존에서 구성되어 있는 hadoop과 spark의 cluster를 import 할수는 없는것 같습니다.

아마도 Ambari에서 사용하는 HDP로 새로운 cluster 구성을 생성해야 하는 모양입니다.



참조

https://cwiki.apache.org/confluence/display/AMBARI/Install+Ambari+2.1.2+from+Public+Repositories

반응형
반응형

지금까지 총 4대의 분산 환경 서버에 기본환경을 설정하고 Hadoop을 설치해보았습니다.

이번에는 MapReduce보다 빠른 속도에 분산환경을 지원하는 메모리 기반의 Spark를 설치하고 테스트를 해보겠습니다.



Spark 설치하기



1. Spark 버젼 확인


아래 사이트에 접속하여 설치하고자 하는 spark의 버젼을 확인합니다.

http://spark.apache.org/downloads.html



2. Spark 2.0.2 설치


# home으로 이동

$ cd ~


# 설치파일 다운로드

$ wget http://www.eu.apache.org/dist/spark/spark-2.0.2/spark-2.0.2-bin-hadoop2.7.tgz


# 압축 해제

$ tar -zxf spark-2.0.2-bin-hadoop2.7.tgz


# 디렉토리명 변경

$ mv spark-2.0.2-bin-hadoop2.7/ spark


# 환경 변수 설정

$ vi .bashrc

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

export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop

export SPARK_HOME=/home/hduser/spark

export PATH=$PATH:$SPARK_HOME/bin



3. Spark on YARN


yarn 위에서 Spark를 실행할 수 있습니다. 샘플 예제를 한번 실행해보도록 합니다.

cluster 모드는 다른 node에서 driver를 실행시키는 방식이고, client 모드는 자신의 node에서 driver를 실행시키는 방식이니 상황에 따라서 적절하게 사용하면 되겠습니다.


$ spark-submit --class org.apache.spark.examples.SparkPi \

    --master yarn \

    --deploy-mode cluster \

    --driver-memory 4g \

    --executor-memory 2g \

    --executor-cores 1 \

    ~/spark/examples/jars/spark-examples*.jar \

    10


$ spark-submit --class org.apache.spark.examples.SparkPi \

--master yarn \

--deploy-mode client \

    --driver-memory 4g \

    --executor-memory 2g \

    --executor-cores 1 \

    ~/spark/examples/jars/spark-examples*.jar \

10   



4. Spark in Standalone


Spark는 독립적인 모드로도 설치 및 수행이 가능합니다. 


### yarn에서 돌리려면 master에만 설치하면되지만, Standalone mode를 위해서는 모든 slave에 설치/배포

$ scp -r /home/hduser/spark ubuntu1:/home/hduser/spark

$ scp -r /home/hduser/spark ubuntu2:/home/hduser/spark

$ scp -r /home/hduser/spark ubuntu3:/home/hduser/spark


### master 서버에서만 이후 진행

### slave 서버들을 등록

$ vi ~/spark/conf/slaves

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

ubuntu1

ubuntu2

ubuntu3


### 환경 설정

$ vi ~/spark/conf/spark-env.sh

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

SPARK_WORKER_MEMORY=2g


### 서비스 시작/종료

$ ~/spark/sbin/start-all.sh

$ ~/spark/sbin/stop-all.sh


### web ui for spark

http://ubuntu0:8080


### 테스트

$ spark-submit \

     --master spark://ubuntu0:7077 \

     --class org.apache.spark.examples.SparkPi \

     ~/spark/examples/jars/spark-examples*.jar \

     100



예제가 잘 수행이 되면 정상적으로 설치 및 설정이 된것입니다.

web ui에서 해당 application들이 수행되는 모습을 모니터링 할 수 있으며, 결과와 로그도 볼 수 있습니다.


다음에는 간단한 튜토리얼 예제 프로그램을 통해서 분산처리 프로그래밍을 살펴보도록 하겠습니다.

길고 긴 설치과정을 따라 하시는냐 수고가 많으셨습니다.



5. Spark history server


Spark에서 제공하는 history server를 띄워보겠습니다. 디폴트 UI port는 18080입니다.


$ hadoop fs -mkdir -p /user/hduser/spark/history


$ sudo vi ~/spark/conf/spark-defaults.conf

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

park.master                      spark://ubuntu0:7077

spark.eventLog.enabled         true

spark.eventLog.dir               hdfs://ubuntu0:9000/user/hduser/spark/history

spark.history.fs.logDirectory    hdfs://ubuntu0:9000/user/hduser/spark/history

spark.history.provider           org.apache.spark.deploy.history.FsHistoryProvider


$ ~/spark/sbin/start-history-server.sh


반응형
반응형

이전 내용에서 각 서버들에 공통적인 기본환경들을 구성하였습니다.

이번에는 본격적으로 Hadoop을 설치하여 서비스를 기동시키고 Mapreduce 테스트까지 돌려보겠습니다.



Hadoop 설치하기


먼저 master서버인 ubuntu0 서버부터 설치를 진행을 합니다.

그리고 진행 중간부분쯤에 설치된 패키지를 나머지 서버들로 배포를 하고 각 서버별로 재수정을 하도록 하겠습니다.


1. data 디렉토리 생성


hadoop의 HDFS(파일시스템)에 사용될 디렉토리를 생성합니다.


### 모든 서버에 data 디렉토리를 생성합니다.

$ sudo mkdir /data

$ sudo chown -R hduser:hadoop /data


### master 서버에서만 namenode 디렉토리를 생성합니다.

$ mkdir /data/tmp /data/namenode


### slave 서버들에서만 datanode와 userlogs 디렉토리를 생성합니다.

$ mkdir /data/tmp /data/datanode /data/userlogs



2hadoop 2.7.1 설치


하둡 파일을 다운로드하고 설치 및 기본 path 설정을 해줍니다.


$ cd ~


### apache repository로 부터 다운로드

$ wget http://www.us.apache.org/dist/hadoop/common/hadoop-2.7.1/hadoop-2.7.1.tar.gz


## 압축 해제

$ tar -zxf hadoop-2.7.1.tar.gz


## 디렉토리 이름변경

$ mv hadoop-2.7.1 hadoop


## 유저계정에 path설정

$ vi ~/.bashrc

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

# Java and Hadoop variables

export HADOOP_HOME=/home/hduser/hadoop

export JAVA_HOME=/opt/jdk/jdk1.8.0_111/ 

export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

export HADOOP_CLASSPATH=${JAVA_HOME}/lib/tools.jar


## 하둡 환경 설정

$ vi ~/hadoop/etc/hadoop/hadoop-env.sh

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

export JAVA_HOME=/opt/jdk/jdk1.8.0_111/ 



3. master서버의 config 파일 설정


우선 master서버의 config 파일들이 있는 디렉토리로 이동하여 설정 xml 파일을 작성해줍니다.


$ cd ~/hadoop/etc/hadoop/



### Configuration for the Master

$ vi core-site.xml

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

<configuration>

    <property>

        <name>fs.defaultFS</name>

        <value>hdfs://ubuntu0:9000</value>

    </property>

    <property>

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

        <value>/data/tmp</value>

    </property>

</configuration>


### hdfs 환경 설정 (디폴트 복제는 3이지만 2만 해줍니다.)

$ vi hdfs-site.xml

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

<configuration>

    <property>

        <name>dfs.replication</name>

        <value>2</value>

    </property>

    <property>

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

        <value>/data/namenode</value>

    </property>

</configuration>


### yarn 환경 설정 (memory와 core수는 각자의 서버에 적절한 값으로 설정해줍니다.)

$ vi yarn-site.xml

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

<configuration>


    <!-- YARN master hostname -->

    <property>

        <name>yarn.resourcemanager.hostname</name>

        <value>ubuntu0</value>

    </property>


    <!-- YARN settings for lower and upper resource limits -->

    <property>

        <name>yarn.scheduler.minimum-allocation-mb</name>

        <value>512</value>

    </property>

    <property>

        <name>yarn.scheduler.maximum-allocation-mb</name>

        <value>4096</value>

    </property>

    <property>

        <name>yarn.scheduler.minimum-allocation-vcores</name>

        <value>1</value>

    </property>

    <property>

        <name>yarn.scheduler.maximum-allocation-vcores</name>

        <value>2</value>

    </property>


    <!-- Log aggregation settings -->

    <property>

        <name>yarn.log-aggregation-enable</name>

        <value>true</value>

    </property>

    <property>

        <name>yarn.log-aggregation.retain-seconds</name>

        <value>86400</value>

        <description>How long to keep aggregation logs. Used by History Server.</description>

    </property>


</configuration>


### mapreduce 환경 설정 (memory 값은 각자의 서버에 적절하게 지정해주도록 합니다.)

$ vi mapred-site.xml

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

<configuration>


    <property>

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

        <value>yarn</value>

    </property>


    <!-- MapReduce ApplicationMaster properties -->

    <property>

        <name>yarn.app.mapreduce.am.resource.mb</name>

        <value>1536</value>

    </property>

    <property>

        <name>yarn.app.mapreduce.am.command-opts</name>

        <value>-Xmx1536m</value>

    </property>


    <!-- Mappers and Reducers settings -->

    <property>

        <name>mapreduce.map.memory.mb</name>

        <value>2048</value>

    </property>

    <property>

        <name>mapreduce.map.cpu.vcores</name>

        <value>1</value>

    </property>

    <property>

        <name>mapreduce.reduce.memory.mb</name>

        <value>4096</value>

    </property>

    <property>

        <name>mapreduce.reduce.cpu.vcores</name>

        <value>1</value>

    </property>

    <property>

        <name>mapreduce.job.reduces</name>

        <value>2</value>

    </property>


    <!-- History Server settings -->

    <property>

        <name>mapreduce.jobhistory.address</name>

        <value>ubuntu0:10020</value>

    </property>

    <property>

        <name>mapreduce.jobhistory.webapp.address</name>

        <value>ubuntu0:19888</value>

    </property>



</configuration>


### 마스터 서버에만 slave 서버들을 등록해줍니다.

$ vi slaves

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

ubuntu1

ubuntu2

ubuntu3



4. slave 서버들로 배포


지금까지 기본 설치 및 설정한 hadoop 패키지를 다른 서버로 배포합니다.

개별적으로 설치하는 것보다 시간을 단축시킬 수 있어 편리합니다.


### 서버별 배포

$ scp -r /home/hduser/hadoop ubuntu1:/home/hduser/hadoop

$ scp -r /home/hduser/hadoop ubuntu2:/home/hduser/hadoop

$ scp -r /home/hduser/hadoop ubuntu3:/home/hduser/hadoop



5. slave 서버들의 환경 설정


### Configuration for the Slaves

### Slave1 server에서 수정하여 다른 Slave2, Slave3 server들로 동기화 전송함


$ vi core-site.xml

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

<configuration>

    <property>

        <name>fs.defaultFS</name>

        <value>hdfs://ubuntu0:9000</value>

    </property>

    <property>

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

        <value>/data/tmp</value>

    </property>

</configuration>



$ vi hdfs-site.xml

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

<configuration>

    <property>

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

        <value>/data/datanode</value>

    </property>

</configuration>



$ vi yarn-site.xml

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

<configuration>


    <property>

        <name>yarn.nodemanager.aux-services</name>

        <value>mapreduce_shuffle</value>

    </property>


    <!-- Link to the master node -->

    <property>

        <name>yarn.resourcemanager.hostname</name>

        <value>ubuntu0</value>

    </property>


    <!-- Available resources for YARN containers on this node -->

    <property>

        <name>yarn.nodemanager.resource.memory-mb</name>

        <value>7048</value>

    </property>

    <property>

        <name>yarn.nodemanager.resource.cpu-vcores</name>

        <value>2</value>

    </property>


    <property>

        <name>yarn.nodemanager.vmem-check-enabled</name>

        <value>false</value>

    </property>


    <!-- Log aggregation settings -->

    <property>

        <name>yarn.log-aggregation-enable</name>

        <value>true</value>

    </property>

    <property>

        <name>yarn.nodemanager.log-dirs</name>

        <value>/data/userlogs</value>

    </property>

    <property>

        <name>yarn.log.server.url</name>

        <value>ubuntu0:19888</value>

    </property>

    <property>

        <name>yarn.nodemanager.delete.debug-delay-sec</name>

        <value>86400</value>

    </property>


</configuration>


### 변경사항 동기화 전송

$ rsync -av /home/hduser/hadoop/etc/hadoop ubuntu2:/home/hduser/hadoop/etc

$ rsync -av /home/hduser/hadoop/etc/hadoop ubuntu3:/home/hduser/hadoop/etc



6. HDFS 시작


설치가 모두 완료가 되었으니 이제 hdfs (파일시스템)을 기동합니다.


### namenode를 format 하고 hdfs start.

$ hadoop namenode -format daesonyCluster

$ start-dfs.sh    #서비스 시작

$ stop-dfs.sh    #서비스 종료


### web ui에서 Namenode 1개와 Datanode 3개가 잘 나타나면 정상

http://ubuntu0:50070


### 만약 이상이 있다면 각 서버별로 로그들을 확인

$ cd ~/hadoop/logs


여기서 한가지 주의할 점이 있습니다.

초기 설치시에는 해당사항이 없지만 한번 서비스를 진행하다가 다시 namenode를 format 해야하는 일이 생기면, 반듯이 먼저 datanode 하위 모든 파일을 삭제하고 진행을 해야 합니다. 만약 하위 파일들을 삭제하지 않고 format을 하면 namenode의 clusterId와 datanode의 clusterId가 달라져서 정상적으로 동작하지 않을 수 있습니다.

참고 : http://hadooptutorial.info/incompatible-clusterids/



7. Filesystem 테스트


Hadoop 파일시스템에 디렉토리를 생성하고 테스트 파일(/opt/test.txt)을 업로딩 해봅니다.


$ hadoop fs -mkdir /user

$ hadoop fs -mkdir /user/hduser

$ hadoop fs -put /opt/test.txt /user/hduser

$ hadoop fs -ls /user/hduser



8. Yarn 시작


하둡의 분산환경에서 리소스를 관리해주는 yarn 서비스를 시작합니다.


$ start-yarn.sh    #서비스 시작

$ stop-yarn.sh    #서비스 종료


#web ui for yarn

http://ubuntu0:8088



9. history server 시작


application이 실행이 되면 그 수행 기록들이 history server에 남게 됩니다.


$ mr-jobhistory-daemon.sh start historyserver    #서비스 시작

$ mr-jobhistory-daemon.sh stop historyserver    #서비스 종료


#web ui for history

http://ubuntu0:19888



10. MapReduce 예제 실행


여기까지 잘 진행이 되었다면 설치가 모두 완료가 되었습니다.

정상적으로 동작하는지 테스트를 위해서 PI 값을 구하는 예제를 실행해봅니다.


저는 해당 예제의 실행 속도가 약 1분 30초 정도 걸리는 것을 볼 수 있습니다. 

이는 datanode의 갯수와 cpu, memory에 따라 분산처리 성능의 차이가 발생하니 결과값을 비교해 보시길 바랍니다.


$ yarn jar $HADOOP_HOME/share/hadoop/mapreduce/*examples*.jar pi 50 100

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

Job Finished in 82.415 seconds

Estimated value of Pi is 3.14160000000000000000


# ResourceManager UI or History Server UI 에서 해당 log를 볼수있게됨

$ yarn logs --applicationId application_1482330106523_0001 > pi_app.log


만약에 실행중에 container-is-running-beyond-memory-limits 와 같은 오류가 발생을 한다면 yarn 환경설정에서 메모리 설정에 문제가 발생한 경우입니다. 각 서버별로 로그들을 확인하고 충분한 메모리를 할당해주도록 합니다.

참조 : http://stackoverflow.com/questions/21005643/container-is-running-beyond-memory-limits


수고하셨습니다~ Hadoop 설치가 모두 완료되었습니다.

MapReduce를 사용해서도 많은 것을 수행할 수 있지만, 디스크 IO 작업이 많이 발생하기에 최근에는 메모리 기반의 Spark을 많이 사용하고 있습니다. 다음에는 Spark에 대해서 알아보도록 하겠습니다.



반응형
반응형

http://daeson.tistory.com/entry/Hadoop-Cluster-Spark-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0-1%EC%84%9C%EB%B2%84-%ED%99%98%EA%B2%BD%EA%B5%AC%EC%84%B1



분산환경의 빅데이터 서버를 구성하기 위해서는 apache hadoop을 많이 사용하고 있습니다.

데이터가 점차 중요해지는 시기가 되고 있고 엄청나게 많은 데이터가 넘쳐나고 있는 지금의 세상에서 어쩌면 가장 필수적인 서버 환경이 되지 않을까 싶은 생각이 듭니다.


그래서, 올해 마지막이자, 개인적인 연말 프로젝트로 시작하는 분산컴퓨팅 환경을 구축하려고 합니다.

ubuntu 14 서버 총 4대를 가지고 hadoop cluster 환경을 구축하고 이어서 spark까지 해보도록 하겠습니다.


워낙 길고 긴 여정이 될 내용인지라 너무 길어서 조금 나눠서 올릴 계획입니다. 

아마 3~4부 정도 되지 않을까 싶으네요.




서버 환경 구성하기


일단 hadoop을 설치하기 전에,

4대의 ubuntu 서버들 모두에게 공통적으로 기본 환경 구성에 필요한 내용들을 먼저 해주어야 합니다.



1. user/usergroup 생성


모든 서버에 hadoop 사용자 그룹과 유저를 생성하고 권한을 부여해 줍니다.


### 모든 서버에 hadoop 유저그룹과 hduser 유저 생성
$ sudo addgroup hadoop
$ sudo adduser --ingroup hadoop hduser

### sudoers file에 hduser 추가
$ sudo visudo
----------------------------------------------------------------------------------

hduser ALL=(ALL:ALL) ALL

### hduser로 로그인
$ su - hduser


2. ssh 설정


hadoop은 분산처리시에 서버들간에 ssh 통신을 자동적으로 수행하게 됩니다.

이를 위해서 암호입력 없이 접속이 가능하도록 ubuntu0 서버에서 공개키를 생성하고 생성된 키를 각 서버들에 배포해줍니다.


### ssh 설정 변경

$ sudo vi /etc/ssh/sshd_config

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

PubkeyAuthentication yes

AuthorizedKeysFile      .ssh/authorized_keys


### 공개키를 생성

$ mkdir ~/.ssh

$ chmod 700 ~/.ssh

$ ssh-keygen -t rsa -P ""

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys


### 공개키를 각 서버에 배포

$ ssh-copy-id -i ~/.ssh/id_rsa.pub ubuntu1

$ ssh-copy-id -i ~/.ssh/id_rsa.pub ubuntu2

$ ssh-copy-id -i ~/.ssh/id_rsa.pub ubuntu3


### 접속 테스트

$ ssh ubuntu1



3. java 설치


Hadoop이 JVM을 사용하기 때문에 모든 서버에 java SDK를 설치하도록 합니다.

현재 Hadoop 버젼이 2.7.* 이며, 버젼 2 이상부터는 java 1.7 이상에서만 지원이 되기에 이미 설치가 되어 있다면 버젼확인을 해보시길 바랍니다.


여기서는 현재 최신 버젼인 java 1.8을 설치하겠습니다.


### directory 생성
$ sudo mkdir /opt/jdk
$ cd /opt

### Download archive
$ sudo wget --header "Cookie: oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u111-b14/jdk-8u111-linux-x64.tar.gz"

### Unpack
$ sudo tar -zxf jdk-8u111-linux-x64.tar.gz -C /opt/jdk

### Update Ubuntu alternatives symbolic links
$ sudo update-alternatives --install /usr/bin/java java /opt/jdk/jdk1.8.0_111/bin/java 100
$ sudo update-alternatives --install /usr/bin/javac javac /opt/jdk/jdk1.8.0_111/bin/javac 100

$ java -version


java 버젼정보가 보여지면 정상적으로 설치가 잘 되었습니다.



4. locale 확인(옵션)


모든 서버의 locale 정보를 확인해보고 en_US.UTF-8 혹은 ko_KR.UTF-8 이 아닌 경우에만 변경을 해주면 됩니다.

일반적으로는 변경할 필요가 없으니 옵션사항으로 생각하시고 skip 하시면 되겠습니다.


### 정보 확인

$ locale
$ cat /etc/default/locale

### locale 변경하기
$ sudo locale-gen ko_KR.UTF-8
$ vi /etc/default/locale
----------------------------------------------------------------------------------
LANG="ko_KR.UTF-8"
LANGUAGE="ko_KR:ko:en_US:en"

### 변경된 locale을 적용하기 (서버 재부팅 필요없음)
$ source /etc/default/locale

### 만약 언어 설정이 제대로 적용이 되지 않으면 아래의 설치 여부를 확인해보세요
### 설치된 언어팩 리스트 확인
$ sudo apt list --installed | grep language*

### 설치 가능한 리스트 확인

$ sudo apt-cache pkgnames | grep language-pack-ko



5. hosts 파일 수정


분산 환경이기 때문에 4대의 서버 모두에 접속이 자유롭게 되어야 합니다.

이를 위해서 모든 서버들의 hosts 파일에 ip와 host 이름을 생성해 주도록 합니다.

참고로 여기서는 ubuntu0이 master 서버가 될 예정이고, 그외 서버들은 slave 서버가 될 예정입니다.


### hosts 파일 수정

$ sudo vi /etc/hosts
----------------------------------------------------------------------------------
10.1.1.58        ubuntu0
10.1.1.13       ubuntu1
10.1.1.15       ubuntu2
10.1.1.221      ubuntu3

### 확인

$ cat /etc/hosts



6. hostname 변경


각각 4대 서버들의 이름을 위에서 지정한 host 이름과 동일하게 맞춰주도록 합니다.


### ubuntu0 서버의 경우

$ sudo vi /etc/hostname

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

ubuntu0


### 변경사항 적용하기 (서버 재부팅 필요없음)

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



여기까지 되면 기본적인 서버들의 환경설정이 모두 완료되었습니다.

다음에는 Hadoop을 설치하고 구동해보도록 하겠습니다.



반응형
반응형

빅데이터 저장소


- 1테라 바이트를 약 100MB/S 로 전송한다면 2시간 반 이상 걸린다.

- 100개의 드라이브가 있고, 각 드라이브는 100/1씩 저장하고 병렬로 동작한다면 2분내에 데이터를 읽을 수 있다

- 병렬 분산처리를 위해서는 하드웨어 장애와 데이터 분할 결합에 대한 고려가 필요하다.

- 하둡은 안정적인 공유저장소(HDFS)와 분산 프로그래밍 프레임웍(맵리듀스)을 제공한다.



HDFS


- 파일시스템(Storage)

- FILE은 Block 단위(64MB or 128MB)로 분할되고 분산되어 저장됨

- 분할된 정보는 Name node(master)에 메타정보가 기록이 되고, 실제 분할된 파일은 Data node(Slave)들에 분산되어 저장이 됨

- Name node 가 없으면 Data node에 저장된 분할된 파일을 찾을 수 없다.

- 각 Block은 장애 복구 용도로 복제본이 생성(default 3 copy) 되어 여러 Data node에 분산되어 저장이 된다.

- HDFS 접근 방법 : Shell 사용(hadoop fs), Java API, Ecosystem(Hue, Sqoop, Flume)

- A.log 파일을 hadoop fs -get 하여 가져올때 Name node에서 해당 파일의 메타 정보를 기준으로 분산저장이 되어 있는 Data node에 저장된 파일을 찾아온다. 이때, 복제본중에서 리소스가 여유있는 서버(혹은 Data node)에 저장되어 있는 파일을 찾아준다.

- Job tracker(master) 데몬이 각각의 task들을 관리해주고 있고, Task tracker(slave) 데몬은 각 Data node에 있는 분산파일 처리를 담당하고 있다.

- Task tracker는 mapper task와 reducer task로 구성이 되어 있으며 해당 task가 위치한 Data node의 데이터를 사용해서 MapReduce를 수행한다.



MapReduce


- Hadoop 클러스터의 분산 데이터를 처리하기 위한 방식(computation)

- 큰 파일을 분할(map)하여 저장하고, 분할된 파일을 다시 하나로 병합(reduce)하는 프레임웍

- 예시, wordcount(단어 갯수 세기), 1억개 단어를 가지고 있는 하나의 파일을 단일 프로세스로 수행하는 것보다 100개 단어를 가지는 100만개 파일로 분할하여 각각 수행하고 이 결과를 최종 병합하여 수행하는 개념이다.

- map은 다수의 data node에 동일한 작업을 수행한다.

- HDFS(Disk)에서 데이터를 read하여 MapReduce 수행하고 완료되면 HDFS(Disk)에 데이터를 다시 write한다.

- Disk IO는 비용이 크기 때문에 이를 Memory로 대체하는 방법이 대안으로 제시된다. (Spark)

- 각 data node의 task들이 모두 완료가 되어야 Reduce를 수행할 수 있다. (하나라도 늦게 끝나면 전체적으로 처리시간이 늦어지는 문제점이 있다.)

- Mapper는 Key/Value 형태로 데이터를 읽어서 처리하고 그 결과를 [Key/Value] List 형태로 출력한다.

- Mapper 출력의 Key 값은 중요하게 사용할 수도 있고 무시할 수도 있고 변경하여 새로운 key를 생성할 수도 있다.

- Mapper는 각 pc에서 memory를 사용해서 처리됨으로 시간이 짧게 걸린다.

- Reducer는 shuffle, sort가 이루어지고 최종적으로 원하는 결과를 출력하도록 수행이 된다.

- shuffle은 Mapper가 출력한 데이터를 Reducer에게 적절히 배분하여 전달해주어야 함으로 시간이 상당히 오래걸린다.(하둡이 해줌)

- sort는 key 값을 cache하여 같은 key 값을 갖는 데이터는 같은 reducer로 전달이 된다.

- Reducer의 입력은 Mapper의 출력인 [Key/Value] List 형태가 되고, 출력은 Key/Value 가 된다.

- Reducer의 출력은 다시 HDFS에 저장된다.

- MapReduce 프로그램은 Java or Python으로 한다.





HIVE


- MapReduce 프로그램을 통해서 데이터를 처리하거나 분석해야하는데 데이터 분석자는 프로그램을 할줄 모른다.

- 페이스북에서 이에 대한 고민을 통해서 Hive를 만들었다.

- RDBMS의 Sql와 비슷하게 작성된 문장(HiveQL)을 Hive가 이를 Mapreduce로 converting 하여 수행해준다.

- structured data 를 Hadoop file system에 저장하기 위한 data warehousing system이다.

- MapReduce를 몰라도 대용량 데이터를 처리하기 용이하다.

- high level 언어임으로 단점이 발생함.(개별 record의 insert, update, delete, transaction이 지원안됨)

- 로그 분석, Data/Text mining(기계학습), 광고배달, 스팸방지등에 활용된다.

- Local PC에 mysql DB를 생성하고 메타데이터(테이블)를 생성 한후 HDFS로 올리는 방법을 많이 사용한다. 직접 HDFS에 생성하는 것은 힘듬

- RDBMS Table을 Hadoop HDFS File로 올릴때에는 Sqoop을 사용한다.

- Hive도 Metastore(master)가 있고, Hive Tables(slave)가 있다. HDFS의 구성과 비슷하게 생성이 됨.

- 기존의 RDBMS 데이터를 HDFS에서 사용이 가능하다.

- Hive에서 ngrams를 지원해준다.

- Hive에서 sentences() 함수는 문장을 array of words로 변환해준다. 2개 이상의 문장은 2-dimensional로 변환해준다.



n-grams


- 검색엔진과 같은 application에서 검색결과의 spelling 교정에 사용

- 웹 페이지에서 가장 중요한 topics 찾는데 사용

- SNS message등에서 트랜드 topics 검색에 사용



Python Basics


http://ai.berkeley.edu/tutorial.html#PythonBasics



pySpark


- RDD(Resilient Distributed Dataset) : 메모리에 데이터 손실이 되어도 다시 생성이 가능하고, 메모리에 분산 저장되어 있고, 초기 데이터는 파일을 통해 가져온다.

- RDD는 spark의 기본적인 데이터 단위이다.

- RDD를 생성하는 방법

sc.textFile("text.txt") #from file to RDD

sc.parallelize(num) #from memory(list) to RDD

objectRDD.map(lambda line: line.upper()) #from RDD to new RDD

- RDD Operations

Actions : RDD의 값을 리턴하거나 내장함수를 사용한다.

Transformations : 현재 RDD로 부터 새로운 RDD를 생성한다.

- RDD는 immutable이여야 하며, 절대로 값이 불변이다. 그러므로 변경하고자 할때에는 transformation을 통해 새로운 RDD로 생성해야 한다.

- transformation에 사용되는 대표적인 함수는 map(f), filter(f), flatMap(f), distinct() 이다.

http://spark.apache.org/docs/latest/programming-guide.html#transformations

- action에 사용되는 대표적인 함수는 count(), take(n), collect(n), saveAsTextFile(path) 이다.

http://spark.apache.org/docs/latest/programming-guide.html#actions

- RDD 데이터는 action 함수로 인한 작업을 만날때까지는 실제적으로 수행/처리되지 않는다. transformations는 즉시 수행이 되지 않는다. (Lazy Execution)

- 복잡한 처리를 한번에 수행하게 되면 시간이 오래걸리므로, 중간에 적절하게 action 함수를 혼용해서 프로그래밍 한다.

- transformations 구문들은 chaining 하여 1라인으로 작성해도 된다.


- Spark 에서는 driver와 executors로 구성이 되고 이 둘 사이에는 통신을 한다.

- Spark Application 을 시작할때 SparkContext 생성으로 부터 시작되고 Master node에서는 동작 가능한 cores을 사용자의 spark application에 할당한다.

- 사용자는 보통 Spark Context를 사용해서 RDD 생성하고 사용한다.

- SparkContext 사용 방법 : sc = SparkContext(conf = conf)

- Partition 갯수 변경 및 확인 방법 : repartition(n), getNumPartitions() <- number만 지정해주면 spark이 알아서 분배해준다.

- python의 range(10,21) 함수는 선언 즉시 메모리를 할당하고 list 값을 갖지만, xrange 함수는 실행되는 시점에 메모리를 할당(lazy evaluation)한다.

- RDD의 lineage 확인하는 방법 : RDD.toDebugString()

- RDD의 type 확인하는 방법 : print 'type of RDD: {0}',format(type(RDD))


- map 함수를 사용하는 방법 : RDD.map(f), f 함수는 partition별로 처리할 로직의 함수이며 새로 생성되는 RDD는 동일한 partition 수를 갖는다.

- filter 함수를 사용하는 방법 : RDD.filter(f), f 함수는 true or false 값을 리턴해주어야 하며 true에 해당하는 data만 남게된다. data가 없어도 partition 수는 그대로 유지가 된다.

- reduce 함수는 파라메터로 function을 전달 받는데 이 function은 항상 associative(더하기 연산) 하고 commutative(곱하기 연산) 해야한다. (마이너스나 나누기 연산은 partition 변경에 따라 값이 달라지므로 사용 불가)

- takeSample 함수는 중복 허용 여부에 따라 num 갯수만큼 샘플링한다. seed 값을 사용하면 항상 같은 샘플링 값이 나오도록 할 수 있다.


- key/value 데이터의 경우에는 reduceByKey(f) 를 사용할 수 있다. 동일node의 같은key기준으로 병합한다. 이는 shuffling 할 때 네트워크 부하를 줄여주는 효과가 있다. (groupByKey()는 데이터가 많이 몰릴경우 네트워크 부하발생 및 out of memory가 발생할 수 있어 주의해야한다.)

- mapValues(sum) 이나 mapValues(list)를 사용해서 pySpark에서 처리도 가능하다.

- pySpark wordcount

text = sc.textFile("test")

wc = text.flatMap(lambda line : line.split()).map(lambda word : (word,1)).reduceByKey(lambda c1,c2 : c1+c2)

wc.collect()

print wc.sortByKey(ascending=True).collect()

print wc.map(lambda (w,c) : (c,w)).sortByKey(ascending=False).collect()

- file 기반의 검색 및 split 하기 위해서 정규화표현식(Regexp)을 사용한다.



(참고)

http://www.kocw.net/home/search/kemView.do?kemId=1174002

http://wiki.gurubee.net/pages/viewpage.action?pageId=28116079

http://hadoop.apache.org/

http://spark.apache.org/docs/latest/programming-guide.html

반응형

+ Recent posts

반응형