12 Octobre 2016

Créer une image Docker contenant Spark et Hdfs

Le but est de pouvoir démarer des datanode et de spark worker dans le même container afin que les workers et datanodes présent sur la même machine partagent la même IP

La solution la plus simple est d’utiliser https://github.com/just-containers/s6-overlay ce système prévu pour docker permet de démarer plusieur processus au sein d’un même container.

Conception du Dockerfile

FROM alpine:3.4
MAINTAINER Paul TREHIOU <paul.trehiou@gmail.com>

ARG OVERLAY_VERSION="v1.18.1.5"
ARG OVERLAY_ARCH="amd64"

# install packages (no-cache permet de ne pas utiliser le cache et virtual place les packets installés dans un groupe pour les supprimer facilement à la fin)
RUN \
apk add --no-cache --virtual=build-dependencies \
        curl \
        tar && \

# add s6 overlay
curl -o /tmp/s6-overlay.tar.gz -L "https://github.com/just-containers/s6-overlay/releases/download/${OVERLAY_VERSION}/s6-overlay-${OVERLAY_ARCH}.tar.gz" && \
tar xfz /tmp/s6-overlay.tar.gz -C / && \

# make our folders
mkdir -p \
        /app \
        /config \
        /defaults && \

# clean up
apk del --purge \
        build-dependencies && \
rm -rf /tmp/* 

Il faut ensuite installer Spark et Hadoop dans cette image :

# create folders

mkdir -p \
    /app \
    ${SPARK_HOME} && \
    
# install Hadoop

curl -sL --retry 3 \
  "http://archive.apache.org/dist/hadoop/common/hadoop-${HADOOP_VERSION}/hadoop-${HADOOP_VERSION}.tar.gz" \
  | gunzip \
  | tar -x -C /app/ && \
rm -rf ${HADOOP_HOME}/share/doc && \

# install Spark

curl -sL --retry 3 \
  "http://d3kbcqa49mib13.cloudfront.net/spark-${SPARK_VERSION}-bin-without-hadoop.tgz" \
  | gunzip \
  | tar x -C ${SPARK_HOME} --strip-components=1 &&\

On peut maintenant créer les script qui vont lancer le datanode et le spark worker

s6 va exécuter tous les scripts présents dans /etc/services.d au démarage du container, il suffit donc de créer deux scripts de cette forme

/etc/services.d/spark-worker/run

/etc/services.d/hdfs-datanode/run