[컴] docker 로 hdfs 설치

docker 로 hdfs

Docker 를 이용한 hdfs 설치

HDFS 를 구성해 보자. 여기서는 windows 에서 docker 를 이용해서 hdfs 환경을 구성한다. 여기서 사용한 hdfs 설정파일과 bash file 은 ref. 1 에서 가져왔다.

전체 file 은 아래 링크에서 download 하자.

namenode 띄우기

우선 namenode 라 부르는 server를 1개 띄워보자.

  1. hdfs 실행을 위해 필요한 파일들 설치
  2. core-site.xml 설정
  3. hdfs-site.xml 설정
  4. docker-compose.yml

필요한 파일 설치

hdfs

hadoop(https://github.com/apache/hadoop) 은 몇개의 server (application) 를 가지고 있는 패키지 같은 녀석이다. 어떤 종류의 server application 들인가 하면, distributed system 과 관련된 service 들이다.

그중에 주요 구성요소(component) 가 hdfs 이다. dfs(distributed file system) 은 분산으로 파일을 다루는 것으로 보면 된다.

간단히 설명하면, 우리의 컴퓨터를 보면 storage 가 하나있고, 파일 하나를 download 한다고 하면 그 storage 에 다 들어간다. 그래서 만약 우리 storage 용량이 1GB 인데, 2GB 짜리 파일을 받을 수 없다. 분산은 이럴때 내컴퓨터 1GB 와 내 친구 컴퓨터 1GB 를 묶어서 2GB 처럼 사용할 수 있게 해준다. 뭐 이밖에도 여러개를 묶어서 마치 하나의 storage 처럼 사용할 수 있게 해준다. 이런 것을 해주는 프로그램이 hdfs 라고 보면 될 것 같다.

여기서 드는 궁금증은 그러면 물리적으로 분리된 storage 를 묶으기 위한 것인가? 라는 것이다. 물리적으로 같은 storage 를 묶을 수도 있지않나? 물론 logical 하게 분리한 후 다시 묶을 수 있다. 그런데 굳이 물리적으로 이미 하나처럼 쓸 수 있는데 다시 2개로 분리후 1개로 사용하는 것은 과하다. 다만 논리적으로 분리를 해놓았는데, 다시 합치려 하니 이슈가 있다면 그때는 고려해 볼 수도 있겠다.

hdfs client 는 meta info 를 위해서 name node 에 먼저 request 를 보낸다. 그리고 data 를 read/write 하기 위해 Data Node들에 요청을 한다.[ref. 3]

설치

이 hadoop 은 java로 만든 server들이라고 보면 된다. 그래서 java 로 실행하면 된다. hadoop 2.x는 java 7 또는 java 8 로 실행해야 한다.

먼저 이중에 hdfs 를 실행해 보자. hdfs 의 namenode 를 실행하기 위해서는 다음과 같은 작업을 하면 된다.

  1. jdk 8.0 설치
  2. hadoop 실행파일들 설치: https://dlcdn.apache.org/hadoop/common/hadoop-2.10.1/hadoop-2.10.1.tar.gz
  3. hadoop core, hdfs 에서 필요한 환경값들 설정
    • core-site.xml
    • hdfs-site.xml
  4. hdfs namenode -format : DFS filesystem 로 format 한다.
  5. hdfs namenode : DFS namenode 를 실행

core-site.xml

이 core-site.xml 설정은 hadoop deamon 에게 namenode 가 어디있는지 알려준다. 이 밖에도 hadoop core 관련 설정을 넣을 수 있다고 한다. i/o 관련 설정등.

fs.defaultFS 은 원래 hdfs 명령을 내릴 때마다 parameter 로 넘겨주는 값인데, 여기에 정의해주면, namenode 의 uri 가 parameter 로 넘어오지 않을때 자동으로 이 값을 default 로 사용하게 된다. 'namenode' 는 domain 이다. 다른 이름도 괜찮고, ip address도 된다.

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://namenode:9000/</value>
    <description>NameNode URI
    </description>
  </property>  
</configuration>

hdfs-site.xml

hdfs configuration들은 hdfs-default.xml 에 저장되고, hdfs-site.xml 파일을 통해 덮어써질 수 있다.(overwrite)[ref. 2]

쉽게 이야기 하면, 기본설정은 hdfs-default.xml이고, 변경하고 싶은 값은 hdfs-site.xml 에서 재정의 해주면 된다.

hdfs-default.xml 에 가면, 각 설정이 어떤 값인지에 대한 설명을 확인할 수 있다.

dfs.namenode.name.dir 은 FsImage, EditLog 파일을 저장하는 경로

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
  <property>
    <name>dfs.namenode.name.dir</name>
    <value>file:///opt/hadoop/dfs/name</value>
  </property>
  <property>
    <name>dfs.blocksize</name>
    <value>10485760</value>
  </property>
  <property>
    <name>dfs.client.use.datanode.hostname</name>
    <value>true</value>
  </property>
  <property>
    <!-- 0.0.0.0 은 namenode가 모든 interface 를 listen 한다는 뜻 -->
    <name>dfs.namenode.rpc-bind-host</name>
    <value>0.0.0.0</value>
  </property>
  <property>
    <name>dfs.namenode.servicerpc-bind-host</name>
    <value>0.0.0.0</value>
  </property>
  <property>
    <name>dfs.namenode.http-bind-host</name>
    <value>0.0.0.0</value>
  </property>
  <property>
    <name>dfs.namenode.https-bind-host</name>
    <value>0.0.0.0</value>
  </property>
</configuration>

DFS namenode 실행

여기서는 docker-compose.yaml 를 이용해서 docker image 를 만들고, 실행하려 한다.

  • docker files

docker compose up 을 하면 build 가 되고, namenode 가 실행된다. namenode 실행에 대한 command 는 <proj>/namenode/start.sh 를 확인하면 된다.

docker-compose.yml - part 1

version: "3"

services:
  base:
    build: ./base
    image: hadoop-base:2.10.1

  # 
  # `hadoop-namenode:2.10.1` 라는 이미지를 생성
  # container 이름은 namenode 로 한다.
  # bridge 라는 이름의 network 를 생성하고,
  # hostname 은 namenode 라고 명명한다.(core-site.xml 참고)
  # volume 은 2개 사용
  #
  namenode:
    build: ./namenode
    image: hadoop-namenode:2.10.1
    container_name: namenode
    hostname: namenode
    ports:
      - "50070:50070"
      - "9000:9000"
    volumes:
      - c:\a\prog\docker\namh-hadoop\volumes\name:/opt/hadoop/dfs/name
      - c:\a\prog\docker\namh-hadoop\volumes\tmp:/tmp
    networks:
      - bridge
   

volumes:
  namenode:

networks:
  bridge:

namenode 확인, web ui

namenode 가 실행되면, 아래 경로에 접속할 수 있다.

  • http://localhost:50070/

아래처럼 실행할 수 있다. port number 50070은 namenode container 의 log 를 확인하면 된다.

...
namenode            | 21/10/15 05:57:30 INFO http.HttpServer2: addJerseyResourcePackage: packageName=org.apache.had`oop.hdfs.server.namenode.web.resources;org.apache.hadoop.hdfs.web.resources, pathSpec=/webhdfs/v1/*
namenode            | 21/10/15 05:57:30 INFO http.HttpServer2: Jetty bound to port 50070
namenode            | 21/10/15 05:57:30 INFO mortbay.log: jetty-6.1.26
namenode            | 21/10/15 05:57:31 INFO mortbay.log: Started HttpServer2$SelectChannelConnectorWithSafeStartup@0.0.0.0:50070
...

hdfs ports

기본적으로 namenode 는 2개의 port 를 열어놓고 있게 된다. 하나는 webUI 를 위한 port(50070) 이고 다른 하나는 IPC 를 위한 port(9000) 이다.

  • 50070 : http, https 로는 50470 를 사용한다.
  • 9000 : ipc, 이 port 를 core-site.xml에 적어주게 된다.

hdfs 에서 mkdir 하기

  • hadoop fs -mkdir -p /tmp/my/test 를 실행하면 된다.

docker container 에서 실행하는 것은 아래처럼 실행하면 된다.

docker exec namenode /opt/hadoop/bin/hadoop fs -ls -R /
docker exec namenode /opt/hadoop/bin/hadoop fs -mkdir -p /tmp/my/test

datanode 추가

datanode 를 띄우는 것도 namenode 를 띄우는 것과 다르지 않다. 전체 작업은 다음과 같다.

  • jvm 설치
  • hdfs 관련 실행파일 설치
    • hdfs-site.xml 추가
  • hdfs datanode

namenode 는 hdfs namenode 로 띄웠는데, datanode 는 hdfs datanode 로 실행시킬 수 있다. 그리고 설정(configuration) 부분은 namenode 처럼 hdfs-site.xml 을 추가해 주면 된다.

DataNode는 NameNode에 일정주기로 heartbeat을 보낸다. heartbeat 이 오지 않으면, namenode 는 datanode 가 죽었다고 판단한다.

hdfs-site.xml

  • dfs.datanode.data.dir 설정은 DFS 의 datanode 역할을 하는 서버가 DFS 의 block 이 발생할때(예를 들어 누군가 hdfs 에 file 을 생성하는 등) 이 DFS block 을 local filesystem 의 어느 위치에 저장할 것인지를 정해준다.
  • dfs.datanode.use.datanode.hostname 은 datanode들이 data 전송을 위해 다른 datanode 에 접속할 때 datanode hostname을 사용한다.
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
  <property>
    <name>dfs.datanode.data.dir</name>
    <value>file:///opt/hadoop/dfs/data</value>
  </property>
  <property>
    <name>dfs.blocksize</name>
    <value>10485760</value>
  </property>  
  <property>
    <name>dfs.datanode.use.datanode.hostname</name>
    <value>true</value>
  </property>
</configuration>

docker-compose.yml - part 2 - fulll

datanode 부분이 추가됐다.

version: "3"

#
# x- 로 시작되는 것은 무시된다. 아래 링크를 참고하자.
# - https://www.cloudsavvyit.com/10765/how-to-simplify-docker-compose-files-with-yaml-anchors-and-extensions/
#
x-datanode_base: &datanode_base
  build: ./datanode
  image: hadoop-datanode:2.10.1
  networks:
    - bridge


services:
  base:
    build: ./base
    image: hadoop-base:2.10.1
  namenode:
    build: ./namenode
    image: hadoop-namenode:2.10.1
    container_name: namenode
    hostname: namenode
    ports:
      - "50070:50070"
      - "9000:9000"
    volumes:
      - c:\a\prog\docker\namh-hadoop\volumes\name:/opt/hadoop/dfs/name
      - c:\a\prog\docker\namh-hadoop\volumes\tmp:/tmp
    networks:
      - bridge
   
  datanode01:
    <<: *datanode_base
    container_name: datanode01
    hostname: datanode01
    volumes:
      - c:\a\prog\docker\namh-hadoop\volumes\data01:/opt/hadoop/dfs/data

  datanode02:
    <<: *datanode_base
    container_name: datanode02
    hostname: datanode02
    volumes:
      - c:\a\prog\docker\namh-hadoop\volumes\data02:/opt/hadoop/dfs/data

  datanode03:
    <<: *datanode_base
    container_name: datanode03
    hostname: datanode03
    volumes:
      - c:\a\prog\docker\namh-hadoop\volumes\data03:/opt/hadoop/dfs/data

volumes:
  namenode:
  datanode01:
  datanode02:
  datanode03:

networks:
  bridge:

docker compose up

이전 것을 죽이고(docker compose down) 을 한 후 다시 docker compose up을 해보자. 이제는 namenode, datanode 가 전부 뜬다.

대략적으로 windows 10 에서 memory 를 확인하면 50MB 정도가 소요된다. 실제 사용을 하면 더 소모되겠지만, 일단 설치 후 동작을 확인하는 수준이라면, 일반적인 개발 pc 에서 다뤄보기 좋은 size 이다.

hdfs, yarn, spark 설치 관련 참고자료

yarn 실행하기

See Also

  1. Ipc - HADOOP2 - Apache Software Foundation
  2. Setting up HDFS and YARN clusters in Hadoop 2.6.0 | Apache Hadoop Tutorials
  3. 쿠...sal: [컴] hadoop deamon 들 설정 

Reference

  1. Docker로 Hadoop 테스트 환경 구축하기 - HDFS
  2. HDFS - Configuration (hdfs-site.xml)
  3. Understanding basics of HDFS and YARN - Cloudera Community - 248860

댓글 없음:

댓글 쓰기