Docker file for Hadoop 3

namenode

Bài viết này sẽ giới thiệu một demo cấu hình và chạy các service của Hadoop bằng docker-compose.

1. Hadoop docker image

1.1. Image: hadoop-base

Docker image này được xây dựng dựa trên image debian:9, chủ yếu với image này chúng ta sẽ cài java-jdk và hadoop, tạo các biến Environment để lưu thư mục cài đặt hadoop và thư mục chứa các file config.

Một điều quan trọng nữa là trong Dockerfile này có sử dụng file entrypoint.sh mục đích của file này là để giúp chúng ta thay đổi các config của hadoop một cách dễ dàng từ máy host mà không cần phải access vào các container. Dưới đây là chi tiết Dockerfile

FROM debian:9

LABEL maintainer = "Anh Nguyen <nvtienanh@gmail.com>"

RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
      openjdk-8-jdk \
      net-tools \
      curl \
      netcat \
      gnupg \
    && rm -rf /var/lib/apt/lists/*
      
ENV JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/

RUN curl -O https://dist.apache.org/repos/dist/release/hadoop/common/KEYS

RUN gpg --import KEYS

ENV HADOOP_VERSION 3.2.0

ENV HADOOP_URL https://www.apache.org/dist/hadoop/common/hadoop-$HADOOP_VERSION/hadoop-$HADOOP_VERSION.tar.gz
RUN set -x \
    && curl -fSL "$HADOOP_URL" -o /tmp/hadoop.tar.gz \
    && curl -fSL "$HADOOP_URL.asc" -o /tmp/hadoop.tar.gz.asc \
    && gpg --verify /tmp/hadoop.tar.gz.asc \
    && tar -xvf /tmp/hadoop.tar.gz -C /opt/ \
    && rm /tmp/hadoop.tar.gz*

# Develop mode
# COPY hadoop-3.2.0.tar.gz /tmp/hadoop.tar.gz
# RUN set -x \
#     # && curl -fSL "$HADOOP_URL" -o /tmp/hadoop.tar.gz \
#     && curl -fSL "$HADOOP_URL.asc" -o /tmp/hadoop.tar.gz.asc \
#     && gpg --verify /tmp/hadoop.tar.gz.asc \
#     && tar -xvf /tmp/hadoop.tar.gz -C /opt/ \
#     && rm /tmp/hadoop.tar.gz*

RUN ln -s /opt/hadoop-$HADOOP_VERSION/etc/hadoop /etc/hadoop
RUN mkdir /opt/hadoop-$HADOOP_VERSION/logs

RUN mkdir /hadoop-data

ENV HADOOP_HOME=/opt/hadoop-$HADOOP_VERSION
ENV HADOOP_CONF_DIR=/etc/hadoop
ENV MULTIHOMED_NETWORK=1
ENV USER=root
ENV PATH $HADOOP_HOME/bin/:$PATH

ADD entrypoint.sh /entrypoint.sh
RUN chmod a+x /entrypoint.sh

ENTRYPOINT ["/entrypoint.sh"]

Để build docker image thì chỉ cần mở cmd tại thư mục có chứa Dockerfile và chạy lênh:

docker build -t nvtienanh/hadoop-base:3.2.0-debian .

1.2. Các image khác

Các docker image khác như: datanode, namenode, resourcemanager, … đều được xây dựng dựa trên hadoop-base, chẳng hạn như hadoop-datanode:

ARG HADOOP_BASE=3.2.0-debian
FROM nvtienanh/hadoop-base:${HADOOP_BASE}
LABEL MAINTAINER = "Anh Nguyen <nvtienanh@gmail.com>" 

HEALTHCHECK CMD curl -f http://localhost:9864/ || exit 1

ENV HDFS_CONF_dfs_datanode_data_dir=file:///hadoop/dfs/data
RUN mkdir -p /hadoop/dfs/data
VOLUME /hadoop/dfs/data

ADD run.sh /run.sh
RUN chmod a+x /run.sh

EXPOSE 9864

CMD ["/run.sh"]

2. Build toàn bộ image

Toàn bộ Dockerfile liên quan đến Hadoop của mình đã được đẩy lên Github tại: https://github.com/nvtienanh/docker-hadoop. Các bạn có thể download toàn bộ file về và build lại bằng cách chạy lệnh:

make build

Hoặc nếu không muốn build lại thì các bạn có thể pull về từ docker hub các image cần thiết tại: https://hub.docker.com/u/nvtienanh

Dưới đây là Makefile, các bạn có thể chỉnh sửa tùy ý

ENV_FILE = hadoop.env
HADOOP_TAG := 3.2.0-debian
HADOOP_VERSION := 3.2.0

build:
	docker build -t nvtienanh/hadoop-base:$(HADOOP_TAG) ./base
	docker build -t nvtienanh/hadoop-namenode:$(HADOOP_TAG) ./namenode
	docker build -t nvtienanh/hadoop-datanode:$(HADOOP_TAG) ./datanode
	docker build -t nvtienanh/hadoop-resourcemanager:$(HADOOP_TAG) ./resourcemanager
	docker build -t nvtienanh/hadoop-nodemanager:$(HADOOP_TAG) ./nodemanager
	docker build -t nvtienanh/hadoop-historyserver:$(HADOOP_TAG) ./historyserver
	docker build -t nvtienanh/hadoop-submit:$(HADOOP_TAG) ./submit

push:
	docker push nvtienanh/hadoop-base:$(HADOOP_TAG)
	docker push nvtienanh/hadoop-namenode:$(HADOOP_TAG)
	docker push nvtienanh/hadoop-datanode:$(HADOOP_TAG)
	docker push nvtienanh/hadoop-resourcemanager:$(HADOOP_TAG)
	docker push nvtienanh/hadoop-nodemanager:$(HADOOP_TAG)
	docker push nvtienanh/hadoop-historyserver:$(HADOOP_TAG)
	docker push nvtienanh/hadoop-submit:$(HADOOP_TAG)

3. Chạy các hadoop image bằng docker-compose

Đầu tiên, các bạn truy cập vào: https://github.com/nvtienanh/docker-compose/tree/master/hadoop đâu là repo chứa một vài demo mà mình đang thực hiện. Các bạn download về máy tính, sau đó mở thư mục docker-compose/hadoop, trong đó sẽ có file docker-compose.yml là file chứa cấu hình các container cần thiết để start các hadoop service: namenode, datanode, historyserver, …

version: "3"

services:
  namenode:
    image: nvtienanh/hadoop-namenode:${HADOOP_TAG}
    container_name: namenode
    hostname: namenode
    volumes:
      - ./data/namenode:/hadoop/dfs/name
    environment:
      - CLUSTER_NAME=test
    ports:
      - 9870:9870
    env_file:
      - ./hadoop.env
    networks:
      - hadoop-net

  datanode:
    image: nvtienanh/hadoop-datanode:${HADOOP_TAG}
    container_name: datanode
    hostname: datanode
    volumes:
      - ./data/datanode:/hadoop/dfs/name
    environment:
      SERVICE_PRECONDITION: "namenode:9870"
    ports:
      - 9864:9864
    env_file:
      - ./hadoop.env
    networks:
      - hadoop-net
  
  resourcemanager:
    image: nvtienanh/hadoop-resourcemanager:${HADOOP_TAG}
    container_name: resourcemanager
    hostname: resourcemanager
    environment:
      SERVICE_PRECONDITION: "namenode:9870 datanode:9864"
    ports:
      - 8088:8088
    env_file:
      - ./hadoop.env
    networks:
      - hadoop-net

  nodemanager:
    image: nvtienanh/hadoop-nodemanager:${HADOOP_TAG}
    container_name: nodemanager
    hostname: nodemanager
    environment:
      SERVICE_PRECONDITION: "namenode:9870 datanode:9864 resourcemanager:8088"
    ports:
      - 8042:8042
    env_file:
      - ./hadoop.env
    networks:
      - hadoop-net
  
  historyserver:
    image: nvtienanh/hadoop-historyserver:${HADOOP_TAG}
    container_name: historyserver
    hostname: historyserver
    environment:
      SERVICE_PRECONDITION: "namenode:9870 datanode:9864 resourcemanager:8088"
    volumes:
      - ./data/historyserver:/hadoop/yarn/timeline
    ports:
      - 8188:8188
    env_file:
      - ./hadoop.env
    networks:
      - hadoop-net

networks:
  hadoop-net:
    external:
      name: hadoop-net

Để khởi chạy các container, chạy lệnh make up

Kết quả khi chạy thành công:

namenode
namenode
Resource manager
Resource manager
History server
History server
Datanode
Datanode

Xem thêm

Bình luận