Docker部署Hadoop集群
前几天写了文章“Hadoop 集群搭建”之后,一个朋友留言说希望介绍下如何使用Docker部署,这个建议很好,Docker不仅在生产环境威力巨大,对于我们在自己电脑中搭建学习实验环境更是非常便利
搭建一个集群环境时需要多台服务器,对于我们个人,这通常是个门槛,需要使用虚拟机,安装操作系统,然后运行起来多个虚机
安装操作系统是个不太轻松的任务,并且运行多个虚机对个人电脑性能也有一定要求,这些门槛影响了很多小伙伴的实践积极性
使用Docker的话就简单了,不用安装操作系统,直接下载一个镜像,如centos,这样操作系统就有了,基于这个系统镜像运行多个容器,就相当于起了多个虚机,而且系统性能的消耗要远小于虚拟机
假设我们有一个 centos7 镜像,启动多个容器,每个容器都有一个IP,都能通过SSH连接操作,这样就可以在每个容器中安装 JAVA Hadoop,从而搭建起集群环境了
使用Docker搭建Hadoop集群的过程包括:
- 安装Docker
- 获取centos镜像
- 安装SSH
- 为容器配置IP
- 安装JAVA和Hadoop
- 配置Hadoop
第1步比较简单,去Docker官网下载安装就好,第5和第6步与在独立服务器中的操作是一样的,所以这里就介绍一下2-4步的Docker操作方式
获取centos7镜像
$ docker pull centos
大概是70多M,使用阿里云等Docker加速器的话很快就能下载完,之后在镜像列表中就可以看到
查看镜像列表的命令:
$ docker images
安装SSH
以centos7镜像为基础,构建一个带有SSH功能的centos
$ vi Dockerfile
内容:
FROM centos
MAINTAINER dys
RUN yum install -y openssh-server sudo
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config
RUN yum install -y openssh-clients
RUN echo "root:111111" | chpasswd
RUN echo "root ALL=(ALL) ALL" >> /etc/sudoers
RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
RUN mkdir /var/run/sshd
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
这段内容的大意是:以 centos 镜像为基础,安装SSH的相关包,设置了root用户的密码为 111111,并启动SSH服务
执行构建镜像的命令,新镜像命名为 centos7-ssh
$ docker build -t="centos7-ssh" .
执行完成后,可以在镜像列表中看到
$ docker images
设置固定IP
需要用到 pipework,他用于给容器设置IP
先下载
$ git clone https://github.com/jpetazzo/pipework.git
$ cp pipework/pipework /usr/local/bin/
安装bridge-utils
$ yum -y install bridge-utils
创建网络
$ brctl addbr br1
$ ip link set dev br1 up
$ ip addr add 192.168.3.1/24 dev br1
基于 centos7-ssh 这个镜像启动一个容器,名为 centos7.ssh
$ docker run -d --name=centos7.ssh centos7-ssh
设置IP
$ pipework br1 centos7.ssh 192.168.3.20/24
为名为 centos7.ssh 的容器指定了IP 192.168.3.20
分别使用 ping 与 ssh 命令进行验证,看是否可以ping通和成功登录
$ ping 192.168.3.20
$ ssh 192.168.3.20
ssh成功登录后,就意味着已经准备好了一台服务器,再运行2个容器、设置好IP,那么就相当于有了3台服务器
$ docker run -d --name=centos7.ssh2 centos7-ssh
$ docker run -d --name=centos7.ssh3 centos7-ssh
$ pipework br1 centos7.ssh2 192.168.3.22/24
$ pipework br1 centos7.ssh3 192.168.3.23/24
这样就有了3个可以SSH连接的容器,可以在上面安装和配置集群环境了
构建Hadoop镜像
上面是运行了3个centos容器,需要在每个容器中单独安装Hadoop环境,我们可以像构建SSH镜像一样,构建一个Hadoop镜像,然后运行3个Hadoop容器,这样就更简单了
$ vi Dockerfile
内容:
FROM centos7-ssh
ADD jdk-8u101-linux-x64.tar.gz /usr/local/
RUN mv /usr/local/jdk1.8.0_101 /usr/local/jdk1.8
ENV JAVA_HOME /usr/local/jdk1.8
ENV PATH $JAVA_HOME/bin:$PATH
ADD hadoop-2.7.3.tar.gz /usr/local
RUN mv /usr/local/hadoop-2.7.3 /usr/local/hadoop
ENV HADOOP_HOME /usr/local/hadoop
ENV PATH $HADOOP_HOME/bin:$PATH
RUN yum install -y which sudo
这里是基于 centos7-ssh 这个镜像,把 JAVA 和 Hadoop 的环境都配置好了
前提:在Dockerfile所在目录下准备好 jdk-8u101-linux-x64.tar.gz 与 hadoop-2.7.3.tar.gz
执行构建命令,新镜像命名为 hadoop
$ docker build -t="hadoop" .
运行3个hadoop容器,分别命名为 hadoop0,hadoop1,hadoop2,hadoop0 作为master
$ docker run --name hadoop0 --hostname hadoop0 -d -P -p 50070:50070 -p 8088:8088 hadoop
$ docker run --name hadoop1 --hostname hadoop1 -d -P hadoop
$ docker run --name hadoop2 --hostname hadoop2 -d -P hadoop
容器hadoop0启动时,映射了端口号,50070和8088,是用来在浏览器中访问hadoop WEB界面的
配置IP
$ pipework br1 hadoop0 192.168.3.30/24
$ pipework br1 hadoop1 192.168.3.31/24
$ pipework br1 hadoop2 192.168.3.32/24
配置Hadoop集群
新开3个终端窗口,分别连接到 hadoop0,hadoop1,hadoop2,便于操作
$ docker exec -it hadoop0 /bin/bash
$ docker exec -it hadoop1 /bin/bash
$ docker exec -it hadoop2 /bin/bash
在各个容器中修改 /etc/hosts,添加:
192.168.3.30 master
192.168.3.31 slave1
192.168.3.32 slave2
接下来就是配置SSH免登录,及hadoop的配置文件了,方法和之前“Hadoop集群搭建”中的一样
这样就使用Docker实现了Hadoop集群的搭建
- Phoenix边讲架构边调优
- 基于Spark Mllib的文本分类
- Sparkml库标签和索引之间转化
- 如何将RDD或者MLLib矩阵zhuanzhi
- SparkMLlib的数据类型讲解
- java lambda表达式
- kylin集群Nginx负载均衡
- Java 8 Stream 教程 (一)
- Python文档精要研读系列(1):map函数
- SparkML模型选择(超参数调整)与调优
- visual studio 2012 的制作ActiveX、打包和发布
- 用java提交一个Spark应用程序
- 一步步教你利用Github开源项目实现网络爬虫:以抓取证券日报新闻为例
- 用linqPad帮助你快速学习LINQ
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法