docker 로 hdfs
Docker 를 이용한 hdfs 설치
HDFS 를 구성해 보자. 여기서는 windows 에서 docker 를 이용해서 hdfs 환경을 구성한다. 여기서 사용한 hdfs 설정파일과 bash file 은 ref. 1 에서 가져왔다.
전체 file 은 아래 링크에서 download 하자.
namenode 띄우기
우선 namenode 라 부르는 server를 1개 띄워보자.
- hdfs 실행을 위해 필요한 파일들 설치
- core-site.xml 설정
- hdfs-site.xml 설정
- 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 를 실행하기 위해서는 다음과 같은 작업을 하면 된다.
- jdk 8.0 설치
- hadoop 실행파일들 설치: https://dlcdn.apache.org/hadoop/common/hadoop-2.10.1/hadoop-2.10.1.tar.gz
- hadoop core, hdfs 에서 필요한 환경값들 설정
- core-site.xml
- hdfs-site.xml
- hdfs namenode -format : DFS filesystem 로 format 한다.
- hdfs namenode : DFS namenode 를 실행
core-site.xml
- What is the core site XML in Hadoop? - Quora
- Meaning of fs.defaultFS property in core-site.xml in hadoop - Stack Overflow
- xml 설정값들 : hadoop deamon 들 설정
이 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 설치 관련 참고자료
- GitHub - gallna/yarn.docker: Hadoop/HDFS + Yarn + Spark docker configuration, 2017-08-28
- GitHub - flokkr/docker-hadoop: Docker image for main Apache Hadoop components (Yarn/Hdfs),
- GitHub - smizy/docker-hadoop-base: Hadoop(Common/HDFS/YARN/MapReduce) docker image based on alpine, 2017-08
yarn 실행하기
See Also
- Ipc - HADOOP2 - Apache Software Foundation
- Setting up HDFS and YARN clusters in Hadoop 2.6.0 | Apache Hadoop Tutorials
- 쿠...sal: [컴] hadoop deamon 들 설정
댓글 없음:
댓글 쓰기