반응형

1. 서론

이번 포스팅에서는 Hadoop 시스템 서비스 중 하나인 Hive에 대해 설명 및 간단한 예제를 진행하려고 합니다.

 

2. Hive

Hive는 페이스 북에서 개발 되었습니다.

Hive는 하둡에 저장된 데이터를 sql 기반으로 간편히 mapreduce를 수행할 수 있으며,

추가로 elasticsearch, hbase와 같은 저장소와 hdfs상의 중간 인터페이스 역할도 제공합니다.

 

hdfs에 있는 파일은 일반적으로 tab 혹은 , 으로 구분자를 통해 각 자리에 의미있는 데이터가 있습니다.

이러한 구분자를 기반으로 테이블을 생성해주고, select, insert쿼리를 수행할 수 있게 해줍니다.

단, update 와 delete쿼리는 지원되지 않습니다.
이유는, 결국 데이터는 구분자를 통한 파일의 한줄이기 때문입니다.
그 말은, DB와 같이 인덱싱이 걸려있지도, key가 있지도 않다는 의미입니다.

 

테이블은 아래와 같이 2가지가 존재합니다.

 

  • managed table
  • external table

 

1) managed table

 

hdfs의 데이터를 Hive에서 관리한다는 의미를 가지고 있습니다.

그렇기 때문에, drop table 질의를 하는 경우 hdfs의 데이터도 사라지게 됩니다.

 

2) external table

 

hdfs의 데이터와 hive 테이블과 심볼릭 링크가 걸린다고 생각하시면 됩니다.

그렇기 때문에, drop table 질의를 하는 경우에도 hdfs의 데이터는 유지가 됩니다.

 

3. 예제

예제로는 hdfs에 있는 데이터를 external 테이블로 만든 후, sql를 통하여 managed table로 만들고 두 테이블을 모두 drop 했을때의 hdfs 데이터 상태를 봐보도록 하겠습니다.

 

1) 데이터 준비

 

저는 아래와 같이 \t 구분자로 데이터를 hdfs:/user/young에 놓았습니다.

 

kim     1
geon    2
young   3
kim     1
geon    2
yeong   3

 

2) external table 생성

 

Hive에 접속하기 위해 hive 명령어를 통해 접속합니다.

그 후, 기본적으로 있는 default DB를 사용하도록 하겠습니다.

 

 

이제 아래와 같이 external 테이블을 생성합니다.

CREATE EXTERNAL TABLE temp
 (
    text string,
    count int
 )
 ROW FORMAT DELIMITED
 FIELDS TERMINATED BY '\t'
 STORED AS TEXTFILE
 LOCATION '/user/young';

ROW FORMAT DELIMITED FIELDS TERMINATED BY 에는 한 라인에서 데이터를 나눌 구분자를 지정합니다.

저의 경우 \t으로 데이터를 만들었기 때문에 '\t'를 지정합니다.

 

LOCATION 에는 연결을 원하는 hdfs상 디렉토리경로를 지정합니다.

 

아래와 같이 테이블을 생성하게 되면 테이블 목록에 보이게 되며,

select 쿼리를 통하여 데이터를 조회할수도 있습니다.

 

 

 

 

 

 

반응형

 

 

 

 

 

 

3) managed table 생성

 

이젠 이 external table을 사용하여 새로운 managed table을 만들어보겠습니다.

 

쿼리는 아래와 같습니다.

 

CREATE TABLE temp_managed
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE
LOCATION '/user/young2'
AS
SELECT text, sum(count)
FROM temp
GROUP BY text
;

 

text로 group by 로 묶어서 count를 더하는 wordcount의 reducer의 역할을 하도록 쿼리하였고,

결과를 /user/young2 디렉토리에 놓도록 지정하였습니다.

managed 테이블은 단순히 external 이 아닌 create table로 테이블을 만들면 됩니다.

 

쿼리가 수행 후에는 아래와 같이 테이블 목록 및 hdfs에도 파일이 생성된것을 확인할 수 있습니다.

 

 

4) external table drop

 

이번에는 처음 만들었던 external table인 temp를 drop 시킨 후 hdfs의 파일을 봐보도록 하겠습니다.

 

쿼리는 아래와 같습니다.

drop table temp;

 

결과로는 아래와 같이 hdfs상의 데이터에는 영향이 없는것을 볼 수 있습니다.

이것은, 단순히 hdfs와 hive table간의 link만 끊은 것이기 때문입니다.

 

 

5) managed table drop

 

이번에는 managed table인 temp_managed 를 drop 시킨 후 hdfs 파일을 보도록 하겠습니다.

 

쿼리는 아래와 같습니다.

 

drop table temp_managed;

 

결과는 아래와 같이 hdfs의 데이터도 모두 삭제되어 No such File 구문이 나온것을 볼 수 있습니다.

 

 

추가로, Hive는 sql을 통해 간편히 데이터를 핸들링하기 위한 인터페이스이고, 모든 작업은 mapreduce로 이루어집니다.

 

 

4. 하이브 지원 SQL

 

하이브에서만 지원되는 sql 들이 있습니다.

 

그 중, 알아두면 유용할 정렬에 관련해서 아래 3개에 대해 정리하였습니다.

 

1) sort by

 

order by 와 비슷하게 느낄수도 있습니다.

하지만 order by의 경우에는 전체 결과를 하나의 리듀서가 정렬을 하게되는 반면,

sort by의 경우에는 각 리듀서에서 정렬을하게 됩니다.

 

그로인해, 리듀서 갯수 multiple이기 때문에 성능에 이점을 볼 수 있습니다.

단, 각 리듀서에서만 정렬이 이루어지기 때문에 정확히 정렬된  결과물은 보장되지 않습니다.

>리듀서 갯수를 한개로 한다면 order by 와 동일한 결과가 나옵니다.

 

2) distribute by

 

distribute by로 지정한 칼럼 기준으로 한 리듀서에 지정한 동일한 칼럼값의 데이터가 가도록 나누는 역할을 합니다.

 

예로, 아래와 같은 데이터가 있을 시

name age
kim 1
geon 2
yeong 2

distribute by age 를 하게되면 한 리듀서에는 (kim, 1)를 받게되고, 다른 리듀서는 (geon, 2), (yeong, 2)를 받게됩니다.

 

3) cluster by

 

cluster by는 distribute by와 sort by를 모두 한다고 보면 됩니다.

 

cluster by age를 하게되면, 각 리듀서는 age 기준으로 데이터 묶음을 받게되고 각 리듀서는 age기준으로 정렬하게 됩니다.

5. 마무리

이번 포스팅에서는 Hive에 대해 포스팅 하였습니다.

 

이렇게, Hadoop에 대한 포스팅을 완료했습니다.

다음 포스팅에서는 Hadoop eco system에서 많이 쓰이는 Spark에 대해 진행하도록하겠습니다.

 

감사합니다.

 

반응형

'BigData > Hadoop' 카테고리의 다른 글

(3) Hadoop 사용법  (0) 2020.03.09
(2) Hadoop 설치  (0) 2020.03.05
(1) Hadoop에 대해  (0) 2020.03.04
반응형

1. 서론

이번 포스팅에서는 간단히 Hadoop의 hdfs와 mapreduce를 진행해보겠습니다.

2. hdfs

hdfs 는 기본적으로 알고계신 파일 시스템이라고 보셔도 무방합니다.

단, hdfs는 설정값에 따라 replication과 파일을 block 단위로 관리합니다.

간단히 진행할 hdfs 의 명령어는 아래와 같습니다.

 

  • cat 
  • appendToFile
  • ls
  • copyFromLocal
  • copyToLocal
  • count
  • cp
  • du
  • expunge
  • get
  • getfacl
  • getmerge
  • mkdir
  • moveFromLocal
  • mv
  • put
  • rm
  • rmr
  • setfacl
  • setfattr
  • setrep
  • stat
  • tail
  • test
  • text
  • touchz

먼저 위 명령어들을 알아보기 전에 간편히 작업하기 위해

아래 사진과 같이 hdfs 권한 검사의 체크를 제거해주세요.

파일 권한 체크를 해제하는 옵션입니다.

 

1) cat

 

리눅스의 cat과 동일합니다.

 

아래는 sample.txt 파일을 cat으로 확인한 예제입니다.

 

2) appendToFile

 

Local 파일을 hdfs 파일에 append 하기위한 명령어

 

아래는 로컬의 young이 들어있는 sample2.txt 파일을 hdfs의 sample.txt 에 append한 후 cat으로 확인하는 예제입니다.

 

3) ls

 

특정 디렉토리의 파일, 디렉토리를 보여주는 명령어

 

아래는 ls 명령어 예제입니다.

 

 

4) copyFromLocal

 

로컬 파일을 hdfs 로 복사하는 명령어 입니다.

 

아래는 로컬 sample3.txt 파일을 hdfs에 복사하는 예제입니다.

 

 

5) copyToLocal

 

이번엔 반대로 hdfs에 있는 파일을 로컬로 복사하는 명령어 입니다.

 

아래는 hdfs의 sample.txt 파일을 로컬로 복사하는 예제입니다.

 

6) count

 

hdfs의 디렉토리, 파일의 갯수를 카운트하여 보여주는 명령어 입니다.

 

아래는 /user/young의 count한 결과 사진입니다.

 

count는 [디렉토리 갯수, 파일 갯수, 전체 사이즈] 로 보여줍니다.

 

7) cp

 

cp는 hdfs내에서 복사하는 경우 사용하는 명령어입니다.

 

아래는 /user.young의 sample.txt 파일을 /user/geonyeong 디렉토리로 복사한 예제입니다.

 

 

8) du

 

특정 디렉토리 혹은 파일의 사이즈를 보여줍니다.

 

아래는 /user/young의 사이즈를 보여주는 예제입니다.

각 파일의 사이즈와 replication * 파일 size 인 총합도 보여줍니다.
아래 예제의 경우에는 replication이 3으로 filesize * 3이 노출되게 됩니다.

 

9) expunge

 

완전 삭제입니다.

 

hdfs dfs -expunge

 

 

 

 

 

반응형

 

 

 

 

 

 

 

10) get

 

copyToLocal과 같은 명령어입니다.

 

아래는 get 명령어의 예제입니다.

 

 

11) getfacl

 

hdfs의 특정 디렉토리 혹은 파일의 ACLs를 보여주는 명령어입니다.

 

아래는 getfacl 명령어의 예제입니다.

 

 

12) getmerge

 

hdfs의 파일을 append한 후 로컬로 다운로드받는 명령어입니다.

 

아래는 예제입니다.

 

 

13) mkdir

 

디렉토리를 생성하는 명령어

 

아래는 예제입니다.

 

 

14) moveFromLocal

 

로컬파일을 hdfs에 올립니다.

copy가 아닌 mv로 로컬 파일은 삭제됩니다.

 

아래는 예제입니다.

 

 

15) mv

 

hdfs 상에서 mv 명령어 입니다.

 

아래는 예제 입니다.

 

 

 

16) put

 

copyFromLocal 명령어와 동일합니다.

 

 

17) rm

 

hdfs 파일을 삭제 합니다.

 

아래는 예제입니다.

 

18) setfacl

 

hdfs의 파일, 디렉토리의 ACLs를 setting 하는 명령어입니다.

 

19) test

 

파일이 존재하는지 체크하는 명령어입니다.

아래는 명령어 옵션값입니다.

 

-e : 파일이 존재하면 return 0

-z : 파일 길이가 0이면 return 0

-d : 디렉토리면 return 0

 

아래는 예제입니다.

 

 

3. mapreduce

mapreduce를 수행하기 위해선 mapper와 reducer가 있는 빌드된 fat jar가 있어야합니다.

1. mapper만 존재해도 됩니다.
2. spring의 boot jar는 안됩니다. 이유는 맵리듀스가 mapper와 reducer의 full packager경로로 찾아야 하는데 boot jar의 경우에는 찾을 수 없기 때문입니다.

저는 mapreduce의 대표적인 예제인 wordcount를 진행하도록 하겠습니다.

 

우선 아래와 같이 예제 jar를 다운 및 압축을 해제합니다.

 

wget http://www.java2s.com/Code/JarDownload/hadoop-examples/hadoop-examples-1.2.1.jar.zip
unzip hadoop-examples-1.2.1.jar.zip

 

그후, 저는 아래와 같은 파일을 hdfs:/user/young에 올렸습니다.

 

 

이제 아래와 같이 wordcount 작업을 yarn에게 제출합니다.

 

hadoop jar <jar path> <main class> [input file path] [output directory path]

 

hadoop jar hadoop-examples-1.2.1.jar wordcount /user/young/sample.txt /user/young2

 

그럼 이제 아래와 같이 mapreduce 작업이 진행됩니다.

 

 

작업이 모두 완료되면 /user/young2에 결과 파일이 생성된것을 볼 수 있습니다.

 

 

파일 내용은 아래와 같이 wordcount 결과입니다.

 

 

4. 마무리

이번 포스팅에서는 hadoop의 hdfs와 mapreduce에 대해 간단한 예제를 진행하였습니다.

다음 포스팅에서는 hadoop 서비스 중 하나인 hive에 대해 간랸히 소개 및 예제를 진해하도록 하겠습니다.

 

반응형

'BigData > Hadoop' 카테고리의 다른 글

(4) Hive  (0) 2020.03.10
(2) Hadoop 설치  (0) 2020.03.05
(1) Hadoop에 대해  (0) 2020.03.04
반응형

1. 서론

이번 포스팅에서는 Hadoop Cluster 설치를 진행하겠습니다.

 

Hadoop 설치는 직접 각 서버에 들어가, Hadoop 패키지를 다운받아 모든 설정파일을 직접 수정하여 설치 할 수 있습니다.

 

하지만, 너무 번거롭고 설정 파일을 잘못 세팅하면 제대로 Hadoop Cluster 설치가 되지 않습니다.

 

이런 까다로운 설치로 인해, Hadoop Cluster 설치 및 관리를 간편하게 제공하는 서비스가 별도로 있습니다.

 

해당 서비스를 제공하는 기업은 아래 2가지가 있습니다.

 

  • Cloudera
  • Hortonworks

 

저는 위 2가지 중 Cloudera 기업의 Cloudera Manager를 통해 Hadoop Cluster 구축을 진행하도록 하겠습니다.

 

참고로, 2019년 1월 Hortonworks는 Cloudera로 합병이 되었습니다.

 

2. Hadoop Cluster 설치

저는 총 4대로 Hadoop Cluster를 구축하도록 하겠습니다.

추가로, sudo가 가능한 계정으로 진행하겠습니다.

 

1) 터널링

 

먼저, 각 서버들을 터널링해야 합니다.

 

ssh-keygen

 

1. ssh-keygen 명령어를 통해 각 서버에 public_key (id_rsa.pub)와 private_key (id_rsa)를 만들어 줍니다. (key 는 ~/.ssh 디렉토리에 생성됩니다.)

 

2. 각 서버의 public_key를 ~/.ssh/authorized_keys 파일에 추가해줍니다.

 

아래와 같이 authorized_keys 파일에 각 서버의 public_key 정보를 넣어주었습니다.

각 서버에도 동일하게 적용하여 줍니다.
mr 수행 시 각 데이터 노드는 연결해야 하기때문에 모든 노드는 터널링이 되어있어야합니다.

 

 

3. 수동 터널링 진행

 

처음 ssh 터널링 진행시 yes or no를 물어보는 구문이 나오며, yes를 통해 터널링이 이루어져야 합니다.

이를 위해서, 최초 한번 수동으로 터널링을 진행해야 합니다.

 

아래와 같이 스크립트를 만들어 진행하였습니다.

 

2)  symbolic link

 

cloudera manager은 hdfs, mapreduce 등 서비스들의 default 경로를 root directory 하위에 잡게됩니다.

 

대부분의 서버는, root가 아닌 별도 디렉토리에 disk가 넉넉히 마운트가 되어 있습니다.

 

저의 경우에도 아래와 같이 root에는 10GB만이 마운트되어 있는 조그만 VM을 사용하고 있어,

symbolic link를 걸어주도록 하겠습니다.

 

 

저는 아래와 같이 스크립트를 만들었습니다.

sudo mkdir -p /home1/irteam/opt/cloudera
sudo mkdir -p /home1/irteam/var/log
sudo mkdir -p /home1/irteam/var/lib
sudo mkdir -p /home1/irteam/dfs
sudo mkdir -p /home1/irteam/yarn
sudo mkdir -p /home1/irteam/impala
sudo mkdir -p /home1/irteam/var/log/cloudera-scm-alertpublisher
sudo mkdir -p /home1/irteam/var/log/cloudera-scm-eventserver
sudo mkdir -p /home1/irteam/var/lib/cloudera-scm-eventserver
sudo mkdir -p /home1/irteam/var/log/cloudera-scm-firehose
sudo mkdir -p /home1/irteam/var/lib/cloudera-host-monitor
sudo mkdir -p /home1/irteam/var/lib/cloudera-service-monitor
sudo mkdir -p /home1/irteam/var/log/hadoop-hdfs
sudo mkdir -p /home1/irteam/var/log/hive
sudo mkdir -p /home1/irteam/var/log/hue
sudo mkdir -p /home1/irteam/var/log/oozie
sudo mkdir -p /home1/irteam/var/log/spark
sudo mkdir -p /home1/irteam/var/log/hadoop-mapreduce
sudo mkdir -p /home1/irteam/var/lib/hadoop-yarn/yarn-nm-recovery
sudo mkdir -p /home1/irteam/var/log/hadoop-yarn
sudo mkdir -p /home1/irteam/var/lib/zookeeper
sudo mkdir -p /home1/irteam/var/log/zookeeper
sudo mkdir -p /home1/irteam/tmp

sudo ln -s /home1/irteam/opt/cloudera /opt/cloudera
sudo ln -s /home1/irteam/var/log/ /var/log
sudo ln -s /home1/irteam/var/lib/ /var/lib
sudo ln -s /home1/irteam/dfs/ /dfs
sudo ln -s /home1/irteam/yarn/ /yarn
sudo ln -s /home1/irteam/impala/ /impala
sudo ln -s /home1/irteam/var/log/cloudera-scm-alertpublisher /var/log/cloudera-scm-alertpublisher
sudo ln -s /home1/irteam/var/log/cloudera-scm-eventserver /var/log/cloudera-scm-eventserver
sudo ln -s /home1/irteam/var/lib/cloudera-scm-eventserver /var/lib/cloudera-scm-eventserver
sudo ln -s /home1/irteam/var/log/cloudera-scm-firehose /var/log/cloudera-scm-firehose
sudo ln -s /home1/irteam/var/lib/cloudera-host-monitor /var/lib/cloudera-host-monitor
sudo ln -s /home1/irteam/var/lib/cloudera-service-monitor /var/lib/cloudera-service-monitor
sudo ln -s /home1/irteam/var/log/hadoop-hdfs /var/log/hadoop-hdfs
sudo ln -s /home1/irteam/var/log/hive /var/log/hive
sudo ln -s /home1/irteam/var/log/hue /var/log/hue
sudo ln -s /home1/irteam/var/log/oozie /var/log/oozie
sudo ln -s /home1/irteam/var/log/spark /var/log/spark
sudo ln -s /home1/irteam/var/log/hadoop-mapreduce /var/log/hadoop-mapreduce
sudo ln -s /home1/irteam/var/lib/hadoop-yarn/ /var/lib/hadoop-yarn
sudo ln -s /home1/irteam/var/log/hadoop-yarn /var/log/hadoop-yarn
sudo ln -s /home1/irteam/var/lib/zookeeper /var/lib/zookeeper
sudo ln -s /home1/irteam/var/log/zookeeper /var/log/zookeeper

sudo chmod -R 777 /home1/irteam

 

cloudera에서 default경로로 사용하고 있는 /var/log, /var/lib 등을 home1/irteam 디렉터리 하위로 link를 생성했습니다.

 

3) /etc/hosts 수정

 

/etc/hosts에 각 서버의 ip와 hostname을 등록해 줍니다.

 

저는 아래와 같이 등록해주었습니다.

 

 

 

 

 

반응형

 

 

 

 

 

 

 

 

4) cloudera manager installer binary 다운로드 및 실행

 

이제 사전준비는 끝났습니다.

실제로 Cloudera Manager를 다운받아 실행하도록 하겠습니다.

 

저는 6.3.0 버전을 다운받아 진행하도록 하겠습니다.

(저는 4번 서버에서 실행하도록 하겠습니다.)

 

아래와 같이 다운로드 및 실행하여 주세요.

wget https://archive.cloudera.com/cm6/6.3.0/cloudera-manager-installer.bin
chmod 755 cloudera-manager-installer.bin
sudo ./cloudera-manager-installer.bin

 

 

실행한다면 아래와 같이 뜰것입니다.

 

모두 next 및 yes를 눌러 설치를 진행해 주세요.

 

 

위의 설치 진행이 끝난다면 7180 port로 web ui에 접근할 수 있습니다. ( default id, password는 admin/admin 입니다. )

 

아래는 ui에 최초 접근했을때의 화면입니다.

 

 

admin/admin으로 로그인 후 next를 눌러 넘어가줍니다. ( edition을 선택하는 화면에서는 무료를 선택합니다. )

 

계속 next를 누르다 보면 Specify Hosts 부분이 나오게됩니다.

 

여기에서는 각 서버들을 입력해줍니다.

 

저의 경우는 1~3번 서버만 설치진행하도록 하겠습니다. ( 4번 서버는 manager 전용 서버로 사용하기 위해서 입니다. )

 

 

각 서버를 line by line으로 입력하여 검색버튼을 누르면 검색됩니다.

 

그 후, cloudera manager에서 default로 권장하는 parcel와 cdh 버전을 선택하여 next 해줍니다.( 기본적으로 선택되어져 있습니다. )

 

이제 설치하기 위해 각 서버에 접근하기 위해 위에서 ssh 터널링 했던 정보를 넣습니다.

 

아래와 같이 계정은 sudo가 가능한 계정을 기입하며, cloudera manager가 설치된 서버의 private key 파일을 업로드합니다.

 

 

입력 후 next 버튼을 누릅니다.

 

아래와 같이 각 서버에 설치가 진행되는 화면으로 이동하게 됩니다.

 

 

agent가 설치가 되었으면 next를 눌러 parcel도 설치를 진행합니다.

parcel까지 설치가 완료되었다면 Inspect Cluster가 나옵니다.

 

여기서 I understand the risks, let me continue with cluster setup. 를 선택하여 설치를 진행해주세요.

 

이제 Select Services화면이 나오고, 여기는 제가 설치할 서비스들을 선택하는 화면입니다.

 

저의 경우, 향후 spark를 사용할것을 고려하여 Data engineering을 선택하겠습니다.

 

 

다음은 각 호스트별로 어떤 서비스를 실행시킬지 선택하는 화면입니다.

 

아래와 같습니다.

 

 

이후, 계속 next를 눌러 서비스를 설치 및 실행시켜줍니다.

(중간에 DB 설정이 있는데 기본으로 내장되어 있는 posrgresql을 사용하였습니다.) 

 

이제 설치가 완료되었습니다.

 

설치가 완료된다면 아래와 같이 주의 표시들이 있을 텐데요.

 

이것은 heap log 디렉토리를 cloudera manager가 default로 /tmp로 잡아서입니다.

이경우, 아래와 같이 해당 서비스의 구성 텝에서 바라보는 디렉토리를 변경할 수 있습니다.

 

 

hdfs의 경우 default block replication 수는 3입니다.
저의 경우 데이터 노드를 2개만 지정하였기 때문에, 계속 경고가 떠있을 텐데요.
이를 위해, 추가로 4번 호스트를 hdfs의 데이터 노드, yarn의 node manager의 역할로 추가하였습니다.

3. 마무리

이번 포스팅에서는 간략히 Hadoop 설치를 진행해봤습니다.

 

다음 포스팅에서는 간단한 Hadoop 사용법을 진행하도록 하겠습니다.

반응형

'BigData > Hadoop' 카테고리의 다른 글

(4) Hive  (0) 2020.03.10
(3) Hadoop 사용법  (0) 2020.03.09
(1) Hadoop에 대해  (0) 2020.03.04
반응형

1. 서론

이번 포스팅에서는 대용량 처리 프레임워크인 Hadoop에 대해 간략히 소개하려고 합니다.

 

소개 목차로는 아래와 같습니다.

 

  • 하둡이란?
  • Hdfs란?
  • mapreduce란?
  • yarn이란?

 

2. 하둡이란?

하둡은 아파치에서 오픈소스로 제공한 분산 처리 프레임워크입니다.

여러개의 컴퓨터를 클러스터화 하여 대용량 데이터를 분산처리하도록 하는것이 목적입니다.

 

그로인해, 하둡은 빅데이터의 열쇠라고도 불리기도 합니다.

 

그렇다면, 하둡은 대략적으로 무엇을 하는지 아래 사진을 통해 설명하도록 하겠습니다.

 

 

1) NameNode

 

하둡에서는 데이터를 block( default = 64M ) 단위로 관리합니다. ( 아래 설명할 HDFS 입니다. )

NameNode는 데이터 block이 어디 DataNode에 있는지를 관리합니다.

 

관리의 의미로는 read시 어느 데이터 노드에 작업을 할당해야하는지와 write시 여유로운 데이터 노드를 찾아 작업 할당을 할지를 의미합니다.

 

만약, NameNode가 죽는다면 관리하고 있던 정보가 사라져 데이터를 얻을 수 없게됩니다.

이를 위해 하둡에서는 별도 FS에 데이터를 동기화하며, NameNode가 죽었을 시

Secondary NameNode는 별도 FS에서 NameNode의 관리 정보를 가져와 새 NameNode에게 할당합니다.

 

마지막으로 NameNode는 메타데이터를 관리하기 위해 EditLog와 FsImage 파일을 사용합니다.

 

  • EditLog = HDFS의 메타데이터에 대한 모든 변화를 기록하는 로그 파일.
  • FsImage = 파일 시스템의 네임스페이스(디렉토리명, 파일명, 상태 정보)와 파일에 대한 블록 매핑 정보를 저장하는 파일. 

2) Secondary NameNode

 

위 EditLog와 FsImage를 주기적으로 병합하는 역할을 합니다.

 

하둡 2.x 버전 부터는 Secondary NameNode를 두지 않고 NameNode를 HA 구성으로 아키텍쳐를 변경하였습니다.
이때, HA 구성한 NameNode는 Active-Standby 구조입니다.

 

3) DataNode

 

데이터노드는 파일 block을 저장하고 제공하는 역할을 합니다.

Client가 데이터 읽기,쓰기 요청을 보낸다면 먼저 NameNode는 요청 데이터에 맞는 데이터 노드를 탐색 후

Client는 탐색 된 DataNode와 통신하여 데이터를 읽고 쓰게됩니다.

 

 

또한, DataNode는 NameNode에게 자신의 정보를 전달합니다.

 

  • 클러스터가 처음 시작될 때, 각 DataNode는 block 정보를 NameNode에게 전달
  • 주기적으로 NameNode에게 Heartbeat와 블록 목록 정보를 전달
  • 변경사항이 발생할 때마다 NameNode에게 변경사항 전달

 

4) JobTracker

 

JobTracker는 일반적으로 NameNode에서 실행시키는 하나의 프로세스입니다.

 

역할로는 TaskTracker의 리소스를 관리하여, MapReduce 작업 요청시 작업을 알맞는 TaskTracker에서 할당합니다. 

또한, TaskTracker가 실패하면 다른 TaskTracker에게 재할당 합니다.

 

5) TaskTracker

 

TaskTracker는 실제로 Task를 처리하는 프로세스입니다.

 

DataNode에는 하나의 TaskTracker만 존재하며, 여러개의 Map과 Reduce를 실행합니다.

 

여러개의 Map과 Reduce를 수행할 수 있기에, 동시에 여러 Task가 처리 가능하고 max Task 갯수는 설정으로 조절가능합니다.

 

 

 

 

 

반응형

 

 

 

 

 

 

 

3. Hdfs란?

Hdfs는 Hadoop Distributed File System의 약자로 하둡 시스템에서 제공하는 파일 시스템입니다.

 

하둡 클러스터의 데이터 노드들에 데이터를 block 단위로 저장하여 대용량 파일 저장이 가능합니다.

 

장점은 아래와 같습니다.

 

  • block 단위로 파일을 나눠 적재. ( default = 64M )
  • 파일에 대해 replication 수행. ( default =3 )
  • Scale-out이 가능으로 인해 필요시 용량 증설 가능.
  • 스트리밍 데이터 엑세스 지원
  • 저사양 하드웨어를 클러스터화하여 고성능 제공

 

4. mapreduce란?

mapreduce는 대용량 데이터를 분산처리하기 위한 모델입니다.

 

하둡에서 제공하는 MapReduce는 아래 그림으로 설명이 됩니다.

 

 

 

하둡의 TaskTracker는 각 Mapper와 Reducer를 생성합니다.

 

Mappper는 input 데이터를 line-by-line으로 읽으며 (key, value)로 만들어 주는 역할을 수행하며,

Reducer는 Mapper에서 넘어온 (key, value)를 merge하는 역할을 수행합니다.

 

이때, Mapper와 Reducer 사이에는 Shuffliing 과정이 존재합니다.

 

Shuffliing은 Mapper의 출력데이터를 Reducer에 전달하기 위한 일련의 과정입니다.

 

이 일련의 과정에서는, 파티셔너와 정렬이 존재합니다.

 

Mapper의 출력데이터는 memory 버퍼에 저장 후 버퍼가 기준치만큼 차게되면 disk에 write하게 됩니다.

파티션을 생성하며, 파티셔너는 동일 key에 대해  List<value>로 묶어주는 역할을 합니다.

 

또한, Mapper 끝나기 직전 disk에 write한 파일들은 정렬된 한개의 파일로 만들어 Reducer에게 전달하게 됩니다.

 

그렇기 때문에, 위 그림의 shuffling 과정에서 key 별로 value list를 가지고 있으며, Bear -> Car -> Deer와 같이 정렬된 것을 볼 수 있습니다.

 

5. yarn이란?

yarn은 Yet Another Resource Negotiator의 약어로 리소스 할당 및 관리를 위해 나온 서비스입니다.

기존 Mapreduce의 jobtracker - tasktracker에는 아래와 같은 단점이 존재했습니다.

 

  • 맵리듀스의 단일 고장점
    • jobtracker는 모든 mapreduce의 요청을 받으며, jobtracker에 문제가 생긴다면 모든 mapreduce는 수행할 수 없는 fail point 입니다.
  • 클러스터의 확장성
    • 단일 클러스터에서 최대 4천대,  동시 실행 태스크 4만개가 한계
  • 맵리듀스의 리소스 관리
    • slot이라는 개념으로 자원을 관리함으로 mapper와 reducer의 자원을 효율적으로 사용하지 못함.
    • mapreduce가 아닌 다른 서비스로 인한 자원 영향은 파악 불가능.

 

위의 단점들로 인해, 아래와 같이 yarn을 Mapreduce대신 hdfs 위에 올리는 아키텍쳐로 변경하게 되었습니다.

yarn은 총 4개의 새로운 컴포넌트들을 제공하고 있습니다.

 

  • resource manager
  • node manager
  • container
  • applicaton master

1) resource manager

 

기존 jobtracker를 대체하는 컴포넌트입니다.

클러스터의 자원 관리, 태스크의 스케쥴링, 태스크가 수행할 수 있는 노드를 찾아주는 역할을 담당합니다.

 

2) node manager

 

기존 tasktracker를 대체하는 컴포넌트입니다.

모든 데이터 노드에서 수행되며 container를 생성하여 container의 라이프 사이클을 모니터링하는 역할을 수행합니다.

 

3) container

 

데이터 노드의 리소스 메트릭이라고 생각하시면 됩니다. ( CPU, Disk, Memory, Network 등 )

node manager는 이 container의 메트릭 상태를 보고 resource manager에게 보고하게 됩니다.

 

4) application master

 

하나의 application을 관리하는 컴포넌트입니다.

client가 2개의 태스크를 요청한다면 2개의 application master가 생성되어 가 application를 관리하게 됩니다.

 

 

이 4개의 서비스로 인해 위의 jobtracker의 단점들을 해결하였습니다.

 

마지막으로, 아래는 yarn의 아키텍쳐입니다.

 

 

6. 마무리

이번 포스팅에서는 간략히 Hadoop에 대해 알아봤습니다.

 

다음 포스팅에서는 Hadoop 설치 포스팅을 진행하도록 하겠습니다.

 

 

 

반응형

'BigData > Hadoop' 카테고리의 다른 글

(4) Hive  (0) 2020.03.10
(3) Hadoop 사용법  (0) 2020.03.09
(2) Hadoop 설치  (0) 2020.03.05

+ Recent posts