docker部署hadoop只是实验目的,每个服务都是通过手动部署,比如namenode, datanode, journalnode等。如果为了灵活的管理集群,而不使用官方封装好的自动化部署脚本,本文还是有些启发的。

准备基础镜像

准备jdk镜像

注意,openjdk启动datanode的时候,jvm会崩溃。所以换成oraclejdk。

基础镜像以alpine为基础,上面装上jdk。Dockerfile如下。

1、openjdk1.8

FROM alpine:latest

MAINTAINER rabbix@qq.com

RUN echo -e "https://mirrors.aliyun.com/alpine/v3.7/main\nhttps://mirrors.aliyun.com/alpine/v3.7/community" > /etc/apk/repositories && \

    apk --no-cache --update add openjdk8-jre-base bash && \

    rm -rf /var/cache/apk/*

ENV JAVA_HOME=/usr/lib/jvm/default-jvm

ENV PATH=$PATH:$JAVA_HOME/bin

docker build . -t alpine-jdk8:v1.0

2、oraclejdk1.8

下面这种方式需要手动下载glibc。

下载地址:https://github.com/sgerrand/alpine-pkg-glibc/releases/

sgerrand.rsa.pub在项目的readme中有下载地址

FROM alpine:latest
MAINTAINER rabbix@qq.com
ADD sgerrand.rsa.pub /etc/apk/keys/
COPY glibc-2.27-r0.apk /opt/
RUN echo -e "https://mirrors.aliyun.com/alpine/v3.7/main\nhttps://mirrors.aliyun.com/alpine/v3.7/community" > /etc/apk/repositories && \
apk add /opt/glibc-2.27-r0.apk && rm -rf /opt/glibc-2.27-r0.apk && \
apk --no-cache --update add bash && \
rm -rf /var/cache/apk/* ADD jdk-8u172-linux-x64.tar.gz /opt/ ENV JAVA_HOME=/opt/jdk1.8.0_172
ENV PATH=$PATH:$JAVA_HOME/bin

自动下载glibc

FROM alpine:latest
MAINTAINER rabbix@qq.com
RUN echo -e "https://mirrors.aliyun.com/alpine/v3.7/main\nhttps://mirrors.aliyun.com/alpine/v3.7/community" > /etc/apk/repositories && \
wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://raw.githubusercontent.com/sgerrand/alpine-pkg-glibc/master/sgerrand.rsa.pub && \
wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.27-r0/glibc-2.27-r0.apk && \
apk add glibc-2.27-r0.apk && rm -rf glibc-2.27-r0.apk && \
apk --no-cache --update add bash && \
rm -rf /var/cache/apk/* ADD jdk-8u172-linux-x64.tar.gz /opt/ ENV JAVA_HOME=/opt/jdk1.8.0_172
ENV PATH=$PATH:$JAVA_HOME/bin

准备hadoop镜像

因为hadoop是以nohup的方式后台运行的,所以需要修改一下启动脚本。这里使用的是当前稳定版2.9.1。

脚本位置 hadoop-2.9.1/sbin/hadoop-daemon.sh

修改前

    case $command in
namenode|secondarynamenode|datanode|journalnode|dfs|dfsadmin|fsck|balancer|zkfc|portmap|nfs3|dfsrouter)
if [ -z "$HADOOP_HDFS_HOME" ]; then
hdfsScript="$HADOOP_PREFIX"/bin/hdfs
else
hdfsScript="$HADOOP_HDFS_HOME"/bin/hdfs
fi
nohup nice -n $HADOOP_NICENESS $hdfsScript --config $HADOOP_CONF_DIR $command "$@" > "$log" 2>&1 < /dev/null &
;;
(*)
nohup nice -n $HADOOP_NICENESS $hadoopScript --config $HADOOP_CONF_DIR $command "$@" > "$log" 2>&1 < /dev/null &
;;
esac
echo $! > $pid
sleep 1

修改后

152     case $command in
153 namenode|secondarynamenode|datanode|journalnode|dfs|dfsadmin|fsck|balancer|zkfc|portmap|nfs3|dfsrouter)
154 if [ -z "$HADOOP_HDFS_HOME" ]; then
155 hdfsScript="$HADOOP_PREFIX"/bin/hdfs
156 else
157 hdfsScript="$HADOOP_HDFS_HOME"/bin/hdfs
158 fi
159 $hdfsScript --config $HADOOP_CONF_DIR $command "$@" > "$log" 2>&1
160 ;;
161 (*)
162 $hadoopScript --config $HADOOP_CONF_DIR $command "$@" > "$log" 2>&1
163 ;;
164 esac
165 echo $! > $pid
166 sleep 1

修改之后重新压缩回tar.gz

Dockerfile如下:

FROM alpine-jdk1.8:v1.0

MAINTAINER rabbix@qq.com
ADD ./hadoop-2.9.1.tar.gz /opt/

docker build . -t hadoop2.9.1:v1.0

配置docker容器的ip

docker network create --subnet=172.16.0.0/16 dn0

准备配置文件

新建目录:

mkdir -p {nn,snn,dn}/{logs,data,etc}

修改配置文件

复制 hadoop-2.9.1/etc/hadoop/ 下面所有的文件到 nn/etc/

复制/etc/hosts 到 nn/etc/

core-site.xml

<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9001</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/tmp/hdfs-root/</value>
</property>
</configuration>

hdfs-site.xml

<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.http-address</name>
<value>master:50071</value>
</property>
<property>
<name>dfs.datanode.http.address</name>
<value>slave1:50076</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>secondary:50091</value>
</property>
<property>
<name>dfs.datanode.address</name>
<value>slave1:50011</value>
</property>
<property>
<name>dfs.datanode.ipc.address</name>
<value>slave1:50021</value>
</property> </configuration>

etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 172.16.0.2 master
172.16.0.3 secondary
172.16.0.4 slave1 主机名中不允许有下划线

启动命令

namenode

因为namenode第一次需要初始化。

先执行初始化命令

docker run -d --rm --net dn0 --ip 172.16.0.2 -h master \
--name namenode -p 9001:9001 -p 50071:50071 \
-v /root/hadoop/nn/data/:/tmp/hdfs-root \
-v /root/hadoop/nn/etc/:/opt/hadoop-2.9.1/etc/hadoop \
-v /root/hadoop/nn/logs:/opt/hadoop-2.9.1/logs \
-v /root/hadoop/nn/etc/hosts:/etc/hosts hadoop2.9.1:v1.0 \
/opt/hadoop-2.9.1/bin/hdfs namenode -format

后启动namenode

 docker run -d --rm --net dn0 --ip 172.16.0.2 -h master \
--name namenode -p 9001:9001 -p 50071:50071 \
-v /root/hadoop/nn/data/:/tmp/hdfs-root \
-v /root/hadoop/nn/etc/:/opt/hadoop-2.9.1/etc/hadoop \
-v /root/hadoop/nn/logs:/opt/hadoop-2.9.1/logs \
-v /root/hadoop/nn/etc/hosts:/etc/hosts hadoop2.9.1:v1.0 \
/opt/hadoop-2.9.1/sbin/hadoop-daemon.sh --config /opt/hadoop-2.9.1/etc/hadoop --script hdfs start namenode

合并在一起:

docker run -d --rm --net dn0 --ip 172.16.0.2 -h master \
--name namenode -p 9001:9001 -p 50071:50071 \
-v /root/hadoop/nn/data/:/tmp/hdfs-root \
-v /root/hadoop/nn/etc/:/opt/hadoop-2.9.1/etc/hadoop \
-v /root/hadoop/nn/logs:/opt/hadoop-2.9.1/logs \
-v /root/hadoop/nn/etc/hosts:/etc/hosts oraclejdk1.8-hadoop2.9.1:latest \
sh -c "/opt/hadoop-2.9.1/bin/hdfs namenode -format && /opt/hadoop-2.9.1/sbin/hadoop-daemon.sh --config /opt/hadoop-2.9.1/etc/hadoop --script hdfs start namenode"

3.1.1的启动命令修改为:

bin/hdfs --config .... namenode
bin/hdfs --config .... datanode

secondarynamenode

datanode

新增加的datanode保证其数据目录为空,不要与其他datanode有冲突。

配置文件中的主机名也应该是自己的主机名或者域名。例如:

<property>
<name>dfs.datanode.address</name>
<value>slave2:50011</value>
</property>

启动:

  docker run -d --rm --net dn0 --ip 172.16.0.4 -h slave1 \
--name datanode1 -p 50011:50011 -p 50021:50021 -p 50076:50076 \
-v /root/hadoop/dn1/data/:/tmp/hdfs-root \
-v /root/hadoop/dn1/etc/:/opt/hadoop-2.9.1/etc/hadoop \
-v /root/hadoop/dn1/logs:/opt/hadoop-2.9.1/logs \
-v /root/hadoop/dn1/etc/hosts:/etc/hosts oraclejdk1.8-hadoop2.9.1:latest \
/opt/hadoop-2.9.1/sbin/hadoop-daemon.sh --config /opt/hadoop-2.9.1/etc/hadoop --script hdfs start datanode
 docker run -d --rm --net dn0 --ip 172.16.0.5 -h slave2 \
--name datanode2 -p 50012:50012 -p 50022:50022 -p 50077:50077 \
-v /root/hadoop/dn2/data/:/tmp/hdfs-root \
-v /root/hadoop/dn2/etc/:/opt/hadoop-2.9.1/etc/hadoop \
-v /root/hadoop/dn2/logs:/opt/hadoop-2.9.1/logs \
-v /root/hadoop/dn2/etc/hosts:/etc/hosts oraclejdk1.8-hadoop2.9.1:latest \
/opt/hadoop-2.9.1/sbin/hadoop-daemon.sh --config /opt/hadoop-2.9.1/etc/hadoop --script hdfs start datanode
 docker run -d --rm --net dn0 --ip 172.16.0.6 -h slave3 \
--name datanode3 -p 50013:50013 -p 50023:50023 -p 50078:50078 \
-v /root/hadoop/dn3/data/:/tmp/hdfs-root \
-v /root/hadoop/dn3/etc/:/opt/hadoop-2.9.1/etc/hadoop \
-v /root/hadoop/dn3/logs:/opt/hadoop-2.9.1/logs \
-v /root/hadoop/dn3/etc/hosts:/etc/hosts oraclejdk1.8-hadoop2.9.1:latest \
/opt/hadoop-2.9.1/sbin/hadoop-daemon.sh --config /opt/hadoop-2.9.1/etc/hadoop --script hdfs start datanode

上传文件

./hdfs dfs -fs hdfs://172.16.0.2:9001 -mkdir /user
./hdfs dfs -fs hdfs://172.16.0.2:9001 -mkdir /user/root
./hdfs dfs -fs hdfs://172.16.0.2:9001 -put hadoop input

在浏览器访问: http://master:50071 就可以看到namenode的管理界面了。

扩展一台datanode

复制以分datanode的配置文件。适当修改。

增加新节点的hosts,和其他节点的hosts。

启动新的节点。

查看文件块信息

./hdfs fsck -conf /root/hadoop/nn/etc/hdfs-site.xml -fs hdfs://172.16.0.2:9001 /user/root/hadoop-2.9.1.tar.gz -blocks

Docker部署HDFS的更多相关文章

  1. HADOOP docker(二):HDFS 高可用原理

        1.环境简述2.QJM HA简述2.1为什么要做HDFS HA?2.2 HDFS HA的方式2.2 HSFS HA的结构2.3 机器要求3.部署HDFS HA3.1 详细配置3.2 部署HDF ...

  2. 自动化测试平台环境docker部署

    参考资料:testin云测 https://www.testin.cn接口自动化测试平台:http://120.79.232.23星云测试 http://www.threadingtest.com腾讯 ...

  3. ASP.NET Core开发-Docker部署运行

    ASP.NET Core开发Docker部署,.NET Core支持Docker 部署运行.我们将ASP.NET Core 部署在Docker 上运行. 大家可能都见识过Docker ,今天我们就详细 ...

  4. Docker部署Hadoop集群

    Docker部署Hadoop集群 2016-09-27 杜亦舒 前几天写了文章"Hadoop 集群搭建"之后,一个朋友留言说希望介绍下如何使用Docker部署,这个建议很好,Doc ...

  5. 程序开发使用docker部署

    我们公司自己研发了一套 grand-line 系统,使用 docker 来部署项目. 我是第一批小白鼠,一开始网络差,build 一次要半个小时,连接进入 web shell 也很慢,部署一个微信项目 ...

  6. 我使用celery以及docker部署遇到的问题

    首先我本机测试时没有问题的,但是在线上docker中,任务一直显示 "Sending due task".超时的任务是 django orm update 操作,本地不会出现这样的 ...

  7. Docker部署SDN环境

    2014-12-03 by muzi Docker image = Java class Docker container = Java object 前言 5月份的时候,当我还是一个大学生的时候,有 ...

  8. 在生产环境使用Docker部署应用

    导读 Docker现在越来越流行,但是真正在生产环境部署Docker还是个比较新的概念,还没有一个标准的流程.作者是ROR的程序员,作者结合平时的部署经验,联系Docker的特点,向大家分享了其在生产 ...

  9. Docker 使用指南 (六)—— 使用 Docker 部署 Django 容器栈

    版权声明:本文由田飞雨原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/98 来源:腾云阁 https://www.qclou ...

随机推荐

  1. Java基础之Java 修饰符

    前言:Java内功心法之Java 修饰符,看完这篇你向Java大神的路上又迈出了一步(有什么问题或者需要资料可以联系我的扣扣:734999078) Java语言提供了很多修饰符,主要分为以下两类: 访 ...

  2. [AHOI2008] 紧急集合

    Description 欢乐岛上有个非常好玩的游戏,叫做"紧急集合".在岛上分散有N个等待点,有N-1条道路连接着它们,每一条道路都连接某两个等待点,且通过这些道路可以走遍所有的等 ...

  3. Spring MVC 学习总结(十)——Spring+Spring MVC+MyBatis框架集成(IntelliJ IDEA SSM集成)

    与SSH(Struts/Spring/Hibernate/)一样,Spring+SpringMVC+MyBatis也有一个简称SSM,Spring实现业务对象管理,Spring MVC负责请求的转发和 ...

  4. C语言之链表的使用

    C语言链表初学者都说很难,今天就来为大家讲讲链表 讲链表之前不得不介绍一下结构体,在链表学习之前大家都应该已经学了结构体,都知道结构体里面能有许多变量,每个变量可以当做这个结构体的属性,例如: str ...

  5. 【esayui】扩展验证方法,控件验证

    基础验证 //页面调用方法$.extend($.fn.validatebox.defaults.rules, { 验证电话 IsPhoneRex: {validator: function (valu ...

  6. VisualSVN 手动记录访问操作日志

    一. VisualSVN 是一个可以免费使用的,SVN服务器端软件,基于 apache .可以实现 http https 多种SVN 发布功能. VisualSVN 默认是没有日志记录功能,需要手动打 ...

  7. Matlab 如何输入矩阵

    A=[1 2 3;4 5 6;7 8 9],每行之间用分号隔开 也可以用循环控制输入 n=input('请输入矩阵阶数:') for i=1:n     for j=1:n         a(i,j ...

  8. CSS如何让不相等的字符上下对齐

    最后效果: <div class="main"> <span style="font-size:12px;"><dl class= ...

  9. 【19】中间者模式(Mediator Pattern)

    一.引言 在现实生活中,有很多中介者模式的身影,例如QQ游戏平台,聊天室.QQ群和短信平台,这些都是中介者模式在现实生活中的应用,下面就具体分享下我对中介者模式的理解. 二. 中介者模式的介绍 2.1 ...

  10. 5大JavaScript前端框架简介

    译者按: 简要介绍五大前端框架特性 原文: Top 5 JavaScript Frameworks 译者: Fundebug 为了保证可读性,本文采用意译而非直译.另外,本文版权归原作者所有,翻译仅用 ...